Compare commits

...
989 Commits
Author SHA1 Message Date
Kamil Gurgul 66558aaf5d [SHARED] Update libs
Shared tests / unit_tests (push) Canceled after 0s
2026-07-30 07:41:15 +02:00
Kamil Gurgul 1b272cb019 [SHARED] Update libs 2026-07-28 09:09:19 +02:00
Kamil Gurgul 50a8754277 [SHARED] Update libs 2026-07-25 08:30:52 +02:00
Kamil Gurgul b619cd31a4 [SHARED] Update libs 2026-07-20 18:48:35 +02:00
Kamil Gurgul 45284affb9 [SHARED] Update libs 2026-07-15 07:39:57 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
78ceef7a17 Update dependency ruby to v4.0.6 (#573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-14 06:46:33 +02:00
Kamil Gurgul 530c7f3caf [SHARED] Update libs 2026-07-09 08:03:21 +02:00
Kamil Gurgul 94a6f7fe01 [SHARED] Update libs 2026-07-03 07:54:54 +02:00
Kamil Gurgul b13d60e8d9 [SHARED] Update libs 2026-07-02 07:41:16 +02:00
Kamil Gurgul 87ed4be31b [SHARED] Update libs 2026-06-30 08:38:43 +02:00
Kamil Gurgul 71e760840d [SHARED] Update libs 2026-06-27 10:54:55 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
49f9460c68 Update Gradle to v9.6.1 (#564)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-27 10:52:34 +02:00
Kamil Gurgul f074e868fc [SHARED] Update libs 2026-06-25 10:40:55 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
37bf22bdf5 Update actions/cache action to v6 (#560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-23 22:39:35 +02:00
Kamil Gurgul 4db0a67900 [SHARED] Update libs 2026-06-19 10:10:16 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fa9c2b8234 Update Gradle to v9.6.0 (#559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-19 10:02:05 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
d24991709a Update actions/checkout action to v7 (#558)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-19 09:57:49 +02:00
Kamil Gurgul 3940d65eda [SHARED] Update libs and Android SDK 2026-06-16 07:55:20 +02:00
Kamil Gurgul 61a73eea87 [SHARED] Update libs 2026-06-14 20:12:55 +02:00
Kamil Gurgul bc3fbcb758 [SHARED] Update libs 2026-06-10 11:52:29 +02:00
Kamil Gurgul e5d5b9609e [SHARED] Test explicit backing fields 2026-06-08 10:32:52 +02:00
Kamil Gurgul f0ea636ee2 [SHARED] Update libs 2026-06-07 11:58:13 +02:00
Kamil Gurgul 72dad4cb19 [SHARED] Code refactoring 2026-06-05 13:49:02 +02:00
Kamil Gurgul 5089126f64 [SHARED] Update libs 2026-06-04 08:15:26 +02:00
Kamil Gurgul edaa06aa68 [SHARED] Update libs and desktop version 2026-06-03 07:08:06 +02:00
Kamil Gurgul 70edcfe911 [SHARED] Update formatting 2026-05-30 06:44:59 +02:00
Kamil Gurgul a34a405f60 [SHARED] Update libs 2026-05-29 09:44:38 +02:00
Kamil Gurgul a034888866 [SHARED] Update libs 2026-05-28 09:18:54 +02:00
Kamil Gurgul f60674f2e8 [SHARED] Add info about running as admin on temperatures 2026-05-27 08:10:40 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
8647341aba Update dependency com.github.oshi:oshi-core to v7.2.1 (#542)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-26 11:14:02 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
3ea30dc57d Update dependency ruby to v4.0.5 (#541)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-22 07:44:07 +02:00
Kamil Gurgul 3e6cd068ad [SHARED] Update libs 2026-05-22 07:30:43 +02:00
Kamil Gurgul 706db80731 [SHARED] Update libs 2026-05-16 11:15:29 +02:00
Kamil Gurgul c9e4aeb444 [SHARED] Update libs 2026-05-13 15:31:29 +02:00
Kamil Gurgul 817df9c5a5 [SHARED] Update gradle 2026-05-13 09:31:18 +02:00
Kamil Gurgul 8ad1f07631 [SHARED] Update android config 2026-05-12 07:02:19 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
f61cf5a137 Update dependency ruby to v4.0.4 (#535)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-12 06:50:43 +02:00
Kamil Gurgul 7e1dfffb57 [SHARED] Update libs 2026-05-09 07:02:17 +02:00
Kamil Gurgul ef910c4f6b [SHARED] Update libs 2026-05-08 08:14:18 +02:00
Kamil Gurgul f30a3d6077 [JVM] Add hard drives 2026-05-08 08:11:08 +02:00
Kamil Gurgul 1f7a48bc45 [SHARED] Update libs 2026-05-07 06:53:17 +02:00
Kamil Gurgul d444eb5ae3 [SHARED] Update libs 2026-05-06 07:27:57 +02:00
Kamil Gurgul b99041541b [SHARED] Update libs 2026-05-03 09:48:41 +02:00
Kamil Gurgul ea0da14cdd [SHARED] Update libs 2026-05-02 11:28:30 +02:00
Kamil Gurgul f8d8f15b9c [SHARED] Update gradle 2026-04-30 07:04:02 +02:00
Kamil Gurgul 5eab1d5012 [SHARED] Update libs 2026-04-24 08:38:25 +02:00
Kamil Gurgul 81b888ab6f [SHARED] Update libs 2026-04-23 09:34:51 +02:00
Kamil Gurgul 3cbf399328 [SHARED] Update libs 2026-04-22 11:15:24 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
3665c73e7a Update Apple-Actions/upload-testflight-build action to v5 (#526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-22 06:40:00 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
0eff82a10a Update dependency ruby to v4.0.3 (#524)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 14:43:24 +02:00
Kamil Gurgul b2efc82aa3 [SHARED] Update libs 2026-04-21 07:01:12 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
5273f42b75 Update apple-actions/import-codesign-certs action to v7 (#523)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 06:58:05 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
9bce215588 Update apple-actions/download-provisioning-profiles action to v6 (#522)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-21 06:49:16 +02:00
Kamil Gurgul 8cad725d16 [SHARED] Update libs 2026-04-20 07:00:05 +02:00
Kamil Gurgul 2050848498 [ANDROID] Update wear os test lane 2026-04-16 07:22:47 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
10dd2b9f59 Update dependency ruby to v4 (#519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-15 07:33:44 +02:00
Kamil Gurgul eae02be45a [ANDROID] Add auto upload to play store 2026-04-15 07:22:47 +02:00
Kamil Gurgul b1a2192e77 [SHARED] Update libs 2026-04-14 07:14:16 +02:00
Kamil Gurgul d24c2d72fb [SHARED] Update libs, small refactoring 2026-04-10 06:53:03 +02:00
Kamil Gurgul 8652040a01 [SHARED] Improve stability, libs update 2026-04-08 19:56:11 +02:00
Kamil Gurgul beb6488ff9 [SHARED] Remove toolchain files 2026-04-07 09:10:34 +02:00
Kamil Gurgul 691ed64e17 [JVM] Update oshi deprecated methods 2026-04-06 13:22:45 +02:00
Kamil Gurgul 483b2e59f4 [SHARED] Update libs 2026-04-04 09:45:28 +02:00
Kamil Gurgul 6c2d3aa7f3 [SHARED] Update libs 2026-04-04 09:44:48 +02:00
Kamil Gurgul 0724d7f387 [ANDROID] Fix wear ram progress color 2026-04-02 12:34:57 +02:00
Kamil Gurgul f52d0e94ab [ANDROID] Fix random exception when qsTile is null 2026-04-02 10:40:53 +02:00
Kamil Gurgul 9c9d682695 [ANDROID] Bump version 2026-03-30 08:08:46 +02:00
Kamil Gurgul fbb3ebb3dd [ANDROID] Fix #511 2026-03-30 08:05:51 +02:00
Kamil Gurgul 6717715a7e [SHARED] Update libs, disable material you 2026-03-26 06:54:10 +01:00
Kamil Gurgul a814c8f2cd [ANDROID] Adjust headers color for material you 2026-03-25 08:35:56 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
278abf074e Update gradle/actions action to v6 (#504)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-24 06:43:21 +01:00
Kamil Gurgul 09d0e51160 [JVM] Expose error logs 2026-03-23 07:05:36 +01:00
Kamil Gurgul 7da44e3694 [JVM] Try to fix msix conversion 2026-03-22 08:45:10 +01:00
Kamil Gurgul f18a8017fd [JVM] Try to fix desktop pipeline for msix build 2026-03-21 18:00:02 +01:00
Kamil Gurgul 0b9434d658 [JVM] Add automatic MSIX conversion 2026-03-20 09:10:38 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
611ac35ad4 Update Gradle to v9.4.1 (#500)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-20 09:04:33 +01:00
Kamil Gurgul 50e3b72bd2 [SHARED] Update libs 2026-03-20 09:00:51 +01:00
Kamil Gurgul ee1b557f1f [SHARED] Fix kover reports 2026-03-19 07:33:35 +01:00
Kamil Gurgul 6f7f0356cc [SHARED] Update libs 2026-03-19 07:17:33 +01:00
Kamil Gurgul b38d426d37 [SHARED] Update libs 2026-03-18 07:42:15 +01:00
Kamil Gurgul 705811697e [ANDROID] Bump version 2026-03-17 08:14:19 +01:00
Kamil Gurgul 1fcfd28cd7 [ANDROID] FDroid releases 2026-03-16 07:23:53 +01:00
Kamil Gurgul 6438787134 [ANDROID] Bump version 2026-03-16 07:01:57 +01:00
Kamil Gurgul 199eb7db9a [SHARED] Fix #86 2026-03-15 12:08:24 +01:00
Kamil Gurgul 7b3e84826a [SHARED] Fix #448 2026-03-14 12:27:57 +01:00
Kamil Gurgul e3d3263eb9 [SHARED] Update libs 2026-03-13 06:42:40 +01:00
Kamil Gurgul 7fa9c6fd78 [ANDROID] Add cellular info, closing #61 2026-03-12 06:53:47 +01:00
Kamil Gurgul 9c844ac9ca [ANDROID] Fix #376 2026-03-11 06:49:43 +01:00
Kamil Gurgul a44e9a847f [ANDROID] Fix #92 2026-03-10 11:11:01 +01:00
Kamil Gurgul b6da3d1ab6 [ANDROID] Add fastlane metadata 2026-03-09 08:09:18 +01:00
Kamil Gurgul 3fdff255c8 [ANDROID] Fix #490 2026-03-09 07:28:07 +01:00
Kamil Gurgul e510870672 [SHARED] Update compose multiplatform 2026-03-06 08:44:07 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
46078ca5e3 Update Gradle to v9.4.0 (#488)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-05 06:54:30 +01:00
Kamil Gurgul dee309370d [ANDROID] Bump version 2026-03-05 06:54:13 +01:00
Kamil Gurgul af177b4c6d [SHARED] Bump libs, fdroid version 2026-03-04 08:12:14 +01:00
Kamil Gurgul 44174be084 [ANDROID] Bump version 2026-03-03 08:38:37 +01:00
Kamil Gurgul bf22f28f75 [SHARED] Update libs 2026-03-03 07:40:46 +01:00
Kamil Gurgul a11a2ae397 [JVM] Bump desktop version 2026-02-28 09:24:34 +01:00
Kamil Gurgul 99637b1a36 [SHARED] Adjust formatting 2026-02-27 08:48:25 +01:00
Kamil Gurgul 40b67b3f10 [SHARED] Block double clicks on shared elements, update licenses 2026-02-27 08:36:31 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
95c90808eb Update GitHub Artifact Actions (#484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-27 07:03:33 +01:00
Kamil Gurgul 64c2aa0d12 [SHARED] Update libs 2026-02-26 07:40:42 +01:00
Kamil Gurgul 7856e5523e [ANDROID] Adjust baselineprofile min sdk 2026-02-25 07:43:44 +01:00
Kamil Gurgul 3e59d4fb88 [SHARED] Update libs and navigation colors 2026-02-25 07:33:17 +01:00
Kamil Gurgul 9ecdb6da75 [JVM] Add printers info 2026-02-24 07:25:11 +01:00
Kamil Gurgul 31149f9d1e [SHARED] Update libraries 2026-02-23 07:28:49 +01:00
Kamil Gurgul e28ab66159 [SHARED] Update libs 2026-02-18 23:00:52 +01:00
Kamil Gurgul d85b87e45d [SHARED] Update libs 2026-02-17 10:07:10 +01:00
Kamil Gurgul 4b44fd5905 [iOS] Fix iOS build 2026-02-17 10:06:16 +01:00
Kamil Gurgul 3ac26f1387 [SHARED] Code formatting 2026-02-16 07:36:42 +01:00
Kamil Gurgul bceac49697 [SHARED] Refactor CPU data flow 2026-02-15 12:47:45 +01:00
Kamil Gurgul 8866f306d6 [SHARED] Update AGP 2026-02-14 12:22:30 +01:00
Kamil Gurgul e6f3ecbc7e [SHARED] Adjust TextField padding 2026-02-13 08:07:44 +01:00
Kamil Gurgul aceb489374 [SHARED] Update libs 2026-02-12 07:06:10 +01:00
Kamil Gurgul 9f6ac297ce [SHARED] Update libs 2026-02-11 07:26:20 +01:00
Kamil Gurgul f70839d406 [JVM] Add nvidia temp reading 2026-02-10 08:55:34 +01:00
Kamil Gurgul 855427376a [JVM] Small refactoring 2026-02-06 09:11:04 +01:00
Kamil Gurgul 38c1337c39 [SHARED] Update libs 2026-02-05 10:46:30 +01:00
Kamil Gurgul 7da1540913 [SHARED] Update libs 2026-02-05 09:57:22 +01:00
Kamil Gurgul 6dbe06a941 [SHARED] Temperature refactoring in progress 2026-02-04 09:43:43 +01:00
Kamil Gurgul a27ba17521 [SHARED] Make sure temp emits at least once 2026-02-04 08:39:14 +01:00
Kamil Gurgul 354bd3468e [SHARED] Update libs 2026-01-31 07:13:07 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
0b2aa3edab Update Gradle to v9.3.1 (#470)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-31 07:09:12 +01:00
Kamil Gurgul f3245b3c20 [SHARED] Update libs 2026-01-30 08:53:23 +01:00
Kamil Gurgul 91b4f0e75d [SHARED] Update libs 2026-01-29 07:24:19 +01:00
Kamil Gurgul cba7cc879c [SHARED] Update libs 2026-01-28 07:02:13 +01:00
Kamil Gurgul d2c5d00907 [SHARED] Fix draggable card on not supported platforms 2026-01-27 07:22:26 +01:00
Kamil Gurgul afb9e36bca [SHARED] Update gradle config 2026-01-26 08:00:57 +01:00
Kamil Gurgul 22583d08e7 [SHARED] Update libs 2026-01-23 09:25:02 +01:00
Kamil Gurgul 5c1b0caac5 [SHARED] FUpdate libs 2026-01-22 10:03:13 +01:00
Kamil Gurgul 2045521a97 [#396] Add spanish translations 2026-01-21 07:54:57 +01:00
Kamil Gurgul 95e4ba0f93 [JVM] Temperature retrieving PoC 2026-01-20 08:17:13 +01:00
Kamil Gurgul 41c2ae9289 [JVM] Bump version 2026-01-20 07:26:42 +01:00
Kamil Gurgul aa1a7a1c38 [JVM] Fix mac icons with proguard 2026-01-19 07:13:01 +01:00
Kamil Gurgul b75898f0c1 [SHARED] Update gradle 2026-01-17 20:36:29 +01:00
Kamil Gurgul 2e299ebef3 [SHARED] Update libs 2026-01-16 13:23:11 +01:00
Kamil Gurgul 21d5e097f6 [SHARED] Bump JVM version and libs update 2026-01-15 09:11:23 +01:00
Kamil Gurgul 6f8b7244c4 [SHARED] Update compose to 1.10 and AGP to 9 2026-01-14 14:56:45 +01:00
Kamil Gurgul d305ae7fa3 [SHARED] Update renovate config 2026-01-13 09:35:47 +01:00
Kamil Gurgul 8059291f71 [SHARED] Update kover config 2026-01-12 09:13:35 +01:00
Kamil Gurgul b2dff44df1 [SHARED] Build fix 2026-01-12 09:05:00 +01:00
Kamil Gurgul ffe160a6e7 [SHARED] Migrate from jetbrains plugin to android multiplatform 2026-01-11 21:11:10 +01:00
Kamil Gurgul 248d62ebf7 [JVM] Fix proguard rules 2026-01-02 09:30:54 +01:00
Kamil Gurgul 575bf6905f [SHARED] Libs update 2025-12-31 10:45:36 +01:00
Kamil Gurgul 0c342fe733 [JVM] Add more temp sensors on JVM 2025-12-30 10:12:13 +01:00
Kamil Gurgul e67fa4ac75 [JVM] Spotless fix 2025-12-28 12:07:47 +01:00
Kamil Gurgul b6309ac9a9 [JVM] Try to update uninstall logic for Windows 2025-12-28 12:06:15 +01:00
Kamil Gurgul 33b2b02267 [SHARED] Remove unused comments 2025-12-24 11:45:17 +01:00
Kamil Gurgul 6cfc723dfc [SHARED] Update libs 2025-12-23 11:58:56 +01:00
Kamil Gurgul 5934465197 [SHARED] Update unistall logic 2025-12-21 12:35:24 +01:00
Kamil Gurgul 30d4674389 [SHARED] Update libs 2025-12-20 09:57:45 +01:00
Kamil Gurgul 54ab886ef4 [JVM] Add uninstall listener 2025-12-19 09:28:53 +01:00
Kamil Gurgul 68f3d73f27 [SHARED] Update libs 2025-12-18 06:53:36 +01:00
Kamil Gurgul d3c9487ba8 [SHARED] Initial app uninstall feature 2025-12-18 06:51:17 +01:00
Kamil Gurgul 73ec2c5fa2 [SHARED] Update libs 2025-12-17 07:31:47 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
f457473399 Update GitHub Artifact Actions (#453)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-13 11:21:32 +01:00
Kamil Gurgul 4f5555a2cd [SHARED] Update libs 2025-12-12 06:43:49 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
a5eabd5cec Update actions/cache action to v5 (#452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-12 06:18:20 +01:00
Kamil Gurgul b085ca4d3b [SHARED] Update libs 2025-12-10 07:11:02 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
6766b10f29 Update jna monorepo to v5.18.1 (#449)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-08 14:04:14 +01:00
Kamil Gurgul ec887d4a16 [JVM] Add exe icon decoding 2025-12-08 08:02:53 +01:00
Kamil Gurgul a66a6953fc [SHARED] Add initializing state to info screens 2025-12-06 15:42:50 +01:00
Kamil Gurgul 155f5b0b81 [SHARED] Update libs 2025-12-04 09:20:01 +01:00
Kamil Gurgul 5fb6ea7799 [IOS] Add more OS data 2025-12-04 09:18:59 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
3e39e20788 Update apple-actions/download-provisioning-profiles action to v5 (#443)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-02 22:30:53 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
f5f33ed0e8 Update apple-actions/import-codesign-certs action to v6 (#444)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-02 22:30:37 +01:00
Kamil Gurgul 41524ceb4c [JVM] Fix spotless 2025-12-01 07:49:07 +01:00
Kamil Gurgul a3a081b17d [JVM] Add icons to applications (tested on MacOS) 2025-12-01 07:30:00 +01:00
KoljaandGitHub d07255dd3b Update metadata for com.kgurgul.cpuinfo (#442)
Automatically generated:
- Keywords: cpu info, hardware info, system info, device specs, cpu details
2025-11-29 22:10:50 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
8092fb8c02 Update Apple-Actions/upload-testflight-build action to v4 (#441)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-26 07:34:58 +01:00
Kamil Gurgul 542b469bda [ANDROID] Add optimized proguard config 2025-11-25 08:02:48 +01:00
Kamil Gurgul f102a6dd79 [SHARED] Apply code formatting with ktfmt 2025-11-21 08:39:18 +01:00
Kamil Gurgul ccef9eff91 [SHARED] Apply code formatting with ktfmt 2025-11-21 08:39:04 +01:00
Kamil Gurgul cb2d0d7edd [SHARED] Libs update 2025-11-21 07:43:05 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
68b540a635 Update actions/checkout action to v6 (#439)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-21 07:34:17 +01:00
Kamil Gurgul 541fffbe29 [SHARED] Libs update 2025-11-20 07:21:02 +01:00
Kamil Gurgul c11beffb5a [SHARED] Libs update 2025-11-20 07:07:47 +01:00
Kamil Gurgul bf5559fa8c [SHARED] Change frequency order on CPU screen 2025-11-20 07:03:09 +01:00
Kamil Gurgul 8a4e232a3b [IOS] Bump version 2025-11-19 07:11:43 +01:00
Kamil Gurgul b2b574a6ed [IOS] Bump version 2025-11-19 06:36:56 +01:00
Kamil Gurgul bf18356bdf [SHARED] Upate gradle 2025-11-18 06:13:58 +01:00
Kamil Gurgul 0961e859c5 [SHARED] Fix iOS version 2025-11-17 08:02:00 +01:00
Kamil Gurgul 785f22f039 [SHARED] Use macos-26 2025-11-17 07:20:02 +01:00
Kamil Gurgul e1fe4e4994 [SHARED] Use macos-26 2025-11-17 07:18:53 +01:00
Kamil Gurgul 8a5e40f91d [SHARED] Update libs 2025-11-11 08:53:18 +01:00
Kamil Gurgul 2f938d5f6a [SHARED] Update libs 2025-11-07 06:25:41 +01:00
Kamil Gurgul 68c86390e2 [SHARED] Update libs 2025-11-06 07:21:03 +01:00
Kamil Gurgul b576942bd4 [SHARED] Update libs 2025-11-05 10:48:12 +01:00
Kamil Gurgul cca75dca9b [SHARED] Remove clip from Applications 2025-11-03 07:10:46 +01:00
Kamil Gurgul 6e5e9ffc3c [SHARED] Replace custom NavigationSuiteScaffold 2025-11-03 07:09:11 +01:00
Kamil Gurgul 38df8bc316 [SHARED] Update libs 2025-11-02 08:41:29 +01:00
Kamil Gurgul a498e48470 [ANDROID] Bump minSDK 2025-11-01 07:05:11 +01:00
Kamil Gurgul 5ea80d9bdd [SHARED] Update libs 2025-10-31 07:00:32 +01:00
Kamil Gurgul 51565edf35 [IOS] Update iOS versions 2025-10-30 09:29:48 +01:00
Kamil Gurgul c11be1123e [SHARED] Update libs 2025-10-25 12:46:04 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
89b1edc565 Update GitHub Artifact Actions (#424)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-25 12:28:53 +02:00
Kamil Gurgul 51b1a9517c [SHARED] Update libs 2025-10-23 09:37:25 +02:00
Kamil Gurgul 6ae82b73c0 [SHARED] Update libs 2025-10-22 08:12:31 +02:00
Kamil Gurgul 7e6cd9d996 [SHARED] Add frequency formatter and current usage on JVM 2025-10-22 07:43:29 +02:00
Kamil Gurgul dd5886f6d8 [SHARED] Update libs 2025-10-19 09:04:36 +02:00
Kamil Gurgul c5ba588cc3 [SHARED] Update libs 2025-10-17 06:51:55 +02:00
Kamil Gurgul b8b9e61378 [SHARED] Update libs 2025-10-15 07:12:06 +02:00
Kamil Gurgul 31ca07feb0 [SHARED] Update libs 2025-10-12 11:33:48 +02:00
Kamil Gurgul 3fd4a48208 [SHARED] Update libs 2025-10-08 07:31:56 +02:00
Kamil Gurgul ba36426905 [SHARED] Downgrade dependency upgrade because of https://github.com/ben-manes/gradle-versions-plugin/issues/968 2025-10-02 06:18:50 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ffdaca06a6 Update gradle/actions action to v5 (#410)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 06:12:19 +02:00
Kamil Gurgul b682fa0c43 [SHARED] Update libs 2025-09-25 06:11:22 +02:00
Kamil Gurgul f9f9b59415 [MAC] Update mac runner with x86_64 architecture 2025-09-24 09:07:44 +02:00
Kamil Gurgul 46a911cef1 [SHARED] Update libs 2025-09-24 09:07:05 +02:00
Kamil Gurgul 6539de70f6 [SHARED] Update gradle 2025-09-21 06:19:35 +02:00
Kamil Gurgul 7a5389fdd1 [SHARED] Update libs 2025-09-19 07:15:31 +02:00
Kamil Gurgul 76974e43d7 [SHARED] Update libs 2025-09-17 06:45:39 +02:00
Kamil Gurgul 97c259a7b6 [SHARED] Update libs 2025-09-13 08:35:34 +02:00
Kamil Gurgul 1e3e71c93b [SHARED] Update libs 2025-09-11 07:03:09 +02:00
Kamil Gurgul 16d85fd93d [SHARED] Update kotlin 2025-09-11 06:58:42 +02:00
Kamil Gurgul 085829ea08 [SHARED] Update libs 2025-09-03 06:34:12 +02:00
Kamil Gurgul 015488b4e4 [SHARED] Fix wasm deps, update compose multiplatform 2025-09-01 07:52:04 +02:00
Kamil Gurgul 46ade526c9 [SHARED] Use mac as shared tests host 2025-09-01 07:46:35 +02:00
Kamil Gurgul f11eee1f3c [SHARED] Temporary downgrade libs to fix iOS target 2025-09-01 07:43:57 +02:00
Kamil Gurgul 6241a66d2d [SHARED] Update libs 2025-08-30 08:30:58 +02:00
Kamil Gurgul 6cba45c140 [SHARED] Update libs 2025-08-29 06:27:29 +02:00
Kamil Gurgul dfcdf04d1c [SHARED] Update libs 2025-08-28 05:40:47 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
a8864d36ad Update actions/setup-java action to v5 (#390)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-21 08:06:50 +02:00
Kamil Gurgul 6e058b4f93 [ANDROID] Fix SO alignment for APK 2025-08-20 08:57:59 +02:00
Kamil Gurgul 7d1b6b7ee0 [ANDROID] Fix cmake config 2025-08-20 08:03:16 +02:00
Kamil Gurgul 78b8ba345c [ANDROID] Update native cpuinfo 2025-08-20 07:48:21 +02:00
Kamil Gurgul 5dcee37fa6 [ANDROID] Update NDK 2025-08-20 07:40:47 +02:00
Kamil Gurgul bae5c77574 [SHARED] Update libs 2025-08-20 06:34:35 +02:00
Kamil Gurgul 51a45a6f56 [SHARED] Update AGP 2025-08-19 07:11:25 +02:00
Kamil Gurgul 32a480e21d [SHARED] Update libs 2025-08-18 07:24:57 +02:00
bpamiotandGitHub c7c731ba5f [SHARED] Fix kelvin symbol (SI Unit) (#383) 2025-08-15 10:26:37 +02:00
Kamil Gurgul bbf09490de [SHARED] Update libs 2025-08-15 08:51:23 +02:00
Kamil Gurgul e9d2b6af63 [SHARED Update libs 2025-08-14 05:48:47 +02:00
Kamil Gurgul c0f3658e2f [SHARED Update libs 2025-08-14 05:47:05 +02:00
Kamil Gurgul 7a2a21cc20 [JVM] Update proguard rules 2025-08-13 09:55:40 +02:00
Kamil Gurgul b31bbe8002 [JVM] Tiny refactoring 2025-08-13 09:28:49 +02:00
Kamil Gurgul d53e7640fd [JVM] Bump version 2025-08-12 07:50:26 +02:00
Kamil Gurgul 26a57c0874 Merge remote-tracking branch 'origin/master' 2025-08-12 07:09:31 +02:00
Kamil Gurgul d28fe6c7ff [JVM] Fix #379 2025-08-12 07:09:22 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
57a5b70e77 Update actions/checkout action to v5 (#378)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 05:59:15 +02:00
Kamil Gurgul 3a335d2839 [SHARED] Disable configuration cache 2025-08-10 08:06:38 +02:00
Kamil Gurgul 2b074ae6f7 [SHARED] Enable configuration cache 2025-08-09 09:36:14 +02:00
Kamil Gurgul f725f50f83 [SHARED] Fix overscroll shadow 2025-08-07 07:27:48 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
623a74d812 Update actions/download-artifact action to v5 (#377)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 06:26:47 +02:00
Kamil Gurgul 916bc74779 [SHARED] Update Gradle 9 2025-08-05 06:54:04 +02:00
Kamil Gurgul d35641f517 [SHARED] Update README 2025-08-05 05:53:48 +02:00
Kamil Gurgul 77b2e3ad24 [WASM] Fix resource preloading 2025-08-05 05:46:43 +02:00
Kamil Gurgul a8e67039c2 [TV] Update focused list item color 2025-08-04 07:12:24 +02:00
Kamil Gurgul 7b8dc691e3 [SHARED] Update libs 2025-08-02 07:53:12 +02:00
Kamil Gurgul 1efc26d98f [WASM] Fix build 2025-08-01 08:15:10 +02:00
Kamil Gurgul bce3b085db [SHARED] Update libs 2025-08-01 07:34:28 +02:00
Kamil Gurgul 8c23e503bc [SHARED] Update libs 2025-07-23 00:18:30 +02:00
Kamil Gurgul 3f165f5f80 [SHARED] Update libs 2025-07-17 06:45:54 +02:00
Kamil Gurgul 024d54780e [SHARED] Update libs 2025-07-11 06:55:43 +02:00
Kamil Gurgul 0b420d23c1 [SHARED] Update gradle 2025-07-05 07:07:25 +02:00
Kamil Gurgul a0d95338d6 [ANDROID] Update version 2025-07-04 07:27:07 +02:00
Kamil Gurgul fee0c14800 [ANDROID] Update native lib 2025-07-03 07:10:20 +02:00
Kamil Gurgul e743dd3cf5 [SHARED] Update libs 2025-07-03 06:37:14 +02:00
Kamil Gurgul 1a1af661aa [SHARED] Update renovate config 2025-07-01 08:11:55 +02:00
Kamil GurgulandGitHub 2e0c8383c5 Update libs.versions.toml 2025-06-28 10:04:44 +02:00
Kamil Gurgul 6a3699d2ea [SHARED] Update libs 2025-06-25 07:11:54 +02:00
Kamil Gurgul 2c9942d069 [ANDROID] Bump target and compile SDK to 36 2025-06-20 06:57:34 +02:00
Kamil Gurgul ace62606b9 [SHARED] Fix color with Material U 2025-06-19 12:29:14 +02:00
Kamil Gurgul ab97ea91f0 [SHARED] Update libs 2025-06-19 06:57:53 +02:00
Kamil Gurgul d2b43d5ca9 [IOS] Add deep links support 2025-06-18 09:04:36 +02:00
Kamil Gurgul 210f90766d [SHARED] Update libs 2025-06-18 07:13:22 +02:00
Kamil Gurgul 61d2386401 [JVM] Bump version 2025-06-17 07:11:45 +02:00
Kamil Gurgul 749f0a9d11 [JVM] Remove unnecessary rule 2025-06-17 07:10:36 +02:00
Kamil Gurgul 2e5cd4be96 [SHARED] Update libs 2025-06-15 14:35:21 +02:00
Kamil Gurgul a6848d5e4e [ANDROID] Bring back material u 2025-06-14 12:16:43 +02:00
Kamil Gurgul 984c4d81ad [SHARED] Update libs 2025-06-12 06:38:54 +02:00
Kamil Gurgul bb490815c2 [JVM] Reenable proguard 2025-06-10 07:09:15 +02:00
Kamil Gurgul aa2315612d [SHARED] Update libs 2025-06-10 06:57:02 +02:00
Kamil Gurgul e03be127aa [SHARED] Update gradle 2025-06-07 06:35:37 +02:00
Kamil Gurgul 3f1e46e723 [WEAR] Update libs 2025-06-06 09:23:13 +02:00
Kamil Gurgul f42bd111ee [JVM] Update oshi 2025-06-01 08:21:07 +02:00
Kamil Gurgul b98be37baf Merge remote-tracking branch 'origin/master' 2025-05-29 06:39:05 +02:00
Kamil Gurgul c7bb3485e5 [ANDROID] Update AGP 2025-05-29 06:38:54 +02:00
Kamil Gurgul 3eb0e92961 [IOS] Bring back version to Info.plist 2025-05-27 07:33:29 +02:00
Kamil Gurgul 01872b0981 [WEAR] Remove deprecated code 2025-05-27 07:11:09 +02:00
Kamil Gurgul 7f741f9517 [IOS] Bump version 2025-05-27 06:55:40 +02:00
Kamil Gurgul 15e99b27d5 [ANDROID] Temporary disable material U 2025-05-24 06:59:53 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
251537026e Update dependency gradle to v8.14.1 (#337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-23 08:37:31 +02:00
Kamil Gurgul aa3621bd7f [SHARED] Adjust navigation color 2025-05-23 08:31:47 +02:00
Kamil Gurgul 55c8f4402d [SHARED] Improve UI 2025-05-22 07:26:28 +02:00
Kamil Gurgul 838588a2ea [SHARED] Update libs 2025-05-21 08:26:56 +02:00
Kamil Gurgul 0c93e20971 Merge remote-tracking branch 'origin/master' 2025-05-21 07:45:59 +02:00
Kamil Gurgul c220bffdbc [SHARED] Update libs 2025-05-21 07:45:51 +02:00
Kamil Gurgul 72cccedc60 [SHARED] Migrate to multiplatform preview 2025-05-20 07:02:44 +02:00
Kamil Gurgul ddbadcf671 [SHARED] Update libs 2025-05-17 07:15:56 +02:00
Kamil Gurgul 184a652a21 [SHARED] Update libs 2025-05-16 06:46:53 +02:00
Kamil Gurgul c13f9e4084 [SHARED] Update libs 2025-05-14 08:52:57 +02:00
Kamil Gurgul 0acb5fc51c [SHARED] Update libs 2025-05-13 11:09:18 +02:00
Kamil Gurgul 3a789caf53 [SHARED] Update libs 2025-05-13 10:31:38 +02:00
Kamil Gurgul 471e1bfefe [SHARED] Update libs 2025-05-10 06:23:43 +02:00
Kamil Gurgul 8caa1386c9 [SHARED] Fix iOS build - temporary relay on betas and RCs 2025-05-09 09:41:22 +02:00
Kamil Gurgul 8dc36fd58e [SHARED] Update libs, adjust DraggableBox 2025-05-08 10:05:41 +02:00
Kamil Gurgul 5ee3a5618b [SHARED] Fix iOS build, WEB navigation in url 2025-05-08 09:48:08 +02:00
Kamil Gurgul 3e2cf54d88 [SHARED] Fix icons deps 2025-05-07 08:55:59 +02:00
Kamil Gurgul 2c1ff372ef [SHARED] Remove deprecated api 2025-05-07 05:19:02 +02:00
Kamil Gurgul 35b53f1615 [SHARED] Update libs (Compose 1.8.0) 2025-05-07 05:18:47 +02:00
Kamil Gurgul c525e048ae [SHARED] Update libs 2025-05-05 08:31:06 +02:00
Kamil Gurgul 246c434bce [SHARED] Update libs 2025-05-05 08:29:02 +02:00
Kamil Gurgul c368d78516 [SHARED] Update libs 2025-05-01 07:00:12 +02:00
Kamil Gurgul 6cef736aa5 [SHARED] Update gradle 2025-04-26 06:24:00 +02:00
Kamil Gurgul 509579cff0 [SHARED] Update README 2025-04-25 07:51:25 +02:00
Kamil Gurgul 5808646932 [WEAR] Adjust proguard 2025-04-24 07:16:43 +02:00
Kamil Gurgul d0173e0b8c [WEAR] Fix brand icon 2025-04-24 07:12:48 +02:00
Kamil Gurgul d22f8477bb [SHARED] Update libs 2025-04-24 06:50:30 +02:00
Kamil Gurgul 05bd0a125a [#312] Add density DPI 2025-04-22 08:24:48 +02:00
Kamil Gurgul ebecc5af19 [SHARED] Update libs 2025-04-22 08:14:48 +02:00
Kamil Gurgul 7ed8caa7df [SHARED] Update libs 2025-04-16 06:26:48 +02:00
Kamil Gurgul 4ff7a02cf4 [SHARED] Update libs 2025-04-11 11:30:39 +02:00
Kamil Gurgul 646771b573 [SHARED] Update libs 2025-04-10 06:50:50 +02:00
Kamil GurgulandGitHub b1d01b49da Update libs.versions.toml 2025-04-09 08:58:58 +02:00
Kamil GurgulandGitHub dbc059ac33 Update libs.versions.toml 2025-04-09 08:57:20 +02:00
Kamil Gurgul 8fd00c61f9 [SHARED] Add licenses plugin 2025-04-03 10:14:10 +02:00
Kamil Gurgul 22f8535000 [SHARED] Update licenses 2025-04-03 10:01:55 +02:00
Kamil Gurgul 5f1e4cb34d [SHARED] Update libs 2025-04-02 06:23:40 +02:00
Kamil Gurgul 544cb3c9c7 [SHARED] Fix unused imports 2025-04-01 06:58:49 +02:00
Kamil Gurgul 199d05b32d [SHARED] Fix typo 2025-04-01 06:55:47 +02:00
Kamil Gurgul e8ebde087d [SHARED] Update libs 2025-04-01 06:30:06 +02:00
Kamil Gurgul 0d1a238dc3 [ANDROID] Remove unnecessary R8 rules 2025-03-31 07:00:35 +02:00
Kamil Gurgul fe98599f6e [SHARED] Refresh icon always visible for desktop 2025-03-31 06:54:07 +02:00
Kamil Gurgul 914ca80d4c [SHARED] Update actions 2025-03-28 05:53:39 +01:00
Kamil Gurgul 38ecc6c5ed [SHARED] Update libs 2025-03-27 06:19:22 +01:00
Kamil Gurgul c042226428 [SHARED] Update libs 2025-03-27 06:17:03 +01:00
Kamil Gurgul 40275ce377 [SHARED] Add applications manual refresh for desktop 2025-03-26 07:07:25 +01:00
Kamil Gurgul 7d01bf4a8f [SHARED] Update koin 2025-03-26 06:52:16 +01:00
Kamil Gurgul 62800e0d14 [JVM] Enable application list for desktop 2025-03-25 09:46:40 +01:00
Kamil Gurgul 51b3427289 [ANDROID] Update AGP 2025-03-25 07:36:18 +01:00
Kamil Gurgul aeb5a16333 [DESKTOP] Use OSHI for OS app list on JVM 2025-03-24 06:51:27 +01:00
Kamil Gurgul f0871041e9 [SHARED] Update actions 2025-03-24 06:40:44 +01:00
Kamil Gurgul e67f8e1cca [SHARED] Update libs 2025-03-23 06:04:30 +01:00
Kamil Gurgul bef0e36ecb [IOS] Update actions 2025-03-21 07:44:39 +01:00
Kamil Gurgul ef2fa5b3cc [SHARED] Update kotlin 2025-03-21 07:43:17 +01:00
Kamil Gurgul e3bee07ec4 [SHARED] Update about button 2025-03-17 07:20:38 +01:00
Kamil Gurgul 1455be36a2 [SHARED] Update libs 2025-03-13 07:00:21 +01:00
Kamil Gurgul b57bf89f3c [ANDROID] Bump version 2025-03-08 09:22:45 +01:00
Kamil Gurgul 106a9daa1c [ANDROID] Downgrade version 2025-03-08 07:16:07 +01:00
Kamil Gurgul 3d7726e93a [ANDROID] Update AGP 2025-03-05 06:32:55 +01:00
Kamil Gurgul b1202af131 [SHARED] Update licenses 2025-03-04 08:08:32 +01:00
Kamil Gurgul b1dc0ec4a5 [DESKTOP] Bump version 2025-03-03 07:20:03 +01:00
Kamil Gurgul bd5396dec3 [DESKTOP] Bump version 2025-03-01 08:47:06 +01:00
Kamil Gurgul 7de9dced00 [SHARED] Update libs 2025-02-28 07:32:00 +01:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
38990629e1 Update dependency gradle to v8.13 (#288)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-27 07:50:54 +01:00
Kamil Gurgul 6ca814c3d9 [SHARED] Update libs 2025-02-27 07:45:32 +01:00
Kamil Gurgul 841085c585 [JVM] Update proguard rules - serialization doesn't work 2025-02-25 07:44:42 +01:00
Kamil Gurgul 5dc70e48af [WASM] Bring back yarn 2025-02-25 06:48:55 +01:00
Kamil Gurgul fbb1141e46 [WASM] Update package-lock.json 2025-02-24 08:28:25 +01:00
Kamil Gurgul 7b757600a8 [SHARED] Fix settings scrollbar 2025-02-24 08:24:53 +01:00
Kamil Gurgul e4435e3121 [WASM] Try to update npm deps 2025-02-24 08:21:39 +01:00
Kamil Gurgul 576b698cd6 [WASM] Disable yarn 2025-02-24 08:16:03 +01:00
Kamil Gurgul c03ed8027e [ANDROID] Bump version 2025-02-22 07:00:05 +01:00
Kamil Gurgul 6dbb4970dc [ANDROID] Bump version 2025-02-22 06:41:59 +01:00
Kamil Gurgul d1383116b7 [SHARED] Update processes and apps unit tests 2025-02-21 07:20:03 +01:00
Kamil Gurgul 62528cbd46 [SHARED] Add processes filtering unit tests 2025-02-21 07:11:35 +01:00
Kamil Gurgul a1fee26f98 [SHARED] Add apps filtering unit tests 2025-02-21 07:04:44 +01:00
Kamil Gurgul 7f6056ecc2 [SHARED] Add nested licenses deeplink 2025-02-20 08:48:26 +01:00
Kamil Gurgul 4706196f95 [TV] Fix deep links navigation 2025-02-19 09:26:53 +01:00
Kamil Gurgul a4fde9154f [SHARED] Fix deep links navigation 2025-02-19 09:20:24 +01:00
Kamil Gurgul 5474536802 [SHARED] Fix processes item animation 2025-02-19 08:21:30 +01:00
Kamil Gurgul 73c71e5c4b [SHARED] Add processes search, adjust apps search UI 2025-02-18 15:08:02 +01:00
Kamil Gurgul 3e57ad3f75 [SHARED] Base for processes search 2025-02-18 13:09:46 +01:00
Kamil Gurgul efde9ea8f2 [SHARED] Format readme, add .aiexclude 2025-02-18 08:01:56 +01:00
Kamil Gurgul 0cf7a53a2f [WEAR] Add apps version name 2025-02-17 07:26:32 +01:00
Kamil Gurgul 80b33a8058 [TV] Add apps version name 2025-02-17 07:19:05 +01:00
Kamil Gurgul 8430b28fda [TV] Adjust search on applications 2025-02-17 06:52:54 +01:00
Kamil Gurgul 6292cabbb7 [TV] Add search for TV 2025-02-15 09:45:47 +01:00
Kamil Gurgul db804107ef [SHARED] Fix missing content description 2025-02-15 07:37:04 +01:00
Kamil Gurgul 214f541d02 [SHARED] Fix license uri 2025-02-14 10:28:49 +01:00
Kamil Gurgul 2a04e43d51 [SHARED] Update libs 2025-02-14 10:27:51 +01:00
Kamil Gurgul 1d93e439ce [SHARED] Add uri opening safe handler 2025-02-14 07:42:33 +01:00
Kamil Gurgul be4a62470e [SHARED] Update libs 2025-02-13 09:12:40 +01:00
Kamil Gurgul b2c3c365ff [SHARED] Add version name to apps list 2025-02-13 09:09:16 +01:00
Kamil Gurgul e605090dfe [ANDROID] Change app data provider 2025-02-12 15:24:52 +01:00
Kamil Gurgul 0addf44aa5 [SHARED] Add applications search 2025-02-12 10:47:56 +01:00
Kamil Gurgul ed7c41589c [SHARED] Fix unit tests 2025-02-11 09:01:24 +01:00
Kamil Gurgul bd2ee36aa6 [SHARED] Initial application search data flow 2025-02-11 08:54:38 +01:00
Kamil Gurgul a596520964 [SHARED] Base for application search 2025-02-11 07:25:45 +01:00
Kamil Gurgul 84cad99f20 [SHARED] Fix unit tests 2025-02-10 08:22:08 +01:00
Kamil Gurgul 303b721c8d [SHARED][#97] Add about section 2025-02-10 08:09:41 +01:00
Kamil Gurgul ca74962010 [ANDROID] Fix unit tests 2025-02-06 09:19:25 +01:00
Kamil Gurgul ef6f687dce [ANDROID] Add shortcuts 2025-02-06 09:01:47 +01:00
Kamil Gurgul 20d2d868bc [ANDROID] Deep links refactor 2025-02-05 08:16:23 +01:00
Kamil Gurgul 51d4ba170c [SHARED] Update libs 2025-02-05 07:10:34 +01:00
Kamil Gurgul 4b5b4b646b [ANDROID] Add deep links 2025-02-05 07:06:22 +01:00
Kamil Gurgul 45e3c0e2db [ANDROID] Fix TV nav 2025-02-04 10:03:40 +01:00
Kamil Gurgul 4224e564a5 [ANDROID] Update navigation models 2025-02-04 09:56:04 +01:00
Kamil Gurgul b6a80a6bc6 [ANDROID] Add base deeplink 2025-02-04 09:22:06 +01:00
Kamil Gurgul 565fe66958 [ANDROID] Refactor tile service 2025-02-04 07:35:29 +01:00
Kamil Gurgul 00c91abbf0 [TV] Refactor NavHost animations 2025-02-04 07:29:53 +01:00
Kamil Gurgul fd3672b40c [WEAR] Fix actions formatting 2025-02-01 13:44:26 +01:00
Kamil Gurgul 41e863f0bc [SHARED] Update libs, fix applications layout 2025-01-30 08:48:58 +01:00
Kamil Gurgul 29d9ab78be [SHARED] Update kotlin 2025-01-29 06:43:49 +01:00
Kamil Gurgul 02ecd6e86b [SHARED] Adjust ram screen dividers 2025-01-27 08:47:06 +01:00
Kamil Gurgul 99cc479e09 [SHARED] Add desktop ram additional info 2025-01-27 08:19:16 +01:00
Kamil Gurgul bc6908b453 [SHARED] Update libs 2025-01-26 09:21:23 +01:00
Kamil Gurgul b75a2508da [SHARED] Update gradle 2025-01-25 09:48:58 +01:00
Kamil Gurgul 14655fa683 [SHARED] Update readme 2025-01-25 09:38:52 +01:00
Kamil Gurgul 93b43a58db [SHARED] Add licenses interactor tests 2025-01-24 07:51:58 +01:00
Kamil Gurgul b7b8553c23 [SHARED] Add fake licenses provider 2025-01-24 07:40:34 +01:00
Kamil Gurgul d274f16b12 [SHARED] Handle licenses webpage 2025-01-24 06:59:55 +01:00
Kamil Gurgul e9305be96f [SHARED] Fix preview 2025-01-23 09:41:48 +01:00
Kamil Gurgul 551d706b7f [SHARED] Add licenses screen 2025-01-23 09:35:03 +01:00
Kamil Gurgul 6368bc35ef [SHARED] Update dependency plugin 2025-01-23 08:57:14 +01:00
Kamil Gurgul ef44f0e9f7 [SHARED] Simplified license screen added 2025-01-23 08:53:46 +01:00
Kamil Gurgul 029b24969c [SHARED] Add licenses provider 2025-01-22 10:23:53 +01:00
Kamil Gurgul 3c5ead03e2 [SHARED] Add serialization library 2025-01-22 08:39:25 +01:00
Kamil Gurgul 85a5f2042d [SHARED] Update koin 2025-01-22 07:48:45 +01:00
Kamil Gurgul 35018cdad2 [SHARED] Add base for licenses parsing 2025-01-21 11:52:33 +01:00
Kamil Gurgul 94adebd220 [SHARED] Add licenses copy 2025-01-21 11:40:34 +01:00
Kamil Gurgul 7b365afdcd [SHARED] Update licenses file 2025-01-21 11:32:15 +01:00
Kamil Gurgul 9391fdc868 [SHARED] Update navigation lib 2025-01-21 11:14:50 +01:00
Kamil Gurgul f8c3aa1172 [SHARED] Simplify settings VM 2025-01-20 08:24:28 +01:00
Kamil Gurgul 9550541aaa [ANDROID] Replace AppCompatActivity with ComponentActivity 2025-01-20 07:01:06 +01:00
Kamil Gurgul bf0785148e [ANDROID] Libs cleanup 2025-01-20 06:55:17 +01:00
Kamil Gurgul cfd5a23b3d [ANDROID] Update navigation library 2025-01-20 06:37:37 +01:00
Kamil Gurgul f6e4f0ab78 [SHARED] Add base for licenses 2025-01-19 09:50:43 +01:00
Kamil Gurgul e30d5b02b4 [SHARED] Add homebrew to readme 2025-01-18 09:54:45 +01:00
Kamil Gurgul 7c62c9baf1 [SHARED] Add homebrew custom badge 2025-01-18 09:53:15 +01:00
Kamil Gurgul c037dfb533 [SHARED] Add licenses file 2025-01-17 08:50:34 +01:00
Kamil Gurgul 15dc794093 [SHARED] Update readme 2025-01-17 08:08:03 +01:00
Kamil Gurgul 0c6884481e [DESKTOP] Fix release script 2025-01-17 07:17:45 +01:00
Kamil Gurgul 0e0128b8b2 [SHARED] Fix release build with DataStore 2025-01-16 11:12:45 +01:00
Kamil Gurgul 669108744d [DESKTOP] Fix desktop release action 2025-01-16 07:32:02 +01:00
Kamil Gurgul 18cb5845a6 [DESKTOP] Fix desktop release action 2025-01-16 07:25:14 +01:00
Kamil Gurgul 728a068a7b [SHARED] Update libs 2025-01-16 07:22:19 +01:00
Kamil Gurgul e6dd86719f [DESKTOP] Add Mac x64 build lane 2025-01-16 07:13:01 +01:00
Kamil Gurgul 8f932de25d [DESKTOP] Add Mac x64 build lane 2025-01-16 07:12:10 +01:00
Kamil Gurgul 93c9408419 [DESKTOP] Add Mac Uber JAR 2025-01-15 13:16:26 +01:00
Kamil Gurgul a567936a7a [DESKTOP] Add Mac Uber JAR 2025-01-15 13:12:56 +01:00
Kamil Gurgul ce3e7f7f81 [DESKTOP] Try to build multiplatform uber jar 2025-01-15 10:22:49 +01:00
Kamil Gurgul 6aace451df [DESKTOP] Bump desktop version 2025-01-15 07:50:06 +01:00
Kamil Gurgul 323859bed2 [DESKTOP] Change app settings file location 2025-01-15 07:08:13 +01:00
Kamil Gurgul c1e199c188 [DESKTOP] Change app settings file location 2025-01-14 12:07:52 +01:00
Kamil Gurgul 817a027c55 [SHARED] Update readme 2025-01-14 08:07:16 +01:00
Kamil Gurgul 73db5b0a9e [SHARED] Add initial shared UI test 2025-01-14 08:06:01 +01:00
Kamil Gurgul 73ab8213fd [SHARED] Add github templates 2025-01-13 08:55:19 +01:00
Kamil Gurgul 7789e20408 [DESKTOP] Extract app name to strings 2025-01-13 08:30:10 +01:00
Kamil Gurgul 4aceb4244e [SHARED] Update ui tests config 2025-01-13 08:12:51 +01:00
Kamil Gurgul 843be6f760 [SHARED] Update ui tests config 2025-01-13 07:10:32 +01:00
Kamil Gurgul 3505e1ecf8 [SHARED] Update readme 2025-01-12 13:19:57 +01:00
Kamil Gurgul fc7986b654 [SHARED] Update readme 2025-01-12 12:32:52 +01:00
Kamil Gurgul 258f61705a [ANDROID] Update AGP 2025-01-10 07:43:11 +01:00
Kamil Gurgul 2e89f36b8f [SHARED] Update readme 2025-01-10 07:38:34 +01:00
Kamil Gurgul e288629ccb [SHARED] Update readme 2025-01-10 07:26:30 +01:00
Kamil Gurgul 47a4acc6b7 [WEAR] Update kover and readme 2025-01-09 08:34:46 +01:00
Kamil Gurgul 39eb2a9c01 [WEAR] Update release script 2025-01-09 08:16:10 +01:00
Kamil Gurgul 3582d6dd0a [WEAR] Update release script 2025-01-09 08:15:05 +01:00
Kamil Gurgul d053c1f79b [WEAR] Update release script 2025-01-09 08:12:29 +01:00
Kamil Gurgul bd375abe5c [WEAR] Update readme 2025-01-09 07:40:06 +01:00
Kamil Gurgul 1c48b27046 [WEAR] Bring back common app ID 2025-01-08 10:42:42 +01:00
Kamil Gurgul 3281f13fd1 [WEAR] Add VM sharing logic and temp unit switcher 2025-01-08 10:41:00 +01:00
Kamil Gurgul af61146925 [WEAR] Add nested navigation for settings 2025-01-08 09:11:39 +01:00
Kamil Gurgul c423bee933 [WEAR] Base for settings screen 2025-01-08 07:45:03 +01:00
Kamil Gurgul efe9bd68e7 [WEAR] Add settings for apps 2025-01-07 09:41:23 +01:00
Kamil Gurgul fe15e06da7 [WEAR] Add refresh for apps 2025-01-07 09:05:09 +01:00
Kamil Gurgul aadaa2637e [WEAR] Add confirmation for apps 2025-01-07 08:36:22 +01:00
Kamil Gurgul 86fe039a99 [WEAR] Add progress for apps 2025-01-07 08:33:28 +01:00
Kamil Gurgul 5a414331fb [WEAR] Add temperature screen 2025-01-06 13:27:29 +01:00
Kamil Gurgul 0093dcb697 [WEAR] Add temperature screen 2025-01-06 13:27:07 +01:00
Kamil Gurgul 7d8e04f3d3 [WEAR] Add click handler for apps 2025-01-05 10:15:54 +01:00
Kamil Gurgul dbad949d28 [WEAR] Add missing modifiers 2025-01-05 10:09:24 +01:00
Kamil Gurgul d5b90d53f6 [WEAR] Fix reveal action 2025-01-05 09:58:05 +01:00
Kamil Gurgul f5fae0ca73 [WEAR] Base for applications 2025-01-04 14:39:46 +01:00
Kamil Gurgul 8ce329afeb [WEAR] Base for applications 2025-01-04 10:11:59 +01:00
Kamil Gurgul e958c342ea [WEAR] Add sensors screen 2025-01-03 09:07:01 +01:00
Kamil Gurgul cb281783a5 [WEAR] Add hardware screen 2025-01-03 09:03:25 +01:00
Kamil Gurgul 5a3dd7eb57 [WEAR] Add os and screen info screen 2025-01-03 08:49:09 +01:00
Kamil Gurgul b8c91011e5 [WEAR] Add storage screen 2025-01-03 06:43:23 +01:00
Kamil Gurgul acdc328cdc [WEAR] Add RAM screen 2025-01-02 09:04:52 +01:00
Kamil Gurgul 9a055c829b [WEAR] Add GPU screen 2025-01-02 08:42:46 +01:00
Kamil Gurgul 736fb18f34 [WEAR] Fix scroll position on menu 2025-01-02 07:51:45 +01:00
Kamil Gurgul 6887c67642 [WEAR] Add CPU screen 2025-01-02 07:49:16 +01:00
Kamil Gurgul bc571c1f42 [WEAR] Base for info screens 2025-01-01 17:31:18 +01:00
Kamil Gurgul bb6efbb43d [WEAR] Add navigation config 2025-01-01 16:56:57 +01:00
Kamil Gurgul 1e495c483f [WEAR] Fix app background 2025-01-01 16:51:02 +01:00
Kamil Gurgul 62525a6075 [WEAR] Add host UiState to wear menu 2025-01-01 16:48:12 +01:00
Kamil Gurgul 508fbb3679 [WEAR] Base for information screen 2024-12-31 09:58:06 +01:00
Kamil Gurgul bac586faf7 [WEAR] Add menu entries 2024-12-31 09:54:16 +01:00
Kamil Gurgul 8fe5a7a78e [WEAR] Start building menu 2024-12-31 09:50:15 +01:00
Kamil Gurgul 12d52c0798 [WEAR] Adjust splash screen 2024-12-31 09:18:49 +01:00
Kamil Gurgul d29f100bbe [WEAR] Adjust theme and names 2024-12-30 09:04:21 +01:00
Kamil Gurgul 111908d84c [WEAR] Add initial typography 2024-12-30 09:02:26 +01:00
Kamil Gurgul 6f79f3b232 [WEAR] Add initial colors 2024-12-30 09:02:09 +01:00
Kamil Gurgul 853908d04f [WEAR] Add base for Wear OS 2024-12-29 14:10:51 +01:00
Kamil Gurgul cb13ee6869 [ANDROID] Update gitignore 2024-12-28 09:42:15 +01:00
Kamil Gurgul 81e9d07802 [TV] Package cleanup 2024-12-28 09:35:49 +01:00
Kamil Gurgul 66a40447a3 [SHARED] Update README 2024-12-28 09:17:03 +01:00
Kamil Gurgul 825b2f75ba [TV] Simplify TV activity 2024-12-28 08:09:01 +01:00
Kamil Gurgul 81a6d84126 [SHARED] Update README 2024-12-26 11:30:40 +01:00
Kamil Gurgul 55d0c6905c [SHARED] Update README 2024-12-26 11:27:45 +01:00
Kamil Gurgul 50169b11dd [SHARED] Code cleanup 2024-12-25 09:54:34 +01:00
Kamil Gurgul 718767919e [SHARED] Update gradle 2024-12-25 09:23:15 +01:00
Kamil Gurgul 23c295e82e [SHARED] Update koin 2024-12-24 09:41:13 +01:00
Kamil Gurgul 5e4f8b67fb [SHARED] Bump android version 2024-12-23 14:46:30 +01:00
Kamil Gurgul e77abf814f [SHARED] Fix issue with DraggableBox edge case 2024-12-23 14:28:50 +01:00
Kamil Gurgul 484ec75afd [ANDROID] Bump version 2024-12-22 07:59:07 +01:00
Kamil Gurgul bddeb135a4 [SHARED] Update libs 2024-12-21 09:21:31 +01:00
Kamil Gurgul 459a309dbe [SHARED] Update coroutines 2024-12-20 10:29:32 +01:00
Kamil Gurgul 7bf77f2157 [SHARED] Fix apps VM UiState refreshing 2024-12-19 11:25:21 +01:00
Kamil Gurgul 0a5a9f8a51 [TV] Use tv text where necessary 2024-12-18 09:29:41 +01:00
Kamil Gurgul 523d6dd5b4 [TV] Add apps handling 2024-12-18 09:07:35 +01:00
Kamil Gurgul 3aca226373 [TV] Adjust settings dialogs 2024-12-17 09:51:36 +01:00
Kamil Gurgul 2422f33469 [TV] Add initial app list 2024-12-17 09:29:49 +01:00
Kamil Gurgul 06b60a25d0 [TV] Add NavigationDrawer 2024-12-16 09:29:02 +01:00
Kamil Gurgul 5d51914842 [SHARED] Update kover 2024-12-15 07:10:45 +01:00
Kamil Gurgul 61e8784dbb [TV] Adjust temperature screen 2024-12-14 09:11:35 +01:00
Kamil GurgulandGitHub 1d5265a0bd Initial Android TV support (#260)
* [ANDROID_TV] Try to create Android TV UI

* [SHARED] Update libs

* [SHARED] Remove magic numbers

* [SHARED] Change native libs icon to button

* [SHARED] Change selection color

* [SHARED] Fix apps action row

* [SHARED] Update kotlin

* [SHARED] Update xcode project structure, disable iOS arm simulator

* [ANDROID] Update native cpuinfo

* [IOS] Preparations for dependencies cleanup

* [SHARED] Update AGP

* [SHARED] Update navigation

* [IOS] Update cpuinfo lib

* [TV] Add TabRow for info section

* [TV] Handle info TabRow content

* [TV] Remove focusable workaround

* [TV] Add banner

* [TV] Adjust colors

* [TV] Adjust info screens
2024-12-13 09:17:41 +01:00
Kamil Gurgul 54c27ba534 [SHARED] Update libs 2024-12-12 07:46:05 +01:00
Kamil Gurgul 8b24fa3326 [IOS] Update cpuinfo lib 2024-12-10 07:46:53 +01:00
Kamil Gurgul 8a3f0dd809 [SHARED] Update navigation 2024-12-07 09:10:23 +01:00
Kamil Gurgul 6821d1f379 [SHARED] Update AGP 2024-12-03 07:11:03 +01:00
Kamil Gurgul 0c823faf5b [IOS] Preparations for dependencies cleanup 2024-11-28 19:12:24 +01:00
Kamil Gurgul 7caadb8d54 [ANDROID] Update native cpuinfo 2024-11-28 13:52:55 +01:00
Kamil Gurgul a2066c73b1 [SHARED] Update xcode project structure, disable iOS arm simulator 2024-11-28 13:41:45 +01:00
Kamil Gurgul 42198912a4 [SHARED] Update kotlin 2024-11-28 10:54:27 +01:00
Kamil Gurgul 51978b7bf9 [SHARED] Fix apps action row 2024-11-27 15:05:11 +01:00
Kamil Gurgul 7011c50040 [SHARED] Change selection color 2024-11-27 13:49:24 +01:00
Kamil Gurgul bffd099935 [SHARED] Change native libs icon to button 2024-11-27 13:18:07 +01:00
Kamil Gurgul f109e44271 [SHARED] Remove magic numbers 2024-11-27 10:48:02 +01:00
Kamil Gurgul 89ea48ffd9 [SHARED] Update libs 2024-11-27 09:06:22 +01:00
Kamil Gurgul bcd764308d [SHARED] Add content description for apps 2024-11-25 08:54:08 +01:00
Kamil Gurgul 88b232fd90 [SHARED] Add cpuinfo app url 2024-11-25 08:39:39 +01:00
Kamil Gurgul 610a8b7e6c [SHARED] Remove getString 2024-11-23 07:13:53 +01:00
Kamil Gurgul e8a75a102a [SHARED] Migrate sensor model to TextResource 2024-11-22 08:04:35 +01:00
Kamil Gurgul 4fd229cb47 [SHARED] Migrate temperature model to TextResource 2024-11-22 07:01:53 +01:00
Kamil Gurgul 81798596c8 [SHARED] Migrate storage model to TextResource 2024-11-21 08:53:16 +01:00
Kamil Gurgul 489c98ed01 [SHARED] Update libs 2024-11-21 07:02:25 +01:00
Kamil Gurgul 8ad8df921a [SHARED] Migrate OS info to ItemValue container 2024-11-21 06:53:38 +01:00
Kamil Gurgul a04723bdfe [SHARED] Migrate hardware info to ItemValue container 2024-11-20 11:36:27 +01:00
Kamil Gurgul daf407be5c [SHARED] Migrate GPU and screen info to ItemValue container 2024-11-20 08:10:38 +01:00
Kamil Gurgul 886314f153 [SHARED] Remove mockito 2024-11-19 09:56:32 +01:00
Kamil Gurgul 06c0a42186 [SHARED] Remove unused classes 2024-11-19 09:51:51 +01:00
Kamil Gurgul 383a69ad31 [SHARED] Migrate apps VM test to common 2024-11-19 09:50:19 +01:00
Kamil Gurgul 2aa6c4eb37 [SHARED] Migrate CPU VM test to common 2024-11-18 09:49:03 +01:00
Kamil Gurgul 98f8b6b826 [SHARED] Migrate ram VM test to common 2024-11-18 08:01:10 +01:00
Kamil Gurgul e2fb1a0479 [SHARED] Update libs 2024-11-17 09:23:01 +01:00
Kamil Gurgul 8d777e9046 [SHARED] Update DraggableBox elevation 2024-11-16 08:51:43 +01:00
Kamil Gurgul c81062992a [SHARED] Refactor ram cleanup tests 2024-11-16 08:49:45 +01:00
Kamil Gurgul 1956a3066a [SHARED] Migrate host VM test to common 2024-11-15 08:03:40 +01:00
Kamil Gurgul 98620999f6 [SHARED] Update coil 2024-11-15 07:52:42 +01:00
Kamil Gurgul 6b1d2f69b2 [SHARED] Refactor screen data tests 2024-11-15 07:49:05 +01:00
Kamil Gurgul c5ab58c49f [SHARED] Refactor temperature VM 2024-11-14 09:32:36 +01:00
Kamil Gurgul d45dd6ab19 [SHARED] Fix unit tests 2024-11-14 08:22:11 +01:00
Kamil Gurgul 511f6931b3 [SHARED] Adjust processes VM 2024-11-14 08:16:56 +01:00
Kamil Gurgul 60e43fdf45 [SHARED] Fix unit tests 2024-11-13 14:31:15 +01:00
Kamil Gurgul 870a28b64f [SHARED] Change OS data provider type 2024-11-13 09:00:12 +01:00
Kamil Gurgul aa6db44911 [SHARED] Adjust naming 2024-11-13 08:54:35 +01:00
Kamil Gurgul 26905f0742 [SHARED] Change init method for info VMs 2024-11-13 08:52:10 +01:00
Kamil Gurgul ff41a035d1 [SHARED] Update compose 2024-11-13 07:49:55 +01:00
Kamil Gurgul 28574c4737 [SHARED] Change host uiState initialization 2024-11-12 11:27:01 +01:00
Kamil Gurgul 2895da5ce8 [SHARED] Update gradle 2024-11-12 08:07:52 +01:00
Kamil Gurgul d179e598c5 [SHARED] Update coil 2024-11-10 09:38:25 +01:00
Kamil Gurgul d948f94642 [SHARED] Update README 2024-11-09 09:25:10 +01:00
Kamil Gurgul 4d62af638d [SHARED] Update libs 2024-11-08 07:13:16 +01:00
Kamil Gurgul d4c41cd362 [SHARED] Update libs 2024-11-06 07:27:22 +01:00
Kamil Gurgul b7b376123e [SHARED] Update coil 2024-11-05 09:14:04 +01:00
Kamil Gurgul 62c096ee3c [SHARED] Migrate DraggableBox to AnchoredDraggableState 2024-11-04 15:29:29 +01:00
Kamil Gurgul fd4837ed4b [SHARED] Simplify DraggableBox state 2024-11-04 10:55:36 +01:00
Kamil Gurgul fcd1467d93 [SHARED] Simplify DraggableBox state 2024-11-04 10:43:56 +01:00
Kamil Gurgul e861c81a60 [SHARED] Update agp 2024-11-01 10:11:18 +01:00
Kamil Gurgul 41815e9bf2 [SHARED] Update libs 2024-10-31 09:36:13 +01:00
Kamil Gurgul 9a24a4b934 [JVM] Change OSHI implementation 2024-10-31 09:34:42 +01:00
Kamil Gurgul 075cbf8516 [WASM] Add known issues to readme 2024-10-30 09:26:11 +01:00
Kamil Gurgul 191e8c6ef0 [ANDROID] Add OS language 2024-10-30 09:22:55 +01:00
Kamil Gurgul 4fc83c7acc [JVM] Add OS language 2024-10-30 09:21:24 +01:00
Kamil Gurgul e31127d595 [WASM] Add translations 2024-10-30 09:18:20 +01:00
Kamil Gurgul a71c50e836 [WASM] Add more providers 2024-10-30 09:13:39 +01:00
Kamil Gurgul 7d25c311a0 [WASM] Add string resources 2024-10-29 11:07:40 +01:00
Kamil Gurgul c4ca844851 [WASM] Code refactoring 2024-10-29 08:25:31 +01:00
Kamil Gurgul 4678e389d3 [SHARED] Update coil 2024-10-29 07:21:23 +01:00
Kamil Gurgul 468036440e [WASM] Add history length 2024-10-28 10:07:13 +01:00
Kamil Gurgul 10be67bd24 [ANDROID][#78] Add material you accent 2024-10-28 09:44:24 +01:00
Kamil Gurgul 62ed89eb54 [WASM] Add screen info 2024-10-28 06:54:20 +01:00
Kamil Gurgul 0de2d07f5f [WASM] Add cookies info 2024-10-27 08:59:10 +01:00
Kamil Gurgul ea3ec63943 [WASM] Add language data to OS 2024-10-25 11:12:24 +02:00
Kamil Gurgul 0a19b06a9d [WASM] Add navigator data to OS 2024-10-25 11:06:42 +02:00
Kamil Gurgul 5e55df428d [SHARED] Update ksp 2024-10-24 07:57:27 +02:00
Kamil Gurgul 6c4ce7361d [WASM] Move initKoin from composable 2024-10-24 07:51:51 +02:00
Kamil Gurgul 01ad482f61 [WASM] Add estimated storage 2024-10-23 11:42:30 +02:00
Kamil Gurgul 24cfabe841 [WASM] Add initial gpu provider, getString is failing on gpu provider 2024-10-23 10:55:34 +02:00
Kamil Gurgul 1a9dfd4b16 [WASM] Hardcode CPU data 2024-10-23 07:42:10 +02:00
Kamil Gurgul ff36d827a7 [WASM] Add heap size retrieval 2024-10-23 07:18:43 +02:00
Kamil Gurgul 1310043b67 [SHARED] Secure div operations 2024-10-22 11:00:08 +02:00
Kamil Gurgul 01488c7605 [WASM] JS function test, not working StateFlow on wasm 2024-10-22 10:50:16 +02:00
Kamil Gurgul 99baba9cba [WASM] Disable JS target, enable localStorage, add favicon 2024-10-22 07:39:20 +02:00
Kamil Gurgul 7f4aebdb73 [WASM] Simplify deps 2024-10-21 09:38:07 +02:00
Kamil Gurgul 4696c38514 [SHARED] Bring back old insets 2024-10-19 21:07:31 +02:00
Kamil Gurgul ce1a9be259 [SHARED] Fix and disable js tests for CI 2024-10-19 20:17:40 +02:00
Kamil Gurgul 5397d7a085 [WASM] Fix preview 2024-10-19 07:31:27 +02:00
Kamil Gurgul a3814cb6a1 [WASM] Fix unit tests names 2024-10-19 07:31:04 +02:00
Kamil Gurgul f571558813 [WASM] Fix alertdialog 2024-10-19 07:27:10 +02:00
Kamil Gurgul 4e29b00eac [WASM] Enable JS target 2024-10-18 09:04:05 +02:00
Kamil Gurgul 9487bbd680 [SHARED] Update NavigationSuiteScaffold impl 2024-10-18 07:41:27 +02:00
Kamil Gurgul a83749f160 [WASM] Enable wasm 2024-10-18 07:12:17 +02:00
Kamil Gurgul e3fa431b06 [SHARED] Create mobile main, add base files for wasm 2024-10-17 09:47:47 +02:00
Kamil Gurgul d646ad0921 [SHARED] Temporary exclude DataStore from common to enable wasm 2024-10-17 09:14:39 +02:00
Kamil Gurgul a629ec0067 [SHARED] Update libs 2024-10-17 08:25:39 +02:00
Kamil Gurgul 067f568d1c [SHARED] Update readme 2024-10-16 09:41:40 +02:00
Kamil Gurgul 5dd7fd23be [SHARED] Add koin dependency verification 2024-10-16 09:38:16 +02:00
Kamil Gurgul 961433eebe [SHARED] Update libs 2024-10-16 09:07:36 +02:00
Kamil Gurgul f83c50ef40 [SHARED] Remove koin annotations for wasm support 2024-10-16 07:48:34 +02:00
Kamil Gurgul 85ff28c2db [SHARED] Add selection functionality 2024-10-15 09:55:45 +02:00
Kamil Gurgul 47a7aeb224 [SHARED] Upgrade AGP 2024-10-15 09:24:50 +02:00
Kamil Gurgul f243e80997 [Shared] Add elevation transition to DraggableBox 2024-10-13 07:32:26 +02:00
Kamil Gurgul 84c7617063 [Shared] Update kotlin 2024-10-12 07:06:39 +02:00
Kamil Gurgul 982fed28e0 [Shared] Update coil 2024-10-09 07:01:51 +02:00
Kamil Gurgul 52d9292837 [Android] Bump BP minSdk 2024-10-07 10:36:16 +02:00
Kamil Gurgul 0db2fabef4 [Android] Bump Android version 2024-10-04 06:44:28 +02:00
Kamil Gurgul 52531b46f0 [SHARED] Upgrade JDK to 17, bump version for fdroid 2024-10-03 10:13:50 +02:00
Kamil Gurgul 7408e67789 [SHARED] Update libs 2024-10-03 06:41:33 +02:00
Kamil Gurgul 9612d86545 [SHARED] Update libs 2024-10-02 08:10:37 +02:00
Kamil Gurgul fed6475003 [SHARED] Format code with ktlint 2024-10-02 06:44:58 +02:00
Kamil Gurgul aed463219a [SHARED] Add editorconfig file 2024-10-01 07:42:13 +02:00
Kamil Gurgul e6574ede9d [SHARED] Update oshi 2024-09-29 13:42:39 +02:00
Kamil Gurgul c89bc7c42a [SHARED] Update gradle to 8.10.2 2024-09-27 09:46:27 +02:00
Kamil Gurgul 29ba041279 [ANDROID] Code refactoring 2024-09-26 08:53:12 +02:00
Kamil Gurgul ebde0efa54 [ANDROID] Code refactor 2024-09-26 07:47:21 +02:00
Kamil Gurgul c58f6249f1 [SHARED] Move TemperatureDataObservableTest to shared 2024-09-26 06:50:22 +02:00
Kamil Gurgul 40f98870d8 [SHARED] Move ProcessesDataObservableTest to shared 2024-09-25 09:27:38 +02:00
Kamil Gurgul 04f414606e [SHARED] Move test data to shared 2024-09-25 09:13:01 +02:00
Kamil Gurgul 250a86b07e [SHARED] Update translations 2024-09-23 10:08:49 +02:00
Kamil Gurgul 490a592445 [ANDROID] Update release action 2024-09-23 09:49:52 +02:00
Kamil Gurgul 225b2f5412 [ANDROID] Try to fix BP 2024-09-23 09:29:08 +02:00
Kamil Gurgul 5b009fc416 [ANDROID] Try to fix BP 2024-09-23 09:00:21 +02:00
Kamil Gurgul 6211b43ea5 [ANDROID] Try to fix BP 2024-09-23 08:03:32 +02:00
Kamil Gurgul 91e2da9f48 [SHARED] Start test migrations to shared 2024-09-23 08:01:19 +02:00
Kamil Gurgul 4a699fea63 [ANDROID] Try to fix baselineprofile 2024-09-22 10:57:51 +02:00
Kamil Gurgul 3b104c72ab [ANDROID] Try to fix baselineprofile 2024-09-22 10:47:34 +02:00
Kamil Gurgul 157341b14a [ANDROID] Try to fix baselineprofile 2024-09-22 09:34:33 +02:00
Kamil Gurgul 327c90c55a [ANDROID] Try to fix baselineprofile 2024-09-21 14:27:45 +02:00
Kamil Gurgul 4e364fa704 [ANDROID] Try to fix baselineprofile 2024-09-21 14:24:47 +02:00
Kamil Gurgul 079178a02b [ANDROID] Try to fix baselineprofile 2024-09-21 14:18:10 +02:00
Kamil Gurgul 1ceb6e4aad [ANDROID] Try to fix baselineprofile 2024-09-21 14:05:02 +02:00
Kamil Gurgul 1e955fcaf5 [ANDROID] Try to fix baselineprofile 2024-09-21 11:05:51 +02:00
Kamil Gurgul c353b25664 [SHARED] Fix progress bar state 2024-09-20 10:09:19 +02:00
Kamil Gurgul 8a9d832813 [ANDROID] Update libs 2024-09-19 07:22:35 +02:00
Kamil Gurgul 882aa159ef [ANDROID] Update version 2024-09-19 07:18:51 +02:00
Kamil Gurgul 35d0a5102c [ANDROID] Update AGP 2024-09-18 07:21:10 +02:00
Kamil Gurgul 28b77ddbb5 [SHARED] Update koin 2024-09-17 16:15:07 +02:00
Kamil Gurgul ee2afe042a [SHARED] Update oshi 2024-09-16 10:00:08 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
80eb19a118 Update kotlinxCoroutines to v1.9.0 (#208)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-13 18:57:37 +02:00
Kamil Gurgul e17ed72439 [SHARED] Update README.md 2024-09-13 10:45:37 +02:00
Kamil Gurgul 670b84bf2a [SHARED] Update README.md 2024-09-13 10:43:49 +02:00
Kamil Gurgul 6af8795ca2 [ANDROID] Bump target and compile SDK to 35, NDK to r27, add support for 16KB page size 2024-09-13 09:19:11 +02:00
Kamil Gurgul 2423844b8d [SHARED] Add animation to processes 2024-09-11 19:21:19 +02:00
Kamil Gurgul b0a464ab0a [SHARED] Update libs 2024-09-11 17:03:37 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
a221864770 Update dependency com.google.devtools.ksp to v2.0.20-1.0.25 (#205)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-06 07:49:01 +02:00
Kamil Gurgul 4ed008976e [SHARED] Remove window lib workaround, enable item change animation for apps list 2024-09-06 07:47:37 +02:00
Kamil Gurgul 8c863c92a3 [SHARED] Update utils 2024-09-05 19:29:21 +02:00
Kamil Gurgul af68af14e7 [SHARED] Update android libs 2024-09-05 19:28:39 +02:00
Kamil Gurgul 2c136bc222 [SHARED] Update compose 2024-09-05 19:26:34 +02:00
Kamil Gurgul d7928e36d4 [SHARED] Add corruption handler to DataStore 2024-09-04 14:24:57 +02:00
Kamil Gurgul 2db387892a [DESKTOP] Update publish task 2024-09-03 07:53:08 +02:00
Kamil Gurgul 57c24c4933 [DESKTOP] Update notarize task 2024-09-03 07:40:22 +02:00
Kamil Gurgul a60ec4d645 [DESKTOP] Update notarize task 2024-09-03 07:25:33 +02:00
Kamil Gurgul 7849b450e8 [DESKTOP] Update notarize task 2024-09-03 06:53:07 +02:00
Kamil Gurgul bf679a9c4e [DESKTOP] Add notarized mac build 2024-09-03 06:24:35 +02:00
Kamil Gurgul b83f70afbe [DESKTOP] Update mac entitlements - probably show stopper for app store 2024-09-02 06:41:44 +02:00
Kamil Gurgul 5e4cc29087 [DESKTOP] Update mac icon and entitlements 2024-09-02 06:13:53 +02:00
Kamil Gurgul c185be0e5c [DESKTOP] Base for Mac App Store build v4 2024-09-01 18:31:04 +02:00
Kamil Gurgul 817a5b102f [DESKTOP] Base for Mac App Store build v3 2024-08-31 07:32:11 +02:00
Kamil Gurgul 2d3f7d8853 [DESKTOP] Base for Mac App Store build v3 2024-08-31 07:28:35 +02:00
Kamil Gurgul f2276cdde3 [DESKTOP] Base for Mac App Store build v2 2024-08-30 20:46:50 +02:00
Kamil GurgulandGitHub e5c9281c51 Update libs.versions.toml 2024-08-30 19:39:23 +02:00
Kamil Gurgul b4293c69b4 [DESKTOP] Base for Mac App Store build 2024-08-29 12:49:00 +02:00
Kamil Gurgul b064cb857f [DESKTOP] Setup provisioning for Mac App Store 2024-08-28 12:53:47 +02:00
Kamil Gurgul 352dca246e [SHARED] Enforce UiState stability 2024-08-28 09:46:46 +02:00
Kamil Gurgul 42ea6516c7 [SHARED] Update compose metrics configuration 2024-08-28 09:29:56 +02:00
Kamil Gurgul 06ce70131a [SHARED] Update README.md 2024-08-28 08:43:16 +02:00
Kamil Gurgul 32009bffd5 [ANDROID] Update baseline profile config 2024-08-27 12:41:11 +02:00
Kamil Gurgul 80400634e5 [SHARED] Remove unnecessary DI config 2024-08-27 12:09:17 +02:00
Kamil Gurgul 58b63e899a [SHARED] Remove unused annotation 2024-08-27 09:42:36 +02:00
Kamil Gurgul 131b362fb4 [SHARED] Add processes sorting 2024-08-27 08:58:01 +02:00
Kamil Gurgul c8c25e9d52 [SHARED] Add Flathub badge 2024-08-27 08:02:47 +02:00
Kamil Gurgul 2fae678e2e [SHARED] Drop Material 2 2024-08-27 06:41:44 +02:00
Kamil Gurgul 06f97b68b7 [SHARED] Add HorizontalScrollbar to ScrollableTabRow 2024-08-26 11:13:42 +02:00
Kamil Gurgul a71cd1d183 [SHARED] Update README.md 2024-08-26 10:14:53 +02:00
Kamil Gurgul 508ccb8079 [SHARED] Update README.md 2024-08-24 09:39:58 +02:00
Kamil Gurgul 477683db4f [SHARED] Migrate NavigationSuiteScaffold to compose-multiplatform adaptive impl 2024-08-23 09:04:52 +02:00
Kamil Gurgul 11b16b8edd [SHARED] Update kotlin 2024-08-23 08:22:06 +02:00
Kamil Gurgul a5a326d0da [DESKTOP] Add flathub meta files 2024-08-23 07:12:29 +02:00
Kamil Gurgul 19df5897f4 [DESKTOP] Bump desktop app 2024-08-22 13:45:13 +02:00
kamgurgul 65918143ad [DESKTOP] Add linux screenshots 2024-08-22 10:08:03 +02:00
Kamil Gurgul bc22de91a1 [DESKTOP] Bump desktop app 2024-08-22 09:59:29 +02:00
kamgurgul a1284f9111 [DESKTOP] Fix storage info duplicates 2024-08-22 09:56:54 +02:00
Kamil Gurgul f88f2d732a [SHARED] Update kover config 2024-08-22 07:09:36 +02:00
Kamil Gurgul e9f9922750 [DESKTOP] Remove additional cache from script 2024-08-22 06:54:36 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ce6c88a4db Update dependency androidx.baselineprofile to v1.3.0 (#193)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-22 06:48:42 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
edb82bed8a Update dependency androidx.benchmark:benchmark-macro-junit4 to v1.3.0 (#194)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-22 06:43:34 +02:00
Kamil Gurgul 4b4c3b2bfa [DESKTOP] Add scrollbars 2024-08-21 10:12:29 +02:00
Kamil Gurgul 2a57366029 [DESKTOP] Add Linux x64 to release github actions 2024-08-21 09:17:06 +02:00
Kamil Gurgul 510391593c [DESKTOP] Workaround RPI issue 2024-08-21 08:40:52 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
a4aa57a6a4 Update dependency com.github.oshi:oshi-core to v6.6.3 (#191)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-21 08:22:47 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
dbcc84f65b Update dependency org.jetbrains.androidx.navigation:navigation-compose to v2.8.0-alpha09 (#192)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-21 08:22:34 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
8342fd2cbe Update dependency org.jetbrains.compose to v1.7.0-alpha03 (#190)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-21 08:22:16 +02:00
Kamil Gurgul 0cf5eeaebd [SHARED] Downgrade gradle 2024-08-21 08:20:29 +02:00
Kamil Gurgul e7e7ac415c [SHARED] Update processes screen 2024-08-21 08:19:04 +02:00
Kamil Gurgul 0bfd224bdb [SHARED] Update tagging 2024-08-20 07:24:44 +02:00
Kamil Gurgul d830ba4a7d [DESKTOP] Fix github actions 2024-08-19 07:50:32 +02:00
Kamil Gurgul 4969064f17 [SHARED] Update github actions 2024-08-19 07:45:34 +02:00
Kamil Gurgul fefc23d2d9 [DESKTOP] base script for desktop release build 2024-08-18 15:23:57 +02:00
Kamil Gurgul 1f70d680dc [SHARED] Update gradle to 8.10 2024-08-18 15:00:04 +02:00
kamgurgul 4d6bfe8008 Revert "[SHARED] Update README.md"
This reverts commit 67f910e278.
2024-08-16 01:17:37 +02:00
kamgurgul 67f910e278 [SHARED] Update README.md 2024-08-16 01:16:48 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ec897c9467 Update dependency androidx.test:runner to v1.6.2 (#189)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-15 09:21:59 +02:00
kamgurgul 816161eda7 [SHARED] Update README.md 2024-08-15 09:20:57 +02:00
Kamil Gurgul 6a741a46b8 [DESKTOP] Code formatting 2024-08-14 07:04:38 +02:00
Kamil Gurgul e736ba614f [iOS] Bump version, hide battery level if not available 2024-08-12 07:19:37 +02:00
Kamil Gurgul e863598fe7 [DESKTOP] Update package name 2024-08-11 08:53:22 +02:00
Kamil Gurgul 30727d95a3 [DESKTOP] Update package name 2024-08-10 22:19:39 +02:00
Kamil Gurgul 74b250ccda [DESKTOP] Disable proguard 2024-08-10 20:29:11 +02:00
Kamil Gurgul c018363dfa [DESKTOP] Update packageName 2024-08-10 19:55:29 +02:00
Kamil Gurgul 4dbc91ec5a [SHARED] Update gradle to 8.9 2024-08-10 08:37:33 +02:00
Kamil Gurgul 7aebbd0540 [DESKTOP] Add temp provider 2024-08-10 08:35:05 +02:00
Kamil Gurgul 82bb0c14c4 [DESKTOP] Update copy 2024-08-10 07:29:07 +02:00
Kamil Gurgul a6a6c8d48b [DESKTOP] Add power source temp if available 2024-08-09 08:32:12 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
1814657f2d Update androidGradlePlugin to v8.5.2 (#186)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-09 07:41:40 +02:00
Kamil Gurgul c5524035d6 [iOS] Fix filename 2024-08-09 07:40:04 +02:00
Kamil Gurgul 66be656f11 [iOS] Unify iOS files with Google name convention 2024-08-09 07:33:55 +02:00
Kamil Gurgul ec067e4af0 [DESKTOP] Unify jvm files with Google name convention 2024-08-09 07:29:19 +02:00
Kamil Gurgul 643d9350a5 [Android] Unify android files with Google name convention 2024-08-09 07:24:40 +02:00
Kamil Gurgul 1230baad84 [SHARED] Update coil 2024-08-08 07:47:33 +02:00
Kamil Gurgul 55b375e2b0 [DESKTOP] Add power sources 2024-08-08 07:45:00 +02:00
Kamil Gurgul d573c6a721 [DESKTOP] Add network interfaces 2024-08-07 12:16:03 +02:00
Kamil Gurgul 81e2b6833c [DESKTOP] Add basic sensors 2024-08-07 11:03:41 +02:00
Kamil Gurgul 12e4aa7749 [DESKTOP] Add processes 2024-08-07 07:09:51 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
1d29c94e19 Update dependency com.google.devtools.ksp to v2.0.10-1.0.24 (#184)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-07 06:47:55 +02:00
Kamil Gurgul 80c9d2b827 [SHARED] Add hardware info refreshing 2024-08-07 06:47:39 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ae72b7ca78 Update kotlin monorepo to v2.0.10 (#183)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-06 13:37:54 +02:00
Kamil Gurgul 8b5596d682 [SHARED] Update README.md 2024-08-06 08:24:06 +02:00
Kamil Gurgul f59a138f3e [DESKTOP] Add sound cards 2024-08-06 08:21:58 +02:00
Kamil Gurgul d8dc6bf8c4 [DESKTOP] Add initial hardware data 2024-08-06 07:42:58 +02:00
Kamil Gurgul 2e35cb4f86 [DESKTOP] Add displays 2024-08-05 07:46:59 +02:00
Kamil Gurgul 3a862cc89b [DESKTOP] Don't display VRAM if unknown 2024-08-05 07:36:46 +02:00
Kamil Gurgul 40bf34f2e2 Merge remote-tracking branch 'origin/master' 2024-08-04 09:11:06 +02:00
Kamil Gurgul 0458a46039 [DESKTOP] Update windows ico 2024-08-04 09:10:59 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
c1f93e0f80 Update gradle/actions action to v4 (#182)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-04 09:05:21 +02:00
Kamil Gurgul 9fd0a7962b [DESKTOP] Add initial OS provider 2024-08-03 10:36:42 +02:00
Kamil Gurgul 850832083b [DESKTOP] Add GPU provider 2024-08-02 07:40:01 +02:00
Kamil Gurgul e49c7ac89b [SHARED] Fix unit test 2024-08-02 07:31:07 +02:00
Kamil Gurgul ad96ccaab7 [SHARED] Made gpu flow more generic 2024-08-02 07:29:57 +02:00
Kamil Gurgul d4baabaf67 [DESKTOP] Update storage icon 2024-08-01 08:52:48 +02:00
Kamil Gurgul e6bd441d44 [DESKTOP] Add more storage data 2024-08-01 07:56:22 +02:00
Kamil Gurgul 7485b77519 [DESKTOP] Add storage data provider 2024-07-31 13:33:37 +02:00
Kamil Gurgul 44b380230a [DESKTOP] Add memory data provider 2024-07-31 11:28:21 +02:00
Kamil Gurgul 557c329607 [DESKTOP] Start CPU provider impl 2024-07-31 09:26:09 +02:00
Kamil Gurgul 75a734596b [iOS] Fixing github actions 2024-07-30 09:03:38 +02:00
Kamil Gurgul 2940da47c9 [IOS] Bump build number 2024-07-30 08:25:05 +02:00
Kamil Gurgul 9ee08258cb [IOS] Bump build number 2024-07-30 07:56:55 +02:00
Kamil Gurgul e07d4aff8c [iOS] Fixing github actions 2024-07-30 07:46:06 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
3cdc9b50fc Update Kotlin, KSP and Compose (#181)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-30 07:22:41 +02:00
Kamil Gurgul 9c053a8e53 [iOS] Fixing github actions 2024-07-30 07:21:22 +02:00
Kamil Gurgul f0bc4fa38c [iOS] Fixing github actions 2024-07-30 06:37:24 +02:00
Kamil Gurgul 1e6b350952 [IOS] Fixing iOS github actions 2024-07-29 09:35:35 +02:00
Kamil Gurgul 042eb4deb8 [IOS] Fixing iOS github actions 2024-07-29 09:28:57 +02:00
Kamil Gurgul bf45c55a9c Revert "[SHARED] Add gradle cache for github actions"
This reverts commit 6d7e62c3b8.
2024-07-29 08:27:56 +02:00
Kamil Gurgul 6d7e62c3b8 [SHARED] Add gradle cache for github actions 2024-07-29 08:23:37 +02:00
Kamil Gurgul 0fb38d4aa8 [IOS] Fixing iOS github actions 2024-07-29 08:08:18 +02:00
Kamil Gurgul 9d8780feff [IOS] Fixing iOS github actions 2024-07-29 08:05:50 +02:00
Kamil Gurgul aee0177afc [IOS] Add github actions build steps 2024-07-29 06:58:16 +02:00
Kamil Gurgul 9fbca97566 [DESKTOP] Add initial desktop icons 2024-07-28 08:51:06 +02:00
Kamil Gurgul 7bbb492c67 [DESKTOP] Adjust NavigationSuiteScaffold sizes 2024-07-26 10:33:23 +02:00
Kamil Gurgul 208cf3a137 [DESKTOP] Update README.md 2024-07-26 10:15:18 +02:00
Kamil Gurgul 4caa48e0e2 [DESKTOP] Add base for desktop 2024-07-26 10:11:53 +02:00
Kamil Gurgul 290ebce885 [SHARED] Update koin 2024-07-26 06:53:46 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
856ee6fc07 Update apple-actions/download-provisioning-profiles action to v3 (#179)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-25 08:54:39 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
dca5830e77 Update apple-actions/import-codesign-certs action to v3 (#180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-25 08:54:27 +02:00
Kamil Gurgul 53f56c1546 [IOS] Start building IOS github actions pipeline 2024-07-25 08:50:33 +02:00
Kamil Gurgul 033a625d3b [SHARED] Add NavigationSuiteScaffold with multiplatform impl 2024-07-25 06:57:09 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
20d0197847 Update dependency androidx.activity:activity-compose to v1.9.1 (#178)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-24 22:38:28 +02:00
Kamil Gurgul 3ece264976 [KMP] Update readme 2024-07-24 08:14:39 +02:00
Kamil Gurgul 723407765b [KMP] Adjust github actions job names 2024-07-24 08:13:28 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
baa97fa947 Update dependency io.coil-kt.coil3:coil-compose to v3.0.0-alpha09 (#177)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-24 08:01:13 +02:00
Kamil Gurgul bb10308d7f [ANDROID] Adjust project structure 2024-07-23 10:25:45 +02:00
Kamil Gurgul 47a177887f [ANDROID] Update baselineprofile 2024-07-23 06:02:09 +02:00
Kamil Gurgul 287736f60c Merge remote-tracking branch 'origin/master' 2024-07-22 09:27:19 +02:00
Kamil Gurgul e37c9fd0eb [KMP] Add App Store link 2024-07-22 07:23:59 +02:00
Kamil Gurgul e756fd4549 [KMP] Update readme 2024-07-21 06:53:35 +02:00
Kamil Gurgul 8f468d58a4 [KMP] Cleanup android structure 2024-07-21 06:52:36 +02:00
Kamil Gurgul cbaea4f3f8 [KMP] Prepare iOS release version 1.0 2024-07-21 06:44:32 +02:00
Kamil Gurgul e5828506ca Merge remote-tracking branch 'origin/master' 2024-07-20 21:54:51 +02:00
Kamil Gurgul 45aaa00850 [KMP] Add thermal state translations 2024-07-20 15:22:02 +02:00
Kamil Gurgul a1a4490c64 [KMP] Add iOS device thermal state 2024-07-20 10:18:01 +02:00
Kamil Gurgul 9e4b29f464 [KMP] Add battery state 2024-07-20 08:04:33 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
f09101b32a Update dependency org.jetbrains.kotlinx.kover to v0.8.3 (#175)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-19 22:51:42 +02:00
Kamil Gurgul dc748d8609 [KMP] Add attitude readings 2024-07-19 09:09:18 +02:00
Kamil Gurgul 987b839a66 [KMP] Add magnetic field readings 2024-07-19 08:52:22 +02:00
Kamil Gurgul 0b0f5fa08f [KMP] Split sensor readings 2024-07-19 08:30:16 +02:00
Kamil Gurgul ed02fd897a Merge remote-tracking branch 'origin/master' 2024-07-18 14:47:43 +02:00
Kamil Gurgul aace8c10c1 [KMP] Add accelerometer sensor 2024-07-18 11:02:37 +02:00
Kamil Gurgul 84c4672191 [KMP] Update koin compose VM 2024-07-18 08:08:19 +02:00
Kamil Gurgul 6cd375d293 [KMP] Adjust insets 2024-07-18 08:05:33 +02:00
Kamil Gurgul d095abb91f [KMP] Update koin 2024-07-18 06:57:49 +02:00
Kamil Gurgul 65609b0207 Revert "Update dependency gradle to v8.9 (#171)"
This reverts commit 06dc7e9398.
2024-07-17 07:24:58 +02:00
Kamil Gurgul b89d28a63b Merge remote-tracking branch 'origin/master' 2024-07-17 07:08:39 +02:00
Kamil Gurgul bb71a05a44 [KMP] Update colors 2024-07-17 06:58:07 +02:00
Kamil Gurgul d1873159fd [KMP] Update compose multiplatform to 1.7 2024-07-17 06:55:18 +02:00
Kamil Gurgul 7effa7bfa4 [KMP] Add microphone detection 2024-07-16 09:31:33 +02:00
Kamil Gurgul f3f90b9db9 [KMP] Add camera detection 2024-07-16 09:05:20 +02:00
Kamil Gurgul 283abaeb31 [KMP] Add jailbreak detection 2024-07-15 07:05:22 +02:00
Kamil Gurgul 66a72b53eb [KMP] Fix unit tests 2024-07-14 06:44:27 +02:00
Kamil Gurgul 43cf285e91 [KMP] Update iOS readme 2024-07-13 16:18:58 +02:00
Kamil Gurgul 47048e9d79 [KMP] Fix android orientation 2024-07-13 16:17:13 +02:00
Kamil Gurgul 1c9423208f [KMP] Add orientation detection for iOS 2024-07-13 15:57:50 +02:00
Kamil Gurgul 918efccbfa [KMP] Try to unify content insets 2024-07-12 08:02:57 +02:00
Kamil Gurgul 5df9420aa1 [KMP] Disable toolbar collapsing 2024-07-12 07:53:55 +02:00
Kamil Gurgul 6ccdcdd862 [KMP] Update libs 2024-07-12 07:50:52 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
06dc7e9398 Update dependency gradle to v8.9 (#171)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-12 06:52:08 +02:00
Kamil Gurgul aa3e0ee054 [KMP] Add more OS data 2024-07-11 08:03:50 +02:00
Kamil Gurgul ccedf46139 [KMP] Migrate UIKit code to Kotlin 2024-07-11 07:28:25 +02:00
Kamil Gurgul b360b43961 [KMP] Rename Android tab to OS 2024-07-10 06:24:49 +02:00
Kamil Gurgul 4dda5210d6 [KMP] Add screen data provider 2024-07-10 06:13:13 +02:00
Kamil Gurgul 45c35ea0e7 [KMP] Gradle cleanup 2024-07-10 06:11:21 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
5cf81fafba Update dependency org.mockito.kotlin:mockito-kotlin to v5.4.0 (#170)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-09 19:25:22 +02:00
Kamil Gurgul 58c2b69ff4 [KMP] Drop swiftklib in favour of interface passing 2024-07-09 07:21:15 +02:00
Kamil Gurgul 0b096152f2 [KMP] Update coil 2024-07-09 06:29:23 +02:00
Kamil Gurgul 3af3299821 [KMP] Fix windows build 2024-07-09 06:25:22 +02:00
Kamil Gurgul 3af6ba2c65 [KMP] Add missing maven local 2024-07-08 10:32:09 +02:00
Kamil Gurgul 0257c205af [KMP] Add screen size 2024-07-08 09:41:53 +02:00
Kamil Gurgul e64f7dd397 [KMP] Rename framework classes 2024-07-06 16:28:26 +02:00
Kamil Gurgul a72566511b [KMP] Add iOS storage info 2024-07-06 16:27:03 +02:00
Kamil Gurgul b1b7628544 [KMP] Change iOS AppIcon 2024-07-04 08:14:29 +02:00
Kamil Gurgul 7b456c088e [KMP] Update navigation lib 2024-07-04 07:50:07 +02:00
Kamil Gurgul 6116d5a5bc [KMP] Temporary replace framework generation to support iOS simulator 2024-07-04 01:23:23 +02:00
Kamil Gurgul f11b7613f0 [KMP] Handle framework on arm64 2024-07-03 09:11:05 +02:00
Kamil Gurgul 006b834d40 [KMP] Start creating internal iOS framework 2024-07-02 09:43:04 +02:00
Kamil Gurgul 36b400eebf [KMP] Remove coroutines warning 2024-07-02 07:49:30 +02:00
Kamil Gurgul c1131b1c22 [KMP] Add total memory 2024-07-01 11:52:27 +02:00
Kamil Gurgul 6b96c0e0d4 [KMP] Add metal version detection 2024-07-01 09:57:10 +02:00
Kamil Gurgul ddb5b8914c [KMP] Get GLES version on iOS 2024-07-01 09:28:35 +02:00
Kamil Gurgul 7cc0cd6308 Merge remote-tracking branch 'origin/master' 2024-06-30 08:38:32 +02:00
Kamil Gurgul 9eea33b0c5 [KMP] Adjust landscape container 2024-06-30 08:38:25 +02:00
Kamil GurgulandGitHub 889bc6c9b4 Update README.md 2024-06-29 16:05:39 +02:00
Kamil Gurgul 3af89c8779 [KMP] Fix edge to edge support, downgrade coil 2024-06-29 15:19:36 +02:00
Kamil Gurgul 0339b903ac [KMP] Adjust positioning 2024-06-29 14:51:34 +02:00
Kamil Gurgul 380e7ef00e [KMP] Add iOS splash 2024-06-29 14:06:42 +02:00
Kamil Gurgul 2a83e8fcda [KMP] Handle theme switcher 2024-06-28 08:35:30 +02:00
Kamil Gurgul 26bbc70010 [KMP] Fix unit tests 2024-06-28 07:55:57 +02:00
Kamil Gurgul d62e659cf9 Merge remote-tracking branch 'origin/master' 2024-06-28 07:51:41 +02:00
Kamil Gurgul 715ec6595d [KMP] Hide applications sections on iOS 2024-06-28 07:50:08 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
21da8b4c64 Update dependency org.jetbrains.kotlinx.kover to v0.8.2 (#166)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-28 07:36:47 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
8978350a2b Update dependency androidx.test:rules to v1.6.1 (#165)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-27 15:15:02 +02:00
Kamil Gurgul 9a3cf9c3d1 [KMP] iOS hide cpu freq 2024-06-27 12:01:45 +02:00
Kamil Gurgul 3b586727cd [KMP] iOS add abi detection based on Kotlin native impl 2024-06-27 11:56:10 +02:00
Kamil Gurgul d7c7fc5a5d [KMP] iOS get number of cores from native provider 2024-06-27 11:53:02 +02:00
Kamil Gurgul 03ee79127e [KMP] iOS native cpu data provider 2024-06-27 10:29:43 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
1c1a7366eb Update dependency androidx.test.ext:junit-ktx to v1.2.1 (#162)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-27 07:49:44 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
d93e3b795a Update androidxEspresso to v3.6.1 (#161)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-27 07:46:42 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
1f6618b9ea Update dependency androidx.test:core-ktx to v1.6.1 (#158)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-27 07:46:06 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
22fcde08ce Update dependency androidx.test:runner to v1.6.1 (#163)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-27 07:45:39 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
e5b5aef2d9 Update dependency io.coil-kt.coil3:coil-compose to v3.0.0-alpha07 (#164)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-27 07:42:52 +02:00
Kamil Gurgul ea72833e4b [KMP] Fix DataStore injection 2024-06-26 14:53:48 +02:00
Kamil Gurgul a2467f439b [KMP] Enable x86_64 simulator for iOS 2024-06-26 13:59:48 +02:00
Kamil Gurgul f15e601cd9 [KMP] Try to separate static libs for ios simulators - still not working 2024-06-26 12:32:39 +02:00
Kamil Gurgul 6fe7ca4d59 [KMP] Working framework on iOS device 2024-06-26 11:28:16 +02:00
Kamil Gurgul fa929d56e1 [KMP] Try XCFramework - still missing symbols 2024-06-25 12:27:38 +02:00
Kamil Gurgul 44a605fbbf [KMP] Update deps 2024-06-25 10:42:38 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
da2dd06866 Update androidxEspresso to v3.6.0 (#156)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-25 10:39:25 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
a23880735a Update dependency androidx.test.ext:junit-ktx to v1.2.0 (#157)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-25 10:39:11 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
88cfa5f1a5 Update dependency androidx.test:orchestrator to v1.5.0 (#159)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-25 10:38:45 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
0226f52501 Update dependency androidx.test:runner to v1.6.0 (#160)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-25 10:38:24 +02:00
Kamil Gurgul c01a869a0e [KMP] Migrate cpuinfo to iOS framework - still missing symbols 2024-06-25 10:12:08 +02:00
Kamil Gurgul 9f7d27a617 [KMP] Try static library linking for iOS 2024-06-24 13:09:15 +02:00
Kamil Gurgul 6d2b445218 [KMP] Enable koin for iOS build 2024-06-24 08:19:08 +02:00
Kamil Gurgul 664c7b5d1a [KMP] Add base for iOS impl 2024-06-23 13:49:04 +02:00
Kamil Gurgul 54b2fa5fe6 [KMP] Update iOS config 2024-06-23 13:29:33 +02:00
Kamil Gurgul eaa2bc37af [KMP] Add iOS modules 2024-06-22 08:40:52 +02:00
Kamil Gurgul 45b313ec2d [KMP] Update gitignore 2024-06-22 08:40:22 +02:00
Kamil Gurgul 15e86003d9 [KMP] Move CPP module to android shared 2024-06-21 08:33:23 +02:00
Kamil Gurgul 2ace136796 [KMP] Update android native libs 2024-06-21 08:24:46 +02:00
Kamil Gurgul a4478994e2 [KMP] Reenable UI tests base and baselineprofile 2024-06-21 08:12:17 +02:00
Kamil Gurgul 936d2fc34f [KMP] Move tests to shared 2024-06-21 07:22:35 +02:00
Kamil Gurgul ab25fbaf89 [KMP] Code cleanup 2024-06-20 11:41:06 +02:00
Kamil Gurgul 29c582d117 [KMP] Code cleanup 2024-06-20 11:18:45 +02:00
Kamil Gurgul cca89e5dd3 [KMP] Move all screens to common 2024-06-20 11:08:37 +02:00
Kamil Gurgul de191ca264 [KMP] Fix koinViewModel 2024-06-20 10:37:02 +02:00
Kamil Gurgul 246e7b8b20 [KMP] Bring back collectAsStateWithLifecycle 2024-06-20 10:17:02 +02:00
Kamil Gurgul 8e8348774d [KMP] Migrate previews to android module, update coil to multiplatform 2024-06-20 09:47:19 +02:00
Kamil Gurgul f5aae178af [KMP] Use multiplatform states collectors 2024-06-20 08:28:52 +02:00
Kamil Gurgul 8926eef694 [KMP] Fix external app actions 2024-06-20 08:05:46 +02:00
Kamil Gurgul 6942e278ba [KMP] Migrate available modules to shared, drop hilt 2024-06-20 08:02:07 +02:00
Kamil Gurgul ddb1950416 [KMP] Move more classes to common 2024-06-19 10:49:08 +02:00
Kamil Gurgul dbf07e54de [KMP] Update deps 2024-06-19 07:56:53 +02:00
Kamil Gurgul 36c1ed195a [KMP] Migrate CPU flow to shared 2024-06-18 08:42:32 +02:00
Kamil Gurgul 1aca77fc27 [KMP] Migrate app initializer 2024-06-18 07:11:55 +02:00
Kamil Gurgul ae1c484207 [KSP] Start koin with annotations 2024-06-17 09:13:22 +02:00
Kamil Gurgul 999dd6ce16 [KMP] Update AGP 2024-06-14 07:23:19 +02:00
Kamil Gurgul addfa238b8 [KMP] Fix koin version 2024-06-14 07:18:03 +02:00
Kamil Gurgul 1f73a17208 [KMP] Migrate more drawables to common and add koin 2024-06-13 10:18:44 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
6a2fe4857d Update dependency androidx.compose.material3:material3-adaptive-navigation-suite to v1.3.0-beta03 (#151)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-12 22:44:27 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
446556a97d Update dependency androidx.compose:compose-bom to v2024.06.00 (#152)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-12 22:39:09 +02:00
Kamil Gurgul d96313ab9e [KMP] Migrate strings to KMP 2024-06-12 10:11:35 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
dcaef26b17 Update dependency org.jetbrains.kotlinx.kover to v0.8.1 (#148)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-11 07:07:04 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
795d03d926 Update androidGradlePlugin to v8.4.2 (#149)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-11 07:06:50 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
e3d1121d5b Update dependency co.touchlab:kermit to v2.0.4 (#150)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-11 07:06:31 +02:00
Kamil Gurgul 0f241a2aa5 [KMP] Export available UI components to shared 2024-06-10 10:16:25 +02:00
Kamil Gurgul 7211812071 [KMP] Start utils and models migration to shared 2024-06-10 08:33:40 +02:00
Kamil Gurgul 93778d9a25 [KMP] Start migration to shared 2024-06-09 11:56:19 +02:00
Kamil Gurgul 45b8e21ed8 [KMP] Enable shared module 2024-06-07 08:46:21 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
e1ed76b766 Update dependency com.google.devtools.ksp to v2.0.0-1.0.22 (#147)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-06 07:42:10 +02:00
Kamil Gurgul c946fe369f Merge remote-tracking branch 'origin/master' 2024-06-05 08:38:24 +02:00
Kamil Gurgul 7b8935c8ca [KMP] Prepare new structure for KMP 2024-06-05 08:38:16 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
36fc823469 Update dependency org.jetbrains.compose to v1.6.11 (#146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-04 07:41:08 +02:00
Kamil Gurgul 34cf17b147 Merge remote-tracking branch 'origin/master' 2024-06-03 11:08:44 +02:00
Kamil Gurgul 72fb47ba99 [KMP] Start migration to KMP 2024-06-03 11:08:34 +02:00
Kamil Gurgul 39dea34c31 Small gradle refactor 2024-06-02 11:56:11 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
650d6bd5b6 Update dependency gradle to v8.8 (#145)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-01 09:57:51 +02:00
Kamil Gurgul ae5bd9b175 Update readme 2024-05-30 08:53:20 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
b436457045 Update dependency androidx.appcompat:appcompat to v1.7.0 (#144)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-29 22:41:49 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
3d74a80577 Update dependency androidx.compose.material3:material3-adaptive-navigation-suite to v1.3.0-beta02 (#143)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-29 22:38:29 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
96e697c391 Update androidxLifecycle to v2.8.1 (#142)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-29 22:38:08 +02:00
Kamil Gurgul b7039a6375 Update lifecycle 2024-05-29 07:12:23 +02:00
Kamil Gurgul 8e3b3c5b59 Add collapsing toolbar on info screen 2024-05-28 08:08:31 +02:00
Kamil Gurgul e447965235 Update baseline profile 2024-05-27 09:55:14 +02:00
Kamil Gurgul 1e95f0e388 Refactor deprecated code 2024-05-24 07:38:18 +02:00
Kamil Gurgul 8a64aff600 Update to Kotlin 2.0.0 2024-05-22 07:15:44 +02:00
Kamil Gurgul a3a7fe5613 Update translations 2024-05-22 06:59:17 +02:00
Kamil Gurgul db254ecfae NavigationSuiteScaffold refactor 2024-05-21 08:58:35 +02:00
Kamil Gurgul 5d3b11ffa3 Migration to NavigationSuiteScaffold 2024-05-21 08:48:31 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
c54affaa40 Update androidGradlePlugin to v8.4.1 (#139)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-20 22:57:42 +02:00
Kamil Gurgul 45d7061699 Add adaptive layout deps 2024-05-20 13:20:22 +02:00
Kamil Gurgul 748f5ac2ee Update TODO 2024-05-19 10:03:43 +02:00
Kamil Gurgul 5c60d87ef2 Update kover 2024-05-17 07:52:52 +02:00
Kamil Gurgul 0dbdb34827 Update deps - temporary downgrade lifecycle because of https://issuetracker.google.com/issues/340578706 2024-05-15 08:32:00 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
58a1e1be9f Update androidxLifecycle to v2.8.0 (#136)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-15 08:11:07 +02:00
Kamil Gurgul 6160c206cb Small refactor 2024-05-15 08:10:03 +02:00
Kamil Gurgul 3b19d47cc8 Update baseline proile 2024-05-14 06:59:44 +02:00
Kamil Gurgul 12a256a1e2 Replace timber with kermit 2024-05-12 17:06:57 +02:00
Kamil Gurgul d9047ea395 Update compose compiler 2024-05-10 20:32:50 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
0c00c03f68 Update kotlinxCoroutines to v1.8.1 (#135)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-10 20:22:10 +02:00
Kamil Gurgul 7ee6b3c6c3 Replace Junit Test annotation 2024-05-09 23:05:45 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
91e6b212e7 Update dependency androidx.core:core-ktx to v1.13.1 (#130)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-02 11:35:31 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
c56381b389 Update dependency androidx.datastore:datastore-preferences to v1.1.1 (#131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-02 11:35:19 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
882f3eeeb2 Update dependency androidx.compose:compose-bom to v2024.05.00 (#132)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-02 11:35:05 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
da02215ea4 Update androidGradlePlugin to v8.4.0 (#129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-01 13:13:38 +02:00
Kamil Gurgul a698d22129 Update gradle plugin 2024-05-01 13:13:08 +02:00
Kamil Gurgul 2e427e7887 Disable viewBinding nad aidl from AGP 2024-04-29 10:36:21 +02:00
Kamil Gurgul ca5f3d3ba3 Update TODO 2024-04-27 00:16:58 +02:00
Kamil Gurgul 2b86f4671e Remove AIDL and mockito-android 2024-04-23 09:56:07 +02:00
Kamil Gurgul b068695114 Remove multidex, proguard rules cleanup 2024-04-19 07:24:57 +02:00
Kamil Gurgul a1dfe6836c Update compose compiler 2024-04-18 08:29:32 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
bd1d932825 Update dependency androidx.baselineprofile to v1.2.4 (#123)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-18 08:23:20 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
5330811035 Update dependency androidx.benchmark:benchmark-macro-junit4 to v1.2.4 (#124)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-18 08:22:46 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ae341362f0 Update dependency androidx.compose:compose-bom to v2024.04.01 (#125)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-18 08:22:36 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
6cca3d5a57 Update dependency androidx.activity:activity-compose to v1.9.0 (#126)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-18 08:22:26 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
99f588305f Update dependency androidx.core:core-ktx to v1.13.0 (#127)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-18 08:22:12 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
c459362f34 Update dependency androidx.datastore:datastore-preferences to v1.1.0 (#128)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-18 08:21:56 +02:00
Kamil Gurgul 02fa3126a8 Add baseline profile 2024-04-15 07:05:42 +02:00
Kamil Gurgul a6577f779d Cleanup baseline profile generator 2024-04-15 06:46:26 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
4d1080a465 Update dependency org.mockito.kotlin:mockito-kotlin to v5.3.1 (#121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-10 09:04:40 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
de8e0319e2 Update androidGradlePlugin to v8.3.2 (#122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-10 09:04:30 +02:00
Kamil Gurgul f1e0413466 Update amazon icon 2024-04-08 07:51:20 +02:00
Kamil Gurgul cf64528466 Add amazon badge 2024-04-07 09:25:55 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
8f69b7a850 Update dependency com.google.devtools.ksp to v1.9.23-1.0.20 (#120)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-05 06:50:38 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
1e012b7953 Update dependency androidx.compose:compose-bom to v2024.04.00 (#119)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-04 08:04:29 +02:00
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>Kamil Gurgul
2b6376ddd0 Configure Renovate (#117)
* Add renovate.json

* Update renovate.json

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Kamil Gurgul <kamgurgul@gmail.com>
2024-04-02 07:34:00 +02:00
Kamil Gurgul de4f27b5f8 Update dagger 2024-03-30 08:38:10 +01:00
Kamil Gurgul 7066301e8f Update github actions 2024-03-29 07:54:01 +01:00
Kamil Gurgul ae14c6b05d Update gradle 2024-03-29 07:48:54 +01:00
Kamil Gurgul b2a24ffdba Update libs 2024-03-22 08:38:16 +01:00
Kamil Gurgul 62cdda749e Update AGP 2024-03-19 08:55:47 +01:00
Kamil Gurgul bf8e7e6f0d Bump version 2024-03-13 07:47:16 +01:00
Kamil Gurgul 5b1fa24e3d Fix crash on applications 2024-03-12 07:47:58 +01:00
Kamil Gurgul 6fc8e8fda7 Update README.md 2024-03-09 11:47:32 +01:00
Kamil Gurgul 957e81aa30 Update deps 2024-03-07 06:37:07 +01:00
Kamil Gurgul 22aee8b192 Deps cleanup 2024-03-06 07:18:46 +01:00
Kamil Gurgul 82dfa5a9dd Update deps 2024-03-06 06:42:33 +01:00
Kamil Gurgul cc07342a61 Extending benchmarks 2024-03-04 08:46:31 +01:00
Kamil Gurgul c61e833b2c Fix baseline task 2024-03-03 10:56:27 +01:00
Kamil Gurgul 53d96b3ccd Add initial baseline profile module 2024-03-02 10:37:45 +01:00
Kamil Gurgul e5b5b728ba Update deps 2024-03-02 10:20:41 +01:00
Kamil Gurgul a8875131d7 Update libs 2024-02-29 08:07:29 +01:00
Kamil Gurgul d40d7e603c Update README 2024-02-27 08:39:00 +01:00
Kamil Gurgul 90f3e4e94a Update deps 2024-02-24 12:39:13 +01:00
Kamil Gurgul 4851eef6d6 Update libraries 2024-02-19 06:41:21 +01:00
Kamil Gurgul ec63b64d2e Update cpuinfo lib 2024-02-15 10:03:37 +01:00
Kamil Gurgul f7f7b2feaf Update compose compiler 2024-02-10 10:37:24 +01:00
Kamil Gurgul 90c73fb445 Update libraries and remove deprecations 2024-02-08 09:57:22 +01:00
Kamil Gurgul 3d59a8c8bc Revert "Temporary bring back gradle 8.5 for fdroid"
This reverts commit f14150f8de.
2024-02-05 07:46:04 +01:00
Kamil Gurgul f14150f8de Temporary bring back gradle 8.5 for fdroid 2024-02-05 07:43:21 +01:00
Kamil Gurgul 5b362894f2 Bump version to 5.4.0 2024-02-05 07:19:24 +01:00
Kamil Gurgul cdafb0e744 [#111] Fix scrolling for tv dpad 2024-02-05 07:16:54 +01:00
Kamil Gurgul 9106b333d9 [#111] Fix scrolling for tv dpad 2024-02-05 07:11:39 +01:00
Kamil Gurgul 4884e5520b Update gradle 2024-02-03 16:39:07 +01:00
Kamil Gurgul a077efae20 Update readme 2024-02-03 16:21:10 +01:00
Kamil Gurgul 8a1741028c Bump version to 5.3.0 2024-01-30 06:52:15 +01:00
635 changed files with 30916 additions and 9529 deletions
+1
View File
@@ -0,0 +1 @@
local.properties
+19
View File
@@ -0,0 +1,19 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[*.{kt,kts}]
ij_kotlin_imports_layout = *
ktlint_code_style = intellij_idea
ktlint_standard_discouraged-comment-location = disabled
ktlint_standard_function-expression-body = disabled
ktlint_function_naming_ignore_when_annotated_with = Composable
+30
View File
@@ -0,0 +1,30 @@
---
name: Bug report
about: Create a report
---
## 🐛 Describe the bug
<!-- A clear and concise description of what the bug is. -->
## ⚠️ Current behavior
<!-- A clear and concise description of what you expected to happen. -->
## ✅ Expected behavior
<!-- A clear and concise description of what you expected to happen. -->
## 💣 Steps to reproduce
<!-- How we can reproduce the behavior: -->
## 📷 Screenshots
<!-- If applicable, add screenshots to help explain your problem. -->
## 📱 Tech info
- Device: <!-- e.g. Nexus One -->
- OS: <!-- e.g. 7.1.1 -->
- App version: <!-- e.g. 1.0.0 -->
+19
View File
@@ -0,0 +1,19 @@
---
name: Feature request
about: Suggest an idea for this project
---
## ⚠️ Is your feature request related to a problem? Please describe
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
## 💡 Describe the solution you'd like
<!-- A clear and concise description of what you want to happen. -->
## 🤚 Do you want to develop this feature yourself?
<!-- Put an `x` symbol into braces of desired choice. -->
- [ ] Yes
- [ ] No
+27
View File
@@ -0,0 +1,27 @@
## 🚀 Description
<!-- Describe your changes in detail -->
## 📄 Motivation and Context
<!-- Why is this change required? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here. -->
## 🧪 How Has This Been Tested?
<!-- Please describe in detail how you tested your changes. -->
<!-- Include details of your testing environment, tests ran to see how -->
<!-- your change affects other areas of the code, etc. -->
## 📷 Screenshots (if appropriate)
<!-- Please provide a screenshot of your change -->
## 📦 Types of changes
<!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
## ✅ Checklist
<!-- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
+192
View File
@@ -0,0 +1,192 @@
name: Android release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
jobs:
unit_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Unit tests
run: ./gradlew allTests
- name: Generate code coverage
run: ./gradlew shared:koverXmlReport
- name: Upload test coverage
uses: actions/upload-artifact@v7
with:
name: code-coverage.xml
path: shared/build/coverage-report/result.xml
- name: Static checks
run: ./gradlew spotlessCheck
build:
needs: unit_tests
runs-on: ubuntu-latest
strategy:
matrix:
format: [
{
type: "apk",
command: "androidApp:assembleRelease
-Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
-Pandroid.testoptions.manageddevices.emulator.gpu=\"swiftshader_indirect\"
-Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true
-Pandroid.experimental.androidTest.numManagedDeviceShards=1
-Pandroid.experimental.testOptions.managedDevices.maxConcurrentDevices=1
--no-configuration-cache",
output: "apk"
},
{
type: "aab",
command: "androidApp:generateReleaseBaseline
-Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
-Pandroid.testoptions.manageddevices.emulator.gpu=\"swiftshader_indirect\"
-Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true
-Pandroid.experimental.androidTest.numManagedDeviceShards=1
-Pandroid.experimental.testOptions.managedDevices.maxConcurrentDevices=1
--no-configuration-cache
androidApp:bundleRelease",
output: "bundle"
}
]
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Clean GMD
run: ./gradlew cleanManagedDevices --unused-only
- name: Decode Keystore
env:
ENCODED_KEYSTORE: ${{ secrets.KEYSTORE_ENCODED }}
run: |
echo $ENCODED_KEYSTORE > keystore-b64.txt
base64 -d keystore-b64.txt > ./androidApp/keystore.jks
- name: Build release
env:
KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }}
KEYSTORE_PATH: keystore.jks
run: ./gradlew ${{ matrix.format.command }}
- name: Upload Build
uses: actions/upload-artifact@v7
with:
name: app-release.${{ matrix.format.type }}
path: androidApp/build/outputs/${{ matrix.format.output }}/release/*.${{ matrix.format.type }}
- name: Upload mapping folder
uses: actions/upload-artifact@v7
with:
name: mapping-${{ matrix.format.type }}
path: androidApp/build/outputs/mapping/
- name: Set up Ruby
if: matrix.format.type == 'aab'
uses: ruby/setup-ruby@v1
with:
ruby-version: '4.0.6'
- name: Install fastlane
if: matrix.format.type == 'aab'
run: gem install fastlane -NV
- name: Write Play Store service account JSON
if: matrix.format.type == 'aab'
env:
GOOGLE_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_JSON }}
run: echo "$GOOGLE_SERVICE_ACCOUNT_JSON" > play-service-account.json
- name: Upload AAB to Play Store internal track
if: matrix.format.type == 'aab'
run: |
AAB_PATH=$(ls androidApp/build/outputs/bundle/release/*.aab | head -n 1)
fastlane android internal aab:"$AAB_PATH" json_key:play-service-account.json
release:
needs: build
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Tag Release
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag android-${{ github.event.inputs.version }}
git push origin android-${{ github.event.inputs.version }}
- name: Download APK
uses: actions/download-artifact@v8
with:
name: app-release.apk
- name: Download APK mapping
uses: actions/download-artifact@v8
with:
name: mapping-apk
path: mapping-apk
- name: Zip APK mapping
run: |
zip -r mapping-apk.zip mapping-apk/
- name: Download AAB
uses: actions/download-artifact@v8
with:
name: app-release.aab
- name: Download AAB mapping
uses: actions/download-artifact@v8
with:
name: mapping-aab
path: mapping-aab
- name: Zip AAB mapping
run: |
zip -r mapping-aab.zip mapping-aab/
- name: Create Release
id: create_release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: "*.apk,*.aab,mapping-apk.zip,mapping-aab.zip"
draft: true
name: "[Android] ${{ github.event.inputs.version }}"
tag: android-${{ github.event.inputs.version }}
-28
View File
@@ -1,28 +0,0 @@
name: Build and test
on:
pull_request:
push:
branches:
- master
jobs:
unit_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Unit tests
run: ./gradlew testDebugUnitTest
- name: Generate code coverage
run: ./gradlew app:koverXmlReportDebug
- name: Upload test coverage
uses: actions/upload-artifact@v3
with:
name: code-coverage.xml
path: app/build/coverage-report/result.xml
-117
View File
@@ -1,117 +0,0 @@
name: Build and release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
jobs:
unit_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/gradle-build-action@v2.10.0
- name: Unit tests
run: ./gradlew testDebugUnitTest
- name: Generate code coverage
run: ./gradlew app:koverXmlReportDebug
- name: Upload test coverage
uses: actions/upload-artifact@v3
with:
name: code-coverage.xml
path: app/build/coverage-report/result.xml
build:
needs: unit_tests
runs-on: ubuntu-latest
strategy:
matrix:
format: [
{ type: "apk", command: "assembleRelease", output: "apk" },
{ type: "aab", command: "bundleRelease", output: "bundle" }
]
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/gradle-build-action@v2.10.0
- name: Decode Keystore
env:
ENCODED_KEYSTORE: ${{ secrets.KEYSTORE_ENCODED }}
run: |
echo $ENCODED_KEYSTORE > keystore-b64.txt
base64 -d keystore-b64.txt > ./app/keystore.jks
- name: Build release
env:
KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }}
KEYSTORE_PATH: keystore.jks
run: ./gradlew ${{ matrix.format.command }}
- name: Upload Build
uses: actions/upload-artifact@v3
with:
name: app-release.${{ matrix.format.type }}
path: app/build/outputs/${{ matrix.format.output }}/release/*.${{ matrix.format.type }}
- name: Upload mapping folder
uses: actions/upload-artifact@v3
with:
name: mapping-${{ matrix.format.type }}
path: app/build/outputs/mapping/
release:
needs: build
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Tag Release
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag ${{ github.event.inputs.version }}
git push origin ${{ github.event.inputs.version }}
- name: Download APK
uses: actions/download-artifact@v3
with:
name: app-release.apk
- name: Download APK mapping
uses: actions/download-artifact@v3
with:
name: mapping-apk
path: mapping-apk
- name: Zip APK mapping
run: |
zip -r mapping-apk.zip mapping-apk/
- name: Download AAB
uses: actions/download-artifact@v3
with:
name: app-release.aab
- name: Download AAB mapping
uses: actions/download-artifact@v3
with:
name: mapping-aab
path: mapping-aab
- name: Zip AAB mapping
run: |
zip -r mapping-aab.zip mapping-aab/
- name: Create Release
id: create_release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: "app-release.apk,app-release.aab,mapping-apk.zip,mapping-aab.zip"
draft: true
name: ${{ github.event.inputs.version }}
tag: ${{ github.event.inputs.version }}
+277
View File
@@ -0,0 +1,277 @@
name: Desktop release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
jobs:
code_quality:
runs-on: windows-latest
steps:
- uses: actions/checkout@v7
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Unit tests
run: ./gradlew test
- name: Static checks
run: ./gradlew spotlessCheck
build_msi:
needs: code_quality
runs-on: windows-latest
steps:
- uses: actions/checkout@v7
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build MSI
run: |
./gradlew :desktopApp:packageReleaseMsi
- name: Upload MSI
uses: actions/upload-artifact@v7
with:
name: CPU.Info-${{ github.event.inputs.version }}.msi
path: desktopApp/build/compose/binaries/main-release/msi/*.msi
- name: Install MSIX Packaging Tool
run: |
winget install --id Microsoft.MSIXPackagingTool --accept-source-agreements --accept-package-agreements
shell: pwsh
- name: Create MSIX conversion template
run: |
$msiPath = (Get-ChildItem -Path "desktopApp/build/compose/binaries/main-release/msi/*.msi" | Select-Object -First 1).FullName
@"
<MsixPackagingToolTemplate
xmlns="http://schemas.microsoft.com/appx/msixpackagingtool/template/2018">
<Installer Path="$msiPath" />
<PackageInformation
PackageName="${{ secrets.MSIX_PACKAGE_NAME }}"
PackageDisplayName="${{ secrets.MSIX_PACKAGE_DISPLAY_NAME }}"
PublisherName="${{ secrets.MSIX_PUBLISHER_NAME }}"
PublisherDisplayName="${{ secrets.MSIX_PUBLISHER_DISPLAY_NAME }}"
Version="${{ github.event.inputs.version }}.0"
/>
<SaveLocation PackagePath="${{ github.workspace }}\output" />
</MsixPackagingToolTemplate>
"@ | Out-File -FilePath template.xml -Encoding utf8
shell: pwsh
- name: Convert MSI to MSIX
id: convert_msix
timeout-minutes: 30
run: |
New-Item -ItemType Directory -Force -Path output
$attempts = 3
for ($i = 1; $i -le $attempts; $i++) {
MsixPackagingTool.exe create-package --template template.xml
if ($LASTEXITCODE -eq 0) { break }
if ($i -eq $attempts) {
Write-Error "MSIX conversion failed after $attempts attempts."
exit 1
}
}
shell: pwsh
- name: Show MSIX Packaging Tool logs on failure
if: failure()
run: |
$logPath = Join-Path $env:LOCALAPPDATA "Packages\Microsoft.MSIXPackagingTool_8wekyb3d8bbwe\LocalState\DiagOutputDir\Logs\Log.txt"
if (Test-Path $logPath) {
Write-Host "MSIX Packaging Tool log: $logPath"
Get-Content $logPath -Tail 400
} else {
Write-Warning "MSIX Packaging Tool log not found at expected path: $logPath"
}
shell: pwsh
- name: Assert MSIX artifact exists
run: |
$msix = Get-ChildItem -Path "output/*.msix" -ErrorAction SilentlyContinue | Select-Object -First 1
if (-not $msix) {
Write-Error "MSIX conversion finished without producing an .msix file."
exit 1
}
shell: pwsh
- name: Upload MSIX
uses: actions/upload-artifact@v7
with:
name: CPU.Info-${{ github.event.inputs.version }}.msix
path: output/*.msix
build_linux_x64_uber_jar:
needs: code_quality
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build Uber JAR
run: ./gradlew :desktopApp:packageReleaseUberJarForCurrentOS
- name: Upload Uber JAR
uses: actions/upload-artifact@v7
with:
name: CPU-Info-linux-x64-${{ github.event.inputs.version }}-release.jar
path: desktopApp/build/compose/jars/*.jar
build_mac_uber_jar:
needs: code_quality
runs-on: macos-26
steps:
- uses: actions/checkout@v7
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build Uber JAR
run: ./gradlew :desktopApp:packageReleaseUberJarForCurrentOS
- name: Upload Uber JAR
uses: actions/upload-artifact@v7
with:
name: CPU-Info-macos-arm64-${{ github.event.inputs.version }}-release.jar
path: desktopApp/build/compose/jars/*.jar
build_mac_dmg:
needs: code_quality
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
- runner: macos-26
arch: arm64
- runner: macos-15-intel
arch: x64
steps:
- uses: actions/checkout@v7
- name: set up JDK 18
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: 18
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
- name: Cache KMP tooling
uses: actions/cache@v6
with:
path: |
~/.konan
key: ${{ runner.os }}-v1-${{ hashFiles('*.versions.toml') }}
- name: Import certs
uses: apple-actions/import-codesign-certs@v7
with:
p12-file-base64: ${{ secrets.MAC_NOTARIZATION_CERT }}
p12-password: ${{ secrets.MAC_NOTARIZATION_CERT_PASS }}
- name: Create path variables
id: path_variables
run: |
name="CPU-Info-${{ matrix.arch }}-${{ github.event.inputs.version }}.dmg"
path="desktopApp/build/compose/binaries/main-release/dmg/CPU-Info-${{ github.event.inputs.version }}.dmg"
echo "RELEASE_NAME=$name" >> $GITHUB_ENV
echo "RELEASE_PATH=$path" >> $GITHUB_ENV
- name: Create and notarize DMG
run: |
./gradlew desktopApp:notarizeReleaseDmg -PmacOsNotarization=true \
-Pcompose.desktop.mac.notarization.appleID=$MAC_NOTARIZATION_ID \
-Pcompose.desktop.mac.notarization.password=$MAC_NOTARIZATION_PWD \
-Pcompose.desktop.mac.notarization.teamID=$MAC_APPSTORE_TEAM_ID
env:
MAC_NOTARIZATION_ID: ${{ secrets.MAC_NOTARIZATION_ID }}
MAC_NOTARIZATION_PWD: ${{ secrets.MAC_NOTARIZATION_PWD }}
MAC_APPSTORE_TEAM_ID: ${{ secrets.MAC_APPSTORE_TEAM_ID }}
RELEASE_PATH: ${{ env.RELEASE_PATH }}
- name: Show notarization logs on failure
if: failure()
run: |
echo "=== notarizeReleaseDmg stdout logs ==="
find desktopApp/build/compose/logs/notarizeReleaseDmg -name "*-out.txt" 2>/dev/null | sort | while read f; do
echo "--- $f ---"
cat "$f"
done
echo "=== notarizeReleaseDmg stderr logs ==="
find desktopApp/build/compose/logs/notarizeReleaseDmg -name "*-err.txt" 2>/dev/null | sort | while read f; do
echo "--- $f ---"
cat "$f"
done
- name: Upload DMG
uses: actions/upload-artifact@v7
with:
name: ${{ env.RELEASE_NAME }}
path: ${{ env.RELEASE_PATH }}
tag_and_create_release:
needs: [ build_msi, build_linux_x64_uber_jar, build_mac_dmg, build_mac_uber_jar ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Download MSI
uses: actions/download-artifact@v8
with:
name: CPU.Info-${{ github.event.inputs.version }}.msi
- name: Download MSIX
uses: actions/download-artifact@v8
with:
name: CPU.Info-${{ github.event.inputs.version }}.msix
- name: Download Linux x64 Uber JAR
uses: actions/download-artifact@v8
with:
name: CPU-Info-linux-x64-${{ github.event.inputs.version }}-release.jar
- name: Download Mac x64 DMG
uses: actions/download-artifact@v8
with:
name: CPU-Info-x64-${{ github.event.inputs.version }}.dmg
- name: Rename Mac x64 DMG file
run: mv CPU-Info-${{ github.event.inputs.version }}.dmg CPU-Info-macos-x64-${{ github.event.inputs.version }}.dmg
- name: Download Mac arm64 DMG
uses: actions/download-artifact@v8
with:
name: CPU-Info-arm64-${{ github.event.inputs.version }}.dmg
- name: Rename Mac arm64 DMG file
run: mv CPU-Info-${{ github.event.inputs.version }}.dmg CPU-Info-macos-arm64-${{ github.event.inputs.version }}.dmg
- name: Download Mac OS Uber JAR
uses: actions/download-artifact@v8
with:
name: CPU-Info-macos-arm64-${{ github.event.inputs.version }}-release.jar
- name: Tag Release
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag jvm-${{ github.event.inputs.version }}
git push origin jvm-${{ github.event.inputs.version }}
- name: Create Release
id: create_release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: "*.msi, *.msix, *.jar, *.dmg"
draft: true
name: "[JVM] ${{ github.event.inputs.version }}"
tag: jvm-${{ github.event.inputs.version }}
+134
View File
@@ -0,0 +1,134 @@
name: iOS release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
jobs:
code_quality:
runs-on: macos-26
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Unit tests
run: ./gradlew testDebugUnitTest
- name: Static checks
run: ./gradlew spotlessCheck
build_and_release:
needs: code_quality
runs-on: macos-26
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
- name: Cache KMP tooling
uses: actions/cache@v6
with:
path: |
~/.konan
key: ${{ runner.os }}-v1-${{ hashFiles('*.versions.toml') }}
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Import certs
uses: apple-actions/import-codesign-certs@v7
with:
p12-file-base64: ${{ secrets.IOS_CERTIFICATES_P12 }}
p12-password: ${{ secrets.IOS_CERTIFICATES_PASSWORD }}
- name: Download provisioning profiles
uses: apple-actions/download-provisioning-profiles@v6
with:
bundle-id: ${{ secrets.IOS_BUNDLE_ID }}
issuer-id: ${{ secrets.IOS_APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.IOS_APPSTORE_KEY_ID }}
api-private-key: ${{ secrets.IOS_APPSTORE_PRIVATE_KEY }}
- name: Build archive
run: |
cd iosApp
xcrun xcodebuild \
-scheme "iosApp" \
-configuration "Release" \
-sdk "iphoneos" \
-parallelizeTargets \
-showBuildTimingSummary \
-disableAutomaticPackageResolution \
-derivedDataPath "${RUNNER_TEMP}/Build/DerivedData" \
-archivePath "${RUNNER_TEMP}/Build/Archives/cpuinfo.xcarchive" \
-resultBundlePath "${RUNNER_TEMP}/Build/Artifacts/cpuinfo.xcresult" \
-destination "generic/platform=iOS" \
DEVELOPMENT_TEAM="${{ secrets.IOS_APPSTORE_TEAM_ID }}" \
PRODUCT_BUNDLE_IDENTIFIER="${{ secrets.IOS_BUNDLE_ID }}" \
CODE_SIGN_STYLE="Manual" \
PROVISIONING_PROFILE_SPECIFIER="${{ secrets.IOS_DEV_PROVISIONING_PROFILE_NAME }}" \
archive
- name: "Generate ExportOptions.plist"
run: |
cat <<EOF > ${RUNNER_TEMP}/Build/ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>destination</key>
<string>export</string>
<key>method</key>
<string>app-store</string>
<key>signingStyle</key>
<string>manual</string>
<key>generateAppStoreInformation</key>
<true/>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>${{ secrets.IOS_APPSTORE_TEAM_ID }}</string>
<key>uploadSymbols</key>
<true/>
<key>provisioningProfiles</key>
<dict>
<key>${{ secrets.IOS_BUNDLE_ID }}</key>
<string>${{ secrets.IOS_DIST_PROVISIONING_PROFILE_NAME }}</string>
</dict>
</dict>
</plist>
EOF
- id: build_ipa
name: Build IPA
run: |
xcrun xcodebuild \
-exportArchive \
-exportOptionsPlist "${RUNNER_TEMP}/Build/ExportOptions.plist" \
-archivePath "${RUNNER_TEMP}/Build/Archives/cpuinfo.xcarchive" \
-exportPath "${RUNNER_TEMP}/Build/Archives/cpuinfo.xcarchive" \
PRODUCT_BUNDLE_IDENTIFIER="${{ secrets.IOS_BUNDLE_ID }}"
echo "ipa_path=${RUNNER_TEMP}/Build/Archives/cpuinfo.xcarchive/CPU Info.ipa" >> $GITHUB_ENV
- uses: Apple-Actions/upload-testflight-build@v5
with:
app-path: ${{ env.ipa_path }}
issuer-id: ${{ secrets.IOS_APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.IOS_APPSTORE_KEY_ID }}
api-private-key: ${{ secrets.IOS_APPSTORE_PRIVATE_KEY }}
- name: Tag Release
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag ios-${{ github.event.inputs.version }}
git push origin ios-${{ github.event.inputs.version }}
+85
View File
@@ -0,0 +1,85 @@
name: Mac App Store release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
jobs:
code_quality:
runs-on: macos-26
steps:
- uses: actions/checkout@v7
- name: set up JDK 18
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: 18
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Unit tests
run: ./gradlew testDebugUnitTest
- name: Static checks
run: ./gradlew spotlessCheck
build_and_release:
needs: code_quality
runs-on: macos-26
steps:
- uses: actions/checkout@v7
- name: set up JDK 18
uses: actions/setup-java@v5
with:
distribution: 'zulu'
java-version: 18
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
- name: Cache KMP tooling
uses: actions/cache@v6
with:
path: |
~/.konan
key: ${{ runner.os }}-v1-${{ hashFiles('*.versions.toml') }}
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Import certs
uses: apple-actions/import-codesign-certs@v7
with:
p12-file-base64: ${{ secrets.MAC_CERTIFICATES_P12 }}
p12-password: ${{ secrets.MAC_CERTIFICATES_PASSWORD }}
- name: Create Embedded Provision Profile
run: |
echo "$EMBEDDED_PROVISION" > desktopApp/embedded.provisionprofile.b64
base64 -d -i desktopApp/embedded.provisionprofile.b64 > desktopApp/embedded.provisionprofile
env:
EMBEDDED_PROVISION: ${{ secrets.MAC_EMBEDDED_PROVISION }}
- name: Create Runtime Provision Profile
run: |
echo "$RUNTIME_PROVISION" > desktopApp/runtime.provisionprofile.b64
base64 -d -i desktopApp/runtime.provisionprofile.b64 > desktopApp/runtime.provisionprofile
env:
RUNTIME_PROVISION: ${{ secrets.MAC_RUNTIME_PROVISION }}
- name: Create PKG
run: ./gradlew packageReleasePkg -PmacOsAppStoreRelease=true
- uses: Apple-Actions/upload-testflight-build@v5
with:
app-type: 'osx'
app-path: desktopApp/build/compose/binaries/main-release/pkg/CPU-Info-${{ github.event.inputs.version }}.pkg
issuer-id: ${{ secrets.IOS_APPSTORE_ISSUER_ID }}
api-key-id: ${{ secrets.IOS_APPSTORE_KEY_ID }}
api-private-key: ${{ secrets.IOS_APPSTORE_PRIVATE_KEY }}
+30
View File
@@ -0,0 +1,30 @@
name: Shared tests
on:
pull_request:
push:
branches:
- master
jobs:
unit_tests:
runs-on: macos-26
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Unit tests
run: ./gradlew allTests
- name: Generate code coverage
run: ./gradlew shared:koverXmlReport
- name: Upload test coverage
uses: actions/upload-artifact@v7
with:
name: code-coverage.xml
path: shared/build/coverage-report/result.xml
- name: Static checks
run: ./gradlew spotlessCheck
+142
View File
@@ -0,0 +1,142 @@
name: Wear OS release
on:
workflow_dispatch:
inputs:
version:
description: 'Version'
required: true
jobs:
unit_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: corretto
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Unit tests
run: ./gradlew allTests
- name: Generate code coverage
run: './gradlew shared:koverXmlReport'
- name: Upload test coverage
uses: actions/upload-artifact@v7
with:
name: code-coverage.xml
path: shared/build/coverage-report/result.xml
- name: Static checks
run: ./gradlew spotlessCheck
build:
needs: unit_tests
runs-on: ubuntu-latest
strategy:
matrix:
format:
- type: apk
command: 'wearOsApp:assembleRelease'
output: apk
- type: aab
command: 'wearOsApp:bundleRelease'
output: bundle
steps:
- uses: actions/checkout@v7
- name: set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: corretto
cache: gradle
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Decode Keystore
env:
ENCODED_KEYSTORE: '${{ secrets.KEYSTORE_ENCODED }}'
run: |
echo $ENCODED_KEYSTORE > keystore-b64.txt
base64 -d keystore-b64.txt > ./wearOsApp/keystore.jks
- name: Build release
env:
KEYSTORE_ALIAS: '${{ secrets.KEYSTORE_ALIAS }}'
KEYSTORE_PASS: '${{ secrets.KEYSTORE_PASS }}'
KEYSTORE_PATH: keystore.jks
run: './gradlew ${{ matrix.format.command }}'
- name: Upload Build
uses: actions/upload-artifact@v7
with:
name: 'app-release.${{ matrix.format.type }}'
path: >-
wearOsApp/build/outputs/${{ matrix.format.output }}/release/*.${{
matrix.format.type }}
- name: Upload mapping folder
uses: actions/upload-artifact@v7
with:
name: 'mapping-${{ matrix.format.type }}'
path: wearOsApp/build/outputs/mapping/
- name: Set up Ruby
if: matrix.format.type == 'aab'
uses: ruby/setup-ruby@v1
with:
ruby-version: '4.0.6'
- name: Install fastlane
if: matrix.format.type == 'aab'
run: gem install fastlane -NV
- name: Write Play Store service account JSON
if: matrix.format.type == 'aab'
env:
GOOGLE_SERVICE_ACCOUNT_JSON: '${{ secrets.GOOGLE_SERVICE_ACCOUNT_JSON }}'
run: echo "$GOOGLE_SERVICE_ACCOUNT_JSON" > play-service-account.json
- name: Upload AAB to Play Store internal track
if: matrix.format.type == 'aab'
run: |
AAB_PATH=$(ls wearOsApp/build/outputs/bundle/release/*.aab | head -n 1)
fastlane android internal aab:"$AAB_PATH" json_key:play-service-account.json track:wear:internal
release:
needs: build
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Tag Release
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag wear-${{ github.event.inputs.version }}
git push origin wear-${{ github.event.inputs.version }}
- name: Download APK
uses: actions/download-artifact@v8
with:
name: app-release.apk
- name: Download APK mapping
uses: actions/download-artifact@v8
with:
name: mapping-apk
path: mapping-apk
- name: Zip APK mapping
run: |
zip -r mapping-apk.zip mapping-apk/
- name: Download AAB
uses: actions/download-artifact@v8
with:
name: app-release.aab
- name: Download AAB mapping
uses: actions/download-artifact@v8
with:
name: mapping-aab
path: mapping-aab
- name: Zip AAB mapping
run: |
zip -r mapping-aab.zip mapping-aab/
- name: Create Release
id: create_release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: '*.apk,*.aab,mapping-apk.zip,mapping-aab.zip'
draft: true
name: '[WearOS] ${{ github.event.inputs.version }}'
tag: 'wear-${{ github.event.inputs.version }}'
+11
View File
@@ -5,7 +5,18 @@ local.properties
build/
captures/
.cxx/
.kotlin/
.idea/
!/.idea/codeStyles
!/.idea/icon.png
captures
.externalNativeBuild
.cxx
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcodeproj/xcshareddata/
!*.xcodeproj/project.xcworkspace/
!*.xcworkspace/contents.xcworkspacedata
**/xcshareddata/WorkspaceSettings.xcsettings
+35
View File
@@ -1,5 +1,40 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JavaCodeStyleSettings>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="" withSubpackages="true" static="false" module="true" />
<package name="android" withSubpackages="true" static="true" />
<package name="androidx" withSubpackages="true" static="true" />
<package name="com" withSubpackages="true" static="true" />
<package name="junit" withSubpackages="true" static="true" />
<package name="net" withSubpackages="true" static="true" />
<package name="org" withSubpackages="true" static="true" />
<package name="java" withSubpackages="true" static="true" />
<package name="javax" withSubpackages="true" static="true" />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
<package name="android" withSubpackages="true" static="false" />
<emptyLine />
<package name="androidx" withSubpackages="true" static="false" />
<emptyLine />
<package name="com" withSubpackages="true" static="false" />
<emptyLine />
<package name="junit" withSubpackages="true" static="false" />
<emptyLine />
<package name="net" withSubpackages="true" static="false" />
<emptyLine />
<package name="org" withSubpackages="true" static="false" />
<emptyLine />
<package name="java" withSubpackages="true" static="false" />
<emptyLine />
<package name="javax" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
<emptyLine />
</value>
</option>
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
+19
View File
@@ -0,0 +1,19 @@
# Project
This is a compose multiplatform project build for Android, iOS, JVM and web. App is focused around
hardware and software of the devices. App is built using MVVM architecture with AndroidX lifecycle
and Kotlin Coroutines for asynchronous programming. It is using DataStore for key-value storage.
# Commands
- Run tests: `./gradlew allTests`
- Format code: `./gradlew spotlessApply`
# Code style
- Use 4 spaces for indentation
- Pass data to VM with Interactor
- From VM expose data as StateFlow using single UiState
- For events use Channel<Event>(Channel.BUFFERED) and observe them in compose with ObserveAsEvents
- In VM use `on` prefix for callback functions like `onEvent`, `onClick` etc.
- Use composeResources for all strings
+35 -19
View File
@@ -1,10 +1,10 @@
![Build and test](https://github.com/kamgurgul/cpu-info/actions/workflows/build_and_test.yml/badge.svg)
![Build and test](https://github.com/kamgurgul/cpu-info/actions/workflows/shared_test.yml/badge.svg)
<img src="info/icon_glow.png" width="100" height="100" />
<img src="info/icon_glow.png" width="100" height="100" alt="CPU Info Icon" />
CPU Info (refactor-in-progress ⛏)
=================================
CPU Info provides information about Android device hardware and software.
# CPU Info
CPU Info provides comprehensive information about your device's hardware and software.
[<img src="https://f-droid.org/badge/get-it-on.png"
alt="Get it on F-Droid"
@@ -17,26 +17,42 @@ alt="Get it on HUAWEI AppGallery"
height="80">](https://appgallery.cloud.huawei.com/ag/n/app/C102414279?channelId=Main+badge+&id=fb28f69db40840f8b79b541cc4a13775&s=1378847C6B5A46F97603F316DD1450C7D3F74C023A62827B43619C2D41F2341D&detailType=0&v=&callType=AGDLINK&installType=0000)
[<img src="https://raw.githubusercontent.com/kamgurgul/cpu-info/master/info/get-it-on-github.png"
alt='Get it on GitHub' height="80">](https://github.com/kamgurgul/cpu-info/releases/latest)
[<img src="https://raw.githubusercontent.com/kamgurgul/cpu-info/master/info/amazon-badge.png"
alt='Available on Amazon AppStore' height="80">](https://www.amazon.com/Kamil-Gurgul-KG-Soft-Info/dp/B088FYQTYR/ref=sr_1_5?keywords=cpu+info&qid=1661020642&s=mobile-apps&sr=1-5)
[<img src="info/app-store-badge.png"
alt="Download on the App Store"
height="80">](https://apps.apple.com/us/app/cpu-info/id6560116815)
[<img src="info/flathub_badge.png"
alt="Get it on Flathub"
height="80">](https://flathub.org/apps/com.kgurgul.cpuinfo)
[<img src="info/ms_badge.png"
alt="Get it from Microsoft"
height="80">](https://apps.microsoft.com/detail/9phxq0f4knbl)
[<img src="info/get-it-on-homebrew.png"
alt="Get it from Homebrew"
height="80">](https://formulae.brew.sh/cask/cpu-info)
TODO
====
## Supported platforms
* Add more information about battery
* Bring back apps size - use StorageStatsManager if possible
* Unit and UI tests
* Add Kotlin Multiplatform module
* Add translations framework
* Add device benchmarks
| Android | Android TV | Wear OS | iOS | Desktop | Wasm |
|:-------:|:----------:|:-------:|:---:|:-------:|:-------------------------------------------------------:|
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅<br/>[In preview](https://kgurgul.com/assets/cpuinfo/) |
Alternative stores
==================
## Tech stack
* [Amazon](https://www.amazon.com/Kamil-Gurgul-KG-Soft-Info/dp/B088FYQTYR/ref=sr_1_5?keywords=cpu+info&qid=1661020642&s=mobile-apps&sr=1-5)
* [Kotlin Multiplatform](https://kotlinlang.org/docs/multiplatform.html)
* [Compose Multiplatform](https://www.jetbrains.com/lp/compose-multiplatform/)
* [Jetpack ViewModel/Lifecycle](https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-lifecycle.html)
* [Coroutines](https://github.com/Kotlin/kotlinx.coroutines)
* [Koin](https://github.com/InsertKoinIO/koin)
* [Coil](https://github.com/coil-kt/coil)
* [DataStore](https://developer.android.com/kotlin/multiplatform/datastore)
* [pytorch/cpuinfo](https://github.com/pytorch/cpuinfo)
* [OSHI](https://github.com/oshi/oshi)
License
-------
## License
Copyright 2017 KG Soft
Copyright KG Soft
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1
View File
@@ -0,0 +1 @@
/build
+1
View File
@@ -0,0 +1 @@
/build
@@ -0,0 +1,54 @@
import com.kgurgul.AndroidVersions
plugins {
alias(libs.plugins.androidTest)
alias(libs.plugins.baselineprofile)
}
android {
namespace = "com.kgurgul.cpuinfo.baselineprofile"
compileSdk = AndroidVersions.COMPILE_SDK
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
defaultConfig {
minSdk = 28
targetSdk = AndroidVersions.TARGET_SDK
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
targetProjectPath = ":androidApp"
testOptions.managedDevices.allDevices {
create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api33") {
device = "Pixel 6"
apiLevel = 33
systemImageSource = "aosp"
}
}
}
baselineProfile {
managedDevices += "pixel6Api33"
useConnectedDevices = false
}
dependencies {
implementation(libs.androidx.benchmark.macro.junit4)
implementation(libs.androidx.test.ext)
implementation(libs.androidx.test.espresso.core)
implementation(libs.androidx.test.uiautomator)
}
androidComponents {
onVariants { v ->
v.instrumentationRunnerArguments.put(
"targetAppId",
v.testedApks.map { v.artifacts.getBuiltArtifactsLoader().load(it)?.applicationId!! },
)
}
}
@@ -0,0 +1 @@
<manifest />
@@ -0,0 +1,43 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.baselineprofile
import androidx.benchmark.macro.junit4.BaselineProfileRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {
@get:Rule val rule = BaselineProfileRule()
@Test
fun generate() {
val packageName =
InstrumentationRegistry.getArguments().getString("targetAppId")
?: throw Exception("targetAppId not passed as instrumentation runner arg")
rule.collect(packageName = packageName, includeInStartupProfile = true) {
pressHome()
startActivityAndWait()
waitForAsyncContent()
}
}
}
@@ -0,0 +1,28 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.baselineprofile
import androidx.benchmark.macro.MacrobenchmarkScope
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiScrollable
import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until
fun MacrobenchmarkScope.waitForAsyncContent() {
device.wait(Until.hasObject(By.res("cpu_info_lazy_column")), 5_000)
val element = UiScrollable(UiSelector().scrollable(true))
element.scrollToEnd(3)
}
@@ -0,0 +1,59 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.baselineprofile
import androidx.benchmark.macro.BaselineProfileMode
import androidx.benchmark.macro.CompilationMode
import androidx.benchmark.macro.StartupMode
import androidx.benchmark.macro.StartupTimingMetric
import androidx.benchmark.macro.junit4.MacrobenchmarkRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@LargeTest
class StartupBenchmarks {
@get:Rule val rule = MacrobenchmarkRule()
@Test fun startupCompilationNone() = benchmark(CompilationMode.None())
@Test
fun startupCompilationBaselineProfiles() =
benchmark(CompilationMode.Partial(BaselineProfileMode.Require))
private fun benchmark(compilationMode: CompilationMode) {
val packageName =
InstrumentationRegistry.getArguments().getString("targetAppId")
?: throw Exception("targetAppId not passed as instrumentation runner arg")
rule.measureRepeated(
packageName = packageName,
metrics = listOf(StartupTimingMetric()),
compilationMode = compilationMode,
startupMode = StartupMode.COLD,
iterations = 10,
setupBlock = { pressHome() },
measureBlock = {
startActivityAndWait()
waitForAsyncContent()
},
)
}
}
+138
View File
@@ -0,0 +1,138 @@
import com.github.jk1.license.filter.DependencyFilter
import com.github.jk1.license.filter.LicenseBundleNormalizer
import com.github.jk1.license.render.JsonReportRenderer
import com.github.jk1.license.render.ReportRenderer
import com.kgurgul.AndroidSigningConfig
import com.kgurgul.AndroidVersions
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.baselineprofile)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.licenses)
alias(libs.plugins.serialization)
id("kotlin-parcelize")
}
kotlin {
jvmToolchain(17)
}
android {
compileSdk = AndroidVersions.COMPILE_SDK
defaultConfig {
applicationId = "com.kgurgul.cpuinfo"
minSdk = AndroidVersions.MIN_SDK
targetSdk = AndroidVersions.TARGET_SDK
versionCode = AndroidVersions.VERSION_CODE
versionName = AndroidVersions.VERSION_NAME
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
namespace = "com.kgurgul.cpuinfo"
signingConfigs {
getByName("debug") {
val debugSigningConfig = AndroidSigningConfig.getDebugProperties(rootProject.rootDir)
storeFile = file(debugSigningConfig.getProperty(AndroidSigningConfig.KEY_PATH))
keyAlias = debugSigningConfig.getProperty(AndroidSigningConfig.KEY_ALIAS)
keyPassword = debugSigningConfig.getProperty(AndroidSigningConfig.KEY_PASS)
storePassword = debugSigningConfig.getProperty(AndroidSigningConfig.KEY_PASS)
}
create("release") {
val releaseSigningConfig =
AndroidSigningConfig.getReleaseProperties(rootProject.rootDir)
storeFile = file(releaseSigningConfig.getProperty(AndroidSigningConfig.KEY_PATH))
keyAlias = releaseSigningConfig.getProperty(AndroidSigningConfig.KEY_ALIAS)
keyPassword = releaseSigningConfig.getProperty(AndroidSigningConfig.KEY_PASS)
storePassword = releaseSigningConfig.getProperty(AndroidSigningConfig.KEY_PASS)
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
debug {
signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = false
enableUnitTestCoverage = true
applicationIdSuffix = ".debug"
}
}
buildFeatures {
compose = true
buildConfig = true
}
packaging {
jniLibs {
useLegacyPackaging = false
}
}
testOptions {
unitTests {
isReturnDefaultValues = true
isIncludeAndroidResources = true
}
animationsDisabled = true
execution = "ANDROIDX_TEST_ORCHESTRATOR"
}
lint {
abortOnError = false
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
baselineProfile {
saveInSrc = true
}
composeCompiler {
// Opt-in only: the Compose compiler metrics/reports writer crashes on Windows
// ("Invalid file path") under Kotlin 2.4.0. Enable with -PenableComposeCompilerReports=true.
if (providers.gradleProperty("enableComposeCompilerReports").orNull == "true") {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
}
licenseReport {
renderers = arrayOf<ReportRenderer>(JsonReportRenderer("licenses.json"))
filters = arrayOf<DependencyFilter>(LicenseBundleNormalizer())
}
dependencies {
implementation(projects.shared)
implementation(libs.androidx.profileinstaller)
androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.ext)
androidTestImplementation(libs.androidx.test.espresso.core)
androidTestImplementation(libs.androidx.test.espresso.contrib)
androidTestImplementation(libs.compose.ui.test)
debugImplementation(libs.compose.ui.testManifest)
androidTestUtil(libs.androidx.test.orchestrator)
"baselineProfile"(projects.androidApp.baselineprofile)
}
+7
View File
@@ -0,0 +1,7 @@
# Remove logs
-assumenosideeffects class co.touchlab.kermit.Logger {
public *** v(...);
public *** d(...);
public *** i(...);
public *** e(...);
}
@@ -1,11 +1,11 @@
/*
* Copyright 2017 KG Soft
* Copyright KG Soft
*
* 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
* 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,
@@ -13,20 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@file:JvmName("TestExtensions")
package com.kgurgul.cpuinfo.core
import androidx.annotation.StringRes
import androidx.test.platform.app.InstrumentationRegistry
import org.hamcrest.CoreMatchers
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import com.kgurgul.cpuinfo.HostActivity
import org.junit.Rule
/**
* Kotlin definition for [CoreMatchers. is] method to avoid problems with 'is' keyword
*/
fun <T> isk(value: T) = CoreMatchers.`is`(value)!!
abstract class BaseTestSuit {
fun getString(@StringRes id: Int): String = InstrumentationRegistry.getInstrumentation()
.targetContext
.getString(id)
@get:Rule val androidComposeRule = createAndroidComposeRule<HostActivity>()
}
@@ -1,11 +1,11 @@
/*
* Copyright 2017 KG Soft
* Copyright KG Soft
*
* 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
* 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,
@@ -13,70 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kgurgul.cpuinfo.core
import android.view.View
import androidx.appcompat.widget.Toolbar
import androidx.compose.ui.test.SemanticsNodeInteraction
import androidx.compose.ui.test.SemanticsNodeInteractionCollection
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsToggleable
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.ViewInteraction
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.BoundedMatcher
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.hasChildCount
import androidx.test.espresso.matcher.ViewMatchers.hasMinimumChildCount
import androidx.test.espresso.matcher.ViewMatchers.withText
import com.kgurgul.cpuinfo.core.CustomMatchers.atPosition
import org.hamcrest.Description
import org.hamcrest.Matcher
/**
* Singleton with custom matchers.
*
* @author kgurgul
*/
object CustomMatchers {
/**
* Matcher for toolbar title
*/
fun withToolbarTitle(textMatcher: Matcher<CharSequence>): Matcher<Any> {
return object : BoundedMatcher<Any, Toolbar>(Toolbar::class.java) {
public override fun matchesSafely(toolbar: Toolbar): Boolean {
return textMatcher.matches(toolbar.title)
}
override fun describeTo(description: Description) {
description.appendText("with toolbar title: ")
textMatcher.describeTo(description)
}
}
}
/**
* Matcher for [RecyclerView] items
*/
fun atPosition(position: Int, itemMatcher: Matcher<View>): Matcher<View> {
return object : BoundedMatcher<View, RecyclerView>(RecyclerView::class.java) {
override fun describeTo(description: Description) {
description.appendText("has item at position $position: ")
itemMatcher.describeTo(description)
}
override fun matchesSafely(view: RecyclerView): Boolean {
val viewHolder = view.findViewHolderForAdapterPosition(position) ?: return false
return itemMatcher.matches(viewHolder.itemView)
}
}
}
}
fun ViewInteraction.isDisplayed(): Boolean {
return try {
@@ -172,15 +120,6 @@ fun ViewInteraction.hasElementsCount(count: Int): Boolean {
}
}
fun ViewInteraction.hasItemAtPosition(position: Int, itemMatcher: Matcher<View>): Boolean {
return try {
check(matches(atPosition(position, itemMatcher)))
true
} catch (e: Throwable) {
false
}
}
fun SemanticsNodeInteraction.isToggleable(): Boolean {
return try {
assertIsToggleable()
@@ -204,8 +143,6 @@ fun SemanticsNodeInteraction.isNotDisplayed(): Boolean {
}
fun SemanticsNodeInteractionCollection.hasAnyElement(): Boolean {
val matchedNodes = fetchSemanticsNodes(
atLeastOneRootRequired = true,
)
val matchedNodes = fetchSemanticsNodes(atLeastOneRootRequired = true)
return matchedNodes.isNotEmpty()
}
@@ -0,0 +1,37 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.pages
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.cpu
import com.kgurgul.cpuinfo.ui.components.TEST_TAG_CPU_TOP_APP_BAR
import kotlinx.coroutines.runBlocking
import org.jetbrains.compose.resources.getString
class InfoContainerPage(composeContent: ComposeContentTestRule) {
private val toolbarTitle = composeContent.onNodeWithTag(TEST_TAG_CPU_TOP_APP_BAR)
private val cpuTab = composeContent.onNodeWithText(runBlocking { getString(Res.string.cpu) })
fun assertViewDisplayed() {
toolbarTitle.assertIsDisplayed()
cpuTab.assertIsDisplayed()
}
}
@@ -1,11 +1,11 @@
/*
* Copyright 2017 KG Soft
* Copyright KG Soft
*
* 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
* 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,
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kgurgul.cpuinfo.testsuits.information
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -28,6 +27,7 @@ class InfoTestSuit : BaseTestSuit() {
private val infoContainerPage = InfoContainerPage(androidComposeRule)
@Test
fun checkInfoTabs() {
fun checkInitialScreenDisplayed() {
infoContainerPage.assertViewDisplayed()
}
}
}
@@ -0,0 +1,35 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.uitestutils.conditionwatcher
import java.util.concurrent.TimeoutException
@Synchronized
fun waitForCondition(timeoutMillis: Long = 5000L, condition: () -> Boolean) {
val step = 250L
var totalTime = 0L
do {
if (condition()) {
break
}
totalTime += step
Thread.sleep(step)
if (totalTime > timeoutMillis) {
throw TimeoutException("Condition timed out after: ${totalTime}ms")
}
} while (true)
}
+92
View File
@@ -0,0 +1,92 @@
<?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" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="PackageVisibilityPolicy,QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.READ_BASIC_PHONE_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.wifi"
android:required="false" />
<application
android:name=".CpuInfoApp"
android:allowBackup="true"
android:banner="@mipmap/ic_banner"
android:enableOnBackInvokedCallback="true"
android:extractNativeLibs="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:resizeableActivity="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false"
android:theme="@style/AppThemeBase"
tools:targetApi="tiramisu">
<activity
android:name="com.kgurgul.cpuinfo.HostActivity"
android:exported="true"
android:theme="@style/Theme.Launcher"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="kgurgul.com" />
<data android:pathPattern="/assets/cpuinfo.*" />
</intent-filter>
</activity>
<activity
android:name="com.kgurgul.cpuinfo.tv.TvActivity"
android:exported="true"
android:theme="@style/Theme.Launcher"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".features.cputile.CpuTileService"
android:exported="true"
android:icon="@drawable/ic_cpu_low"
android:label="@string/app_name"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
</application>
</manifest>
@@ -0,0 +1,35 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo
import android.app.Application
import com.kgurgul.cpuinfo.appinitializers.AppInitializerComponent
import com.kgurgul.cpuinfo.di.androidModule
import com.kgurgul.cpuinfo.di.sharedModule
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
class CpuInfoApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@CpuInfoApp)
modules(androidModule, sharedModule)
}
AppInitializerComponent().init(this)
}
}
@@ -0,0 +1,111 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.kgurgul.cpuinfo.features.HostScreen
import com.kgurgul.cpuinfo.features.HostViewModel
import com.kgurgul.cpuinfo.ui.shouldUseDarkTheme
import com.kgurgul.cpuinfo.ui.theme.CpuInfoTheme
import com.kgurgul.cpuinfo.ui.theme.DarkColors
import com.kgurgul.cpuinfo.ui.theme.LightColors
import com.kgurgul.cpuinfo.ui.theme.darkPrimary
import com.kgurgul.cpuinfo.ui.theme.lightPrimary
import com.kgurgul.cpuinfo.utils.AndroidShortcutManager
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
class HostActivity : ComponentActivity() {
private val viewModel: HostViewModel by viewModel()
private val androidShortcutManager: AndroidShortcutManager by inject()
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
var uiState: HostViewModel.UiState by mutableStateOf(HostViewModel.UiState())
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiStateFlow.onEach { uiState = it }.collect()
}
}
splashScreen.setKeepOnScreenCondition { uiState.isLoading }
enableEdgeToEdge()
setContent {
val darkTheme = shouldUseDarkTheme(uiState)
val systemBarScrim = (if (darkTheme) darkPrimary else lightPrimary).toArgb()
DisposableEffect(darkTheme) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.dark(systemBarScrim),
navigationBarStyle = SystemBarStyle.dark(systemBarScrim),
)
onDispose {}
}
val dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
val colors =
when {
dynamicColor && darkTheme -> {
val dynamicDarkColors = dynamicDarkColorScheme(LocalContext.current)
DarkColors.copy(
secondary = dynamicDarkColors.secondaryFixed,
onSecondary = dynamicDarkColors.onSecondaryFixed,
)
}
dynamicColor && !darkTheme -> {
val dynamicLightColors = dynamicLightColorScheme(LocalContext.current)
LightColors.copy(
secondary = dynamicLightColors.secondaryFixed,
onSecondary = dynamicLightColors.onSecondaryFixed,
)
}
darkTheme -> DarkColors
else -> LightColors
}
LaunchedEffect(uiState.isApplicationSectionVisible) {
androidShortcutManager.createShortcuts(uiState.isApplicationSectionVisible)
}
CpuInfoTheme(useDarkTheme = darkTheme, colors = colors) {
HostScreen(viewModel = viewModel)
}
}
}
}
@@ -1,3 +1,18 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.features.cputile
import android.graphics.drawable.Icon
@@ -7,34 +22,32 @@ import androidx.annotation.RequiresApi
import com.kgurgul.cpuinfo.R
import com.kgurgul.cpuinfo.data.provider.CpuDataProvider
import com.kgurgul.cpuinfo.utils.IDispatchersProvider
import dagger.hilt.android.AndroidEntryPoint
import com.kgurgul.cpuinfo.utils.formatHz
import kotlin.coroutines.CoroutineContext
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@RequiresApi(api = Build.VERSION_CODES.N)
@AndroidEntryPoint
class CpuTileService : TileService(), CoroutineScope {
class CpuTileService : TileService(), CoroutineScope, KoinComponent {
@Inject
lateinit var cpuDataProvider: CpuDataProvider
private val cpuDataProvider: CpuDataProvider by inject()
private val dispatchersProvider: IDispatchersProvider by inject()
@Inject
lateinit var dispatchersProvider: IDispatchersProvider
private val job = SupervisorJob()
override val coroutineContext: CoroutineContext
get() = job + dispatchersProvider.main
get() = SupervisorJob() + dispatchersProvider.main
private var refreshingJob: Job? = null
private val minMaxAvg: Pair<Long, Long> by lazy {
val cpuCount = cpuDataProvider.getNumberOfCores()
val cpuCount = cpuDataProvider.getNumberOfLogicalCores()
val minFreq = mutableListOf<Long>()
val maxFreq = mutableListOf<Long>()
for (i in 0 until cpuCount) {
@@ -49,7 +62,7 @@ class CpuTileService : TileService(), CoroutineScope {
mapOf(
CPULoad.Low to Icon.createWithResource(this, R.drawable.ic_cpu_low),
CPULoad.Medium to Icon.createWithResource(this, R.drawable.ic_cpu_med),
CPULoad.High to Icon.createWithResource(this, R.drawable.ic_cpu_high)
CPULoad.High to Icon.createWithResource(this, R.drawable.ic_cpu_high),
)
}
private val defaultIcon by lazy { Icon.createWithResource(this, R.drawable.ic_cpu_high) }
@@ -59,11 +72,13 @@ class CpuTileService : TileService(), CoroutineScope {
refreshingJob?.cancel()
refreshingJob = launch {
while (true) {
val load = withContext(dispatchersProvider.io) { averageCPUFreq() }
qsTile.label = "Avg ${load}MHz"
qsTile.icon = getLoadIcon(load)
qsTile.updateTile()
delay(REFRESHING_DELAY_MS)
val load = getAverageCPUFreq()
qsTile?.run {
label = "Avg ${formatHz(load)}"
icon = getLoadIcon(load)
updateTile()
}
delay(REFRESHING_DELAY.milliseconds)
}
}
}
@@ -74,37 +89,42 @@ class CpuTileService : TileService(), CoroutineScope {
}
override fun onDestroy() {
job.cancel()
coroutineContext.cancel()
super.onDestroy()
}
private fun getLoadIcon(avgLoad: Long): Icon {
val freqDiff = minMaxAvg.second - minMaxAvg.first
val freqThirds = freqDiff / 3
val loadEnum = when {
avgLoad >= minMaxAvg.second - freqThirds -> CPULoad.High
minMaxAvg.second - freqThirds > avgLoad && avgLoad >= minMaxAvg.first + freqThirds -> CPULoad.Medium
else -> CPULoad.Low
}
val loadEnum =
when {
avgLoad >= minMaxAvg.second - freqThirds -> CPULoad.High
minMaxAvg.second - freqThirds > avgLoad &&
avgLoad >= minMaxAvg.first + freqThirds -> CPULoad.Medium
else -> CPULoad.Low
}
return icons.getOrDefault(loadEnum, defaultIcon)
}
private fun averageCPUFreq(): Long {
val cpuCount = cpuDataProvider.getNumberOfCores()
var sumFreq = 0L
for (i in 0 until cpuCount) {
sumFreq += cpuDataProvider.getCurrentFreq(i)
private suspend fun getAverageCPUFreq(): Long {
return withContext(dispatchersProvider.io) {
val cpuCount = cpuDataProvider.getNumberOfLogicalCores()
var sumFreq = 0L
for (i in 0 until cpuCount) {
sumFreq += cpuDataProvider.getCurrentFreq(i)
}
sumFreq / cpuCount
}
return (sumFreq / cpuCount)
}
enum class CPULoad {
Low,
Medium,
High
High,
}
companion object {
private const val REFRESHING_DELAY_MS = 1000L
private const val REFRESHING_DELAY = 1000L
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2017 KG Soft
* Copyright KG Soft
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,38 +13,36 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kgurgul.cpuinfo.features
package com.kgurgul.cpuinfo.tv
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.toArgb
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.kgurgul.cpuinfo.domain.model.DarkThemeConfig
import com.kgurgul.cpuinfo.features.HostViewModel
import com.kgurgul.cpuinfo.tv.features.TvHostScreen
import com.kgurgul.cpuinfo.ui.shouldUseDarkTheme
import com.kgurgul.cpuinfo.ui.theme.CpuInfoTheme
import com.kgurgul.cpuinfo.ui.theme.darkPrimary
import com.kgurgul.cpuinfo.ui.theme.lightPrimary
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel
@AndroidEntryPoint
class HostActivity : AppCompatActivity() {
class TvActivity : ComponentActivity() {
private val viewModel: HostViewModel by viewModels()
private val viewModel: HostViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
@@ -53,9 +51,7 @@ class HostActivity : AppCompatActivity() {
var uiState: HostViewModel.UiState by mutableStateOf(HostViewModel.UiState())
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiStateFlow
.onEach { uiState = it }
.collect()
viewModel.uiStateFlow.onEach { uiState = it }.collect()
}
}
splashScreen.setKeepOnScreenCondition { uiState.isLoading }
@@ -64,7 +60,7 @@ class HostActivity : AppCompatActivity() {
setContent {
val darkTheme = shouldUseDarkTheme(uiState)
val systemBarScrim = if (darkTheme) darkPrimary else lightPrimary
val systemBarScrim = (if (darkTheme) darkPrimary else lightPrimary).toArgb()
DisposableEffect(darkTheme) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.dark(systemBarScrim),
@@ -72,22 +68,7 @@ class HostActivity : AppCompatActivity() {
)
onDispose {}
}
CpuInfoTheme(
useDarkTheme = darkTheme,
) {
HostScreen(
viewModel = viewModel,
)
}
CpuInfoTheme(useDarkTheme = darkTheme) { TvHostScreen(viewModel = viewModel) }
}
}
}
@Composable
private fun shouldUseDarkTheme(
uiState: HostViewModel.UiState,
): Boolean = when (uiState.darkThemeConfig) {
DarkThemeConfig.FOLLOW_SYSTEM -> isSystemInDarkTheme()
DarkThemeConfig.LIGHT -> false
DarkThemeConfig.DARK -> true
}
@@ -0,0 +1,179 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.selection.selectableGroup
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavDestination.Companion.hasRoute
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.tv.material3.Icon
import androidx.tv.material3.NavigationDrawer
import androidx.tv.material3.NavigationDrawerItem
import androidx.tv.material3.NavigationDrawerItemDefaults
import com.kgurgul.cpuinfo.features.HostViewModel
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.applications
import com.kgurgul.cpuinfo.shared.hardware
import com.kgurgul.cpuinfo.shared.ic_android
import com.kgurgul.cpuinfo.shared.ic_cpu
import com.kgurgul.cpuinfo.shared.ic_settings
import com.kgurgul.cpuinfo.shared.ic_temperature
import com.kgurgul.cpuinfo.shared.settings
import com.kgurgul.cpuinfo.shared.temp
import com.kgurgul.cpuinfo.tv.features.applications.TvApplicationsBaseRoute
import com.kgurgul.cpuinfo.tv.features.applications.tvApplicationsScreen
import com.kgurgul.cpuinfo.tv.features.information.TvInformationBaseRoute
import com.kgurgul.cpuinfo.tv.features.information.tvInformationScreen
import com.kgurgul.cpuinfo.tv.features.settings.TvSettingsBaseRoute
import com.kgurgul.cpuinfo.tv.features.settings.tvSettingsScreen
import com.kgurgul.cpuinfo.tv.features.temperature.TvTemperaturesBaseRoute
import com.kgurgul.cpuinfo.tv.features.temperature.tvTemperaturesScreen
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.TopLevelRoute
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvHostScreen(viewModel: HostViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvHostScreen(uiState = uiState)
}
@Composable
fun TvHostScreen(uiState: HostViewModel.UiState) {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
NavigationDrawer(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
drawerContent = {
Column(
modifier = Modifier.fillMaxHeight().padding(spacingMedium).selectableGroup(),
horizontalAlignment = Alignment.Start,
verticalArrangement =
Arrangement.spacedBy(spacingSmall, Alignment.CenterVertically),
) {
buildTopLevelRoutes(isApplicationsVisible = uiState.isApplicationSectionVisible)
.forEach { topLevelRoute ->
NavigationDrawerItem(
selected =
currentDestination?.hierarchy?.any {
it.hasRoute(topLevelRoute.route::class)
} == true,
onClick = {
navController.navigate(topLevelRoute.route) {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
leadingContent = {
Icon(
painter = painterResource(topLevelRoute.icon),
contentDescription = stringResource(topLevelRoute.name),
)
},
colors =
NavigationDrawerItemDefaults.colors(
contentColor = MaterialTheme.colorScheme.onBackground,
focusedContainerColor = MaterialTheme.colorScheme.surfaceTint,
focusedContentColor = MaterialTheme.colorScheme.onBackground,
selectedContentColor = MaterialTheme.colorScheme.onBackground,
selectedContainerColor =
MaterialTheme.colorScheme.surfaceTint.copy(alpha = 0.4f),
pressedContentColor = MaterialTheme.colorScheme.onBackground,
pressedContainerColor =
MaterialTheme.colorScheme.surfaceTint.copy(alpha = 0.4f),
),
) {
Text(
text = stringResource(topLevelRoute.name),
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
},
) {
NavHost(
navController = navController,
startDestination = TvInformationBaseRoute,
enterTransition = { fadeIn() },
exitTransition = { fadeOut() },
popEnterTransition = { fadeIn() },
popExitTransition = { fadeOut() },
) {
tvInformationScreen()
tvApplicationsScreen()
tvTemperaturesScreen()
tvSettingsScreen()
}
}
}
private fun buildTopLevelRoutes(isApplicationsVisible: Boolean) = buildList {
add(
TopLevelRoute(
name = Res.string.hardware,
route = TvInformationBaseRoute,
icon = Res.drawable.ic_cpu,
)
)
if (isApplicationsVisible) {
add(
TopLevelRoute(
name = Res.string.applications,
route = TvApplicationsBaseRoute,
icon = Res.drawable.ic_android,
)
)
}
add(
TopLevelRoute(
name = Res.string.temp,
route = TvTemperaturesBaseRoute,
icon = Res.drawable.ic_temperature,
)
)
add(
TopLevelRoute(
name = Res.string.settings,
route = TvSettingsBaseRoute,
icon = Res.drawable.ic_settings,
)
)
}
@@ -0,0 +1,476 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.applications
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
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.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text
import androidx.compose.material3.TextFieldDefaults
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.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import androidx.tv.material3.Icon
import coil3.compose.AsyncImage
import coil3.compose.LocalPlatformContext
import coil3.request.ImageRequest
import coil3.request.crossfade
import com.kgurgul.cpuinfo.domain.model.ExtendedApplicationData
import com.kgurgul.cpuinfo.features.applications.ApplicationsScreenTestData
import com.kgurgul.cpuinfo.features.applications.ApplicationsViewModel
import com.kgurgul.cpuinfo.features.applications.registerUninstallListener
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.apps_open
import com.kgurgul.cpuinfo.shared.apps_settings
import com.kgurgul.cpuinfo.shared.apps_show_system_apps
import com.kgurgul.cpuinfo.shared.apps_sort_order
import com.kgurgul.cpuinfo.shared.apps_uninstall
import com.kgurgul.cpuinfo.shared.ic_apk_document_filled
import com.kgurgul.cpuinfo.shared.ic_apk_document_outlined
import com.kgurgul.cpuinfo.shared.ok
import com.kgurgul.cpuinfo.shared.refresh
import com.kgurgul.cpuinfo.shared.search
import com.kgurgul.cpuinfo.tv.ui.components.TvAlertDialog
import com.kgurgul.cpuinfo.tv.ui.components.TvButton
import com.kgurgul.cpuinfo.tv.ui.components.TvIconButton
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.tv.ui.components.TvWideButton
import com.kgurgul.cpuinfo.ui.components.CpuPullToRefreshBox
import com.kgurgul.cpuinfo.ui.components.CpuSnackbar
import com.kgurgul.cpuinfo.ui.components.CpuTextField
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.ui.theme.spacingXSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Serializable
data object TvApplicationsBaseRoute {
@Serializable data object TvApplicationsRoute
}
fun NavGraphBuilder.tvApplicationsScreen() {
navigation<TvApplicationsBaseRoute>(
startDestination = TvApplicationsBaseRoute.TvApplicationsRoute,
deepLinks =
listOf(
navDeepLink<TvApplicationsBaseRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.APPLICATIONS
)
),
) {
composable<TvApplicationsBaseRoute.TvApplicationsRoute> { TvApplicationsScreen() }
}
}
@Composable
fun TvApplicationsScreen(viewModel: ApplicationsViewModel = koinViewModel()) {
registerUninstallListener(onRefresh = viewModel::onRefreshApplications)
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
val searchQuery by viewModel.searchQuery.collectAsStateWithLifecycle()
TvApplicationsScreen(
uiState = uiState,
onAppClicked = viewModel::onApplicationClicked,
onRefreshApplications = viewModel::onRefreshApplications,
onSnackbarDismissed = viewModel::onSnackbarDismissed,
onAppUninstallClicked = viewModel::onAppUninstallClicked,
onAppSettingsClicked = viewModel::onAppSettingsClicked,
onSystemAppsSwitched = viewModel::onSystemAppsSwitched,
onSortOrderChange = viewModel::onSortOrderChange,
searchQuery = searchQuery,
onSearchQueryChanged = viewModel::onSearchQueryChanged,
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TvApplicationsScreen(
uiState: ApplicationsViewModel.UiState,
onAppClicked: (packageName: String) -> Unit,
onRefreshApplications: () -> Unit,
onSnackbarDismissed: () -> Unit,
onAppUninstallClicked: (id: String) -> Unit,
onAppSettingsClicked: (id: String) -> Unit,
onSystemAppsSwitched: (enabled: Boolean) -> Unit,
onSortOrderChange: (ascending: Boolean) -> Unit,
searchQuery: String,
onSearchQueryChanged: (String) -> Unit,
) {
val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
val snackbarMessageString = uiState.snackbarMessage?.let { stringResource(it) }
LaunchedEffect(snackbarMessageString) {
scope.launch {
if (snackbarMessageString != null) {
val result = snackbarHostState.showSnackbar(snackbarMessageString)
if (result == SnackbarResult.Dismissed) {
onSnackbarDismissed()
}
}
}
}
var optionsDialogId by remember { mutableStateOf("") }
Scaffold(
topBar = {
TopBar(
withSystemApps = uiState.withSystemApps,
onRefreshApplications = onRefreshApplications,
onSystemAppsSwitched = onSystemAppsSwitched,
isSortAscending = uiState.isSortAscending,
onSortOrderChange = onSortOrderChange,
searchQuery = searchQuery,
onSearchQueryChanged = onSearchQueryChanged,
)
},
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal),
snackbarHost = { SnackbarHost(snackbarHostState) { data -> CpuSnackbar(data) } },
) { innerPaddingModifier ->
CpuPullToRefreshBox(
isRefreshing = uiState.isLoading,
enabled = false,
onRefresh = { onRefreshApplications() },
modifier = Modifier.fillMaxSize().padding(innerPaddingModifier),
) {
ApplicationsList(
appList = uiState.applications,
onAppClicked = { optionsDialogId = it },
)
}
OptionsDialog(
isVisible = optionsDialogId.isNotEmpty(),
onDismissRequest = { optionsDialogId = "" },
appId = optionsDialogId,
onOpenAppClicked = onAppClicked,
onSettingsClicked = onAppSettingsClicked,
onUninstallAppClicked = onAppUninstallClicked,
)
}
}
@Composable
private fun TopBar(
withSystemApps: Boolean,
onRefreshApplications: () -> Unit,
onSystemAppsSwitched: (enabled: Boolean) -> Unit,
isSortAscending: Boolean,
onSortOrderChange: (ascending: Boolean) -> Unit,
searchQuery: String,
onSearchQueryChanged: (String) -> Unit,
) {
var showSearch by rememberSaveable { mutableStateOf(false) }
BackHandler(enabled = showSearch) { showSearch = false }
Row(
horizontalArrangement = Arrangement.spacedBy(spacingMedium, Alignment.End),
modifier = Modifier.fillMaxWidth().padding(spacingMedium),
) {
AnimatedVisibility(visible = showSearch) {
SearchTextField(
searchQuery = searchQuery,
onSearchQueryChanged = onSearchQueryChanged,
onSearchClosed = { showSearch = false },
)
}
AnimatedVisibility(visible = !showSearch) {
TvIconButton(onClick = { showSearch = true }) {
Icon(
imageVector = Icons.Default.Search,
contentDescription = stringResource(Res.string.search),
)
}
}
AnimatedVisibility(visible = !showSearch) {
TvIconButton(onClick = onRefreshApplications) {
Icon(
imageVector = Icons.Default.Refresh,
contentDescription = stringResource(Res.string.refresh),
)
}
}
AnimatedVisibility(visible = !showSearch) {
TvIconButton(onClick = { onSortOrderChange(!isSortAscending) }) {
val icon =
if (isSortAscending) {
Icons.Default.KeyboardArrowDown
} else {
Icons.Default.KeyboardArrowUp
}
Icon(
imageVector = icon,
contentDescription = stringResource(Res.string.apps_sort_order),
)
}
}
AnimatedVisibility(visible = !showSearch) {
val systemAppIcon =
if (withSystemApps) {
Res.drawable.ic_apk_document_filled
} else {
Res.drawable.ic_apk_document_outlined
}
TvIconButton(onClick = { onSystemAppsSwitched(!withSystemApps) }) {
Icon(
painter = painterResource(systemAppIcon),
contentDescription = stringResource(Res.string.apps_show_system_apps),
)
}
}
}
}
@Composable
private fun ApplicationsList(
appList: ImmutableList<ExtendedApplicationData>,
onAppClicked: (packageName: String) -> Unit,
) {
LazyColumn(modifier = Modifier.fillMaxSize().padding(spacingMedium)) {
items(items = appList, key = { item -> item.packageName }) { item ->
TvListItem(
onClick = { onAppClicked(item.packageName) },
modifier = Modifier.animateItem(),
) {
Row { ApplicationItem(appData = item, modifier = Modifier.weight(1f)) }
}
}
}
}
@Composable
private fun ApplicationItem(appData: ExtendedApplicationData, modifier: Modifier = Modifier) {
Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) {
AsyncImage(
model =
ImageRequest.Builder(LocalPlatformContext.current)
.data(appData.appIconUri)
.crossfade(true)
.build(),
contentDescription = appData.name,
modifier = Modifier.size(50.dp),
)
Spacer(modifier = Modifier.size(spacingMedium))
SelectionContainer {
Column(modifier = Modifier.padding(horizontal = spacingXSmall)) {
Text(
text = appData.name,
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onBackground,
)
Text(
text = appData.packageName,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onBackground,
)
Text(
text = appData.versionName,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
@Composable
private fun OptionsDialog(
isVisible: Boolean,
onDismissRequest: () -> Unit,
appId: String,
onOpenAppClicked: (id: String) -> Unit,
onSettingsClicked: (id: String) -> Unit,
onUninstallAppClicked: (id: String) -> Unit,
) {
if (isVisible) {
TvAlertDialog(
onDismissRequest = onDismissRequest,
text = {
LazyColumn(
contentPadding = PaddingValues(horizontal = spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
) {
item(key = "__open") {
TvWideButton(
onClick = {
onDismissRequest()
onOpenAppClicked(appId)
},
title = { Text(text = stringResource(Res.string.apps_open)) },
icon = {
Icon(
imageVector = Icons.Default.PlayArrow,
contentDescription = null,
)
},
)
}
item(key = "__settings") {
TvWideButton(
onClick = {
onDismissRequest()
onSettingsClicked(appId)
},
title = { Text(text = stringResource(Res.string.apps_settings)) },
icon = {
Icon(
imageVector = Icons.Default.Settings,
contentDescription = null,
)
},
)
}
item(key = "__uninstall") {
TvWideButton(
onClick = {
onDismissRequest()
onUninstallAppClicked(appId)
},
title = { Text(text = stringResource(Res.string.apps_uninstall)) },
icon = {
Icon(imageVector = Icons.Default.Delete, contentDescription = null)
},
)
}
}
},
confirmButton = {
TvButton(onClick = onDismissRequest) {
androidx.tv.material3.Text(text = stringResource(Res.string.ok))
}
},
)
}
}
@Composable
private fun SearchTextField(
searchQuery: String,
onSearchQueryChanged: (String) -> Unit,
onSearchClosed: () -> Unit,
) {
val focusRequester = remember { FocusRequester() }
val keyboardController = LocalSoftwareKeyboardController.current
val onSearchExplicitlyTriggered = {
keyboardController?.hide()
onSearchClosed()
}
CpuTextField(
colors =
TextFieldDefaults.colors(
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
disabledIndicatorColor = Color.Transparent,
cursorColor = MaterialTheme.colorScheme.onSurface,
),
leadingIcon = {
Icon(
imageVector = Icons.Default.Search,
contentDescription = stringResource(Res.string.search),
tint = MaterialTheme.colorScheme.onSurface,
)
},
onValueChange = { if ("\n" !in it) onSearchQueryChanged(it) },
modifier =
Modifier.fillMaxWidth()
.windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal))
.padding(spacingSmall)
.focusRequester(focusRequester)
.onKeyEvent {
if (it.key == Key.Enter) {
if (searchQuery.isBlank()) return@onKeyEvent false
onSearchExplicitlyTriggered()
true
} else {
false
}
}
.testTag(ApplicationsScreenTestData.SEARCH_TEST_TAG),
shape = RoundedCornerShape(32.dp),
value = searchQuery,
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
keyboardActions =
KeyboardActions(
onSearch = {
if (searchQuery.isBlank()) return@KeyboardActions
onSearchExplicitlyTriggered()
}
),
maxLines = 1,
singleLine = true,
)
LaunchedEffect(Unit) { focusRequester.requestFocus() }
}
@@ -0,0 +1,187 @@
/*
* Copyright KG Soft
*
* 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.
*/
@file:OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class)
package com.kgurgul.cpuinfo.tv.features.information
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.focusRestorer
import androidx.compose.ui.unit.LayoutDirection
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import androidx.tv.material3.Tab
import androidx.tv.material3.TabRow
import androidx.tv.material3.TabRowDefaults
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.ANDROID_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.CPU_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.GPU_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.HARDWARE_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.INFO_PAGE_AMOUNT
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.RAM_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.SCREEN_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.SENSORS_POS
import com.kgurgul.cpuinfo.features.information.InfoContainerViewModel.Companion.STORAGE_POS
import com.kgurgul.cpuinfo.features.information.getTabTitle
import com.kgurgul.cpuinfo.tv.features.information.cpu.TvCpuInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.gpu.TvGpuInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.hardware.TvHardwareInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.os.TvOsInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.ram.TvRamInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.screen.TvScreenInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.sensors.TvSensorsInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.storage.TvStorageInfoScreen
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.serialization.Serializable
import org.koin.compose.viewmodel.koinViewModel
@Serializable
data object TvInformationBaseRoute {
@Serializable object TvInformationRoute
}
fun NavGraphBuilder.tvInformationScreen() {
navigation<TvInformationBaseRoute>(
startDestination = TvInformationBaseRoute.TvInformationRoute,
deepLinks =
listOf(
navDeepLink<TvInformationBaseRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.INFORMATION
)
),
) {
composable<TvInformationBaseRoute.TvInformationRoute> { TvInfoContainerScreen() }
}
}
@Composable
fun TvInfoContainerScreen(viewModel: InfoContainerViewModel = koinViewModel()) {
TvInfoContainerScreen(onPageChanged = viewModel::onPageChanged)
}
@Composable
fun TvInfoContainerScreen(onPageChanged: (Int) -> Unit) {
Scaffold(contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)) {
paddingValues ->
InfoContainer(
paddingValues = paddingValues,
onPageChanged = onPageChanged,
modifier = Modifier.fillMaxSize(),
)
}
}
@Composable
private fun InfoContainer(
paddingValues: PaddingValues,
onPageChanged: (Int) -> Unit,
modifier: Modifier = Modifier,
) {
val tabTitles = (0 until INFO_PAGE_AMOUNT).map { getTabTitle(position = it) }
var selectedTabIndex by rememberSaveable { mutableIntStateOf(0) }
Column(modifier = Modifier.padding(top = paddingValues.calculateTopPadding()).then(modifier)) {
TabRow(
selectedTabIndex = selectedTabIndex,
indicator = { tabPositions, doesTabRowHaveFocus ->
TabRowDefaults.PillIndicator(
currentTabPosition = tabPositions[selectedTabIndex],
doesTabRowHaveFocus = doesTabRowHaveFocus,
activeColor = MaterialTheme.colorScheme.surfaceTint,
inactiveColor = MaterialTheme.colorScheme.surfaceTint.copy(alpha = 0.4f),
)
},
modifier =
Modifier.align(Alignment.CenterHorizontally).focusRestorer().padding(spacingMedium),
) {
tabTitles.forEachIndexed { index, tab ->
key(index) {
Tab(
selected = index == selectedTabIndex,
onFocus = { selectedTabIndex = index },
) {
Text(
text = tab,
style = MaterialTheme.typography.titleMedium,
modifier =
Modifier.padding(
horizontal = spacingMedium,
vertical = spacingSmall,
),
)
}
}
}
}
AnimatedContent(
targetState = selectedTabIndex,
label = "screen_transition",
transitionSpec = {
fadeIn(animationSpec = tween(220, delayMillis = 90))
.togetherWith(fadeOut(animationSpec = tween(90)))
},
modifier =
Modifier.padding(
start = paddingValues.calculateStartPadding(LayoutDirection.Ltr),
end = paddingValues.calculateEndPadding(LayoutDirection.Ltr),
),
) { targetPos ->
when (targetPos) {
CPU_POS -> TvCpuInfoScreen()
GPU_POS -> TvGpuInfoScreen()
RAM_POS -> TvRamInfoScreen()
STORAGE_POS -> TvStorageInfoScreen()
SCREEN_POS -> TvScreenInfoScreen()
ANDROID_POS -> TvOsInfoScreen()
HARDWARE_POS -> TvHardwareInfoScreen()
SENSORS_POS -> TvSensorsInfoScreen()
else -> throw IllegalArgumentException("Unknown position")
}
onPageChanged(targetPos)
}
}
}
@@ -0,0 +1,107 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.cpu
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.CpuData
import com.kgurgul.cpuinfo.domain.model.getName
import com.kgurgul.cpuinfo.domain.model.getValue
import com.kgurgul.cpuinfo.features.information.base.InformationRow
import com.kgurgul.cpuinfo.features.information.cpu.CpuInfoViewModel
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.cpu_current_frequency
import com.kgurgul.cpuinfo.shared.cpu_frequency_stopped
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.components.CpuProgressBar
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.formatHz
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvCpuInfoScreen(viewModel: CpuInfoViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvCpuInfoScreen(uiState = uiState)
}
@Composable
fun TvCpuInfoScreen(uiState: CpuInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize().testTag(TvCpuInfoScreenTestTags.LAZY_COLUMN),
) {
uiState.cpuData?.let { cpuData ->
cpuData.frequencies.forEachIndexed { i, frequency ->
item(key = "__frequency_$i") {
TvListItem { FrequencyItem(index = i, frequency = frequency) }
}
}
items(cpuData.cpuItems) { itemValue ->
TvListItem {
InformationRow(
title = itemValue.getName(),
value = itemValue.getValue(),
isLastItem = true,
)
}
}
}
}
}
@Composable
fun FrequencyItem(index: Int, frequency: CpuData.Frequency) {
val currentFreq =
if (frequency.current != -1L) {
stringResource(Res.string.cpu_current_frequency, index, formatHz(frequency.current))
} else {
stringResource(Res.string.cpu_frequency_stopped, index)
}
val minFreq =
if (frequency.min != -1L) {
formatHz(0)
} else {
""
}
val maxFreq =
if (frequency.max != -1L) {
formatHz(frequency.max)
} else {
""
}
val progress =
if (frequency.current != -1L && frequency.max != 0L) {
frequency.current.toFloat() / frequency.max.toFloat()
} else {
0f
}
CpuProgressBar(label = currentFreq, progress = progress, minMaxValues = minFreq to maxFreq)
}
object TvCpuInfoScreenTestTags {
const val LAZY_COLUMN = "cpu_info_lazy_column"
const val SOCKET_NAME = "cpu_info_socket_name"
}
@@ -0,0 +1,68 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.gpu
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.getKey
import com.kgurgul.cpuinfo.domain.model.getName
import com.kgurgul.cpuinfo.domain.model.getValue
import com.kgurgul.cpuinfo.features.information.base.InformationRow
import com.kgurgul.cpuinfo.features.information.gpu.GpuInfoViewModel
import com.kgurgul.cpuinfo.features.information.gpu.InternalGLSurfaceView
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvGpuInfoScreen(viewModel: GpuInfoViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
Box {
InternalGLSurfaceView(
onGlInfoReceived = { vendor, renderer, extensions ->
viewModel.onGlInfoReceived(vendor, renderer, extensions)
}
)
TvGpuInfoScreen(uiState = uiState)
}
}
@Composable
fun TvGpuInfoScreen(uiState: GpuInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
items(uiState.gpuData, key = { itemValue -> itemValue.getKey() }) { itemValue ->
TvListItem {
InformationRow(
title = itemValue.getName(),
value = itemValue.getValue(),
isLastItem = true,
)
}
}
}
}
@@ -0,0 +1,60 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.hardware
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.getName
import com.kgurgul.cpuinfo.domain.model.getValue
import com.kgurgul.cpuinfo.features.information.base.InformationRow
import com.kgurgul.cpuinfo.features.information.hardware.HardwareInfoViewModel
import com.kgurgul.cpuinfo.features.information.hardware.RegisterPowerPlugListener
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvHardwareInfoScreen(viewModel: HardwareInfoViewModel = koinViewModel()) {
RegisterPowerPlugListener(onRefresh = viewModel::refreshHardwareInfo)
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvHardwareInfoScreen(uiState = uiState)
}
@Composable
fun TvHardwareInfoScreen(uiState: HardwareInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
items(uiState.hardwareItems) { itemValue ->
TvListItem {
InformationRow(
title = itemValue.getName(),
value = itemValue.getValue(),
isLastItem = true,
)
}
}
}
}
@@ -0,0 +1,59 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.os
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.getKey
import com.kgurgul.cpuinfo.domain.model.getName
import com.kgurgul.cpuinfo.domain.model.getValue
import com.kgurgul.cpuinfo.features.information.base.InformationRow
import com.kgurgul.cpuinfo.features.information.os.OsInfoViewModel
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvOsInfoScreen(viewModel: OsInfoViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvOsInfoScreen(uiState = uiState)
}
@Composable
fun TvOsInfoScreen(uiState: OsInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
items(uiState.items, key = { itemValue -> itemValue.getKey() }) { itemValue ->
TvListItem {
InformationRow(
title = itemValue.getName(),
value = itemValue.getValue(),
isLastItem = true,
)
}
}
}
}
@@ -0,0 +1,93 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.ram
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.features.information.ram.RamInfoViewModel
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.available_memory
import com.kgurgul.cpuinfo.shared.threshold
import com.kgurgul.cpuinfo.shared.total_memory
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.components.CpuProgressBar
import com.kgurgul.cpuinfo.ui.components.ItemValueRow
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.Utils
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvRamInfoScreen(viewModel: RamInfoViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvRamInfoScreen(uiState = uiState)
}
@Composable
fun TvRamInfoScreen(uiState: RamInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
uiState.ramData?.let { ramData ->
item(key = "__total") {
TvListItem {
ItemValueRow(
title = stringResource(Res.string.total_memory),
value = Utils.convertBytesToMega(ramData.total),
)
}
}
item(key = "__available") {
TvListItem {
ItemValueRow(
title = stringResource(Res.string.available_memory),
value =
"${Utils.convertBytesToMega(ramData.available)} " +
"(${ramData.availablePercentage}%)",
)
}
}
if (ramData.threshold != -1L) {
item(key = "__threshold") {
TvListItem {
ItemValueRow(
title = stringResource(Res.string.threshold),
value = Utils.convertBytesToMega(ramData.threshold),
)
}
}
}
item(key = "__progress") {
val usedPercentage = (100 - ramData.availablePercentage) / 100f
TvListItem {
CpuProgressBar(
progress = usedPercentage,
minMaxValues =
Utils.convertBytesToMega(0L) to Utils.convertBytesToMega(ramData.total),
)
}
}
}
}
}
@@ -0,0 +1,59 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.screen
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.getKey
import com.kgurgul.cpuinfo.domain.model.getName
import com.kgurgul.cpuinfo.domain.model.getValue
import com.kgurgul.cpuinfo.features.information.base.InformationRow
import com.kgurgul.cpuinfo.features.information.screen.ScreenInfoViewModel
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvScreenInfoScreen(viewModel: ScreenInfoViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvScreenInfoScreen(uiState = uiState)
}
@Composable
fun TvScreenInfoScreen(uiState: ScreenInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
items(uiState.items, key = { itemValue -> itemValue.getKey() }) { itemValue ->
TvListItem {
InformationRow(
title = itemValue.getName(),
value = itemValue.getValue(),
isLastItem = true,
)
}
}
}
}
@@ -0,0 +1,74 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.sensors
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.asString
import com.kgurgul.cpuinfo.features.information.sensors.SensorsInfoViewModel
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.ui.theme.spacingXSmall
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvSensorsInfoScreen(viewModel: SensorsInfoViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvSensorsInfoScreen(uiState = uiState)
}
@Composable
fun TvSensorsInfoScreen(uiState: SensorsInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
items(uiState.sensors, key = { sensorData -> sensorData.id }) { sensorData ->
TvListItem { SensorItem(title = sensorData.name.asString(), value = sensorData.value) }
}
}
}
@Composable
private fun SensorItem(title: String, value: String) {
Column(modifier = Modifier.fillMaxWidth()) {
Text(
text = title,
style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.onBackground,
)
Spacer(modifier = Modifier.size(spacingXSmall))
Text(
text = value,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onBackground.copy(alpha = .7f),
)
}
}
@@ -0,0 +1,82 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.information.storage
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.kgurgul.cpuinfo.domain.model.asString
import com.kgurgul.cpuinfo.features.information.storage.StorageInfoViewModel
import com.kgurgul.cpuinfo.features.information.storage.registerStorageMountingListener
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.components.CpuProgressBar
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.Utils
import kotlin.math.roundToInt
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun TvStorageInfoScreen(viewModel: StorageInfoViewModel = koinViewModel()) {
registerStorageMountingListener(viewModel::onRefreshStorage)
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvStorageInfoScreen(uiState = uiState)
}
@Composable
fun TvStorageInfoScreen(uiState: StorageInfoViewModel.UiState) {
LazyColumn(
contentPadding = PaddingValues(spacingSmall),
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.fillMaxSize(),
) {
items(uiState.storageItems, key = { it.id }) { storageItem ->
val label = buildString {
val notFormattedLabel = storageItem.label.asString().trim()
if (notFormattedLabel.isNotEmpty()) {
append(notFormattedLabel)
append(": ")
}
}
val totalReadable = Utils.humanReadableByteCount(storageItem.storageTotal)
val usedReadable = Utils.humanReadableByteCount(storageItem.storageUsed)
val progress =
if (storageItem.storageTotal != 0L)
storageItem.storageUsed.toFloat() / storageItem.storageTotal.toFloat()
else 0f
val usedPercent = (progress * 100.0).roundToInt()
val storageDesc = "$label$usedReadable / $totalReadable ($usedPercent%)"
val minMaxValues =
Utils.humanReadableByteCount(0) to
Utils.humanReadableByteCount(storageItem.storageTotal)
TvListItem {
CpuProgressBar(
label = storageDesc,
progress = progress,
progressHeight = 32.dp,
prefixImageRes = storageItem.iconDrawable,
minMaxValues = minMaxValues,
)
}
}
}
}
@@ -0,0 +1,294 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.settings
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.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.material3.RadioButtonDefaults
import androidx.compose.material3.Scaffold
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.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.kgurgul.cpuinfo.features.settings.SettingsViewModel
import com.kgurgul.cpuinfo.features.settings.getTemperatureUnit
import com.kgurgul.cpuinfo.features.settings.getThemeName
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.cancel
import com.kgurgul.cpuinfo.shared.general
import com.kgurgul.cpuinfo.shared.pref_theme
import com.kgurgul.cpuinfo.shared.pref_theme_choose
import com.kgurgul.cpuinfo.shared.temperature_unit
import com.kgurgul.cpuinfo.tv.ui.components.TvAlertDialog
import com.kgurgul.cpuinfo.tv.ui.components.TvButton
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingLarge
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.collections.immutable.ImmutableList
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Serializable
data object TvSettingsBaseRoute {
@Serializable data object TvSettingsRoute
}
fun NavGraphBuilder.tvSettingsScreen() {
navigation<TvSettingsBaseRoute>(
startDestination = TvSettingsBaseRoute.TvSettingsRoute,
deepLinks =
listOf(
navDeepLink<TvSettingsBaseRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.SETTINGS
)
),
) {
composable<TvSettingsBaseRoute.TvSettingsRoute> { TvSettingsScreen() }
}
}
@Composable
fun TvSettingsScreen(viewModel: SettingsViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvSettingsScreen(
uiState = uiState,
onTemperatureOptionClicked = viewModel::setTemperatureUnit,
onThemeOptionClicked = viewModel::setTheme,
)
}
@Composable
fun TvSettingsScreen(
uiState: SettingsViewModel.UiState,
onTemperatureOptionClicked: (Int) -> Unit,
onThemeOptionClicked: (String) -> Unit,
) {
Scaffold { paddingValues ->
var isTemperatureDialogVisible by remember { mutableStateOf(false) }
var isThemeDialogVisible by remember { mutableStateOf(false) }
SettingsList(
uiState = uiState,
modifier = Modifier.padding(paddingValues),
onThemeItemClicked = { isThemeDialogVisible = true },
onTemperatureItemClicked = { isTemperatureDialogVisible = true },
)
TemperatureUnitDialog(
isDialogVisible = isTemperatureDialogVisible,
onDismissRequest = { isTemperatureDialogVisible = false },
currentSelection = uiState.temperatureUnit,
options = uiState.temperatureDialogOptions,
onOptionClicked = onTemperatureOptionClicked,
)
ThemeDialog(
isDialogVisible = isThemeDialogVisible,
onDismissRequest = { isThemeDialogVisible = false },
currentSelection = uiState.theme,
options = uiState.themeDialogOptions,
onOptionClicked = onThemeOptionClicked,
)
}
}
@Composable
private fun SettingsList(
uiState: SettingsViewModel.UiState,
onThemeItemClicked: () -> Unit,
onTemperatureItemClicked: () -> Unit,
modifier: Modifier = Modifier,
) {
LazyColumn(contentPadding = PaddingValues(spacingMedium), modifier = modifier) {
item(key = "__generalHeader") {
Text(
text = stringResource(Res.string.general),
style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.tertiary,
)
Spacer(modifier = Modifier.requiredSize(spacingMedium))
}
item(key = "__themeItem") {
SettingsItem(
title = stringResource(Res.string.pref_theme),
subtitle = getThemeName(option = uiState.theme),
onClick = onThemeItemClicked,
)
}
item(key = "__temperatureItem") {
SettingsItem(
title = stringResource(Res.string.temperature_unit),
subtitle = getTemperatureUnit(option = uiState.temperatureUnit),
onClick = onTemperatureItemClicked,
)
}
}
}
@Composable
private fun SettingsItem(title: String, subtitle: String, onClick: () -> Unit) {
TvListItem(onClick = onClick) {
Column(
modifier =
Modifier.fillMaxWidth()
.padding(vertical = spacingMedium)
.padding(start = spacingLarge)
) {
Text(
text = title,
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onBackground,
)
Text(
text = subtitle,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
}
}
@Composable
private fun TemperatureUnitDialog(
isDialogVisible: Boolean,
onDismissRequest: () -> Unit,
currentSelection: Int,
options: ImmutableList<Int>,
onOptionClicked: (Int) -> Unit,
) {
if (isDialogVisible) {
TvAlertDialog(
onDismissRequest = onDismissRequest,
title = { Text(text = stringResource(Res.string.temperature_unit)) },
text = {
val scrollState = rememberScrollState()
Column(
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.verticalScroll(scrollState),
) {
for (option in options) {
TvListItem(
onClick = {
onOptionClicked(option)
onDismissRequest()
}
) {
Row(
horizontalArrangement = Arrangement.spacedBy(spacingMedium),
modifier = Modifier.fillMaxWidth().padding(vertical = spacingSmall),
) {
RadioButton(
selected = option == currentSelection,
onClick = null,
colors =
RadioButtonDefaults.colors(
selectedColor = MaterialTheme.colorScheme.tertiary
),
)
Text(
text = getTemperatureUnit(option = option),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
},
confirmButton = {
TvButton(onClick = onDismissRequest) {
androidx.tv.material3.Text(text = stringResource(Res.string.cancel))
}
},
)
}
}
@Composable
private fun ThemeDialog(
isDialogVisible: Boolean,
onDismissRequest: () -> Unit,
currentSelection: String,
options: ImmutableList<String>,
onOptionClicked: (String) -> Unit,
) {
if (isDialogVisible) {
TvAlertDialog(
onDismissRequest = onDismissRequest,
title = { Text(text = stringResource(Res.string.pref_theme_choose)) },
text = {
val scrollState = rememberScrollState()
Column(
verticalArrangement = Arrangement.spacedBy(spacingSmall),
modifier = Modifier.verticalScroll(scrollState),
) {
for (option in options) {
TvListItem(
onClick = {
onOptionClicked(option)
onDismissRequest()
}
) {
Row(
horizontalArrangement = Arrangement.spacedBy(spacingMedium),
modifier = Modifier.fillMaxWidth().padding(vertical = spacingSmall),
) {
RadioButton(
selected = option == currentSelection,
onClick = null,
colors =
RadioButtonDefaults.colors(
selectedColor = MaterialTheme.colorScheme.tertiary
),
)
Text(
text = getThemeName(option = option),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
},
confirmButton = {
TvButton(onClick = onDismissRequest) {
androidx.tv.material3.Text(text = stringResource(Res.string.cancel))
}
},
)
}
}
@@ -0,0 +1,186 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.features.temperature
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
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.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.kgurgul.cpuinfo.domain.model.TemperatureItem
import com.kgurgul.cpuinfo.domain.model.asString
import com.kgurgul.cpuinfo.features.temperature.TemperatureFormatter
import com.kgurgul.cpuinfo.features.temperature.TemperatureViewModel
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.no_temp_data
import com.kgurgul.cpuinfo.shared.no_temp_data_admin_required
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Serializable
data object TvTemperaturesBaseRoute {
@Serializable data object TvTemperaturesRoute
}
fun NavGraphBuilder.tvTemperaturesScreen() {
navigation<TvTemperaturesBaseRoute>(
startDestination = TvTemperaturesBaseRoute.TvTemperaturesRoute,
deepLinks =
listOf(
navDeepLink<TvTemperaturesBaseRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.TEMPERATURES
)
),
) {
composable<TvTemperaturesBaseRoute.TvTemperaturesRoute> { TvTemperatureScreen() }
}
}
@Composable
fun TvTemperatureScreen(viewModel: TemperatureViewModel = koinViewModel()) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
TvTemperatureScreen(uiState = uiState)
}
@Composable
fun TvTemperatureScreen(uiState: TemperatureViewModel.UiState) {
Scaffold(contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal)) {
paddingValues ->
val paddingModifier = Modifier.padding(paddingValues)
if (uiState.temperatureItems.isEmpty()) {
TvEmptyTemperatureList(
isAdminRequired = uiState.isAdminRequired,
modifier = paddingModifier,
)
} else {
TvTemperatureList(
temperatureItems = uiState.temperatureItems,
temperatureFormatter = uiState.temperatureFormatter,
modifier = paddingModifier,
)
}
}
}
@Composable
private fun TvTemperatureList(
temperatureItems: ImmutableList<TemperatureItem>,
temperatureFormatter: TemperatureFormatter,
modifier: Modifier = Modifier,
) {
LazyColumn(modifier = Modifier.fillMaxSize().padding(spacingMedium).then(modifier)) {
items(items = temperatureItems, key = { item -> item.id }) { item ->
TvTemperatureItem(item = item, temperatureFormatter = temperatureFormatter)
}
}
}
@Composable
private fun TvTemperatureItem(item: TemperatureItem, temperatureFormatter: TemperatureFormatter) {
val coroutineScope = rememberCoroutineScope()
TvListItem {
Row(modifier = Modifier.height(IntrinsicSize.Min)) {
Icon(
painter = painterResource(item.icon),
tint = MaterialTheme.colorScheme.onBackground,
contentDescription = null,
modifier = Modifier.requiredSize(60.dp),
)
Spacer(modifier = Modifier.requiredSize(spacingSmall))
Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center) {
Text(
text = item.name.asString(),
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
Spacer(modifier = Modifier.requiredSize(spacingSmall))
if (!item.temperature.isNaN()) {
var formattedTemp by remember { mutableStateOf("") }
LaunchedEffect(item.temperature) {
coroutineScope.launch {
formattedTemp = temperatureFormatter.format(item.temperature)
}
}
Text(
text = formattedTemp,
style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
}
@Composable
private fun TvEmptyTemperatureList(isAdminRequired: Boolean, modifier: Modifier = Modifier) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize().padding(spacingMedium).then(modifier),
) {
Text(
text =
stringResource(
if (isAdminRequired) {
Res.string.no_temp_data_admin_required
} else {
Res.string.no_temp_data
}
),
color = MaterialTheme.colorScheme.onBackground,
style = MaterialTheme.typography.bodyLarge,
)
}
}
@@ -0,0 +1,41 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.ui.components
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun TvAlertDialog(
onDismissRequest: () -> Unit,
confirmButton: @Composable () -> Unit,
modifier: Modifier = Modifier,
title: @Composable (() -> Unit)? = null,
text: @Composable (() -> Unit)? = null,
) {
AlertDialog(
onDismissRequest = onDismissRequest,
title = title,
tonalElevation = 0.dp,
containerColor = MaterialTheme.colorScheme.surface,
text = text,
confirmButton = confirmButton,
modifier = modifier,
)
}
@@ -0,0 +1,140 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.ui.components
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsFocusedAsState
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.tv.material3.Button
import androidx.tv.material3.ButtonDefaults
import androidx.tv.material3.IconButton
import androidx.tv.material3.IconButtonDefaults
import androidx.tv.material3.OutlinedIconButton
import androidx.tv.material3.OutlinedIconButtonDefaults
import androidx.tv.material3.WideButton
import androidx.tv.material3.WideButtonDefaults
@Composable
fun TvIconButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
content: @Composable BoxScope.() -> Unit,
) {
IconButton(
onClick = onClick,
modifier = modifier,
colors =
IconButtonDefaults.colors(
containerColor = MaterialTheme.colorScheme.surfaceTint.copy(alpha = 0.2f),
contentColor = MaterialTheme.colorScheme.onSurface,
focusedContainerColor = MaterialTheme.colorScheme.surfaceTint.copy(alpha = 0.5f),
focusedContentColor = MaterialTheme.colorScheme.onSurface,
),
content = content,
)
}
@Composable
fun TvOutlinedIconButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
content: @Composable BoxScope.() -> Unit,
) {
OutlinedIconButton(
onClick = onClick,
modifier = modifier,
colors =
OutlinedIconButtonDefaults.colors(
contentColor = MaterialTheme.colorScheme.onSurface,
focusedContainerColor = MaterialTheme.colorScheme.onSurface,
focusedContentColor = MaterialTheme.colorScheme.surface,
),
content = content,
)
}
@Composable
fun TvButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
content: @Composable RowScope.() -> Unit,
) {
Button(
onClick = onClick,
modifier = modifier,
colors =
ButtonDefaults.colors(
containerColor = MaterialTheme.colorScheme.surfaceTint.copy(alpha = 0.7f),
contentColor = MaterialTheme.colorScheme.onSurface,
focusedContainerColor = MaterialTheme.colorScheme.surfaceTint,
focusedContentColor = MaterialTheme.colorScheme.onSurface,
),
content = content,
)
}
@Composable
fun TvWideButton(
onClick: () -> Unit,
title: @Composable () -> Unit,
modifier: Modifier = Modifier,
icon: (@Composable () -> Unit)? = null,
subtitle: (@Composable () -> Unit)? = null,
enabled: Boolean = true,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) {
WideButton(
onClick = onClick,
title = title,
subtitle = subtitle,
icon = icon,
contentColor =
WideButtonDefaults.contentColor(
color = MaterialTheme.colorScheme.onSurface,
focusedColor = MaterialTheme.colorScheme.onSurface,
),
scale = WideButtonDefaults.scale(focusedScale = 1.05f),
enabled = enabled,
interactionSource = interactionSource,
background = { TvWideButtonBackground(enabled, interactionSource) },
modifier = modifier,
)
}
@Composable
private fun TvWideButtonBackground(enabled: Boolean, interactionSource: MutableInteractionSource) {
val isFocused = interactionSource.collectIsFocusedAsState().value
val isPressed = interactionSource.collectIsPressedAsState().value
val backgroundColor =
when {
!enabled -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.01f)
isPressed -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)
isFocused -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.4f)
else -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f)
}
Box(modifier = Modifier.fillMaxSize().background(backgroundColor))
}
@@ -0,0 +1,43 @@
/*
* Copyright KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.tv.ui.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.tv.material3.DenseListItem
import androidx.tv.material3.ListItemColors
import androidx.tv.material3.ListItemDefaults
import androidx.tv.material3.MaterialTheme
@Composable
fun TvListItem(
modifier: Modifier = Modifier,
onClick: () -> Unit = {},
colors: ListItemColors =
ListItemDefaults.colors(
focusedContainerColor = MaterialTheme.colorScheme.inverseSurface.copy(alpha = 0.4f)
),
headlineContent: @Composable () -> Unit,
) {
DenseListItem(
selected = false,
onClick = onClick,
scale = ListItemDefaults.scale(focusedScale = 1.01f),
colors = colors,
headlineContent = headlineContent,
modifier = modifier,
)
}
@@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="320dp"
android:height="180dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group
android:scaleX="0.6666667"
android:scaleY="0.6666667"
android:translateX="18"
android:translateY="18">
<group
android:scaleX="0.5625"
android:translateX="23.625">
<path
android:fillColor="#FF000000"
android:pathData="m62.72,30l1.08,0a0.42,0.43 90.01,0 0,-0.01 0.07q0,0.95 0,1.9a0.63,0.63 90,0 0,0.01 0.09l0.68,0l0,4.3l2.14,0l0,-4.3l0.68,0c0,-0.04 0.01,-0.07 0.01,-0.1q0,-0.94 0,-1.88A0.57,0.57 89.99,0 0,67.3 30l1.08,0l0,2.06l0.69,0l0,4.31c0.2,0 0.37,-0.01 0.55,0 0.44,0.04 0.88,-0.1 1.32,0.08a0.63,0.63 90,0 1,0.29 0.18,0.69 0.69,89.99 0,0 0.12,0.12 0.37,0.37 90,0 1,0.18 0.29,0.11 0.11,90.01 0,0 0.02,0.08c0.1,0.05 0.07,0.14 0.07,0.22 0,0.58 0,1.15 0,1.73 0,0.05 0,0.09 0,0.15l4.31,0l0,0.68l0.18,0 1.89,0l0,1.08l-2.07,0l0,0.69l-4.3,0l0,1.96l4.3,0l0,0.67l2.06,0l0,1.08l-2.07,0l0,0.69l-4.3,0l0,2.25l4.3,0l0,0.68l2.06,0l0,1.08l-2.07,0l0,0.69l-4.3,0l0,2.06l4.3,0l0,0.68l2.06,0l0,1.08l-2.07,0l0,0.69l-4.3,0l0,2.25l4.3,0l0,0.68l2.06,0l0,1.08l-2.06,0l0,0.69l-4.3,0l0,2.06l4.31,0l0,0.69l0.16,0 1.89,0l0,1.06c-0.05,0 -0.09,0.01 -0.14,0.01l-1.93,0l0,0.69l-4.3,0l0,2.35l4.31,0l0,0.68l0.16,0 1.89,0l0,1.08l-2.07,0l0,0.69l-4.31,0c0,0.05 0,0.1 0,0.14 0,0.43 0,0.85 0,1.28a0.49,0.49 90.01,0 1,-0.03 0.14,1.06 1.06,90 0,1 -0.06,0.13 1.11,1.11 90,0 1,-0.13 0.25,2.23 2.23,90 0,1 -0.27,0.22 1.45,1.45 89.99,0 1,-0.45 0.18l-1.47,0 -0.14,0l0,4.31l-0.69,0c0,0.07 0,0.12 0,0.17q0,0.94 0,1.89l-1.06,0c0,-0.05 -0.01,-0.09 -0.01,-0.14q0,-0.89 0,-1.77l0,-0.15l-0.69,0l0,-4.26l-2.25,0l0,4.31l-0.69,0c0,0.07 0,0.12 0,0.17q0,0.94 0,1.89l-1.06,0c0,-0.05 -0.01,-0.09 -0.01,-0.14q0,-0.89 0,-1.77l0,-0.15l-0.69,0l0,-4.3l-2.06,0l0,4.3l-0.67,0l0,2.06l-1.08,0l0,-2.07l-0.69,0l0,-4.3l-2.15,0l0,4.31l-0.68,0l0,2.06l-1.08,0l0,-2.06l-0.69,0l0,-4.3l-2.15,0l0,4.31l-0.69,0l0,2.06l-1.08,0l0,-2.06l-0.69,0l0,-4.3l-2.15,0l0,4.31l-0.68,0c0,0.07 0,0.12 0,0.17q0,0.94 0,1.89l-1.08,0l0,-2.07l-0.69,0l0,-4.29l-2.15,0l0,4.31l-0.69,0c0,0.06 0,0.12 0,0.17q0,0.95 0,1.89l-1.09,0c0,-0.05 -0.01,-0.1 -0.01,-0.14q0,-0.89 0,-1.77l0,-0.15l-0.69,0l0,-4.31l-0.14,0c-0.52,0 -1.03,0.01 -1.55,-0.01a1.64,1.64 89.99,0 1,-0.41 -0.12,0.11 0.11,90 0,1 -0.03,-0.03c-0.05,-0.05 -0.1,-0.1 -0.15,-0.14 -0.13,-0.1 -0.27,-0.21 -0.27,-0.4a0.09,0.09 89.98,0 0,-0.02 -0.06c-0.08,-0.03 -0.07,-0.1 -0.07,-0.16 0,-0.5 0,-0.99 0,-1.49 0,-0.04 0,-0.08 0,-0.14l-4.31,0l0,-0.69l-0.16,0 -1.9,0l0,-1.08a0.42,0.43 90.01,0 0,0.07 0.01l1.9,0a0.61,0.61 89.99,0 0,0.09 -0.02l0,-0.68l4.3,0l0,-1.96l-4.3,0l0,-0.69l-2.06,0L30,62.91l2.06,0l0,-0.69l4.3,0l0,-2.25l-4.3,0l0,-0.69l-2.06,0l0,-1.08l2.06,0l0,-0.69l4.3,0l0,-2.06l-4.3,0l0,-0.68l-0.15,0 -1.9,0l0,-1.08l2.06,0l0,-0.69l4.3,0l0,-2.25l-4.3,0l0,-0.68l-0.15,0 -1.9,0l0,-1.08l2.06,0l0,-0.69l4.3,0l0,-2.06l-4.3,0L32.06,45.58c-0.04,0 -0.07,-0.01 -0.1,-0.01l-1.88,0a0.57,0.57 89.99,0 0,-0.08 0.01l0,-1.08l2.06,0L32.06,43.81l4.3,0l0,-2.35l-4.3,0l0,-0.69l-0.15,0 -1.9,0l0,-1.08a0.42,0.43 90.01,0 0,0.07 0.01l1.9,0a0.62,0.62 90,0 0,0.09 -0.02l0,-0.69l4.3,0c0,-0.06 0,-0.1 0,-0.14q0,-0.79 0,-1.59a0.36,0.36 90,0 1,0.02 -0.12c0.02,-0.05 0.05,-0.1 0.07,-0.14a0.29,0.29 89.99,0 1,0.03 -0.11c0.11,-0.07 0.14,-0.2 0.25,-0.27 0.11,-0.07 0.18,-0.17 0.32,-0.17a0.08,0.08 90,0 0,0.06 -0.02c0.04,-0.11 0.14,-0.07 0.21,-0.07 0.51,0 1.03,0 1.54,0l0.14,0l0,-4.31l0.68,0c0,-0.04 0.01,-0.07 0.01,-0.1q0,-0.94 0,-1.88a0.57,0.57 89.99,0 0,-0.01 -0.08l1.08,0l0,2.06l0.69,0l0,4.3l2.25,0l0,-4.3l0.68,0c0,-0.04 0.01,-0.07 0.01,-0.1q0,-0.94 0,-1.88a0.57,0.57 89.99,0 0,-0.01 -0.08l1.08,0l0,2.06l0.7,0l0,4.3l2.05,0l0,-4.3l0.68,0l0,-2.06l1.08,0l0,2.06l0.69,0l0,4.3l2.15,0l0,-4.3l0.69,0l0,-2.06l1.08,0l0,2.06l0.69,0l0,4.3l2.15,0l0,-4.3l0.68,0c0,-0.06 0,-0.1 0,-0.15q0,-0.95 0,-1.9l1.08,0l0,2.06l0.69,0l0,4.3l2.15,0l0,-4.3l0.69,0c0,-0.06 0,-0.11 0,-0.15q0.03,-0.95 0.03,-1.9zM38.63,53.91l0,0q0,7.15 0,14.3a1.29,1.29 90,0 0,0.06 0.47,0.88 0.88,89.99 0,0 0.25,0.37 0.85,0.85 89.99,0 0,0.57 0.22c0.06,0 0.13,0 0.19,0q14.09,0 28.18,0c0.27,0 0.53,0.05 0.81,-0.07a0.93,0.93 90,0 0,0.46 -0.38c0.08,-0.13 0.16,-0.29 0.13,-0.47a0.7,0.7 89.99,0 1,0 -0.13q0,-13.92 -0,-27.85c0,-0.39 0.09,-0.79 -0.08,-1.18a0.67,0.67 90.01,0 0,-0.32 -0.37,0.23 0.23,89.99 0,1 -0.05,-0.02 0.57,0.57 89.99,0 0,-0.39 -0.16l-26.61,0c-0.81,0 -1.62,0 -2.43,0a1.36,1.36 90,0 0,-0.36 0.1,0.05 0.05,90.01 0,0 -0.01,0.02 0.69,0.69 89.99,0 1,-0.12 0.15c-0.1,0.07 -0.18,0.14 -0.18,0.27a0.04,0.04 90,0 1,-0.02 0.03c-0.09,0.02 -0.06,0.1 -0.07,0.15 0,0.1 0,0.2 0,0.31q-0,7.13 -0,14.25z"
android:strokeWidth="0.1" />
<path
android:fillColor="#FF000000"
android:pathData="m39.95,54q0,-6.25 0,-12.49c0,-0.12 0,-0.24 0.01,-0.35a0.5,0.5 90.01,0 1,0.06 -0.14,0.11 0.11,90.01 0,0 0.02,-0.04c-0.01,-0.2 0.11,-0.35 0.22,-0.48a1.27,1.27 90,0 1,0.43 -0.36c0.1,-0.05 0.22,-0.05 0.29,-0.1 0.17,-0.13 0.36,-0.08 0.53,-0.08q9.11,-0.01 18.23,0l6.78,0c0.11,0 0.23,0 0.34,0.01a0.44,0.44 90.01,0 1,0.13 0.06,0.11 0.11,90.01 0,0 0.04,0.02c0.2,-0.02 0.33,0.13 0.49,0.22a0.7,0.7 89.99,0 1,0.14 0.15c0.03,0.04 0.07,0.07 0.1,0.11 0.06,0.08 0.12,0.16 0.18,0.25a0.02,0.02 90.01,0 1,0 0.01c0,0.19 0.12,0.34 0.12,0.53 -0.01,1.23 -0,2.45 0,3.68q0,10.72 0,21.45c0,0.11 0,0.23 0,0.34 0,0.08 0.02,0.17 -0.07,0.23a0.11,0.11 90.01,0 0,-0.01 0.05,1.08 1.08,90 0,1 -0.29,0.52 3.01,3.01 89.99,0 0,-0.24 0.24,0.03 0.03,90 0,1 -0.01,0.01l-0.32,0.14c-0.05,0.02 -0.1,0.04 -0.14,0.06a0.42,0.42 90,0 1,-0.12 0.03c-0.11,0 -0.22,0 -0.33,0l-25.05,0c-0.07,0 -0.14,0 -0.21,0 -0.1,-0.01 -0.2,0.03 -0.27,-0.08a0.07,0.07 89.99,0 0,-0.05 -0.01,0.77 0.77,89.99 0,1 -0.48,-0.23 1.27,1.27 90,0 1,-0.35 -0.43c-0.04,-0.1 -0.04,-0.21 -0.1,-0.28 -0.13,-0.16 -0.08,-0.33 -0.08,-0.5q-0.01,-6.27 -0,-12.53zM66.38,65.89c0,-0.24 -0.24,-0.47 -0.49,-0.49 -0.2,-0.01 -0.49,0.29 -0.49,0.49 0,0.2 0.29,0.49 0.49,0.49 0.2,0 0.53,-0.29 0.49,-0.49z"
android:strokeWidth="0.1" />
</group>
</group>
</vector>
@@ -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_banner_background" />
<foreground android:drawable="@drawable/ic_banner_foreground" />
</adaptive-icon>

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_banner_background">#FFFFFF</color>
</resources>
@@ -0,0 +1,21 @@
<!--
~ Copyright 2017 KG Soft
~
~ 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.
-->
<resources>
<string name="app_name" translatable="false">CPU Info</string>
</resources>
-3
View File
@@ -1,3 +0,0 @@
/build
src/debug/google-services.json
src/release/google-services.json
-180
View File
@@ -1,180 +0,0 @@
plugins {
alias(libs.plugins.android.application)
kotlin("android")
id("kotlin-parcelize")
alias(libs.plugins.ksp)
alias(libs.plugins.hilt)
alias(libs.plugins.kover)
}
android {
compileSdk = Versions.COMPILE_SDK
defaultConfig {
applicationId = "com.kgurgul.cpuinfo"
minSdk = Versions.MIN_SDK
targetSdk = Versions.TARGET_SDK
versionCode = Versions.VERSION_CODE
versionName = Versions.VERSION_NAME
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
arguments += "-DANDROID_STL=c++_static"
}
}
}
namespace = "com.kgurgul.cpuinfo"
ndkVersion = Versions.NDK_VERSION
signingConfigs {
getByName("debug") {
val debugSigningConfig = SigningConfig.getDebugProperties(rootProject.rootDir)
storeFile = file(debugSigningConfig.getProperty(SigningConfig.KEY_PATH))
keyAlias = debugSigningConfig.getProperty(SigningConfig.KEY_ALIAS)
keyPassword = debugSigningConfig.getProperty(SigningConfig.KEY_PASS)
storePassword = debugSigningConfig.getProperty(SigningConfig.KEY_PASS)
}
create("release") {
val releaseSigningConfig = SigningConfig.getReleaseProperties(rootProject.rootDir)
storeFile = file(releaseSigningConfig.getProperty(SigningConfig.KEY_PATH))
keyAlias = releaseSigningConfig.getProperty(SigningConfig.KEY_ALIAS)
keyPassword = releaseSigningConfig.getProperty(SigningConfig.KEY_PASS)
storePassword = releaseSigningConfig.getProperty(SigningConfig.KEY_PASS)
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
debug {
signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = false
enableUnitTestCoverage = true
applicationIdSuffix = ".debug"
}
}
externalNativeBuild {
cmake {
path("src/main/cpp/CMakeLists.txt")
}
}
buildFeatures {
viewBinding = true
compose = true
aidl = true
buildConfig = true
}
testOptions {
unitTests {
isReturnDefaultValues = true
isIncludeAndroidResources = true
}
animationsDisabled = true
execution = "ANDROIDX_TEST_ORCHESTRATOR"
}
lint {
abortOnError = false
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.androidxComposeCompiler.get()
}
}
dependencies {
implementation(libs.kotlin.stdlib)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.immutable)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.core)
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.datastore.preferences)
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.androidx.multidex)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.lifecycle.viewmodel.compose)
implementation(libs.androidx.lifecycle.runtime.compose)
val composeBom = platform(libs.androidx.compose.bom)
implementation(composeBom)
androidTestImplementation(composeBom)
implementation(libs.androidx.compose.material)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.tooling.preview)
debugImplementation(libs.androidx.compose.ui.tooling)
debugImplementation(libs.androidx.compose.ui.testManifest)
implementation(libs.hilt.android)
ksp(libs.hilt.compiler)
implementation(libs.timber)
implementation(libs.relinker)
implementation(libs.coil)
testImplementation(kotlin("test"))
testImplementation(libs.junit)
testImplementation(libs.turbine)
testImplementation(libs.androidx.test.core)
testImplementation(libs.androidx.arch.core.testing)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.hilt.android.testing)
testImplementation(libs.mockito.android)
testImplementation(libs.mockito.kotlin)
kspTest(libs.hilt.compiler)
androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.ext)
androidTestImplementation(libs.androidx.test.espresso.core)
androidTestImplementation(libs.androidx.test.espresso.contrib)
androidTestImplementation(libs.androidx.compose.ui.test)
androidTestImplementation(libs.hilt.android.testing)
kspAndroidTest(libs.hilt.compiler)
androidTestUtil(libs.androidx.test.orchestrator)
}
koverReport {
androidReports("debug") {
filters {
includes {
packages(KoverConfig.includedPackages)
}
excludes {
packages(KoverConfig.excludedPackages)
classes(KoverConfig.excludedClasses)
annotatedBy(KoverConfig.excludedAnnotations)
}
}
html {
setReportDir(layout.buildDirectory.dir("coverage-report/html"))
}
xml {
setReportFile(layout.buildDirectory.file("coverage-report/result.xml"))
}
}
}
-41
View File
@@ -1,41 +0,0 @@
# Kotlin
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
<fields>;
}
# Dagger
-dontwarn com.google.errorprone.annotations.*
# General
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,SourceFile,LineNumberTable,*Annotation*
# AIDL
-keep class android.content.pm.IPackageStatsObserver$** {
public <fields>;
public <methods>;
}
-keep class android.content.pm.IPackageStatsObserver$Stub.** {
public <fields>;
public <methods>;
}
-keep interface android.content.pm.IPackageStatsObserver$** {*;}
# Coroutines
# ServiceLoader support
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
# Most of volatile fields are updated with AFU and should not be mangled
-keepclassmembernames class kotlinx.** {
volatile <fields>;
}
# Remove logs
-assumenosideeffects class timber.log.Timber* {
public static *** v(...);
public static *** d(...);
public static *** i(...);
public static *** e(...);
}
@@ -1,11 +0,0 @@
package com.kgurgul.cpuinfo.core
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import com.kgurgul.cpuinfo.features.HostActivity
import org.junit.Rule
abstract class BaseTestSuit {
@get:Rule
val androidComposeRule = createAndroidComposeRule<HostActivity>()
}
@@ -1,56 +0,0 @@
/*
* Copyright 2017 KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.core
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.NoMatchingViewException
import androidx.test.espresso.ViewAssertion
import androidx.test.espresso.matcher.ViewMatchers.assertThat
import org.hamcrest.Matcher
/**
* Assertion for item count on [RecyclerView].
* Examples:
* - .check(RecyclerViewItemCountAssertion(5))
* - .check(RecyclerViewItemCountAssertion(greaterThan(5)))
* - .check(RecyclerViewItemCountAssertion(lessThan(5)))
*
* @author kgurgul
*/
class RecyclerViewItemCountAssertion : ViewAssertion {
private val matcher: Matcher<Int>
constructor(expectedCount: Int) {
matcher = isk(expectedCount)
}
constructor(matcher: Matcher<Int>) {
this.matcher = matcher
}
override fun check(view: View?, noViewFoundException: NoMatchingViewException?) {
if (noViewFoundException != null) {
throw noViewFoundException
}
val recyclerView = view as RecyclerView
val adapter = recyclerView.adapter
assertThat(adapter?.itemCount, matcher)
}
}
@@ -1,20 +0,0 @@
package com.kgurgul.cpuinfo.uitestutils.conditionwatcher
import java.util.concurrent.TimeoutException
@Synchronized
fun waitForCondition(timeoutMillis: Long = 5000L, condition: () -> Boolean) {
val step = 250L
var totalTime = 0L
do {
if (condition()) {
break
}
totalTime += step
Thread.sleep(step)
if (totalTime > timeoutMillis) {
throw TimeoutException("Condition timed out after: ${totalTime}ms")
}
} while (true)
}
@@ -1,11 +0,0 @@
package android.content.pm;
import android.content.pm.PackageStats;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage
*/
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
@@ -1,4 +0,0 @@
// PackageStats.aidl
package android.content.pm;
parcelable PackageStats;
@@ -1,7 +0,0 @@
package com.kgurgul.cpuinfo.appinitializers
import android.app.Application
interface AppInitializer {
fun init(application: Application)
}
@@ -1,14 +0,0 @@
package com.kgurgul.cpuinfo.appinitializers
import android.app.Application
import javax.inject.Inject
class AppInitializers @Inject constructor(
private val initializers: Set<@JvmSuppressWildcards AppInitializer>
) {
fun init(application: Application) {
initializers.forEach {
it.init(application)
}
}
}
@@ -1,16 +0,0 @@
package com.kgurgul.cpuinfo.appinitializers
import android.app.Application
import com.getkeepsafe.relinker.ReLinker
import com.kgurgul.cpuinfo.data.provider.CpuDataNativeProvider
import javax.inject.Inject
class NativeToolsInitializer @Inject constructor(
private val cpuDataNativeProvider: CpuDataNativeProvider
) : AppInitializer {
override fun init(application: Application) {
ReLinker.loadLibrary(application, "cpuinfo-libs")
cpuDataNativeProvider.initLibrary()
}
}
@@ -1,15 +0,0 @@
package com.kgurgul.cpuinfo.appinitializers
import android.app.Application
import com.kgurgul.cpuinfo.BuildConfig
import timber.log.Timber
import javax.inject.Inject
class TimberInitializer @Inject constructor() : AppInitializer {
override fun init(application: Application) {
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
}
}
@@ -1,17 +0,0 @@
package com.kgurgul.cpuinfo.data
import com.kgurgul.cpuinfo.data.local.IUserPreferencesRepository
import com.kgurgul.cpuinfo.data.local.UserPreferencesRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
abstract class DataModule {
@Binds
abstract fun bindUserPreferencesRepository(
userPreferencesRepository: UserPreferencesRepository
): IUserPreferencesRepository
}
@@ -1,16 +0,0 @@
package com.kgurgul.cpuinfo.data.local
import kotlinx.coroutines.flow.Flow
interface IUserPreferencesRepository {
val userPreferencesFlow: Flow<UserPreferences>
suspend fun setApplicationsSortingOrder(isAscending: Boolean)
suspend fun setApplicationsWithSystemApps(withSystemApps: Boolean)
suspend fun setTemperatureUnit(temperatureUnit: Int)
suspend fun setTheme(theme: String)
}
@@ -1,21 +0,0 @@
package com.kgurgul.cpuinfo.data.local
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
class StubUserPreferencesRepository : IUserPreferencesRepository {
override val userPreferencesFlow: Flow<UserPreferences>
get() = flow { }
override suspend fun setApplicationsSortingOrder(isAscending: Boolean) {
}
override suspend fun setApplicationsWithSystemApps(withSystemApps: Boolean) {
}
override suspend fun setTemperatureUnit(temperatureUnit: Int) {
}
override suspend fun setTheme(theme: String) {
}
}
@@ -1,81 +0,0 @@
package com.kgurgul.cpuinfo.data.local
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.emptyPreferences
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import com.kgurgul.cpuinfo.domain.model.DarkThemeConfig
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import timber.log.Timber
import java.io.IOException
import javax.inject.Inject
class UserPreferencesRepository @Inject constructor(
private val dataStore: DataStore<Preferences>
) : IUserPreferencesRepository {
override val userPreferencesFlow: Flow<UserPreferences>
get() = dataStore.data
.catch { exception ->
if (exception is IOException) {
Timber.e(exception)
emit(emptyPreferences())
} else {
throw exception
}
}.map { preferences ->
mapUserPreferences(preferences)
}
override suspend fun setApplicationsSortingOrder(isAscending: Boolean) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.SORTING_APPS] = isAscending
}
}
override suspend fun setApplicationsWithSystemApps(withSystemApps: Boolean) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.WITH_SYSTEM_APPS] = withSystemApps
}
}
override suspend fun setTemperatureUnit(temperatureUnit: Int) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.TEMPERATURE_UNIT] = temperatureUnit
}
}
override suspend fun setTheme(theme: String) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.THEME] = theme
}
}
private fun mapUserPreferences(preferences: Preferences): UserPreferences {
return UserPreferences(
isApplicationsSortingAscending = preferences[PreferencesKeys.SORTING_APPS] ?: true,
withSystemApps = preferences[PreferencesKeys.WITH_SYSTEM_APPS] ?: false,
temperatureUnit = preferences[PreferencesKeys.TEMPERATURE_UNIT] ?: 0,
theme = preferences[PreferencesKeys.THEME] ?: DarkThemeConfig.FOLLOW_SYSTEM.prefName,
)
}
private object PreferencesKeys {
val SORTING_APPS = booleanPreferencesKey("sorting_apps")
val WITH_SYSTEM_APPS = booleanPreferencesKey("with_system_apps")
val TEMPERATURE_UNIT = intPreferencesKey("temperature_unit")
val THEME = stringPreferencesKey("theme")
}
}
data class UserPreferences(
val isApplicationsSortingAscending: Boolean,
val withSystemApps: Boolean,
val temperatureUnit: Int,
val theme: String,
)
@@ -1,26 +0,0 @@
package com.kgurgul.cpuinfo.data.provider
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.os.Build
import javax.inject.Inject
class ApplicationsDataProvider @Inject constructor(
private val packageManager: PackageManager
) {
fun getInstalledApplications(withSystemApps: Boolean): List<ApplicationInfo> {
val applications = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getInstalledApplications(
PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())
)
} else {
packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
}
return if (withSystemApps) {
applications
} else {
applications.filter { (it.flags and ApplicationInfo.FLAG_SYSTEM) == 0 }
}
}
}
@@ -1,60 +0,0 @@
/*
* Copyright 2017 KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.data.provider
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import dagger.hilt.android.qualifiers.ApplicationContext
import timber.log.Timber
import javax.inject.Inject
/**
* Return battery status from ACTION_BATTERY_CHANGED broadcast receiver
*/
class BatteryStatusProvider @Inject constructor(
@ApplicationContext private val appContext: Context
) {
/**
* @return [Intent] with battery information
*/
fun getBatteryStatusIntent(): Intent? {
val iFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
return appContext.registerReceiver(null, iFilter)
}
/**
* @return battery capacity from private API. In case of error it will return -1.
*/
@SuppressLint("PrivateApi")
fun getBatteryCapacity(): Double {
var capacity = -1.0
try {
val powerProfile = Class.forName("com.android.internal.os.PowerProfile")
.getConstructor(Context::class.java).newInstance(appContext)
capacity = Class
.forName("com.android.internal.os.PowerProfile")
.getMethod("getAveragePower", String::class.java)
.invoke(powerProfile, "battery.capacity") as Double
} catch (e: Exception) {
Timber.e(e)
}
return capacity
}
}
@@ -1,24 +0,0 @@
package com.kgurgul.cpuinfo.data.provider
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class CpuDataNativeProvider @Inject constructor() {
external fun initLibrary()
external fun getCpuName(): String
external fun hasArmNeon(): Boolean
external fun getL1dCaches(): IntArray?
external fun getL1iCaches(): IntArray?
external fun getL2Caches(): IntArray?
external fun getL3Caches(): IntArray?
external fun getL4Caches(): IntArray?
}
@@ -1,52 +0,0 @@
package com.kgurgul.cpuinfo.data.provider
import android.os.Build
import timber.log.Timber
import java.io.RandomAccessFile
import javax.inject.Inject
class CpuDataProvider @Inject constructor() {
fun getAbi(): String {
return Build.SUPPORTED_ABIS[0]
}
fun getNumberOfCores(): Int {
return Runtime.getRuntime().availableProcessors()
}
/**
* Checking frequencies directories and return current value if exists (otherwise we can
* assume that core is stopped - value -1)
*/
fun getCurrentFreq(coreNumber: Int): Long {
val currentFreqPath = "${CPU_INFO_DIR}cpu$coreNumber/cpufreq/scaling_cur_freq"
return try {
RandomAccessFile(currentFreqPath, "r").use { it.readLine().toLong() / 1000 }
} catch (e: Exception) {
Timber.e("getCurrentFreq() - cannot read file")
-1
}
}
/**
* Read max/min frequencies for specific [coreNumber]. Return [Pair] with min and max frequency
* or [Pair] with -1.
*/
fun getMinMaxFreq(coreNumber: Int): Pair<Long, Long> {
val minPath = "${CPU_INFO_DIR}cpu$coreNumber/cpufreq/cpuinfo_min_freq"
val maxPath = "${CPU_INFO_DIR}cpu$coreNumber/cpufreq/cpuinfo_max_freq"
return try {
val minMhz = RandomAccessFile(minPath, "r").use { it.readLine().toLong() / 1000 }
val maxMhz = RandomAccessFile(maxPath, "r").use { it.readLine().toLong() / 1000 }
Pair(minMhz, maxMhz)
} catch (e: Exception) {
Timber.e("getMinMaxFreq() - cannot read file")
Pair(-1, -1)
}
}
companion object {
private const val CPU_INFO_DIR = "/sys/devices/system/cpu/"
}
}
@@ -1,44 +0,0 @@
package com.kgurgul.cpuinfo.data.provider
import android.app.ActivityManager
import android.content.pm.PackageManager
import android.content.res.Resources
import android.os.Build
import com.kgurgul.cpuinfo.R
import javax.inject.Inject
class GpuDataProvider @Inject constructor(
private val activityManager: ActivityManager,
private val packageManager: PackageManager,
private val resources: Resources,
) {
fun getGlEsVersion(): String {
return activityManager.deviceConfigurationInfo.glEsVersion
}
/**
* Obtain Vulkan version
*/
fun getVulkanVersion(): String {
val default = resources.getString(R.string.unknown)
if (Build.VERSION.SDK_INT < 24) {
return default
}
val vulkan = packageManager.systemAvailableFeatures.find {
it.name == PackageManager.FEATURE_VULKAN_HARDWARE_VERSION
}?.version ?: 0
if (vulkan == 0) {
return default
}
// Extract versions from bit field
// See: https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VULKAN_HARDWARE_VERSION
val major = vulkan shr 22 // Higher 10 bits
val minor = vulkan shl 10 shr 22 // Middle 10 bits
val patch = vulkan shl 20 shr 22 // Lower 12 bits
//
return "$major.$minor.$patch"
}
}
@@ -1,428 +0,0 @@
/*
* Copyright 2017 KG Soft
*
* 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.
*/
package com.kgurgul.cpuinfo.data.provider
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.pm.PackageManager
import android.content.res.Resources
import android.hardware.ConsumerIrManager
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import android.net.wifi.WifiManager
import android.os.BatteryManager
import android.os.Build
import com.kgurgul.cpuinfo.R
import com.kgurgul.cpuinfo.features.temperature.TemperatureFormatter
import com.kgurgul.cpuinfo.utils.Utils
import com.kgurgul.cpuinfo.utils.round2
import timber.log.Timber
import java.io.File
import java.io.FileFilter
import java.io.RandomAccessFile
import java.util.regex.Pattern
import javax.inject.Inject
class HardwareDataProvider @Inject constructor(
private val resources: Resources,
private val temperatureProvider: TemperatureProvider,
private val temperatureFormatter: TemperatureFormatter,
private val packageManager: PackageManager,
private val contentResolver: ContentResolver,
private val batteryStatusProvider: BatteryStatusProvider,
private val wifiManager: WifiManager,
private val irManager: ConsumerIrManager?,
private val cameraManager: CameraManager,
) {
fun getData(): List<Pair<String, String>> {
return buildList {
add(Pair(resources.getString(R.string.battery), ""))
addAll(getBatteryStatus())
if (hasCamera()) {
add(Pair(resources.getString(R.string.cameras), ""))
addAll(getCameraInfo())
}
add(Pair(resources.getString(R.string.sound_card), ""))
addAll(getSoundCardInfo())
addAll(getWirelessInfo())
addAll(getUsbInfo())
}
}
private fun getBatteryStatus(): ArrayList<Pair<String, String>> {
val functionsList = ArrayList<Pair<String, String>>()
val batteryStatus = batteryStatusProvider.getBatteryStatusIntent()
if (batteryStatus != null) {
// Level
val level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
if (level != -1 && scale != -1) {
val batteryPct = level / scale.toFloat() * 100.0
functionsList.add(
Pair(
resources.getString(R.string.level),
"${batteryPct.round2()}%"
)
)
}
// Health
val health = batteryStatus.getIntExtra(BatteryManager.EXTRA_HEALTH, -1)
if (health != -1) {
functionsList.add(
Pair(
resources.getString(R.string.battery_health),
getBatteryHealthStatus(health)
)
)
}
// Voltage
val voltage = batteryStatus.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1)
if (voltage > 0) {
functionsList.add(
Pair(
resources.getString(R.string.voltage),
"${voltage / 1000.0}V"
)
)
}
}
// Temperature
val temperature = temperatureProvider.getBatteryTemperature()
if (temperature != null) {
functionsList.add(
Pair(
resources.getString(R.string.temperature),
temperatureFormatter.format(temperature)
)
)
}
// Capacity
val capacity = batteryStatusProvider.getBatteryCapacity().round2()
if (capacity != -1.0) {
functionsList.add(Pair(resources.getString(R.string.capacity), "${capacity}mAh"))
}
if (batteryStatus != null) {
// Technology
val technology = batteryStatus.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY)
Utils.addPairIfExists(
functionsList,
resources.getString(R.string.technology),
technology
)
// Are we charging / is charged?
val status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL
// How we charging?
val chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1)
val usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB
val acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC
val charging =
if (isCharging) resources.getString(R.string.yes)
else resources.getString(R.string.no)
functionsList.add(Pair(resources.getString(R.string.is_charging), charging))
if (isCharging) {
val chargingType: String = when {
usbCharge -> "USB"
acCharge -> "AC"
else -> resources.getString(R.string.unknown)
}
functionsList.add(Pair(resources.getString(R.string.charging_type), chargingType))
}
}
return functionsList
}
private fun getBatteryHealthStatus(healthInt: Int): String {
return when (healthInt) {
BatteryManager.BATTERY_HEALTH_COLD -> resources.getString(R.string.battery_cold)
BatteryManager.BATTERY_HEALTH_GOOD -> resources.getString(R.string.battery_good)
BatteryManager.BATTERY_HEALTH_DEAD -> resources.getString(R.string.battery_dead)
BatteryManager.BATTERY_HEALTH_OVERHEAT -> resources.getString(R.string.battery_overheat)
BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE -> resources.getString(R.string.battery_overvoltage)
BatteryManager.BATTERY_HEALTH_UNKNOWN -> resources.getString(R.string.battery_unknown)
BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE -> resources.getString(R.string.battery_unspecified_failure)
else -> resources.getString(R.string.battery_unknown)
}
}
/**
* Get Wi-Fi and Bluetooth mac address and Bluetooth LE support
*/
@SuppressLint("InlinedApi")
private fun getWirelessInfo(): List<Pair<String, String>> {
val functionsList = mutableListOf<Pair<String, String>>()
functionsList.add(resources.getString(R.string.wireless) to "")
// Bluetooth
functionsList.add(
resources.getString(R.string.bluetooth) to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
)
)
val hasBluetoothLe = getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
)
functionsList.add(resources.getString(R.string.bluetooth_le) to hasBluetoothLe)
// GPS
functionsList.add(
"GPS" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)
)
)
// NFC
functionsList.add(
"NFC" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_NFC)
)
)
functionsList.add(
"NFC Card Emulation" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
)
)
// Wi-Fi
val hasWiFi = packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)
functionsList.add("Wi-Fi" to getYesNoString(hasWiFi))
if (hasWiFi) {
functionsList.add(
"Wi-Fi Aware" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
)
)
functionsList.add(
"Wi-Fi Direct" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)
)
)
functionsList.add(
"Wi-Fi Passpoint" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_PASSPOINT)
)
)
functionsList.add("Wi-Fi 5Ghz" to getYesNoString(wifiManager.is5GHzBandSupported))
functionsList.add("Wi-Fi P2P" to getYesNoString(wifiManager.isP2pSupported))
}
try {
val bluetoothMac = android.provider.Settings.Secure.getString(
contentResolver,
"bluetooth_address"
)
if (bluetoothMac != null && bluetoothMac.isNotEmpty())
functionsList.add(resources.getString(R.string.bluetooth_mac) to bluetoothMac)
} catch (e: Exception) {
// ignored
}
// Wi-Fi mac
val filePath = "/sys/class/net/wlan0/address"
try {
val reader = RandomAccessFile(filePath, "r")
val value = reader.readLine()
reader.close()
functionsList.add(resources.getString(R.string.wifi_mac) to value)
} catch (ignored: Exception) {
}
// IR
val hasIr = irManager?.hasIrEmitter() ?: false
functionsList.add(resources.getString(R.string.ir_emitter) to getYesNoString(hasIr))
return functionsList
}
private fun getUsbInfo(): List<Pair<String, String>> {
val featureList = mutableListOf<Pair<String, String>>()
featureList.add("USB" to "")
featureList.add(
"OTG" to getYesNoString(
packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
)
)
return featureList
}
/**
* @return number of the sound card in device - default is 1
*/
private fun getSoundCardNumber(): Int {
class AudioFilter : FileFilter {
// http://alsa.opensrc.org/Proc_asound_documentation
override fun accept(pathname: File): Boolean =
Pattern.matches("card[0-7]+", pathname.name)
}
return try {
File("/proc/asound/").listFiles(AudioFilter())!!.size
} catch (e: Exception) {
1
}
}
/**
* Get available data connected with sound card like ALSA version etc.
*/
private fun getSoundCardInfo(): List<Pair<String, String>> {
val functionsList = mutableListOf<Pair<String, String>>()
val soundCardNumber = getSoundCardNumber()
functionsList.add(Pair(resources.getString(R.string.amount), soundCardNumber.toString()))
for (i in 0 until soundCardNumber) {
functionsList.add(
Pair(
" ${resources.getString(R.string.card)} $i",
tryToGetSoundCardId(i)
)
)
}
// ALSA
val alsa = tryToGetAlsa()
Utils.addPairIfExists(functionsList, "ALSA", alsa)
return functionsList
}
/**
* Try to read id of the sound card.
*
* @param cardPosition position of the sound card in files
* @return id from "id" file
*/
private fun tryToGetSoundCardId(cardPosition: Int): String {
var id = resources.getString(R.string.unknown)
val filePath = "/proc/asound/card$cardPosition/id"
var reader: RandomAccessFile? = null
try {
reader = RandomAccessFile(filePath, "r")
id = reader.readLine()
} catch (ignored: Exception) {
} finally {
reader?.close()
}
return id
}
/**
* @return ALSA version if exists, otherwise null
*/
private fun tryToGetAlsa(): String? {
var alsa: String? = null
val filePath = "/proc/asound/version"
var reader: RandomAccessFile? = null
try {
reader = RandomAccessFile(filePath, "r")
val version = reader.readLine()
alsa = version
} catch (ignored: Exception) {
} finally {
reader?.close()
}
return alsa
}
private fun hasCamera(): Boolean =
packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
/**
* Get number, type and orientation of the cameras
*/
private fun getCameraInfo(): List<Pair<String, String>> {
val functionsList = mutableListOf<Pair<String, String>>()
try {
val cameraIdList = cameraManager.cameraIdList
val numberOfCameras = cameraIdList.size
functionsList.add(
Pair(
resources.getString(R.string.amount),
numberOfCameras.toString()
)
)
val cameraName = resources.getString(R.string.camera)
val cameraType = resources.getString(R.string.type)
val cameraOrientation = resources.getString(R.string.orientation)
for (cameraId in cameraIdList) {
functionsList.add(Pair(" $cameraName $cameraId", " "))
try {
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val orientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)
val facing = characteristics.get(CameraCharacteristics.LENS_FACING)
functionsList.add(Pair(" $cameraType", getCameraFacing(facing)))
functionsList.add(Pair(" $cameraOrientation", orientation.toString()))
if (Build.VERSION.SDK_INT >= 28) {
val lensAmount = characteristics.physicalCameraIds.size
if (lensAmount > 0) {
functionsList.add(
Pair(
" ${resources.getString(R.string.camera_lens_number)}",
lensAmount.toString()
)
)
}
}
} catch (e: Exception) {
Timber.e(e)
}
}
} catch (e: Exception) {
Timber.e(e)
functionsList.add(Pair(resources.getString(R.string.amount), "0"))
}
return functionsList
}
private fun getCameraFacing(facing: Int?): String =
when (facing) {
CameraCharacteristics.LENS_FACING_FRONT ->
resources.getString(R.string.front)
CameraCharacteristics.LENS_FACING_BACK ->
resources.getString(R.string.back)
CameraCharacteristics.LENS_FACING_EXTERNAL ->
resources.getString(R.string.camera_external)
else -> resources.getString(R.string.unknown)
}
private fun getYesNoString(yesValue: Boolean) = if (yesValue) {
resources.getString(R.string.yes)
} else {
resources.getString(R.string.no)
}
}

Some files were not shown because too many files have changed in this diff Show More