Compare commits

...

357 commits

Author SHA1 Message Date
831c3753f2 i18n: Remove empty translations
I don't know why Weblate decided to do this
2024-11-12 17:59:32 -05:00
NXTGENCAT
3f33f87167 Translated using Weblate (Telugu)
Currently translated at 96.0% (96 of 100 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/te/
2024-10-21 11:47:36 +00:00
d61d741ebe Add monochrome launcher icons 2024-10-08 21:00:39 -04:00
a4189c9148 ui: Use accent 0 as background 2024-10-05 20:29:56 -04:00
7adae7f070 ui: Enable EdgeToEdge globally 2024-10-05 20:23:18 -04:00
bdfd8c29be ui: Handle bottom insets in SettingsFragment 2024-10-05 20:22:39 -04:00
da45e570ca ui: Use a DropDownPreference for auto freeze delay
and limit maximum to 5 minutes while we are at it
2024-10-05 20:17:04 -04:00
9e0f2306a8 ui: Handle system bar insets using AppBarLayout 2024-10-05 17:47:58 -04:00
1c4101ba2f ui: Handle system bar insets in SetupWizardActivity 2024-10-05 17:37:53 -04:00
c06e64ffe8 [WIP] Disable time picker temporarily
We need to rework this to use the MDC version
2024-10-05 17:14:45 -04:00
7db88df146 chore: Update targetSDK and dependencies 2024-10-05 17:10:52 -04:00
8bd864c895 chore: Upgrade AGP plugin 2024-10-05 16:57:13 -04:00
Anonymous
88770fa756 Translated using Weblate (Serbian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sr/
2024-06-16 23:53:35 +00:00
Translator
f2e475a20d Translated using Weblate (Serbian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sr/
2024-06-16 23:53:35 +00:00
Anonymous
86d75de501 Translated using Weblate (Telugu)
Currently translated at 11.1% (11 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/te/
2024-06-16 23:53:34 +00:00
Anonymous
60a64e3f72 Translated using Weblate (Ukrainian)
Currently translated at 15.1% (15 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/uk/
2024-06-16 23:53:34 +00:00
Anonymous
60292c53de Translated using Weblate (Persian)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fa/
2024-06-16 23:53:34 +00:00
Anonymous
79ed7861f3 Translated using Weblate (Hebrew)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/he/
2024-06-16 23:53:34 +00:00
shop
c805d153f4 Translated using Weblate (Hebrew)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/he/
2024-06-16 23:53:34 +00:00
Anonymous
6367240299 Translated using Weblate (Bengali)
Currently translated at 8.0% (8 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/bn/
2024-06-16 23:53:33 +00:00
Anonymous
a8c7b2a015 Translated using Weblate (Korean)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ko/
2024-06-16 23:53:33 +00:00
Roland Kim
24b8b95a97 Translated using Weblate (Korean)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ko/
2024-06-16 23:53:33 +00:00
Anonymous
29f157136f Translated using Weblate (Greek)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/el/
2024-06-16 23:53:33 +00:00
Anonymous
f59d4c5a2a Translated using Weblate (Indonesian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/id/
2024-06-16 23:53:33 +00:00
Ihfandi Cahyo Aryanto
1c72a09473 Translated using Weblate (Indonesian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/id/
2024-06-16 23:53:32 +00:00
Anonymous
c4b8c481fa Translated using Weblate (Czech)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/cs/
2024-06-16 23:53:32 +00:00
infoek.cz
5ee633ba82 Translated using Weblate (Czech)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/cs/
2024-06-16 23:53:32 +00:00
Anonymous
23f67d85c1 Translated using Weblate (Asturian)
Currently translated at 92.9% (92 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ast/
2024-06-16 23:53:32 +00:00
Anonymous
8f36146492 Translated using Weblate (Vietnamese)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/vi/
2024-06-16 23:53:32 +00:00
Quang Trung
8a97fd9b27 Translated using Weblate (Vietnamese)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/vi/
2024-06-16 23:53:31 +00:00
Anonymous
45942a1b32 Translated using Weblate (Turkish)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2024-06-16 23:53:31 +00:00
Alparslan Sakci
39caece2a5 Translated using Weblate (Turkish)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2024-06-16 23:53:31 +00:00
Anonymous
43597589e9 Translated using Weblate (Romanian)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ro/
2024-06-16 23:53:31 +00:00
Victor Teodor Butiu
624085c66b Translated using Weblate (Romanian)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ro/
2024-06-16 23:53:31 +00:00
Anonymous
12d60d5738 Translated using Weblate (Tamil)
Currently translated at 7.0% (7 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ta/
2024-06-16 23:53:31 +00:00
Anonymous
5183543292 Translated using Weblate (Japanese)
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ja/
2024-06-16 23:53:30 +00:00
-
1063b33b86 Translated using Weblate (Dutch)
Currently translated at 59.5% (59 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/nl/
2024-06-16 23:53:30 +00:00
Anonymous
d7d7876e88 Translated using Weblate (Dutch)
Currently translated at 59.5% (59 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/nl/
2024-06-16 23:53:30 +00:00
Anonymous
a64dbe1e92 Translated using Weblate (Spanish)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/es/
2024-06-16 23:53:29 +00:00
Benjamin Torres
0d7ee6f0c4 Translated using Weblate (Spanish)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/es/
2024-06-16 23:53:29 +00:00
Anonymous
d78254ab9b Translated using Weblate (Polish)
Currently translated at 92.9% (92 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pl/
2024-06-16 23:53:29 +00:00
Skajmer
b0e128999a Translated using Weblate (Polish)
Currently translated at 92.9% (92 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pl/
2024-06-16 23:53:29 +00:00
Anonymous
6a79aea943 Translated using Weblate (Swedish)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sv/
2024-06-16 23:53:29 +00:00
Konstantinos
16f5fcb256 Translated using Weblate (Swedish)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sv/
2024-06-16 23:53:29 +00:00
Anonymous
334c9de0c6 Translated using Weblate (French)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fr/
2024-06-16 23:53:28 +00:00
Alexandre Brochand
8ef9c2c674 Translated using Weblate (French)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fr/
2024-06-16 23:53:28 +00:00
Anonymous
79b7275bf8 Translated using Weblate (Italian)
Currently translated at 92.9% (92 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/it/
2024-06-16 23:53:28 +00:00
Random
7e8c84aa3f Translated using Weblate (Italian)
Currently translated at 92.9% (92 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/it/
2024-06-16 23:53:28 +00:00
Anonymous
e7d10d6e46 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2024-06-16 23:53:27 +00:00
Deleted User
a034e1d915 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2024-06-16 23:53:27 +00:00
Anonymous
874fccf653 Translated using Weblate (Chinese (Traditional))
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2024-06-16 23:53:27 +00:00
Anonymous
70dcbd3d5f Translated using Weblate (German)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2024-06-16 23:53:26 +00:00
-
4997f37f7e Translated using Weblate (German)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2024-06-16 23:53:26 +00:00
Anonymous
7facef5905 Translated using Weblate (Chinese (Simplified))
Currently translated at 95.9% (95 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2024-06-16 23:53:26 +00:00
Anonymous
cd43df7089 Translated using Weblate (Russian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2024-06-16 23:53:26 +00:00
solokot
005f4f747e Translated using Weblate (Russian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2024-06-16 23:53:25 +00:00
Anonymous
a223c49f9a Translated using Weblate (Arabic)
Currently translated at 84.8% (84 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2024-06-16 23:53:25 +00:00
Roland Kim
dcfd7bf400 Translated using Weblate (Korean)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ko/
2024-02-27 20:58:34 +00:00
Ferdinand Rau
4e6d926d07 Translated using Weblate (French)
Currently translated at 94.9% (94 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fr/
2023-12-23 17:26:04 +00:00
Ferdinand Rau
b75523b2b5 Translated using Weblate (German)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2023-12-23 17:26:04 +00:00
Translator
e20ef7a6dd Translated using Weblate (Serbian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sr/
2023-12-14 00:48:09 +00:00
infoek.cz
45516e511e Translated using Weblate (Czech)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/cs/
2023-12-14 00:48:09 +00:00
Translator
33c4a40817 Added translation using Weblate (Serbian) 2023-12-11 18:13:00 +00:00
3f71a44617 hotfix: Do not access cross-profile interaction APIs below R 2023-12-06 15:48:02 -05:00
v1s7
401cc49ac5 Translated using Weblate (Russian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2023-12-06 06:48:08 +00:00
Ihfandi Cahyo Aryanto
f6dc206a81 Translated using Weblate (Indonesian)
Currently translated at 100.0% (99 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/id/
2023-11-26 12:48:08 +00:00
ef1632dc8b CHANGELOG: Release 1.9 2023-11-19 21:23:19 -05:00
787a10e746 fix: Unintuitive navigation icon color in dark mode 2023-11-19 21:21:43 -05:00
d5c5b71fc9 CHANGELOG: describe NFC payment service stub 2023-11-12 15:53:13 -05:00
06b89a9534 feat: NFC payment service stub
This commits adds a NFC payment service stub in the main profile that
can be enabled on-demand. This is intended to work around a bug in AOSP
where if no payment app is present in the main profile, one cannot even
choose a payment app from the work profile. The stub simply shows up in
the main profile to enable the Settings menu for NFC payment services.
2023-11-12 15:51:03 -05:00
Andrés Maldonado
936f7bdd2b README: make custom F-Droid repo easier to add
The QR code was generated with:

  qrencode --level=H "fdroidrepos://fdroid.typeblog.net?fingerprint=1A7E446C491C80BC2F83844A26387887990F97F2F379AE7B109679FEAE3DBC8C" -o fdroid_custom_repo.png
2023-11-04 21:00:37 -04:00
3593861e39 CHANGELOG: describe media scanning changes 2023-11-04 18:27:58 -04:00
584bd25aeb FileShuttleService: trigger media scanner after writes as well
Previously, we have been triggering the media scanner after calls to
`createFile()`. This is not robust, though, as in many cases the writer is
not able to finish writing (i.e. *actually* creating the file) before
the scanner is scheduled, resulting in media copied into the work
profile not showing up in galleries etc.

Turns out, ParcelFileDescriptor supports a `listener` argument in its
`open()` calls. This listener is triggered when the fd is actually
closed by the (potentially remote) writer. To have robust media
scanning, we simply re-trigger the scanner every time a writable
ParcelFileDescriptor is closed.
2023-11-04 18:24:10 -04:00
20369aafd2 gradle: Set versionCode of debug builds to current timestamp 2023-11-04 18:14:12 -04:00
edb8447d2d FileShuttle: use try-with-resource for FileOutputStream 2023-11-04 16:06:02 -04:00
15516b0dde CHANGELOG: Describe File Shuttle changes 2023-11-04 16:04:32 -04:00
88402cdc96 FileShuttleService: show "Shelter" as the name of the root directory 2023-11-04 16:02:39 -04:00
70b82bdba3 refactor: FileShuttleService.createFile() MIME type handling
* Remove unnecessary branching between file and directory handling
* Handle null / application/octet-stream MIME types properly: do not
  append .null or .bin unnecessarily.

This closes #132 and #201 on GitHub -- they have been around for way to
long.
2023-11-04 15:51:05 -04:00
Valentin Kuhn
f7e5ed3f46 Translated using Weblate (German)
Currently translated at 100.0% (96 of 96 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2023-10-30 23:48:08 +00:00
S Knorr
7c1d4b0009 Translated using Weblate (German)
Currently translated at 100.0% (96 of 96 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2023-10-29 22:51:41 +00:00
Valentin Kuhn
2e86b596d4 Translated using Weblate (German)
Currently translated at 100.0% (96 of 96 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2023-10-29 22:51:41 +00:00
a4ecd10a48 CHANGELOG: Also add versioning changes 2023-10-26 21:46:51 -04:00
Ivan Rakanskiy
5f6d56d1dc Translated using Weblate (Ukrainian)
Currently translated at 16.1% (16 of 99 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/uk/
2023-10-27 01:45:47 +00:00
41bb2379ea Remove "Fake Camera" feature 2023-10-26 21:45:09 -04:00
58b0ccefa6 Update CHANGELOG 2023-10-16 21:42:37 -04:00
48b2ff89dc Remove useless TODOs 2023-10-16 21:08:37 -04:00
67095e0180 refactor: Use git describe as version names / codes 2023-10-16 20:51:20 -04:00
32bbdd13b1 feat: Cross-Profile interaction allowlisting 2023-10-16 20:45:21 -04:00
00cdc9aacb CHANGELOG: provisional changelog for 1.9 2023-10-10 21:39:14 -04:00
fe762cba28 FreezeService: migrate to AlarmManager to ensure wakeup
Co-authored-by: parmaster84 <parmaster84@proton.me>
2023-10-10 19:17:41 -04:00
990cf39ed9 Bump version to 1.9-dev 2023-10-09 15:16:13 -04:00
c987f3455e manifest: Declare foreground service type 2023-10-09 15:10:10 -04:00
935b9fbe94 chore: Uprev dependencies 2023-10-09 14:38:22 -04:00
942dbd1af9 chore: Uprev to SDK version 34 2023-10-09 14:36:39 -04:00
95ab9c8cd0 chore: Update SetupWizardLibrary 2023-10-09 14:08:19 -04:00
abef98d602 chore: Bump AGP version 2023-10-09 12:54:02 -04:00
Kap0t
a2ca0d8c7f Translated using Weblate (Dutch)
Currently translated at 61.2% (60 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/nl/
2023-10-05 09:48:08 +00:00
Omegaplex
f83255d59b Translated using Weblate (Russian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2023-05-21 20:37:36 +00:00
74e589bnt
a26f5b4e8f Translated using Weblate (Telugu)
Currently translated at 12.2% (12 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/te/
2023-05-04 08:37:36 +00:00
74e589bnt
94fc1e3eb4 Added translation using Weblate (Telugu) 2023-05-03 08:18:49 +00:00
Andrii
bbbde40ca9 Translated using Weblate (Ukrainian)
Currently translated at 15.3% (15 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/uk/
2023-04-26 09:37:36 +00:00
Mura Masa
85ae669988 Translated using Weblate (Ukrainian)
Currently translated at 9.1% (9 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/uk/
2023-04-09 16:37:36 +00:00
Mura Masa
9f4c65296b Added translation using Weblate (Ukrainian) 2023-04-08 15:41:44 +00:00
Ihfandi Cahyo Aryanto
687a0fc2d1 Translated using Weblate (Indonesian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/id/
2023-03-20 03:08:20 +00:00
be9b762724 Update README to remove Play Store, and clarify the state of the project 2023-03-03 19:03:17 -05:00
Victor Teodor Butiu
1855984e0d Translated using Weblate (Romanian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ro/
2023-03-01 10:08:20 +00:00
Omegaplex
e185ad3a1f Translated using Weblate (Russian)
Currently translated at 97.9% (96 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2023-02-26 23:08:20 +00:00
Ardeshir Nahavandi.F
08edb9c4db Translated using Weblate (Persian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fa/
2023-02-14 15:08:20 +00:00
Omegaplex
9c9d50837d Translated using Weblate (Russian)
Currently translated at 97.9% (96 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2023-02-14 15:08:20 +00:00
BobH_Official
af46b5d587 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2023-01-21 15:08:20 +00:00
BobH_Official
a10898c1a9 Translated using Weblate (Japanese)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ja/
2023-01-20 14:09:21 +00:00
BobH_Official
8318e47c79 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2023-01-20 14:09:21 +00:00
BobH_Official
507f4c62df Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2023-01-20 14:01:15 +00:00
Ihfandi Cahyo Aryanto
a842a90113 Translated using Weblate (Indonesian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/id/
2022-11-28 10:08:20 +00:00
Faviwer apreciador de casadas
5aa00b22d7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2022-11-03 16:32:04 +00:00
hamed
651569cadc Added translation using Weblate (Persian) 2022-10-29 10:10:17 +00:00
shop
c7dfec2101 Translated using Weblate (Hebrew)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/he/
2022-10-04 04:36:26 +00:00
Quang Trung
cb08e62792 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/vi/
2022-10-04 04:36:26 +00:00
Da Awl
7df7a89777 Translated using Weblate (German)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2022-10-04 04:36:26 +00:00
1df8431c3c Release Shelter 1.8 2022-09-25 22:05:29 -04:00
b59745c7b3 chore: Upgrade gradle 2022-09-25 22:05:29 -04:00
Alparslan Sakci
d100ffd003 Translated using Weblate (Turkish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2022-09-19 10:36:20 +00:00
Mohammed Anas
5da7a23651 Translated using Weblate (Arabic)
Currently translated at 88.7% (87 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-09-09 22:12:36 +00:00
Vila que aprecia casadas
2bff2501c6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2022-09-08 15:12:36 +00:00
Roland Kim
99c99488f9 Translated using Weblate (Korean)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ko/
2022-09-06 07:12:35 +00:00
Mobew apreciador de casadas
ad5ccbeb54 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2022-08-31 13:38:50 +00:00
684e5a0350 DummyActivity: Do not request for notification permission multiple times in one process 2022-08-28 22:09:43 -04:00
df70a6b57c DummyActivity: Avoid conflict with provisioning UI 2022-08-28 22:09:43 -04:00
ling
6b18f2c355 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2022-08-28 02:38:49 +00:00
fd939d2ffb Bump version to 1.8-dev2 with changelog 2022-08-27 17:51:11 -04:00
e5b1b3b9d7 styles: Material You! 2022-08-27 17:22:48 -04:00
c46c701ff3 styles: Fix styling for context menus and dialogs
...and use the AppCompat-provided DayNight selector theme
2022-08-27 17:07:15 -04:00
f32e15106a styles: Inherit the dark theme in dark mode 2022-08-27 16:39:15 -04:00
09e6e3db54 colors: Fix text and menu colors in night mode 2022-08-27 16:24:53 -04:00
b1de2c93b8 colors: Add colors for system-wide dark mode 2022-08-27 16:21:12 -04:00
f77281dc5b colors: Adjust colors for selected apps 2022-08-27 16:08:40 -04:00
6db4f84d35 AppListFragment: ConstraintLayout cannot be the parent of SwipeRefreshLayout
It causes problems with click events. Just use plain old FrameLayout for
this fragment.
2022-08-27 16:04:31 -04:00
4ea875be1a colors: Stop referring to black / grey / white directly
Prepare for Material You impl
2022-08-27 16:02:49 -04:00
6fae55fdbf style: Make the background slightly teal
To prepare for Material You
2022-08-27 15:59:47 -04:00
ceda2ef715 design: Use bottom navigation
Straight to the evil side...
2022-08-27 15:45:04 -04:00
705785630e style: Use light status bar color
Old Material is dead, long live Material Design
2022-08-27 14:56:41 -04:00
5e2ca3f575 Bump version to 1.8-dev1 2022-08-26 21:32:14 -04:00
60a52ee7fb Request notification permission on Tiramisu 2022-08-26 21:31:23 -04:00
019abe5a0c AndroidManifest: Remove meaningless commented-out permission 2022-08-26 21:17:25 -04:00
14a4ca6cd2 SetupWizardActivity: better documentation again 2022-08-26 21:16:42 -04:00
7202151378 strings: Limit the "Do-Not-Disturb" nonsense to pre-Oreo 2022-08-26 21:12:49 -04:00
18012b8c64 SetupWizardActivity: better documentation 2022-08-26 21:09:44 -04:00
7ca33edd26 Use ACTION_PROVISIONING_SUCCESSFUL instead of ACTION_PROFILE_PROVISIONING_COMPLETE
On Android 8.0+, the activity intent ACTION_PROVISIONING_SUCCESSFUL is
also sent out before the broadcast
ACTION_PROFILE_PROVISIONING_COMPLETE. We can make of use this to
directly bring up an activity for finalization, skipping over our
original notification-based switch-er-oo from the broadcast receiver.

This is also necessary on platform release T since now we cannot send
notifications by default. We cannot request for the permission either
since that will require a visible activity too. Using the activity
intent works around all of this and makes Shelter work again on T. (And
we won't have to deal with the Do-Not-Disturb nonsense anymore)
2022-08-26 21:02:13 -04:00
030b9837dc gradle: Bump target SDK to 33 (T) 2022-08-26 17:02:25 -04:00
a2677d9f9d gradle: Bring back jcenter just for time-duration-picker 2022-08-26 16:56:03 -04:00
95e5ae2fa8 chore: Upgrade dependencies
Not necessarily working yet.
2022-08-26 16:53:23 -04:00
593d8103f2 chore: Upgrade build tool dependencies
And move to mavenCentral instead of jcenter
2022-08-26 16:47:51 -04:00
shop
9c2357b1a1 Translated using Weblate (Hebrew)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/he/
2022-08-16 10:38:44 +00:00
shop
1d89e9804d Translated using Weblate (Hebrew)
Currently translated at 56.1% (55 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/he/
2022-08-10 13:38:42 +00:00
shop
1f30e9fad6 Added translation using Weblate (Hebrew) 2022-08-09 13:16:11 +00:00
Pad Ibog
e483e45bc2 Translated using Weblate (Bengali)
Currently translated at 8.1% (8 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/bn/
2022-08-06 16:38:41 +00:00
Pad Ibog
9a9832c6f1 Added translation using Weblate (Bengali) 2022-08-05 15:40:55 +00:00
Roland Kim
36e8ccaafb Translated using Weblate (Korean)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ko/
2022-07-29 00:38:37 +00:00
Roland Kim
a754568365 Added translation using Weblate (Korean) 2022-07-27 05:21:52 +00:00
Konstantinos
7e6557164e Translated using Weblate (Greek)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/el/
2022-04-08 14:29:00 +00:00
Konstantinos
f7270972a1 Translated using Weblate (Swedish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sv/
2022-04-08 14:29:00 +00:00
Konstantinos
cbeb287e17 Added translation using Weblate (Greek) 2022-04-07 08:32:01 +00:00
Adrià Vilanova
bf0fd9d0fc Translated using Weblate (Spanish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/es/
2022-03-25 18:01:57 +00:00
mezysinc
a9f6361400 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2022-02-15 15:04:30 +00:00
Faysal E
76bc161a0f Translated using Weblate (Arabic)
Currently translated at 83.6% (82 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-02-12 18:04:29 +00:00
Mohammed Anas
2b613059d7 Translated using Weblate (Arabic)
Currently translated at 83.6% (82 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-02-12 18:04:29 +00:00
Mohammed Anas
5207fd7eb9 Translated using Weblate (Arabic)
Currently translated at 81.6% (80 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-02-11 17:44:00 +00:00
Faysal E
0e18dd2b51 Translated using Weblate (Arabic)
Currently translated at 81.6% (80 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-02-11 17:43:59 +00:00
ling
fa618e0b49 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2022-02-04 02:04:26 +00:00
Faysal E
a976f8e711 Translated using Weblate (Arabic)
Currently translated at 77.5% (76 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-02-04 02:04:26 +00:00
Mohammed Anas
975bcfbc92 Translated using Weblate (Arabic)
Currently translated at 77.5% (76 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2022-02-04 02:04:26 +00:00
gorogr
f1f66a6a9b Translated using Weblate (Japanese)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ja/
2021-11-22 03:30:59 +00:00
Alparslan Sakci
ae6096613d Translated using Weblate (Turkish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-11-11 15:27:32 +00:00
Faysal E
ad7c2050b2 Translated using Weblate (Arabic)
Currently translated at 73.4% (72 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ar/
2021-11-05 22:27:29 +00:00
12cb10521f app: bump version to 1.7 (20) 2021-10-29 17:12:26 -04:00
a32f344736 CHANGELOG: Update changelog in preparation for 1.7 release 2021-10-29 17:11:55 -04:00
4bf4816521 AndroidManifest: get rid of annoying linter warnings 2021-10-29 14:37:27 -04:00
802074ee79 res: update source code URL to gitea 2021-10-29 14:27:23 -04:00
e42819a7e7 chore: bump dependencies 2021-10-29 14:26:32 -04:00
55142a7e4a chore: bump Android gradle plugin version 2021-10-29 14:26:07 -04:00
ling
13748b7745 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2021-10-25 11:27:25 +00:00
82681c3452 bump version to 1.7-dev2 2021-10-20 21:55:14 -04:00
2dd11d074f fix more instances of PendingIntent 2021-10-14 20:23:33 -04:00
1fd8670acb DummyActivity: set FLAG_MUTABLE on pending intents
Required on S
2021-10-14 20:16:16 -04:00
a36e028478 strings: escape quotes 2021-10-14 18:38:33 -04:00
d8fe3e339c strings: now setup will fail with existing profiles 2021-10-14 18:37:57 -04:00
bd1c765fb0 strings: fix typo 2021-10-14 18:34:17 -04:00
24108822a2 ShelterDeviceAdminReceiver: remove FLAG_ONGOING_EVENT
This prevents the notification from being shown on S
2021-10-14 18:28:14 -04:00
35fc9ba1bd WIP: bump targetSdkVersion to 31 2021-10-14 18:16:13 -04:00
0ae375e6a3 bump Android build tools version and dependencies 2021-10-14 18:08:59 -04:00
a8cf77857b update gradle build tools version 2021-10-14 17:20:42 -04:00
82c8caf027 Revert "Translated using Weblate (Chinese (Simplified))"
This reverts commit e72e5e3e4c.

Please do NOT update the zh_CN translation. These are maintained by me,
and acts as one of the canonical sources of translation (the other one
being en_US).
2021-10-14 14:54:26 -04:00
a5fdd50a05 .gitmodules: update path to SetupWizardLibrary 2021-10-14 10:55:34 -04:00
Alice
8b11d091e8 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2021-10-05 16:27:16 +00:00
Random
d9c72be47a Translated using Weblate (Italian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/it/
2021-09-29 15:26:59 +00:00
mezysinc
f8123d5e93 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2021-08-24 03:26:45 +00:00
ling
e72e5e3e4c Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2021-07-03 01:50:42 +00:00
solokot
87143bb666 Translated using Weblate (Russian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2021-06-13 09:58:11 +00:00
Judistirav
ff862e08d3 Translated using Weblate (Indonesian)
Currently translated at 15.3% (15 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/id/
2021-06-12 11:07:49 +00:00
Judistirav
2d4a3b6ff7 Added translation using Weblate (Indonesian) 2021-06-11 12:52:28 +00:00
Enol P
8df4430682 Translated using Weblate (Asturian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ast/
2021-06-04 00:47:43 +00:00
Martin Jurina
d9875b32bd Translated using Weblate (Czech)
Currently translated at 13.2% (13 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/cs/
2021-06-02 06:09:16 +00:00
Martin Jurina
5203ceae2c Added translation using Weblate (Czech) 2021-06-01 19:59:15 +00:00
Alparslan Sakci
239581b346 Translated using Weblate (Turkish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-06-01 17:33:58 +00:00
Enol P
0ec02e769f Translated using Weblate (Asturian)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ast/
2021-05-31 08:12:23 +00:00
Enol P
37e43c1d8b Added translation using Weblate (Asturian) 2021-05-29 21:28:52 +00:00
Alparslan Sakci
43414c453a Translated using Weblate (Turkish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-26 11:41:31 +00:00
Alparslan Sakci
66f582f771 Translated using Weblate (Turkish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-25 19:30:27 +00:00
Alparslan Sakci
838b2b085f Translated using Weblate (Turkish)
Currently translated at 94.8% (93 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-25 06:52:01 +00:00
Alparslan Sakci
b5d1ccdbbe Translated using Weblate (Turkish)
Currently translated at 93.8% (92 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-23 22:33:52 +00:00
Alparslan Sakci
1e1540ab80 Translated using Weblate (Turkish)
Currently translated at 86.7% (85 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-20 00:31:08 +00:00
Alexandre Brochand
e38982b96d Translated using Weblate (French)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fr/
2021-05-20 00:31:08 +00:00
Alparslan Sakci
c71b79b8f2 Translated using Weblate (Turkish)
Currently translated at 85.7% (84 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-17 18:11:46 +00:00
Alparslan Sakci
9c4d846907 Translated using Weblate (Turkish)
Currently translated at 75.5% (74 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-16 08:27:49 +00:00
Alparslan Sakci
8642521ee9 Translated using Weblate (Spanish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/es/
2021-05-16 08:27:49 +00:00
Alparslan Sakci
bc1cd3d792 Translated using Weblate (Swedish)
Currently translated at 9.1% (9 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/sv/
2021-05-16 08:27:49 +00:00
Alparslan Sakci
7cfdad04f4 Translated using Weblate (Turkish)
Currently translated at 55.1% (54 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-13 21:36:48 +00:00
Quang Trung
4735f35439 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/vi/
2021-05-11 07:06:13 +00:00
Quang Trung
662207d920 Translated using Weblate (Vietnamese)
Currently translated at 61.2% (60 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/vi/
2021-05-11 05:03:24 +00:00
Quang Trung
faf534d9ec Added translation using Weblate (Vietnamese) 2021-05-11 02:31:45 +00:00
Alparslan Sakci
436a0deb09 Translated using Weblate (Turkish)
Currently translated at 24.4% (24 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-09 20:12:43 +00:00
Alparslan Sakci
980e4f66c4 Translated using Weblate (Turkish)
Currently translated at 17.3% (17 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/tr/
2021-05-08 21:07:33 +00:00
Alparslan Sakci
0d9e73d9c2 Added translation using Weblate (Turkish) 2021-05-08 18:57:21 +00:00
Skajmer
029092dd93 Translated using Weblate (Polish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pl/
2021-04-24 19:12:46 +00:00
-
d9a3a0a667 Translated using Weblate (Dutch)
Currently translated at 55.1% (54 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/nl/
2021-04-21 12:12:45 +00:00
-
a418ee9116 Translated using Weblate (German)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2021-04-19 16:01:40 +00:00
dd3b4d4689 add fastlane-compatible metadata directory for F-Droid 2021-04-02 10:23:51 +08:00
ffba2c0d20 ShelterService: stop being foreground when unbound 2021-04-02 10:11:16 +08:00
4e2f498c6c refactor: MainActivity: do not use resource IDs in switch..case 2021-04-02 09:56:49 +08:00
a2c400de9b MainActivity: fail fast in NonNull method 2021-04-02 09:51:45 +08:00
68b0b85993 refactor: MainActivity: use contracts instead of startActivityForResult 2021-04-02 09:49:56 +08:00
7f9e62ac5b WTFPL -> GPLv3 2021-04-02 09:26:14 +08:00
gnuhead-chieb
8806311c64 Translated using Weblate (Japanese)
Currently translated at 91.8% (90 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ja/
2021-03-31 17:23:13 +00:00
Benjamin Torres
912e9ab16b Translated using Weblate (Spanish)
Currently translated at 100.0% (98 of 98 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/es/
2021-03-27 08:57:02 +00:00
50331986c9 README: make it clear that PRs are not accepted on GitHub 2021-03-24 08:41:27 +08:00
5dd68e8c38 README: rewrite 2021-03-24 08:40:13 +08:00
e67251267e app: build.gradle: disable ExtraTranslation lint
* we will let Weblate handle these
2021-03-18 17:02:03 +08:00
0a4b09dbdb app: build.gradle: disable Fragment version check for now 2021-03-18 17:00:54 +08:00
e52f38bd03 app: update appcompat library to 1.3.0-beta01
* Otherwise the linter won't let us do a release build due to it
  depending on an old Fragment version
2021-03-18 16:53:33 +08:00
8692e558fc update SetupWizardLibrary
* for dependency upgrades
2021-03-18 16:48:34 +08:00
cc5c4e41be app: build.gradle: bump version to 1.7-dev1 2021-03-18 16:33:55 +08:00
0a7721cd50 MainActivity: derp 2021-03-18 16:32:23 +08:00
530cee79de refactor: MainActivity: use the new result contract to choose APKs 2021-03-18 16:30:58 +08:00
15de66412e cleanup: MainActivity: cleanup class member variable 2021-03-18 15:59:21 +08:00
af8337f2c8 add setup wizard to changelog 2021-03-17 21:18:52 +08:00
1c28f100db i18n: remove unused strings due to refactor 2021-03-17 16:46:57 +08:00
cc90c170e0 Merge branch 'refactor-setupwizard' into master
* Revamped setup process!
2021-03-17 16:38:43 +08:00
f63272baee i18n: make it clear that users should pull down notification center 2021-03-17 16:36:44 +08:00
657f729fac SetupWizardActivity: use a separate action for finalizing provision 2021-03-17 16:33:21 +08:00
7e34b75443 SetupWizardActivity: support resuming setup 2021-03-17 16:18:48 +08:00
d79cc800cb MainActivity: ActivityResultLauncher has to be created before starting 2021-03-17 16:11:01 +08:00
36d2988ec2 SetupWizardActivity: reset authentication keys before provisioning 2021-03-17 16:08:02 +08:00
a406505386 refactor: move isProfileAvailable to Utility
* and clean up profile provisioning code from MainActivity
2021-03-17 16:06:18 +08:00
ca225e19d5 SetupWizardActivity: actually implement setup 2021-03-17 15:58:42 +08:00
65bfaa4729 .idea: whatever IDEA decided to change 2021-03-17 15:35:20 +08:00
13599506c5 SetupWizardActivity: implement setup [1/n] 2021-03-17 15:33:54 +08:00
924ad14008 SetupWizard: layout: no scroll view is needed
* SetupWizardLayout has a built-in one
2021-03-15 20:16:29 +08:00
f7c3504549 SetupWizard: i18n: escape quotes properly 2021-03-15 20:15:10 +08:00
9594c368fd SetupWizardActivity: add the final "Ready?" fragment 2021-03-15 20:14:32 +08:00
5b6b0fc96c SetupWizardActivity: add compatibility page 2021-03-15 20:03:05 +08:00
3d9c2fcdcf SetupWizardActivity: add slide animation to the fragments 2021-03-15 19:38:21 +08:00
448601291f SetupWizardActivity: add a permissions page 2021-03-15 17:47:17 +08:00
2b544a223b lay out the skeleton of SetupWizardActivity 2021-03-15 17:35:05 +08:00
c2d7c45db5 import SetupWizardLibrary 2021-03-15 16:46:29 +08:00
533e5bc148 MainActivity: cleanup unused device admin requests and text 2021-03-13 16:35:27 +08:00
c24d71eddb MainActivity: add vertical constraints to toolbar 2021-03-13 16:28:20 +08:00
830ddd40b8 refactor: MainActivity: move mPager and mTabs to local
* while we are at it, move FragmentStateAdaptor to local too.
2021-03-13 16:27:25 +08:00
ff91bf42ef refactor: switch to ViewPager2
* ViewPager is now deprecated
2021-03-13 16:22:20 +08:00
a64bb7910e UX: make it clear that the user should expect a notification on setup 2021-03-13 16:01:44 +08:00
0369e6e8cf chore: update dependencies and build tools 2021-03-13 15:47:10 +08:00
Radagio
1ab19beb8b Translated using Weblate (Romanian)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ro/
2021-02-19 12:55:39 +00:00
Radagio
bd6b80111d Translated using Weblate (Romanian)
Currently translated at 25.2% (22 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ro/
2021-02-17 06:14:27 +00:00
Alecsandra
8ada54f5eb Translated using Weblate (Romanian)
Currently translated at 11.4% (10 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ro/
2021-02-11 13:52:49 +00:00
Daniel Jircă
6cfcd600c6 Added translation using Weblate (Romanian) 2021-02-11 13:01:38 +00:00
Dan G
5661e7b28d Translated using Weblate (Tamil)
Currently translated at 8.0% (7 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ta/
2021-02-10 08:53:49 +00:00
gnuhead-chieb
755b5f7c45 Translated using Weblate (Japanese)
Currently translated at 97.7% (85 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ja/
2021-02-10 08:53:49 +00:00
Dan G
02a9c4ee55 Added translation using Weblate (Tamil) 2021-02-09 12:22:43 +00:00
Takaki Iekura
337b7ad9f7 Added translation using Weblate (Japanese) 2021-01-29 19:05:22 +00:00
stev101
0057da17fa Translated using Weblate (Dutch)
Currently translated at 29.8% (26 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/nl/
2021-01-19 16:30:25 +00:00
stev101
01372d1d62 Added translation using Weblate (Dutch) 2021-01-19 05:08:37 +00:00
stev101
d13bb7864b Added translation using Weblate (Spanish) 2021-01-19 05:06:59 +00:00
Pavel Vasiliev
789d55f101 Translated using Weblate (Russian)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/ru/
2020-11-04 12:16:28 +00:00
Natalcia
0d53bc9980 Translated using Weblate (Polish)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pl/
2020-10-27 18:21:17 +00:00
Natalcia
dcc0326fd2 Translated using Weblate (Polish)
Currently translated at 28.7% (25 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pl/
2020-10-27 13:35:21 +00:00
Natalcia
ad514424fe Added translation using Weblate (Polish) 2020-10-26 12:39:22 +00:00
mezy
28637b77b7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2020-10-08 14:30:03 +00:00
Guillaume Démurgé
6955935f12 Translated using Weblate (French)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/fr/
2020-10-05 14:30:02 +00:00
Erik Lindström
8bf9810669 Added translation using Weblate (Swedish) 2020-10-04 22:28:59 +00:00
Guillaume Démurgé
2e4f190593 Added translation using Weblate (French) 2020-10-04 11:12:41 +00:00
Ronaldo
8f71c62078 Translated using Weblate (Italian)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/it/
2020-09-30 03:56:03 +00:00
Ronaldo
c4415fa801 Added translation using Weblate (Italian) 2020-09-29 08:04:32 +00:00
1230b506f1
README: add link to GitHub releases for now
* The Google Play version is crippled so let's link to GitHub releases
  for people that want the full version but do not want to have to
  uninstall & reinstall.
2020-09-29 14:44:24 +08:00
d6abfdcc64
CHANGELOG: explain why File Shuttle is not available on Play 2020-09-29 14:31:48 +08:00
87e72dfa01
use a repackaging script to remove File Shuttle for Google Play
* It is not supported on Google Play for now.
2020-09-29 14:24:54 +08:00
93c1f66bca
app: bump to version 1.6 and bump dependencies 2020-09-29 13:40:55 +08:00
d31986d351 add CHANGELOG.md and prepare for 1.6 release 2020-09-29 11:48:17 +08:00
S Knorr
8ee141fcd6 Translated using Weblate (German)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2020-09-26 00:21:28 +00:00
FROM LIST
76695401ee Translated using Weblate (Portuguese (Brazil))
Currently translated at 90.8% (79 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/pt_BR/
2020-09-19 00:21:26 +00:00
Obiwan Kenobi
3ffb4daa4a Translated using Weblate (German)
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2020-09-19 00:21:25 +00:00
119c798929 Added translation using Weblate (Portuguese (Brazil)) 2020-09-17 23:56:46 +00:00
Fei Yang
38d204bf5f Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2020-09-16 14:49:44 +00:00
b1916e3035 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (87 of 87 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2020-09-16 12:06:20 +00:00
Obiwan Kenobi
a07d166cb9 Translated using Weblate (German)
Currently translated at 100.0% (85 of 85 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2020-09-16 12:04:11 +00:00
749ad11dbe
feat: blocking cross-profile access to contacts
* Suggested in:
  <https://lists.sr.ht/~petercxy/shelter/%3CQILP9g8tdm3cegKs9oS8d_BJaeBojoQGLhxxOl5msDJq4rOFfq_pOqiJapSc4ndOp6rTNv-Q-6Y8hkI2sizYetorrJb9EWQ6dzEoIQ15m2A%3D%40pm.me%3E>
2020-09-16 20:02:42 +08:00
6f765b58bd
settings: disable camera proxy on Android 11 and beyond
* This is no longer supported by Android.
2020-09-16 19:22:00 +08:00
Camilo Alejo
43444bfa5f
feat: Enable default browsable intents from working profile
Some browsable intents are also defined as "CATEGORY_DEFAULT", meaning
the current filter won't allow them to interact with the main profile.
Notably within this group are some authenticators and other safe-to-use
apps that the user might not be able/allowed to clone.
2020-09-16 19:19:13 +08:00
Camilo Alejo
9a6777c56f
fix: Force installation on internal memory.
Shelter will only install on internal memory since device managers
can't work from external memory.
2020-09-16 19:19:12 +08:00
Fei Yang
46490be13d Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (85 of 85 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hant/
2020-09-15 06:30:09 +00:00
Fei Yang
f663270270 Added translation using Weblate (Chinese (Traditional)) 2020-09-15 02:34:43 +00:00
86a6bdb526
README: add translation status widget 2020-09-15 08:09:03 +08:00
Obiwan Kenobi
ee411957d0 Translated using Weblate (German)
Currently translated at 100.0% (85 of 85 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2020-09-14 23:42:20 +00:00
f69b091587 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (85 of 85 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2020-09-14 23:42:20 +00:00
4bf41b5931 i18n: fix typo in source string 2020-09-15 07:42:05 +08:00
FROM LIST
330cde328e Translated using Weblate (German)
Currently translated at 97.6% (83 of 85 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/de/
2020-09-14 17:25:28 +00:00
870a41a855 Added translation using Weblate (German) 2020-09-14 13:33:05 +00:00
b5e4581867
UI: add Weblate URL to settings 2020-09-14 21:07:30 +08:00
3fe7da9f27 README: link to Weblate for translations 2020-09-14 20:48:19 +08:00
c851a22cf6 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (83 of 83 strings)

Translation: Shelter/Shelter
Translate-URL: http://weblate.typeblog.net/projects/shelter/shelter/zh_Hans/
2020-09-14 12:39:13 +00:00
a121eec480
feat: add menu option for Documents UI
* On Pixel (and possibly Android One) devices, the default Documents UI
  is hidden behind Google Files, making it hard to use File Shuttle
  because the Google one does not work well with Shelter as a custom
  FileProvider.
* Let's offer an option in menu to open the original AOSP one.
2020-09-14 19:42:54 +08:00
3852bd83b5
fix: querying application list on Android R
* This needs special whitelisting now.
2020-09-08 21:10:55 +08:00
bb4b030968
build: bump version to 1.6-alpha 2020-09-08 20:57:08 +08:00
172522f3f9
fix: disable File Shuttle on Android Go devices
* Those won't work with SYSTEM_ALERT_WINDOW
2020-09-08 20:55:32 +08:00
f35f125c7d
fix: request system alert permission for File Shuttle
* I cannot think of a proper way to start File Shuttle services without
  hitting background activity limitations. Let's just request for system
  alert window permission.
* This is pretty dirty, and could mask other bugs that may happen when
  this is not enabled. I don't want to make this permission mandatory
  for Shelter, so always remember to test without this enabled.
* This won't work on Android Go, though.
2020-09-08 20:51:51 +08:00
b8bd0f5dc6
refactor: extract common logic for ensuring special access 2020-09-08 20:43:47 +08:00
c147377c07
feat: start re-enabling File Shuttle on Android R
* TODO: Figure out how to start the activity properly.
2020-09-08 20:32:58 +08:00
23c87cfe6e
build.gradle: bump build tool and sdk versions 2020-09-08 19:58:43 +08:00
d52d813054
app: bump version to 1.5.1 release 2020-08-05 19:03:16 +08:00
2071a39eea
app: bump to 1.5.1-beta 2020-07-16 19:22:42 +08:00
e4d8505a96
i18n: clarify the device can't be on Do Not Disturb mode 2020-07-16 19:21:14 +08:00
3395f55f09
fix: cannot invoke startActivity from services
* As per Android 10 background limitation, there is no way for a
  service, even foreground, to start an activity reliably.
* We probably could have just moved all the install application logic to
  DummyActivity and invoke that activity directly from the other side,
  but sometimes we may not need an UI component at all, e.g. when
  installing system applications. Doing those in a service keeps visual
  interruption minimal.
* Instead, we use the MainActivity in the main profile as a proxy to
  start activities needed to install user applications.
2020-07-02 10:30:21 +08:00
2911a1d3ae
feat: support cloning apps with split apks
* This is available since O, but no special logic is needed until Q.
2020-07-02 09:36:34 +08:00
411487db24
chore: bump build tools version 2020-06-22 11:20:15 +08:00
7774395819
fix: DummyActivity: implement installation progress dialog
* This fixes the apparent stalling when installing / cloning
  applications.
* Also moves apk reading to another thread.
2020-06-22 10:55:47 +08:00
97f4b918b7
doc: update in-app URLs to repo and mailing list 2020-06-22 09:15:29 +08:00
59b32e141e
README: update bug report methods 2020-06-22 09:13:49 +08:00
87ec259028
README: clarify known issues 2020-06-22 09:12:26 +08:00
733bab3605
chore: update dependencies
* We are back in business!
2020-06-22 09:04:01 +08:00
3e8c564de2
README: update logo to use the one from CGit 2020-06-20 10:37:21 +08:00
07c581ceb0
README: announce switch to my CGit instance 2020-06-20 10:17:02 +08:00
d4371f6a83
README: update to include non-isolated data and statement on Island 2019-09-10 14:29:32 +08:00
77464550ce
build.gradle: bump version
let's release at least a working version for Android 10 ASAP
2019-09-10 13:42:59 +08:00
a6437340cf
i18n: update zh_CN translations 2019-09-10 13:42:50 +08:00
d2716cf0da
app: bump targetSDK to 29 and upgrade dependencies 2019-09-10 13:29:21 +08:00
36815f5c51
SettingsFragment: disable FileShuttle on Q for now
FileShuttle needs to be totally refactored to be able to support Q. For
now, let's first make sure basic features are working and just disable
FileShuttle for a while.

Users upgraded from lower versions of Android to Q would not be affected
because Shelter already has permissions to read and write external
storage.
2019-09-10 13:27:28 +08:00
d884930034
MainActivity: kill Device Admin code
There is zero need for Shelter to become device admin
2019-09-10 13:03:31 +08:00
33e10a0c1a
clean up unused imports 2019-09-10 13:00:37 +08:00
d8b6fd53aa
DummyActivity: fix app cloning on Android Q
On Android Q, it is no longer possible to invoke PackageInstaller by
using ACTION_INSTALL_PACKAGE. Therefore, we have to use a not-so-elegant
solution by reading the apk to memory and write it back to the
PackageInstaller interface. Keep this case only for Android Q as for
now.
2019-09-10 12:57:25 +08:00
188ca82088
ShelterDeviceAdminReceiver: use notification to start activity
On Android 10, it is no longer possible to start an activity without
being visible in the first place. However, Shelter depends on starting
the activity from the DAR to initialize the provisioned work profile. We
switch to a notification with the highest importance to let the user
manually bring up the DummyActivity for finalization.

This may also fix bugs on devices running EMUI / MIUI that were
previously not working due to similar reasons.
2019-09-10 10:43:17 +08:00
7aa0df0c86
.idea: whatever Android Studio decided to change 2019-09-10 10:42:46 +08:00
bb2e425f06
Merge branch 'simple_cleanup' of https://github.com/tonymanou/Shelter 2019-04-03 17:42:34 +08:00
tonymanou
0ca210a7d9 Generic values passed to AIDL are Serializable, not simple Object 2019-02-26 23:34:04 +01:00
tonymanou
ba46ea599b Make constants final 2019-02-26 23:34:04 +01:00
tonymanou
60a8fdf960 Remove redundant things 2019-02-26 23:34:04 +01:00
tonymanou
f66099bc2f Fix string comparison 2019-02-26 23:34:04 +01:00
tonymanou
9bae5fb333 Use our context's layout inflater 2019-02-26 23:34:04 +01:00
tonymanou
cdcd9844a5 No need to store root view in viewholder 2019-02-26 23:34:04 +01:00
tonymanou
872b288419 Fix non-final lock 2019-02-25 22:16:38 +01:00
107 changed files with 5779 additions and 846 deletions

5
.gitignore vendored
View file

@ -4,6 +4,7 @@
/.idea/libraries /.idea/libraries
/.idea/modules.xml /.idea/modules.xml
/.idea/workspace.xml /.idea/workspace.xml
/.idea/jarRepositories.xml
.DS_Store .DS_Store
/app/release /app/release
/build /build
@ -75,3 +76,7 @@ fastlane/Preview.html
fastlane/screenshots fastlane/screenshots
fastlane/test_output fastlane/test_output
fastlane/readme.md fastlane/readme.md
# temporary google play repackaging tool
repackage/*
!repackage/repackage.sh

4
.gitmodules vendored Normal file
View file

@ -0,0 +1,4 @@
[submodule "libs/SetupWizardLibrary"]
path = libs/SetupWizardLibrary
url = https://gitea.angry.im/PeterCxy/SetupWizardLibrary.git
branch = main

View file

@ -1,72 +1,6 @@
<component name="ProjectCodeStyleConfiguration"> <component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173"> <code_scheme name="Project" version="173">
<option name="RIGHT_MARGIN" value="100" />
<AndroidXmlCodeStyleSettings>
<option name="USE_CUSTOM_SETTINGS" value="true" />
</AndroidXmlCodeStyleSettings>
<JavaCodeStyleSettings>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<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 />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
</value>
</option>
</JavaCodeStyleSettings>
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
<XML>
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</XML>
<codeStyleSettings language="XML"> <codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions> <indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions> </indentOptions>

6
.idea/compiler.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

10
.idea/deploymentTargetSelector.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

4
.idea/encodings.xml generated Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

10
.idea/migrations.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

38
.idea/misc.xml generated
View file

@ -1,31 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="app/src/main/res/drawable/bottom_navigation_color_selector.xml" value="0.287" />
<entry key="app/src/main/res/drawable/circle_accent.xml" value="0.288" />
<entry key="app/src/main/res/layout/activity_main.xml" value="0.2838541666666667" />
<entry key="app/src/main/res/layout/activity_settings.xml" value="0.19375" />
<entry key="app/src/main/res/layout/app_list_item.xml" value="0.2838541666666667" />
<entry key="app/src/main/res/layout/fragment_list.xml" value="0.2838541666666667" />
<entry key="app/src/main/res/menu/bottom_navigation.xml" value="0.2828125" />
<entry key="app/src/main/res/menu/main_activity_menu.xml" value="0.2838541666666667" />
</map>
</option>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="NullableNotNullManager"> <component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" /> <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" /> <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables"> <option name="myNullables">
<value> <value>
<list size="5"> <list size="13">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" /> <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" /> <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" /> <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" /> <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" /> <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="5" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="6" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="7" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
<item index="8" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
<item index="9" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="11" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
<item index="12" class="java.lang.String" itemvalue="org.jspecify.nullness.Nullable" />
</list> </list>
</value> </value>
</option> </option>
<option name="myNotNulls"> <option name="myNotNulls">
<value> <value>
<list size="4"> <list size="12">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" /> <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" /> <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" /> <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" /> <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="5" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="6" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
<item index="7" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
<item index="11" class="java.lang.String" itemvalue="org.jspecify.nullness.NonNull" />
</list> </list>
</value> </value>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>

1
.idea/vcs.xml generated
View file

@ -2,5 +2,6 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/libs/SetupWizardLibrary" vcs="Git" />
</component> </component>
</project> </project>

42
CHANGELOG.md Normal file
View file

@ -0,0 +1,42 @@
1.9.1 (445)
===
- Hotfix crashes below Android 11.
1.9
===
- Updated targetSDK to 34 (Android 14) with compatibility fixes.
- More reliable delayed freezing using AlarmManager (thanks parmaster84).
- Support for cross-profile interactions allowlisting (e.g. for Gboard).
- Removed "Fake Camera" feature as it has not been supported since R.
- Version displayed within the app has now been changed to also reflect the exact Git commit when the app is built.
- File Shuttle no longer appends ".null" or ".bin" suffixes unnecessarily. This should make it work much better with file managers such as Material Files.
- File Shuttle now triggers media scanning much more robustly. Media files (pictures, videos, etc.) copied into the work profile should now show up much quicker in gallery apps.
- Added a fake NFC payment service to workaround a bug in Android that prevents payment apps inside the work profile from being used if none is present in the main profile.
- Fixed unintuitive colors of navigation icons under dark mode.
1.8
===
- Updated targetSDK to 33 (Android 13) with compatibility fixes.
- UI style revamp with Material You support on Android 12+.
1.7
===
- Revamped the initial setup process to include a full setup guide for better clarity and less confusion.
- Upgraded targetSDK to 31 (Android 12) with compatibility fixes.
- Upgraded dependencies.
- Translation updates thanks to our wonderful community.
1.6
===
- Start of in-repo changelogs
- Add support for Android 11 (c147377, 3852bd, and more) (__Note__: For now, File Shuttle is not available in the version on Google Play due to policy reasons, as they will not be allowing apps with All Files permission before 2021.)
- Shelter can no longer be installed to external storage (removable SD cards) (9a6777 by Camilio Alejo)
- Allow more browsable intents to be passed across work / main profile boundary (43444b by Camilio Alejo)
- A new shortcut to Documents UI is available in the three-dot menu of Shelter, because on Pixels the Google Files app may not be able to open File Shuttle correctly (a121ee)
- You can now choose to block or allow cross-profile contact access via a settings option (749ad1)
- Thanks to translators participating in our Weblate instance (https://weblate.typeblog.net), Shelter is now available in more languages. You can now contribute translations easier than ever by using the Weblate interface.

679
LICENSE
View file

@ -1,13 +1,674 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 2, December 2004 Version 3, 29 June 2007
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Everyone is permitted to copy and distribute verbatim or modified Preamble
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE The GNU General Public License is a free, copyleft license for
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION software and other kinds of works.
0. You just DO WHAT THE FUCK YOU WANT TO. The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View file

@ -1,55 +1,61 @@
![Shelter](https://git.angry.im/PeterCxy/Shelter/raw/branch/master/art/ic_launcher_egg-web.png) Shelter
<a href='https://play.google.com/store/apps/details?id=net.typeblog.shelter&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/></a>
<a href="https://f-droid.org/app/net.typeblog.shelter"><img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="80"></a>
Note: the GitHub repository is merely a mirror. Although I also accept pull requests and issues from GitHub, I'd recommend you to go to the main repository at <https://git.angry.im/PeterCxy/Shelter>
Note: The F-Droid version is automatically built and signed by the F-Droid server on each update of Shelter. The build is not managed by the author and could lag behind the updates from Play Store and this repository for several days due to high server load.
Shelter - Isolate your Big Brother Apps / Multiple Accounts
=== ===
Shelter is a Free and Open-Source (FOSS) app that leverages the "Work Profile" feature of Android to provide an isolated space that you can install or clone apps into. Shelter is a Free and Open-Source (FOSS) app that leverages the "Work Profile" feature of Android to provide an isolated space that you can install or clone apps into.
Shelter comes with absolutely no advertisement / statistics / tracking SDKs bundled with it. All source code is available in this public Git repository and the sources are licensed under WTFPL. Downloads
This app depends on your Android system's implementation of Work Profile. Some vendor / custom ROMs may have a broken implementation that may cause crashes and even bricking of your device. One such example is MIUI from Xiaomi. I currently provide no support for such ROMs because I personally do not own any of these devices. If you are running Shelter on these ROMs, you are on your own. If any developer out there own these devices and could make Shelter run on these ROMs, please send pull requests and I'll be happy to merge them.
Features / Use Cases
=== ===
1. Run "Big Brother" apps inside the isolated profile so they cannot access your data / files outside the profile - [F-Droid](https://f-droid.org/app/net.typeblog.shelter) (Signed by F-Droid)
2. "Freeze" (disable) background-heavy, tracking-heavy or seldom-used apps when you don't need them. This is especially true if you use apps from Chinese companies like Baidu, Alibaba, Tencent. - Custom F-Droid Repository (Signed by PeterCxy, contains latest development versions):
3. Clone apps to use two accounts on one device - [Click here](fdroidrepos://fdroid.typeblog.net?fingerprint=1A7E446C491C80BC2F83844A26387887990F97F2F379AE7B109679FEAE3DBC8C) to add from your phone
- Or scan the following QR-code:
![](fdroid_custom_repo.png)
- Or setup manually:
- Url: https://fdroid.typeblog.net
- Fingerprint: `1A 7E 44 6C 49 1C 80 BC 2F 83 84 4A 26 38 78 87 99 0F 97 F2 F3 79 AE 7B 10 96 79 FE AE 3D BC 8C`
Caveats You cannot switch between versions listed above that have different signature without uninstalling Shelter first.
Features
=== ===
Shelter is not a full sandbox implementation. It cannot protect you from: - Installing apps inside a work profile for isolation
- "Freeze" apps inside the work profile to prevent them from running or being woken up when you are not actively using them
- Installing two copies of the same app on the same device
1. Security bugs of the Android system or Linux kernel Discussion & Support
2. Backdoors installed in your Android system (so please use an open-source ROM if you are concerned about this)
3. Backdoors installed into the firmwares (no way to work around this)
4. Any other bugs or limitations imposed by the Android system. (i.e. If Android chooses to expose some information into the work profile, there is nothing I could do about it)
Also, Shelter cannot create more than 1 work profile on one Android device, and cannot co-exist with any other apps that manages a Work Profile. This is due to the limitations of the Android system, and I can do nothing about this.
FAQS
=== ===
**Q**: Why not use Island by OasisFeng, the creator of Greenify? - [Mailing List](https://lists.sr.ht/~petercxy/shelter)
**A**: Simply because it is not an FOSS app and it bundles with non-free SDKs. Note that this doesn't necessarily mean that Island has anti-features like tracking (and I don't think it has either), it's just that I wrote Shelter as an FOSS replacement of it. There is no other reason why one would prefer Shelter over Island except for this one. - Matrix Chat Room: #shelter:neo.angry.im
**Q**: Why does Shelter always run in background? __The GitHub Issue list and pull requests are not checked regularly. Please use the mailing list instead.__
**A**: Please try removing Shelter from "Recent Apps" every time you close it. If it still persists in your notifications and eating up battery, you might have encountered a bug. Please file a bug report.
**Q**: How do I uninstall Shelter from my device? Caveats & Known Issues
**A**: 1) Go to Settings -> Accounts to remove the work profile; 2) Go to Settings -> Security -> Advanced -> Device admin apps to remove Shelter from Device Admin apps; 3) Uninstall Shelter normally. ===
**Q**: If I encounter bugs, how do I report them? - Some caveats and known issues are discussed during the setup process of Shelter. __Please read through text in the setup wizard carefully__.
**A**: You could file an issue on either the main repository at <https://git.angry.im/PeterCxy/Shelter> or the mirror repository at <https://github.com/PeterCxy/Shelter>. Please include your system information as well as a logcat if possible. - Shelter is only as safe as the Work Profile implementation of the Android OS you are using. For details, see <https://support.google.com/work/android/answer/6191949?hl=en>
**Q**: How do I support the project? State of the Project, Feature Requests, etc.
**A**: You can submit issues if you find a bug or have an idea about features of Shelter; you may also contribute code to this project if you can code; providing translations is also welcomed. If you have some extra money lying around, you can also [support me on Patreon](https://www.patreon.com/PeterCxy). ===
Since Shelter simply makes use of the Work Profile APIs exposed by Android, there is a limited set of features that are possible to implement via the app. As we do not intend on leveraging (or "abusing") adb privileges, the features of Shelter can only be a strict subset of the exposed, unprivileged APIs.
As a result, we do not intend on adding a lot of new features to Shelter going forward, unless there is to be big changes in the capabilities of work profile APIs. Shelter is currently in an effective **maintenance mode**. Nevertheless, the author is still committed to regularly **adapting Shelter to all new Android versions as soon as possible after they are released** -- this includes upgrading the target SDK level, adapting to any new features or restrictions introduced by the new Android version, updating all dependencies, and so on. The author still relies on Shelter for his daily life, so Shelter will **not** become abandonware in the forseeable future.
Contributing
===
- [Weblate](https://weblate.typeblog.net/projects/shelter/shelter/) for contributing translations
- Sponsor me on [Patreon](https://www.patreon.com/PeterCxy)
<a href="http://weblate.typeblog.net/engage/shelter/?utm_source=widget">
<img src="http://weblate.typeblog.net/widgets/shelter/-/shelter/multi-auto.svg" alt="Translation status" />
</a>
Uninstalling
===
To uninstall Shelter, please delete the work profile first in Settings -> Accounts, and then uninstall the Shelter app normally.

View file

@ -1,14 +1,51 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
repositories {
//noinspection JcenterRepositoryObsolete
jcenter {
content {
includeVersion "mobi.upod", "time-duration-picker", "1.1.3"
}
}
}
def getVersionCode = { ->
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-list', '--first-parent', '--count', 'master'
standardOutput = stdout
}
return Integer.parseInt(stdout.toString().trim())
}
catch (ignored) {
return -1;
}
}
def getVersionName = { ->
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--tags', '--dirty'
standardOutput = stdout
}
return stdout.toString().trim()
}
catch (ignored) {
return null;
}
}
android { android {
compileSdkVersion 28 compileSdk 35
buildToolsVersion '28.0.3' buildToolsVersion = '35.0.0'
defaultConfig { defaultConfig {
applicationId "net.typeblog.shelter" applicationId "net.typeblog.shelter"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 28 targetSdkVersion 35
versionCode 12 versionCode getVersionCode()
versionName "1.4.1" versionName getVersionName()
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
@ -18,32 +55,36 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} }
} }
aaptOptions { applicationVariants.all { variant ->
cruncherEnabled = false if (variant.name == "debug") {
variant.outputs.each { o -> o.versionCodeOverride = System.currentTimeSeconds() }
}
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
lintOptions { lint {
// We have community-contributed translations. Do not let them block releases. disable 'MissingTranslation', 'ExtraTranslation', 'GoogleAppIndexingWarning', 'InvalidFragmentVersionForActivityResult'
disable 'MissingTranslation'
// We don't need Google App Indexing
disable 'GoogleAppIndexingWarning'
} }
buildFeatures {
aidl true
}
namespace 'net.typeblog.shelter'
} }
dependencies { dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.legacy:legacy-support-core-ui:1.0.0' implementation 'androidx.legacy:legacy-support-core-ui:1.0.0'
implementation 'androidx.fragment:fragment:1.0.0' implementation 'androidx.fragment:fragment:1.8.4'
implementation 'androidx.appcompat:appcompat:1.0.0' implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.preference:preference:1.0.0' implementation 'androidx.preference:preference:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
implementation 'mobi.upod:time-duration-picker:1.1.3' debugImplementation project(path: ':setup-wizard-lib', configuration: 'gingerbreadCompatDebugRuntimeElements')
testImplementation 'junit:junit:4.12' releaseImplementation project(path: ':setup-wizard-lib', configuration: 'gingerbreadCompatReleaseRuntimeElements')
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4' androidTestImplementation 'androidx.test:runner:1.6.0-alpha04'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.0-alpha01'
} }

View file

@ -1,18 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.typeblog.shelter"> xmlns:tools="http://schemas.android.com/tools"
android:installLocation="internalOnly" >
<uses-feature android:name="android.software.device_admin" android:required="true"/> <uses-feature android:name="android.software.device_admin" android:required="true"/>
<uses-feature android:name="android.software.managed_users" android:required="true"/> <uses-feature android:name="android.software.managed_users" android:required="true"/>
<!--<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" />
<uses-permission android:maxSdkVersion="25" <uses-permission android:maxSdkVersion="25"
android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.NFC" />
<!-- For querying apps on Android R and later -->
<queries>
<intent>
<action android:name="android.intent.action.MAIN"/>
</intent>
</queries>
<application <application
android:name=".ShelterApplication" android:name=".ShelterApplication"
@ -25,13 +40,20 @@
<!-- The main activity for UI --> <!-- The main activity for UI -->
<activity android:name=".ui.MainActivity" <activity android:name=".ui.MainActivity"
android:launchMode="singleTask"> android:launchMode="singleTask"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Setup Wizard -->
<activity android:name=".ui.SetupWizardActivity"
android:theme="@style/SuwThemeMaterial.Light"
android:launchMode="singleTask"
android:exported="false"/>
<!-- The Settings activity --> <!-- The Settings activity -->
<activity android:name=".ui.SettingsActivity" <activity android:name=".ui.SettingsActivity"
android:label="@string/settings" /> android:label="@string/settings" />
@ -40,7 +62,9 @@
<!-- Needed because only cross-profile Activity intents are supported --> <!-- Needed because only cross-profile Activity intents are supported -->
<activity android:name=".ui.DummyActivity" <activity android:name=".ui.DummyActivity"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"> android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.Translucent.NoTitleBar"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="net.typeblog.shelter.action.FINALIZE_PROVISION" /> <action android:name="net.typeblog.shelter.action.FINALIZE_PROVISION" />
<action android:name="net.typeblog.shelter.action.START_SERVICE" /> <action android:name="net.typeblog.shelter.action.START_SERVICE" />
@ -56,17 +80,21 @@
<action android:name="net.typeblog.shelter.action.START_FILE_SHUTTLE" /> <action android:name="net.typeblog.shelter.action.START_FILE_SHUTTLE" />
<action android:name="net.typeblog.shelter.action.START_FILE_SHUTTLE_2" /> <action android:name="net.typeblog.shelter.action.START_FILE_SHUTTLE_2" />
<action android:name="net.typeblog.shelter.action.SYNCHRONIZE_PREFERENCE" /> <action android:name="net.typeblog.shelter.action.SYNCHRONIZE_PREFERENCE" />
<action android:name="net.typeblog.shelter.action.PACKAGEINSTALLER_CALLBACK" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Activity to forward ACTION_IMAGE_CAPTURE as ACTION_OPEN_DOCUMENT --> <!-- An activity to listen to ACTION_PROVISIONING_SUCCESSFUL for finalization -->
<activity android:name=".ui.CameraProxyActivity" <!-- This replaces the functionality of ShelterDeviceAdminReceiver on Oreo and above -->
<activity android:name=".ui.FinalizeActivity"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" android:launchMode="singleTask"
android:label="@string/camera_proxy_activity"> android:theme="@style/Theme.AppCompat.Translucent.NoTitleBar"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.media.action.IMAGE_CAPTURE" /> <action android:name="android.app.action.PROVISIONING_SUCCESSFUL" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
@ -75,7 +103,8 @@
<receiver android:name=".receivers.ShelterDeviceAdminReceiver" <receiver android:name=".receivers.ShelterDeviceAdminReceiver"
android:label="@string/device_admin_label" android:label="@string/device_admin_label"
android:description="@string/device_admin_desc" android:description="@string/device_admin_desc"
android:permission="android.permission.BIND_DEVICE_ADMIN"> android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
<meta-data android:name="android.app.device_admin" <meta-data android:name="android.app.device_admin"
android:resource="@xml/device_admin" /> android:resource="@xml/device_admin" />
<intent-filter> <intent-filter>
@ -113,6 +142,7 @@
<!-- Actions like cloning / freezing apps will be performed by this service --> <!-- Actions like cloning / freezing apps will be performed by this service -->
<service android:name=".services.ShelterService" <service android:name=".services.ShelterService"
android:exported="true" android:exported="true"
android:foregroundServiceType="systemExempted"
android:permission="android.permission.BIND_DEVICE_ADMIN"/> android:permission="android.permission.BIND_DEVICE_ADMIN"/>
<!-- Service to forward file information between profiles --> <!-- Service to forward file information between profiles -->
@ -125,7 +155,21 @@
<service android:name=".services.KillerService" /> <service android:name=".services.KillerService" />
<!-- Service to freeze apps on screen lock --> <!-- Service to freeze apps on screen lock -->
<service android:name=".services.FreezeService" /> <service android:name=".services.FreezeService"
android:foregroundServiceType="systemExempted" />
<!-- Payment stub service -->
<service android:name=".services.PaymentStubService"
android:exported="true"
android:enabled="false"
android:permission="android.permission.BIND_NFC_SERVICE">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
</intent-filter>
<meta-data android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/payment_stub"/>
</service>
</application> </application>
</manifest> </manifest>

View file

@ -6,6 +6,7 @@ import android.content.pm.ApplicationInfo;
import net.typeblog.shelter.services.IAppInstallCallback; import net.typeblog.shelter.services.IAppInstallCallback;
import net.typeblog.shelter.services.IGetAppsCallback; import net.typeblog.shelter.services.IGetAppsCallback;
import net.typeblog.shelter.services.ILoadIconCallback; import net.typeblog.shelter.services.ILoadIconCallback;
import net.typeblog.shelter.services.IStartActivityProxy;
import net.typeblog.shelter.util.ApplicationInfoWrapper; import net.typeblog.shelter.util.ApplicationInfoWrapper;
import net.typeblog.shelter.util.UriForwardProxy; import net.typeblog.shelter.util.UriForwardProxy;
@ -20,6 +21,11 @@ interface IShelterService {
void freezeApp(in ApplicationInfoWrapper app); void freezeApp(in ApplicationInfoWrapper app);
void unfreezeApp(in ApplicationInfoWrapper app); void unfreezeApp(in ApplicationInfoWrapper app);
boolean hasUsageStatsPermission(); boolean hasUsageStatsPermission();
boolean hasSystemAlertPermission();
boolean hasAllFileAccessPermission();
List<String> getCrossProfileWidgetProviders(); List<String> getCrossProfileWidgetProviders();
boolean setCrossProfileWidgetProviderEnabled(String pkgName, boolean enabled); boolean setCrossProfileWidgetProviderEnabled(String pkgName, boolean enabled);
void setStartActivityProxy(in IStartActivityProxy proxy);
List<String> getCrossProfilePackages();
void setCrossProfilePackages(in List<String> packages);
} }

View file

@ -0,0 +1,7 @@
package net.typeblog.shelter.services;
import android.content.Intent;
interface IStartActivityProxy {
void startActivity(in Intent intent);
}

View file

@ -1,33 +1,44 @@
package net.typeblog.shelter.receivers; package net.typeblog.shelter.receivers;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.admin.DeviceAdminReceiver; import android.app.admin.DeviceAdminReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import net.typeblog.shelter.R;
import net.typeblog.shelter.ui.DummyActivity; import net.typeblog.shelter.ui.DummyActivity;
import net.typeblog.shelter.util.LocalStorageManager; import net.typeblog.shelter.util.Utility;
public class ShelterDeviceAdminReceiver extends DeviceAdminReceiver { public class ShelterDeviceAdminReceiver extends DeviceAdminReceiver {
@Override private static final int NOTIFICATION_ID = 114514;
public void onEnabled(Context context, Intent intent) {
super.onEnabled(context, intent);
LocalStorageManager.getInstance().setBoolean(LocalStorageManager.PREF_IS_DEVICE_ADMIN, true);
}
@Override
public void onDisabled(Context context, Intent intent) {
super.onDisabled(context, intent);
LocalStorageManager.getInstance().setBoolean(LocalStorageManager.PREF_IS_DEVICE_ADMIN, false);
}
@Override @Override
public void onProfileProvisioningComplete(Context context, Intent intent) { public void onProfileProvisioningComplete(Context context, Intent intent) {
super.onProfileProvisioningComplete(context, intent); super.onProfileProvisioningComplete(context, intent);
// I don't know why setting the policies in this receiver won't work very well // After Oreo, we use the activity intent ACTION_PROVISIONING_SUCCESSFUL for finalization
// Anyway, we delegate it to the DummyActivity // As it is an activity intent, it is way more reliable (and less hacky) than doing
// it in a BroadcastReceiver
// This is handled by FinalizeActivity, and thus we should ignore the event here
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) return;
// Complex logic in a BroadcastReceiver is not reliable
// Delegate finalization to the DummyActivity
Intent i = new Intent(context.getApplicationContext(), DummyActivity.class); Intent i = new Intent(context.getApplicationContext(), DummyActivity.class);
i.setAction(DummyActivity.FINALIZE_PROVISION); i.setAction(DummyActivity.FINALIZE_PROVISION);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i); // Delegate starting activity to notification to work around background limitations
// And also maybe this will fix bugs on stupid custom OSes like MIUI / EMUI
Notification notification = Utility.buildNotification(context, true,
"shelter-finish-provision",
context.getString(R.string.finish_provision_title),
context.getString(R.string.finish_provision_desc),
R.drawable.ic_notification_white_24dp);
notification.contentIntent = PendingIntent.getActivity(context, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
context.getSystemService(NotificationManager.class)
.notify(NOTIFICATION_ID, notification);
} }
} }

View file

@ -1,6 +1,7 @@
package net.typeblog.shelter.services; package net.typeblog.shelter.services;
import android.app.Service; import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@ -18,6 +19,7 @@ import android.webkit.MimeTypeMap;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import net.typeblog.shelter.R;
import net.typeblog.shelter.ShelterApplication; import net.typeblog.shelter.ShelterApplication;
import net.typeblog.shelter.util.CrossProfileDocumentsProvider; import net.typeblog.shelter.util.CrossProfileDocumentsProvider;
import net.typeblog.shelter.util.Utility; import net.typeblog.shelter.util.Utility;
@ -26,6 +28,7 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -46,9 +49,9 @@ public class FileShuttleService extends Service {
} }
@Override @Override
public List<Map> loadFiles(String path) { public List<Map<String, Serializable>> loadFiles(String path) {
resetSuicideTask(); resetSuicideTask();
ArrayList<Map> ret = new ArrayList<>(); ArrayList<Map<String, Serializable>> ret = new ArrayList<>();
File f = new File(resolvePath(path)); File f = new File(resolvePath(path));
if (f.listFiles() != null) { if (f.listFiles() != null) {
for (File child : f.listFiles()) { for (File child : f.listFiles()) {
@ -59,12 +62,17 @@ public class FileShuttleService extends Service {
} }
@Override @Override
public Map loadFileMeta(String path) { public Map<String, Serializable> loadFileMeta(String path) {
resetSuicideTask(); resetSuicideTask();
File f = new File(resolvePath(path)); File f = new File(resolvePath(path));
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Serializable> map = new HashMap<>();
map.put(DocumentsContract.Document.COLUMN_DOCUMENT_ID, f.getAbsolutePath()); map.put(DocumentsContract.Document.COLUMN_DOCUMENT_ID, f.getAbsolutePath());
if (f.equals(Environment.getExternalStorageDirectory())) {
// Show "Shelter" as the name of the root directory
map.put(DocumentsContract.Document.COLUMN_DISPLAY_NAME, getString(R.string.app_name));
} else {
map.put(DocumentsContract.Document.COLUMN_DISPLAY_NAME, f.getName()); map.put(DocumentsContract.Document.COLUMN_DISPLAY_NAME, f.getName());
}
map.put(DocumentsContract.Document.COLUMN_SIZE, f.length()); map.put(DocumentsContract.Document.COLUMN_SIZE, f.length());
map.put(DocumentsContract.Document.COLUMN_LAST_MODIFIED, f.lastModified()); map.put(DocumentsContract.Document.COLUMN_LAST_MODIFIED, f.lastModified());
@ -93,10 +101,24 @@ public class FileShuttleService extends Service {
public ParcelFileDescriptor openFile(String path, String mode) { public ParcelFileDescriptor openFile(String path, String mode) {
resetSuicideTask(); resetSuicideTask();
File f = new File(resolvePath(path)); File f = new File(resolvePath(path));
int numericMode = ParcelFileDescriptor.parseMode(mode);
try { try {
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.parseMode(mode)); if ((numericMode & ParcelFileDescriptor.MODE_WRITE_ONLY) != 0) {
} catch (FileNotFoundException e) { // When the file is opened in writable mode, and the file is of a media
// type, we need to notify the media scanner of the update.
// Even though this is done as part of file creation as well, that scan
// might have failed because it happened before the writer was able to
// finish writing.
return ParcelFileDescriptor.open(f, numericMode, mHandler, (e) -> {
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
Utility.getFileExtension(f.getAbsolutePath()));
notifyMediaScannerIfNecessary(f, mime);
});
} else {
return ParcelFileDescriptor.open(f, numericMode);
}
} catch (IOException e) {
return null; return null;
} }
} }
@ -125,36 +147,32 @@ public class FileShuttleService extends Service {
public String createFile(String path, String mimeType, String displayName) { public String createFile(String path, String mimeType, String displayName) {
resetSuicideTask(); resetSuicideTask();
File f; File f;
if (!DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType)) {
String fullPath = path + "/" + displayName; String fullPath = path + "/" + displayName;
boolean isDirectory =
DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType);
boolean shouldAppendExtension =
mimeType != null && !isDirectory && !mimeType.equals("application/octet-stream");
// Append extension for files if a MIME type is specified
if (shouldAppendExtension) {
String extensionPart = "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); String extensionPart = "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);
if (!fullPath.endsWith(extensionPart)) { if (!fullPath.endsWith(extensionPart)) {
fullPath += extensionPart; fullPath += extensionPart;
} }
f = new File(resolvePath(fullPath));
if (mimeType.startsWith("image/") || mimeType.startsWith("video/")) {
// Notify the media scanner to scan the file
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(f));
sendBroadcast(intent);
} }
// Now we can create the file / directory
f = new File(resolvePath(fullPath));
try { try {
if (!f.createNewFile()) { if ((isDirectory && !f.mkdir()) || (!isDirectory && !f.createNewFile())) {
return null; return null;
} }
} catch (IOException e) { } catch (IOException e) {
return null; return null;
} }
} else { notifyMediaScannerIfNecessary(f, mimeType);
String fullPath = path + "/" + displayName;
f = new File(resolvePath(fullPath));
if (!f.mkdir()) {
return null;
}
}
return f.getAbsolutePath(); return f.getAbsolutePath();
} }
@ -272,14 +290,13 @@ public class FileShuttleService extends Service {
return null; return null;
} }
FileOutputStream os = new FileOutputStream(pair[1].getFileDescriptor());
// Send the bitmap into the pipe in another thread, so that we can return the // Send the bitmap into the pipe in another thread, so that we can return the
// reading fd to the Documents UI before we finish sending the Bitmap. // reading fd to the Documents UI before we finish sending the Bitmap.
new Thread(() -> { new Thread(() -> {
try (FileOutputStream os = new FileOutputStream(pair[1].getFileDescriptor())) {
bmp.compress(Bitmap.CompressFormat.PNG, 100, os); bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
try {
os.flush(); os.flush();
os.close();
} catch (IOException e) { } catch (IOException e) {
// ... // ...
} }
@ -288,4 +305,14 @@ public class FileShuttleService extends Service {
return pair[0]; return pair[0];
} }
private void notifyMediaScannerIfNecessary(File f, String mimeType) {
// Notify the media scanner to scan the file as needed
// This has to be done AFTER file creation
if (mimeType != null && (mimeType.startsWith("image/") || mimeType.startsWith("video/"))) {
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(f));
sendBroadcast(intent);
}
}
} }

View file

@ -1,5 +1,6 @@
package net.typeblog.shelter.services; package net.typeblog.shelter.services;
import android.app.AlarmManager;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
@ -11,9 +12,7 @@ import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Looper;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -50,10 +49,10 @@ public class FreezeService extends Service {
} }
// An app being inactive for this amount of time will be frozen // An app being inactive for this amount of time will be frozen
private static long APP_INACTIVE_TIMEOUT = 1000; private static final long APP_INACTIVE_TIMEOUT = 1000;
// Notification ID // Notification ID
private static int NOTIFICATION_ID = 0xe49c0; private static final int NOTIFICATION_ID = 0xe49c0;
// The actual receiver of the screen-off event // The actual receiver of the screen-off event
private BroadcastReceiver mLockReceiver = new BroadcastReceiver() { private BroadcastReceiver mLockReceiver = new BroadcastReceiver() {
@ -72,8 +71,9 @@ public class FreezeService extends Service {
// Delay the work so that it can be canceled if the screen // Delay the work so that it can be canceled if the screen
// gets unlocked before the delay passes // gets unlocked before the delay passes
mHandler.postDelayed(mFreezeWork, mAlarmManager.set(AlarmManager.RTC_WAKEUP,
((long) SettingsManager.getInstance().getAutoFreezeDelay()) * 1000); System.currentTimeMillis() + ((long) SettingsManager.getInstance().getAutoFreezeDelay()) * 1000,
null, mFreezeWork, null);
registerReceiver(mUnlockReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON)); registerReceiver(mUnlockReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
} }
}; };
@ -83,7 +83,7 @@ public class FreezeService extends Service {
private BroadcastReceiver mUnlockReceiver = new BroadcastReceiver() { private BroadcastReceiver mUnlockReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
mHandler.removeCallbacks(mFreezeWork); mAlarmManager.cancel(mFreezeWork);
} }
}; };
@ -96,9 +96,10 @@ public class FreezeService extends Service {
private Map<String, UsageStats> mUsageStats = new HashMap<>(); private Map<String, UsageStats> mUsageStats = new HashMap<>();
private long mScreenLockTime = -1; private long mScreenLockTime = -1;
// The handler and the delayed work to handle // Delayed work
private Handler mHandler = new Handler(Looper.getMainLooper()); private AlarmManager mAlarmManager;
private Runnable mFreezeWork = () -> {
private AlarmManager.OnAlarmListener mFreezeWork = () -> {
synchronized (FreezeService.class) { synchronized (FreezeService.class) {
// Cancel the unlock receiver first - the delay has passed if this work is executed // Cancel the unlock receiver first - the delay has passed if this work is executed
unregisterReceiver(mUnlockReceiver); unregisterReceiver(mUnlockReceiver);
@ -128,6 +129,7 @@ public class FreezeService extends Service {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mAlarmManager = getSystemService(AlarmManager.class);
// This is the only thing that we do // This is the only thing that we do
registerReceiver(mLockReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); registerReceiver(mLockReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
// Use foreground notification to keep this service alive until screen is locked // Use foreground notification to keep this service alive until screen is locked
@ -163,7 +165,7 @@ public class FreezeService extends Service {
notification.actions = new Notification.Action[] { notification.actions = new Notification.Action[] {
new Notification.Action.Builder( new Notification.Action.Builder(
null, getString(R.string.service_auto_freeze_now), null, getString(R.string.service_auto_freeze_now),
PendingIntent.getActivity(this, 0, intentFreeze, 0) PendingIntent.getActivity(this, 0, intentFreeze, PendingIntent.FLAG_IMMUTABLE)
).build() ).build()
}; };

View file

@ -0,0 +1,18 @@
package net.typeblog.shelter.services;
import android.nfc.cardemulation.HostApduService;
import android.os.Bundle;
public class PaymentStubService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
// We do not handle anything
notifyUnhandled();
return null;
}
@Override
public void onDeactivated(int reason) {
}
}

View file

@ -9,6 +9,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
@ -24,6 +25,8 @@ import net.typeblog.shelter.util.FileProviderProxy;
import net.typeblog.shelter.util.UriForwardProxy; import net.typeblog.shelter.util.UriForwardProxy;
import net.typeblog.shelter.util.Utility; import net.typeblog.shelter.util.Utility;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -35,6 +38,16 @@ public class ShelterService extends Service {
private boolean mIsProfileOwner = false; private boolean mIsProfileOwner = false;
private PackageManager mPackageManager = null; private PackageManager mPackageManager = null;
private ComponentName mAdminComponent = null; private ComponentName mAdminComponent = null;
// When we need to start an activity, we need something else to do it for us
// as per background limitation of Android 10
// We mostly need this for app cloning / installation
// (we could probably just invoke DummyActivity directly from the other side,
// but there are cases where DummyActivity isn't needed, e.g. when cloning
// system applications. These cases can be handled without DummyActivity
// and without any visual interference.)
// Note that this proxy can only start activity that is accessible to the
// main profile and within the application itself.
private IStartActivityProxy mStartActivityProxy = null;
private IShelterService.Stub mBinder = new IShelterService.Stub() { private IShelterService.Stub mBinder = new IShelterService.Stub() {
@Override @Override
public void ping() { public void ping() {
@ -121,6 +134,8 @@ public class ShelterService extends Service {
intent.setComponent(new ComponentName(ShelterService.this, DummyActivity.class)); intent.setComponent(new ComponentName(ShelterService.this, DummyActivity.class));
intent.putExtra("package", app.getPackageName()); intent.putExtra("package", app.getPackageName());
intent.putExtra("apk", app.getSourceDir()); intent.putExtra("apk", app.getSourceDir());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
intent.putExtra("split_apks", app.getSplitApks());
// Send the callback to the DummyActivity // Send the callback to the DummyActivity
Bundle callbackExtra = new Bundle(); Bundle callbackExtra = new Bundle();
@ -128,7 +143,8 @@ public class ShelterService extends Service {
intent.putExtra("callback", callbackExtra); intent.putExtra("callback", callbackExtra);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
DummyActivity.registerSameProcessRequest(intent); DummyActivity.registerSameProcessRequest(intent);
startActivity(intent); if (mStartActivityProxy != null)
mStartActivityProxy.startActivity(intent);
} else { } else {
if (mIsProfileOwner) { if (mIsProfileOwner) {
// We can only enable system apps in our own profile // We can only enable system apps in our own profile
@ -149,7 +165,7 @@ public class ShelterService extends Service {
} }
@Override @Override
public void installApk(UriForwardProxy uriForwarder, IAppInstallCallback callback) { public void installApk(UriForwardProxy uriForwarder, IAppInstallCallback callback) throws RemoteException {
// Directly install an APK through a given Fd // Directly install an APK through a given Fd
// instead of installing an existing one // instead of installing an existing one
Intent intent = new Intent(DummyActivity.INSTALL_PACKAGE); Intent intent = new Intent(DummyActivity.INSTALL_PACKAGE);
@ -166,7 +182,8 @@ public class ShelterService extends Service {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
DummyActivity.registerSameProcessRequest(intent); DummyActivity.registerSameProcessRequest(intent);
startActivity(intent); if (mStartActivityProxy != null)
mStartActivityProxy.startActivity(intent);
} }
@Override @Override
@ -183,7 +200,9 @@ public class ShelterService extends Service {
intent.putExtra("callback", callbackExtra); intent.putExtra("callback", callbackExtra);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
DummyActivity.registerSameProcessRequest(intent); DummyActivity.registerSameProcessRequest(intent);
startActivity(intent);
if (mStartActivityProxy != null)
mStartActivityProxy.startActivity(intent);
} else { } else {
if (mIsProfileOwner) { if (mIsProfileOwner) {
// This is essentially the same as disabling the system app // This is essentially the same as disabling the system app
@ -223,6 +242,16 @@ public class ShelterService extends Service {
return Utility.checkUsageStatsPermission(ShelterService.this); return Utility.checkUsageStatsPermission(ShelterService.this);
} }
@Override
public boolean hasSystemAlertPermission() {
return Utility.checkSystemAlertPermission(ShelterService.this);
}
@Override
public boolean hasAllFileAccessPermission() {
return Utility.checkAllFileAccessPermission();
}
@Override @Override
public List<String> getCrossProfileWidgetProviders() { public List<String> getCrossProfileWidgetProviders() {
if (!mIsProfileOwner) if (!mIsProfileOwner)
@ -240,6 +269,29 @@ public class ShelterService extends Service {
return mPolicyManager.removeCrossProfileWidgetProvider(mAdminComponent, pkgName); return mPolicyManager.removeCrossProfileWidgetProvider(mAdminComponent, pkgName);
} }
} }
@Override
public void setStartActivityProxy(IStartActivityProxy proxy) {
mStartActivityProxy = proxy;
}
@Override
public List<String> getCrossProfilePackages() throws RemoteException {
if (!mIsProfileOwner)
throw new IllegalStateException("Cannot access cross-profile packages without being profile owner");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
throw new IllegalStateException("Cross-profile packages support is only available on Android 11 and later");
return new ArrayList<>(mPolicyManager.getCrossProfilePackages(mAdminComponent));
}
@Override
public void setCrossProfilePackages(List<String> packages) throws RemoteException {
if (!mIsProfileOwner)
throw new IllegalStateException("Cannot access cross-profile packages without being profile owner");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
throw new IllegalStateException("Cross-profile packages support is only available on Android 11 and later");
mPolicyManager.setCrossProfilePackages(mAdminComponent, new HashSet<>(packages));
}
}; };
@Override @Override
@ -259,6 +311,16 @@ public class ShelterService extends Service {
return mBinder; return mBinder;
} }
@Override
public boolean onUnbind(Intent intent) {
// Stop our foreground notification (if it was created at all) when
// all clients have disconnected.
// This helps to ensure no notification is left when the Shelter activity
// is closed.
stopForeground(true);
return false;
}
private boolean isHidden(String packageName) { private boolean isHidden(String packageName) {
return mIsProfileOwner && mPolicyManager.isApplicationHidden(mAdminComponent, packageName); return mIsProfileOwner && mPolicyManager.isApplicationHidden(mAdminComponent, packageName);
} }

View file

@ -29,16 +29,14 @@ import java.util.stream.Collectors;
public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHolder> { public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHolder> {
class ViewHolder extends RecyclerView.ViewHolder { class ViewHolder extends RecyclerView.ViewHolder {
private ViewGroup mView;
private ImageView mIcon; private ImageView mIcon;
private TextView mTitle; private TextView mTitle;
private TextView mPackage; private TextView mPackage;
// This text view shows the order of all selected items // This text view shows the order of all selected items
private TextView mSelectOrder; private TextView mSelectOrder;
int mIndex = -1; int mIndex = -1;
ViewHolder(ViewGroup view) { ViewHolder(View view) {
super(view); super(view);
mView = view;
mIcon = view.findViewById(R.id.list_app_icon); mIcon = view.findViewById(R.id.list_app_icon);
mTitle = view.findViewById(R.id.list_app_title); mTitle = view.findViewById(R.id.list_app_title);
mPackage = view.findViewById(R.id.list_app_package); mPackage = view.findViewById(R.id.list_app_package);
@ -57,7 +55,7 @@ public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHold
// pass the full info to it, since we can't be sure // pass the full info to it, since we can't be sure
// the index won't change // the index won't change
if (mContextMenuHandler != null) { if (mContextMenuHandler != null) {
mContextMenuHandler.showContextMenu(mList.get(mIndex), mView); mContextMenuHandler.showContextMenu(mList.get(mIndex), itemView);
} }
} else { } else {
// In multi-select mode, single clicks just adds to the selection // In multi-select mode, single clicks just adds to the selection
@ -91,7 +89,7 @@ public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHold
void select() { void select() {
mSelectedIndices.add(mIndex); mSelectedIndices.add(mIndex);
mSelectOrder.clearAnimation(); mSelectOrder.clearAnimation();
mSelectOrder.startAnimation(AnimationUtils.loadAnimation(mView.getContext(), R.anim.scale_appear)); mSelectOrder.startAnimation(AnimationUtils.loadAnimation(itemView.getContext(), R.anim.scale_appear));
showSelectOrder(); showSelectOrder();
} }
@ -100,7 +98,7 @@ public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHold
mSelectedIndices.remove((Integer) mIndex); mSelectedIndices.remove((Integer) mIndex);
mSelectOrder.clearAnimation(); mSelectOrder.clearAnimation();
setUnselectedBackground(); setUnselectedBackground();
Animation anim = AnimationUtils.loadAnimation(mView.getContext(), R.anim.scale_hide); Animation anim = AnimationUtils.loadAnimation(itemView.getContext(), R.anim.scale_hide);
anim.setAnimationListener(new Animation.AnimationListener() { anim.setAnimationListener(new Animation.AnimationListener() {
@Override @Override
public void onAnimationStart(Animation animation) { public void onAnimationStart(Animation animation) {
@ -132,11 +130,11 @@ public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHold
// (not necessarily when the user clicked on it; the view might have been recycled) // (not necessarily when the user clicked on it; the view might have been recycled)
void showSelectOrder() { void showSelectOrder() {
if (!mList.get(mIndex).isHidden()) { if (!mList.get(mIndex).isHidden()) {
mView.setBackgroundResource(R.color.selectedAppBackground); itemView.setBackgroundResource(R.color.selectedAppBackground);
} else { } else {
// The app is both frozen and selected // The app is both frozen and selected
// we use a blended color of the two for its background // we use a blended color of the two for its background
mView.setBackgroundResource(R.color.selectedAndDisabledAppBackground); itemView.setBackgroundResource(R.color.selectedAndDisabledAppBackground);
} }
mSelectOrder.setVisibility(View.VISIBLE); mSelectOrder.setVisibility(View.VISIBLE);
mSelectOrder.setText(String.valueOf(mSelectedIndices.indexOf(mIndex) + 1)); mSelectOrder.setText(String.valueOf(mSelectedIndices.indexOf(mIndex) + 1));
@ -151,9 +149,9 @@ public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHold
// Set the background when not in the selected state // Set the background when not in the selected state
void setUnselectedBackground() { void setUnselectedBackground() {
if (!mList.get(mIndex).isHidden()) { if (!mList.get(mIndex).isHidden()) {
mView.setBackground(null); itemView.setBackground(null);
} else { } else {
mView.setBackgroundResource(R.color.disabledAppBackground); itemView.setBackgroundResource(R.color.disabledAppBackground);
} }
} }
@ -327,8 +325,8 @@ public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHold
if (mLabelDisabled == null) { if (mLabelDisabled == null) {
mLabelDisabled = viewGroup.getContext().getString(R.string.list_item_disabled); mLabelDisabled = viewGroup.getContext().getString(R.string.list_item_disabled);
} }
LayoutInflater inflater = viewGroup.getContext().getSystemService(LayoutInflater.class); LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
ViewGroup view = (ViewGroup) inflater.inflate(R.layout.app_list_item, viewGroup, false); View view = inflater.inflate(R.layout.app_list_item, viewGroup, false);
ViewHolder vh = new ViewHolder(view); ViewHolder vh = new ViewHolder(view);
vh.setIndex(i); vh.setIndex(i);
return vh; return vh;

View file

@ -9,6 +9,7 @@ import android.content.IntentFilter;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
@ -40,6 +41,7 @@ import net.typeblog.shelter.util.ApplicationInfoWrapper;
import net.typeblog.shelter.util.LocalStorageManager; import net.typeblog.shelter.util.LocalStorageManager;
import net.typeblog.shelter.util.Utility; import net.typeblog.shelter.util.Utility;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -57,6 +59,7 @@ public class AppListFragment extends BaseFragment {
private static final int MENU_ITEM_CREATE_UNFREEZE_SHORTCUT = 10006; private static final int MENU_ITEM_CREATE_UNFREEZE_SHORTCUT = 10006;
private static final int MENU_ITEM_AUTO_FREEZE = 10007; private static final int MENU_ITEM_AUTO_FREEZE = 10007;
private static final int MENU_ITEM_ALLOW_CROSS_PROFILE_WIDGET = 10008; private static final int MENU_ITEM_ALLOW_CROSS_PROFILE_WIDGET = 10008;
private static final int MENU_ITEM_ALLOW_CROSS_PROFILE_INTERACTION = 10009;
private IShelterService mService = null; private IShelterService mService = null;
private boolean mIsRemote = false; private boolean mIsRemote = false;
@ -68,6 +71,9 @@ public class AppListFragment extends BaseFragment {
// Only useful if this fragment manages the work profile // Only useful if this fragment manages the work profile
private Set<String> mCrossProfileWidgetProviders = new HashSet<>(); private Set<String> mCrossProfileWidgetProviders = new HashSet<>();
// Packages allowed to interact across profiles
private Set<String> mCrossProfilePackages = new HashSet<>();
// Views // Views
private RecyclerView mList = null; private RecyclerView mList = null;
private AppListAdapter mAdapter = null; private AppListAdapter mAdapter = null;
@ -98,7 +104,7 @@ public class AppListFragment extends BaseFragment {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String query = intent.getStringExtra("text"); String query = intent.getStringExtra("text");
if (query == "") { if ("".equals(query)) {
// Consider empty query as null // Consider empty query as null
query = null; query = null;
} }
@ -200,11 +206,15 @@ public class AppListFragment extends BaseFragment {
public void callback(List<ApplicationInfoWrapper> apps) { public void callback(List<ApplicationInfoWrapper> apps) {
if (mIsRemote) { if (mIsRemote) {
mCrossProfileWidgetProviders.clear(); mCrossProfileWidgetProviders.clear();
mCrossProfilePackages.clear();
// Update the cross-profile widget provider list // Update the cross-profile packages / widget providers list
try { try {
mCrossProfileWidgetProviders.addAll(mService.getCrossProfileWidgetProviders()); mCrossProfileWidgetProviders.addAll(mService.getCrossProfileWidgetProviders());
} catch (RemoteException e) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
mCrossProfilePackages.addAll(mService.getCrossProfilePackages());
} catch (RemoteException ignored) {
} }
} }
@ -288,7 +298,7 @@ public class AppListFragment extends BaseFragment {
menu.add(Menu.NONE, MENU_ITEM_FREEZE, Menu.NONE, R.string.freeze_app); menu.add(Menu.NONE, MENU_ITEM_FREEZE, Menu.NONE, R.string.freeze_app);
menu.add(Menu.NONE, MENU_ITEM_LAUNCH, Menu.NONE, R.string.launch); menu.add(Menu.NONE, MENU_ITEM_LAUNCH, Menu.NONE, R.string.launch);
} }
// Cross-profile widget settings is also limited to work profile // Cross-profile widget / packages settings is also limited to work profile
MenuItem crossProfileWdiegt = MenuItem crossProfileWdiegt =
menu.add(Menu.NONE, MENU_ITEM_ALLOW_CROSS_PROFILE_WIDGET, Menu.NONE, menu.add(Menu.NONE, MENU_ITEM_ALLOW_CROSS_PROFILE_WIDGET, Menu.NONE,
R.string.allow_cross_profile_widgets); R.string.allow_cross_profile_widgets);
@ -296,6 +306,15 @@ public class AppListFragment extends BaseFragment {
crossProfileWdiegt.setChecked( crossProfileWdiegt.setChecked(
mCrossProfileWidgetProviders.contains(mSelectedApp.getPackageName())); mCrossProfileWidgetProviders.contains(mSelectedApp.getPackageName()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
MenuItem crossProfileInteraction =
menu.add(Menu.NONE, MENU_ITEM_ALLOW_CROSS_PROFILE_INTERACTION, Menu.NONE,
R.string.allow_cross_profile_interaction);
crossProfileInteraction.setCheckable(true);
crossProfileInteraction.setChecked(
mCrossProfilePackages.contains(mSelectedApp.getPackageName()));
}
// TODO: If we implement God Mode (i.e. Shelter as device owner), we should // TODO: If we implement God Mode (i.e. Shelter as device owner), we should
// TODO: use two different lists to store auto freeze apps because we'll be // TODO: use two different lists to store auto freeze apps because we'll be
// TODO: able to freeze apps in main profile. // TODO: able to freeze apps in main profile.
@ -393,7 +412,7 @@ public class AppListFragment extends BaseFragment {
LocalStorageManager.PREF_AUTO_FREEZE_LIST_WORK_PROFILE, mSelectedApp.getPackageName()); LocalStorageManager.PREF_AUTO_FREEZE_LIST_WORK_PROFILE, mSelectedApp.getPackageName());
} }
return true; return true;
case MENU_ITEM_ALLOW_CROSS_PROFILE_WIDGET: case MENU_ITEM_ALLOW_CROSS_PROFILE_WIDGET: {
boolean newState = !item.isChecked(); boolean newState = !item.isChecked();
try { try {
if (mService.setCrossProfileWidgetProviderEnabled(mSelectedApp.getPackageName(), newState)) { if (mService.setCrossProfileWidgetProviderEnabled(mSelectedApp.getPackageName(), newState)) {
@ -411,6 +430,22 @@ public class AppListFragment extends BaseFragment {
} }
return true; return true;
} }
case MENU_ITEM_ALLOW_CROSS_PROFILE_INTERACTION: {
boolean newState = !item.isChecked();
if (newState) {
mCrossProfilePackages.add(mSelectedApp.getPackageName());
} else {
mCrossProfilePackages.remove(mSelectedApp.getPackageName());
}
try {
mService.setCrossProfilePackages(new ArrayList<>(mCrossProfilePackages));
item.setChecked(newState);
} catch (RemoteException ignored) {
}
return true;
}
}
return super.onContextItemSelected(item); return super.onContextItemSelected(item);
} }

View file

@ -1,90 +0,0 @@
package net.typeblog.shelter.ui;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import androidx.annotation.Nullable;
import net.typeblog.shelter.util.Utility;
import java.io.IOException;
import java.io.OutputStream;
// This activity forwards ACTION_CAPTURE_IMAGE to ACTION_OPEN_DOCUMENT with image files
// which allows users to use Documents UI, and of course, Shelter's File Shuttle
// to pick images within apps that do not support ACTION_OPEN_DOCUMENT directly
// This will make cross-profile picture sharing a ton more easier.
// But here is the catch: sending images through this method will re-compress
// the image because Android's ACTION_CAPTURE_IMAGE requires returning a JPEG image
// this will in turn affect the quality of the image.
public class CameraProxyActivity extends Activity {
private static final int REQUEST_OPEN_IMAGE = 1001;
private Uri mOutputUri = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction())) {
finish();
return;
}
if (getIntent().hasExtra(MediaStore.EXTRA_OUTPUT)) {
// The calling app may or may not request for the full output image
mOutputUri = getIntent().getParcelableExtra(MediaStore.EXTRA_OUTPUT);
}
// Launch Documents UI for picking images
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*"); // Only allow images
startActivityForResult(intent, REQUEST_OPEN_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_OPEN_IMAGE && resultCode == RESULT_OK && data != null) {
// The image is now opened. We should now read the data and send it to the other Uri
Uri imageUri = data.getData();
try {
ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(imageUri, "r");
// Thumbnail is required by the definition of ACTION_CAPTURE_IMAGE
Bitmap thumbnail = Utility.decodeSampledBitmap(fd.getFileDescriptor(), 128, 128);
if (mOutputUri != null) {
// The calling app may or may not request for the full image
// If requested, we write the image, in JPEG format, to the provided URI
// Note that JPEG is required by the interface.
Bitmap bmp = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor());
OutputStream out = getContentResolver().openOutputStream(mOutputUri);
// Re-compress the image to another JPEG image through the output URI
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
}
fd.close();
Intent resultIntent = new Intent();
resultIntent.putExtra("data", thumbnail);
setResult(RESULT_OK, resultIntent);
finish();
return;
} catch (IOException e) {
// Just silently fail
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
// We exit the activity anyway
setResult(RESULT_CANCELED); // If we succeeded, we should have returned earlier
finish();
}
}

View file

@ -2,10 +2,13 @@ package net.typeblog.shelter.ui;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
@ -13,10 +16,16 @@ import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.StrictMode; import android.os.StrictMode;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import net.typeblog.shelter.R; import net.typeblog.shelter.R;
import net.typeblog.shelter.ShelterApplication; import net.typeblog.shelter.ShelterApplication;
@ -27,14 +36,20 @@ import net.typeblog.shelter.services.IFileShuttleService;
import net.typeblog.shelter.services.IFileShuttleServiceCallback; import net.typeblog.shelter.services.IFileShuttleServiceCallback;
import net.typeblog.shelter.util.AuthenticationUtility; import net.typeblog.shelter.util.AuthenticationUtility;
import net.typeblog.shelter.util.FileProviderProxy; import net.typeblog.shelter.util.FileProviderProxy;
import net.typeblog.shelter.util.InstallationProgressListener;
import net.typeblog.shelter.util.LocalStorageManager; import net.typeblog.shelter.util.LocalStorageManager;
import net.typeblog.shelter.util.SettingsManager; import net.typeblog.shelter.util.SettingsManager;
import net.typeblog.shelter.util.Utility; import net.typeblog.shelter.util.Utility;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
// DummyActivity does nothing about presenting any UI // DummyActivity does nothing about presenting any UI
// It is a wrapper over various different operations // It is a wrapper over various different operations
@ -58,6 +73,7 @@ public class DummyActivity extends Activity {
public static final String START_FILE_SHUTTLE = "net.typeblog.shelter.action.START_FILE_SHUTTLE"; public static final String START_FILE_SHUTTLE = "net.typeblog.shelter.action.START_FILE_SHUTTLE";
public static final String START_FILE_SHUTTLE_2 = "net.typeblog.shelter.action.START_FILE_SHUTTLE_2"; public static final String START_FILE_SHUTTLE_2 = "net.typeblog.shelter.action.START_FILE_SHUTTLE_2";
public static final String SYNCHRONIZE_PREFERENCE = "net.typeblog.shelter.action.SYNCHRONIZE_PREFERENCE"; public static final String SYNCHRONIZE_PREFERENCE = "net.typeblog.shelter.action.SYNCHRONIZE_PREFERENCE";
public static final String PACKAGEINSTALLER_CALLBACK = "net.typeblog.shelter.action.PACKAGEINSTALLER_CALLBACK";
// Only these actions are allowed without a valid signature // Only these actions are allowed without a valid signature
private static final List<String> ACTIONS_ALLOWED_WITHOUT_SIGNATURE = Arrays.asList( private static final List<String> ACTIONS_ALLOWED_WITHOUT_SIGNATURE = Arrays.asList(
@ -74,6 +90,9 @@ public class DummyActivity extends Activity {
private static final int REQUEST_INSTALL_PACKAGE = 1; private static final int REQUEST_INSTALL_PACKAGE = 1;
private static final int REQUEST_PERMISSION_EXTERNAL_STORAGE= 2; private static final int REQUEST_PERMISSION_EXTERNAL_STORAGE= 2;
private static final int REQUEST_PERMISSION_POST_NOTIFICATIONS = 3;
private static boolean sHasRequestedPermission = false;
// A state variable to record the last time DummyActivity was informed that someone // A state variable to record the last time DummyActivity was informed that someone
// in the same process needs to call an action without signature // in the same process needs to call an action without signature
@ -116,8 +135,31 @@ public class DummyActivity extends Activity {
Utility.enforceWorkProfilePolicies(this); Utility.enforceWorkProfilePolicies(this);
Utility.enforceUserRestrictions(this); Utility.enforceUserRestrictions(this);
SettingsManager.getInstance().applyAll(); SettingsManager.getInstance().applyAll();
synchronized (DummyActivity.class) {
// Do not show permission dialog during finalization -- it will conflict with the provisioning UI
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !sHasRequestedPermission
&& !FINALIZE_PROVISION.equals(getIntent().getAction())) {
// Avoid requesting permission multiple times in one session
// This also prevents multiple instances of DummyActivity from being blocked on each other
sHasRequestedPermission = true;
// We pretty much only send notifications to keep the process inside work profile alive
// as such, only request the notification permission from inside the profile
// This will ideally be shown and done when the user sees the app list UI for the first time
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_PERMISSION_POST_NOTIFICATIONS);
// Continue once the request has been completed (see onRequestPermissionResult)
return;
}
}
}
} }
init();
}
private void init() {
Intent intent = getIntent(); Intent intent = getIntent();
// First check if we have a registered request from the same process // First check if we have a registered request from the same process
@ -165,6 +207,27 @@ public class DummyActivity extends Activity {
} }
} }
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.getAction().equals(PACKAGEINSTALLER_CALLBACK)) {
int status = intent.getExtras().getInt(PackageInstaller.EXTRA_STATUS);
switch (status) {
case PackageInstaller.STATUS_PENDING_USER_ACTION:
startActivity((Intent) intent.getExtras().get(Intent.EXTRA_INTENT));
break;
case PackageInstaller.STATUS_SUCCESS:
appInstallFinished(Activity.RESULT_OK);
break;
default:
appInstallFinished(Activity.RESULT_CANCELED);
break;
}
}
}
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
@ -182,6 +245,11 @@ public class DummyActivity extends Activity {
} else { } else {
finish(); finish();
} }
} else if (requestCode == REQUEST_PERMISSION_POST_NOTIFICATIONS) {
// Regardless of the result, continue initialization
// This is fine because most functionalities will work anyway; it will just be a bit buggy
// and unreliable.
init();
} else { } else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
} }
@ -189,6 +257,11 @@ public class DummyActivity extends Activity {
private void actionFinalizeProvision() { private void actionFinalizeProvision() {
if (mIsProfileOwner) { if (mIsProfileOwner) {
// Only notify the main profile on pre-Oreo
// After Oreo, since we use the activity-based finalization flow,
// the setup wizard will wait until we finish finalization before returning
// (Note: the actual finalization is done by common code in onCreate)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
// This is the action used by DeviceAdminReceiver to finalize the setup // This is the action used by DeviceAdminReceiver to finalize the setup
// The work has been finished in onCreate(), now we just have to // The work has been finished in onCreate(), now we just have to
// inform the main profile about this // inform the main profile about this
@ -196,6 +269,7 @@ public class DummyActivity extends Activity {
// We don't need signature for this intent // We don't need signature for this intent
Utility.transferIntentToProfileUnsigned(this, intent); Utility.transferIntentToProfileUnsigned(this, intent);
startActivity(intent); startActivity(intent);
}
finish(); finish();
} else { } else {
// Set the flag telling MainActivity that we have now finished provisioning // Set the flag telling MainActivity that we have now finished provisioning
@ -203,8 +277,8 @@ public class DummyActivity extends Activity {
.setBoolean(LocalStorageManager.PREF_HAS_SETUP, true); .setBoolean(LocalStorageManager.PREF_HAS_SETUP, true);
LocalStorageManager.getInstance() LocalStorageManager.getInstance()
.setBoolean(LocalStorageManager.PREF_IS_SETTING_UP, false); .setBoolean(LocalStorageManager.PREF_IS_SETTING_UP, false);
Intent intent = new Intent(Intent.ACTION_MAIN); Intent intent = new Intent(SetupWizardActivity.ACTION_PROFILE_PROVISIONED);
intent.setComponent(new ComponentName(this, MainActivity.class)); intent.setComponent(new ComponentName(this, SetupWizardActivity.class));
startActivity(intent); startActivity(intent);
Toast.makeText(this, getString(R.string.provision_finished), Toast.LENGTH_LONG).show(); Toast.makeText(this, getString(R.string.provision_finished), Toast.LENGTH_LONG).show();
finish(); finish();
@ -258,18 +332,91 @@ public class DummyActivity extends Activity {
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().build());
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
try {
// For Q, since we use the more "manual" method of installation,
// we have to also pass the split APKs ("Configuration APKs" as Google calls it)
// Although these are available since API 26, we don't need to
// take care of them for versions before Q since we don't actually
// install the APKs before Q.
actionInstallPackageQ(uri, getIntent().getStringArrayExtra("split_apks"));
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, uri); Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, uri);
intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, getPackageName()); intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, getPackageName());
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true); intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, REQUEST_INSTALL_PACKAGE); startActivityForResult(intent, REQUEST_INSTALL_PACKAGE);
}
// Restore the VmPolicy anyway // Restore the VmPolicy anyway
StrictMode.setVmPolicy(policy); StrictMode.setVmPolicy(policy);
} }
// On Android Q, ACTION_INSTALL_PACKAGE has been deprecated.
// We have to switch to using PackageInstaller for the job, which isn't quite
// as elegant because now we really need to read the entire apk and write to it
// Keep this case only for Q for now.
private void actionInstallPackageQ(Uri uri, String[] split_apks) throws IOException {
PackageInstaller pi = getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
int sessionId = pi.createSession(params);
// Show the progress dialog first
pi.registerSessionCallback(new InstallationProgressListener(this, pi, sessionId));
PackageInstaller.Session session = pi.openSession(sessionId);
doInstallPackageQ(uri, split_apks, session, () -> {
// We have finished piping the streams, show the progress as 10%
session.setStagingProgress(0.1f);
// Commit the session
Intent intent = new Intent(this, DummyActivity.class);
intent.setAction(PACKAGEINSTALLER_CALLBACK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, PendingIntent.FLAG_MUTABLE);
session.commit(pendingIntent.getIntentSender());
});
}
// The background part of the installation process on Q (reading APKs etc)
// that must be executed on another thread
// Put them in background to avoid stalling the UI thread
private void doInstallPackageQ(Uri baseUri, String[] split_apks, PackageInstaller.Session session, Runnable callback) {
ArrayList<Uri> uris = new ArrayList<>();
uris.add(baseUri);
if (split_apks != null && split_apks.length > 0) {
for (String apk : split_apks) {
uris.add(Uri.fromFile(new File(apk)));
}
}
new Thread(() -> {
for (Uri uri : uris) {
try (InputStream is = getContentResolver().openInputStream(uri);
OutputStream os = session.openWrite(UUID.randomUUID().toString(), 0, is.available())
) {
Utility.pipe(is, os);
session.fsync(os);
} catch (IOException e) {
}
}
runOnUiThread(callback);
}).start();
}
private void actionUninstallPackage() { private void actionUninstallPackage() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
actionUninstallPackageQ();
return;
}
Uri uri = Uri.fromParts("package", getIntent().getStringExtra("package"), null); Uri uri = Uri.fromParts("package", getIntent().getStringExtra("package"), null);
Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, uri); Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, uri);
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true); intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
@ -282,6 +429,15 @@ public class DummyActivity extends Activity {
startActivityForResult(intent, REQUEST_INSTALL_PACKAGE); startActivityForResult(intent, REQUEST_INSTALL_PACKAGE);
} }
private void actionUninstallPackageQ() {
PackageInstaller pi = getPackageManager().getPackageInstaller();
Intent intent = new Intent(this, DummyActivity.class);
intent.setAction(PACKAGEINSTALLER_CALLBACK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, PendingIntent.FLAG_MUTABLE);
pi.uninstall(getIntent().getStringExtra("package"), pendingIntent.getIntentSender());
}
private void appInstallFinished(int resultCode) { private void appInstallFinished(int resultCode) {
// Clear the fd anyway since we have finished installation. // Clear the fd anyway since we have finished installation.
// Because we might have been installing an APK opened from // Because we might have been installing an APK opened from
@ -419,12 +575,22 @@ public class DummyActivity extends Activity {
} }
private void actionStartFileShuttle() { private void actionStartFileShuttle() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
// This requires the permission WRITE_EXTERNAL_STORAGE // This requires the permission WRITE_EXTERNAL_STORAGE
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
doStartFileShuttle(); doStartFileShuttle();
} else { } else {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_EXTERNAL_STORAGE); requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_EXTERNAL_STORAGE);
} }
} else {
// The all file access permission should have been granted when enabling File Shuttle
// since Android R.
if (Utility.checkAllFileAccessPermission() && Utility.checkSystemAlertPermission(this)) {
doStartFileShuttle();
} else {
finish();
}
}
} }
private void doStartFileShuttle() { private void doStartFileShuttle() {
@ -461,6 +627,11 @@ public class DummyActivity extends Activity {
} }
// TODO: Cases for other types // TODO: Cases for other types
SettingsManager.getInstance().applyAll(); SettingsManager.getInstance().applyAll();
if (mIsProfileOwner) {
// Refresh profile policies because
// settings may have been changed
Utility.enforceWorkProfilePolicies(this);
}
finish(); finish();
} }
} }

View file

@ -0,0 +1,19 @@
package net.typeblog.shelter.ui;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class FinalizeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = new Intent(getApplicationContext(), DummyActivity.class);
i.setAction(DummyActivity.FINALIZE_PROVISION);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
}
}

View file

@ -1,6 +1,5 @@
package net.typeblog.shelter.ui; package net.typeblog.shelter.ui;
import android.app.ProgressDialog;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
@ -15,25 +14,27 @@ import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.bottomnavigation.BottomNavigationView;
import net.typeblog.shelter.R; import net.typeblog.shelter.R;
import net.typeblog.shelter.ShelterApplication; import net.typeblog.shelter.ShelterApplication;
import net.typeblog.shelter.receivers.ShelterDeviceAdminReceiver;
import net.typeblog.shelter.services.IAppInstallCallback; import net.typeblog.shelter.services.IAppInstallCallback;
import net.typeblog.shelter.services.IShelterService; import net.typeblog.shelter.services.IShelterService;
import net.typeblog.shelter.services.IStartActivityProxy;
import net.typeblog.shelter.services.KillerService; import net.typeblog.shelter.services.KillerService;
import net.typeblog.shelter.util.AuthenticationUtility;
import net.typeblog.shelter.util.LocalStorageManager; import net.typeblog.shelter.util.LocalStorageManager;
import net.typeblog.shelter.util.SettingsManager; import net.typeblog.shelter.util.SettingsManager;
import net.typeblog.shelter.util.UriForwardProxy; import net.typeblog.shelter.util.UriForwardProxy;
@ -43,17 +44,23 @@ public class MainActivity extends AppCompatActivity {
public static final String BROADCAST_CONTEXT_MENU_CLOSED = "net.typeblog.shelter.broadcast.CONTEXT_MENU_CLOSED"; public static final String BROADCAST_CONTEXT_MENU_CLOSED = "net.typeblog.shelter.broadcast.CONTEXT_MENU_CLOSED";
public static final String BROADCAST_SEARCH_FILTER_CHANGED = "net.typeblog.shelter.broadcast.SEARCH_FILTER_CHANGED"; public static final String BROADCAST_SEARCH_FILTER_CHANGED = "net.typeblog.shelter.broadcast.SEARCH_FILTER_CHANGED";
private static final int REQUEST_PROVISION_PROFILE = 1; private final ActivityResultLauncher<Void> mStartSetup =
private static final int REQUEST_START_SERVICE_IN_WORK_PROFILE = 2; registerForActivityResult(new SetupWizardActivity.SetupWizardContract(), this::setupWizardCb);
private static final int REQUEST_SET_DEVICE_ADMIN = 3; private final ActivityResultLauncher<Void> mResumeSetup =
private static final int REQUEST_TRY_START_SERVICE_IN_WORK_PROFILE = 4; registerForActivityResult(new SetupWizardActivity.ResumeSetupContract(), this::setupWizardCb);
private static final int REQUEST_DOCUMENTS_CHOOSE_APK = 5; private final ActivityResultLauncher<Void> mSelectApk =
registerForActivityResult(
new Utility.ActivityResultContractInputWrapper<>(
new ActivityResultContracts.OpenDocument(),
new String[]{"application/vnd.android.package-archive"}),
this::onApkSelected);
// Logic of the following intents are quite complicated; use the generic contract for more control
private final ActivityResultLauncher<Intent> mTryStartWorkService =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this::tryStartWorkServiceCb);
private final ActivityResultLauncher<Intent> mBindWorkService =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this::bindWorkServiceCb);
private LocalStorageManager mStorage = null; private LocalStorageManager mStorage = null;
private DevicePolicyManager mPolicyManager = null;
// The "please wait" dialog when creating profile
private ProgressDialog mProgressDialog = null;
// Flag to avoid double-killing our services while restarting // Flag to avoid double-killing our services while restarting
private boolean mRestarting = false; private boolean mRestarting = false;
@ -62,73 +69,36 @@ public class MainActivity extends AppCompatActivity {
private IShelterService mServiceMain = null; private IShelterService mServiceMain = null;
private IShelterService mServiceWork = null; private IShelterService mServiceWork = null;
// Views
private ViewPager mPager = null;
private TabLayout mTabs = null;
// Show all applications or not // Show all applications or not
// default to false // default to false
boolean mShowAll = false; boolean mShowAll = false;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
EdgeToEdge.enable(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
setSupportActionBar(findViewById(R.id.main_toolbar)); setSupportActionBar(findViewById(R.id.main_toolbar));
mStorage = LocalStorageManager.getInstance(); mStorage = LocalStorageManager.getInstance();
mPolicyManager = getSystemService(DevicePolicyManager.class);
if (mPolicyManager.isProfileOwnerApp(getPackageName())) { if (getSystemService(DevicePolicyManager.class).isProfileOwnerApp(getPackageName())) {
// We are now in our own profile // We are now in our own profile
// We should never start the main activity here. // We should never start the main activity here.
android.util.Log.d("MainActivity", "started in user profile. stopping."); android.util.Log.d("MainActivity", "started in user profile. stopping.");
finish(); finish();
} else { } else {
if (!mStorage.getBoolean(LocalStorageManager.PREF_IS_DEVICE_ADMIN)) {
mStorage.setBoolean(LocalStorageManager.PREF_HAS_SETUP, false);
// Navigate to the Device Admin settings page
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(
DevicePolicyManager.EXTRA_DEVICE_ADMIN,
new ComponentName(getApplicationContext(), ShelterDeviceAdminReceiver.class));
intent.putExtra(
DevicePolicyManager.EXTRA_ADD_EXPLANATION,
getString(R.string.device_admin_explanation));
startActivityForResult(intent, REQUEST_SET_DEVICE_ADMIN);
return;
}
init(); init();
} }
} }
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (mProgressDialog != null && isWorkProfileAvailable()) {
mProgressDialog.dismiss();
init();
}
}
private void init() { private void init() {
if (mStorage.getBoolean(LocalStorageManager.PREF_IS_SETTING_UP) && !isWorkProfileAvailable()) { if (mStorage.getBoolean(LocalStorageManager.PREF_IS_SETTING_UP) && !Utility.isWorkProfileAvailable(this)) {
// Provision is still going on... // System has already finished provisioning, but Shelter still
Toast.makeText(this, R.string.provision_still_pending, Toast.LENGTH_SHORT).show(); // needs to be brought up inside the work profile
finish(); mResumeSetup.launch(null);
} else if (!mStorage.getBoolean(LocalStorageManager.PREF_HAS_SETUP)) { } else if (!mStorage.getBoolean(LocalStorageManager.PREF_HAS_SETUP)) {
// Reset the authentication key first mStartSetup.launch(null);
AuthenticationUtility.reset();
// If not set up yet, we have to provision the profile first
new AlertDialog.Builder(this)
.setCancelable(false)
.setMessage(R.string.first_run_alert)
.setPositiveButton(R.string.first_run_alert_continue,
(dialog, which) -> setupProfile())
.setNegativeButton(R.string.first_run_alert_cancel,
(dialog, which) -> finish())
.show();
} else { } else {
// Initialize the settings // Initialize the settings
SettingsManager.getInstance().applyAll(); SettingsManager.getInstance().applyAll();
@ -137,25 +107,13 @@ public class MainActivity extends AppCompatActivity {
} }
} }
private void setupProfile() { private void setupWizardCb(Boolean result) {
// Build the provisioning intent first if (result)
ComponentName admin = new ComponentName(getApplicationContext(), ShelterDeviceAdminReceiver.class); init();
Intent intent = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE); else
intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION, true);
intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, admin);
// Check if provisioning is allowed
if (!mPolicyManager.isProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)
|| getPackageManager().resolveActivity(intent, 0) == null) {
Toast.makeText(this,
getString(R.string.msg_device_unsupported), Toast.LENGTH_LONG).show();
finish(); finish();
} }
// Start provisioning
startActivityForResult(intent, REQUEST_PROVISION_PROFILE);
}
private void bindServices() { private void bindServices() {
// Bind to the service provided by this app in main user // Bind to the service provided by this app in main user
// The service in main profile doesn't need to be foreground // The service in main profile doesn't need to be foreground
@ -192,7 +150,22 @@ public class MainActivity extends AppCompatActivity {
finish(); finish();
return; return;
} }
startActivityForResult(intent, REQUEST_TRY_START_SERVICE_IN_WORK_PROFILE); mTryStartWorkService.launch(intent);
}
private void tryStartWorkServiceCb(ActivityResult result) {
if (result.getResultCode() == RESULT_OK) {
// RESULT_OK is from DummyActivity. The work profile is enabled!
bindWorkService();
} else {
// In this case, the user has been presented with a prompt
// to enable work mode, but we have no means to distinguish
// "ok" and "cancel", so the only way is to tell the user
// to start again.
Toast.makeText(this,
getString(R.string.work_mode_disabled), Toast.LENGTH_LONG).show();
finish();
}
} }
private void bindWorkService() { private void bindWorkService() {
@ -200,7 +173,18 @@ public class MainActivity extends AppCompatActivity {
Intent intent = new Intent(DummyActivity.START_SERVICE); Intent intent = new Intent(DummyActivity.START_SERVICE);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Utility.transferIntentToProfile(this, intent); Utility.transferIntentToProfile(this, intent);
startActivityForResult(intent, REQUEST_START_SERVICE_IN_WORK_PROFILE); mBindWorkService.launch(intent);
}
private void bindWorkServiceCb(ActivityResult result) {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
Bundle extra = result.getData().getBundleExtra("extra");
IBinder binder = extra.getBinder("service");
mServiceWork = IShelterService.Stub.asInterface(binder);
registerStartActivityProxies();
startKiller();
buildView();
}
} }
private void startKiller() { private void startKiller() {
@ -219,33 +203,48 @@ public class MainActivity extends AppCompatActivity {
private void buildView() { private void buildView() {
// Finally we can build the view // Finally we can build the view
// Find all the views // Find all the views
mPager = findViewById(R.id.main_pager); ViewPager2 pager = findViewById(R.id.main_pager);
mTabs = findViewById(R.id.main_tablayout); BottomNavigationView nav = findViewById(R.id.main_bottom_navigation);
// Initialize the ViewPager and the tab // Initialize the ViewPager and the tab
// All the remaining work will be done in the fragments // All the remaining work will be done in the fragments
mPager.setAdapter(new AppListFragmentAdapter(getSupportFragmentManager())); pager.setAdapter(new FragmentStateAdapter(this) {
mTabs.setupWithViewPager(mPager); @NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return AppListFragment.newInstance(mServiceMain, false);
} else if (position == 1) {
return AppListFragment.newInstance(mServiceWork, true);
} else {
throw new RuntimeException("How did this happen?");
}
} }
private boolean isWorkProfileAvailable() { @Override
// Determine if the work profile is already available public int getItemCount() {
// If so, return true and set all the corresponding flags to true return 2;
// This is for scenarios where the asynchronous part of the
// setup process might be finished before the synchronous part
Intent intent = new Intent(DummyActivity.TRY_START_SERVICE);
try {
// DO NOT sign this request, because this won't be actually sent to work profile
// If this is signed, and is the first request to be signed,
// then the other side would never receive the auth_key
Utility.transferIntentToProfileUnsigned(this, intent);
mStorage.setBoolean(LocalStorageManager.PREF_IS_SETTING_UP, false);
mStorage.setBoolean(LocalStorageManager.PREF_HAS_SETUP, true);
return true;
} catch (IllegalStateException e) {
// If any exception is thrown, this means that the profile is not available
return false;
} }
});
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
int[] menuIds = new int[]{
R.id.bottom_navigation_main,
R.id.bottom_navigation_work
};
nav.setSelectedItemId(menuIds[position]);
}
});
nav.setOnItemSelectedListener((MenuItem item) -> {
int itemId = item.getItemId();
if (itemId == R.id.bottom_navigation_main) {
pager.setCurrentItem(0);
} else if (itemId == R.id.bottom_navigation_work) {
pager.setCurrentItem(1);
}
return true;
});
} }
// Get the service on the other side // Get the service on the other side
@ -271,6 +270,33 @@ public class MainActivity extends AppCompatActivity {
return true; return true;
} }
private void registerStartActivityProxies() {
try {
mServiceMain.setStartActivityProxy(new IStartActivityProxy.Stub() {
@Override
public void startActivity(Intent intent) throws RemoteException {
MainActivity.this.startActivity(intent);
}
});
mServiceWork.setStartActivityProxy(new IStartActivityProxy.Stub() {
@Override
public void startActivity(Intent intent) throws RemoteException {
// Using the full intent may cause the package manager to
// fail to find the DummyActivity inside profile.
// Instead we try to use an empty intent with only the action
// and then extract the correct component name
Intent dummyIntent = new Intent(intent.getAction());
Utility.transferIntentToProfileUnsigned(MainActivity.this, dummyIntent);
intent.setComponent(dummyIntent.getComponent());
MainActivity.this.startActivity(intent);
}
});
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@ -362,22 +388,22 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { int itemId = item.getItemId();
case R.id.main_menu_freeze_all: if (itemId == R.id.main_menu_freeze_all) {
// This is the same as clicking on the batch freeze shortcut // This is the same as clicking on the batch freeze shortcut
// so we just forward the request to DummyActivity // so we just forward the request to DummyActivity
Intent intent = new Intent(DummyActivity.PUBLIC_FREEZE_ALL); Intent intent = new Intent(DummyActivity.PUBLIC_FREEZE_ALL);
intent.setComponent(new ComponentName(this, DummyActivity.class)); intent.setComponent(new ComponentName(this, DummyActivity.class));
startActivity(intent); startActivity(intent);
return true; return true;
case R.id.main_menu_settings: } else if (itemId == R.id.main_menu_settings) {
Intent settingsIntent = new Intent(this, SettingsActivity.class); Intent settingsIntent = new Intent(this, SettingsActivity.class);
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putBinder("profile_service", mServiceWork.asBinder()); extras.putBinder("profile_service", mServiceWork.asBinder());
settingsIntent.putExtra("extras", extras); settingsIntent.putExtra("extras", extras);
startActivity(settingsIntent); startActivity(settingsIntent);
return true; return true;
case R.id.main_menu_create_freeze_all_shortcut: } else if (itemId == R.id.main_menu_create_freeze_all_shortcut) {
Intent launchIntent = new Intent(DummyActivity.PUBLIC_FREEZE_ALL); Intent launchIntent = new Intent(DummyActivity.PUBLIC_FREEZE_ALL);
launchIntent.setComponent(new ComponentName(this, DummyActivity.class)); launchIntent.setComponent(new ComponentName(this, DummyActivity.class));
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
@ -385,13 +411,10 @@ public class MainActivity extends AppCompatActivity {
Icon.createWithResource(this, R.mipmap.ic_freeze), Icon.createWithResource(this, R.mipmap.ic_freeze),
"shelter-freeze-all", getString(R.string.freeze_all_shortcut)); "shelter-freeze-all", getString(R.string.freeze_all_shortcut));
return true; return true;
case R.id.main_menu_install_app_to_profile: } else if (itemId == R.id.main_menu_install_app_to_profile) {
Intent openApkIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); mSelectApk.launch(null);
openApkIntent.addCategory(Intent.CATEGORY_OPENABLE);
openApkIntent.setType("application/vnd.android.package-archive");
startActivityForResult(openApkIntent, REQUEST_DOCUMENTS_CHOOSE_APK);
return true; return true;
case R.id.main_menu_show_all: } else if (itemId == R.id.main_menu_show_all) {
Runnable update = () -> { Runnable update = () -> {
mShowAll = !item.isChecked(); mShowAll = !item.isChecked();
item.setChecked(mShowAll); item.setChecked(mShowAll);
@ -410,64 +433,18 @@ public class MainActivity extends AppCompatActivity {
update.run(); update.run();
} }
return true; return true;
} } else if (itemId == R.id.main_menu_documents_ui) {
Intent documentsUiIntent = new Intent(Intent.ACTION_VIEW);
documentsUiIntent.setDataAndType(null, "vnd.android.document/root");
startActivity(documentsUiIntent);
return true;
} else {
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
}
@Override private void onApkSelected(Uri uri) {
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (uri == null) return;
if (requestCode == REQUEST_PROVISION_PROFILE) {
if (resultCode == RESULT_OK) {
if (isWorkProfileAvailable()) {
// For pre-Oreo, or post-Oreo on some circumstances,
// by the time this is received, the whole process
// should have completed.
recreate();
return;
}
// The sync part of the setup process is completed
// Wait for the provisioning to complete
mStorage.setBoolean(LocalStorageManager.PREF_IS_SETTING_UP, true);
// However, we still have to wait for DummyActivity in work profile to finish
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage(getString(R.string.provision_still_pending));
mProgressDialog.setCancelable(false);
mProgressDialog.show();
} else {
Toast.makeText(this,
getString(R.string.work_profile_provision_failed), Toast.LENGTH_LONG).show();
finish();
}
} else if (requestCode == REQUEST_TRY_START_SERVICE_IN_WORK_PROFILE) {
if (resultCode == RESULT_OK) {
// RESULT_OK is from DummyActivity. The work profile is enabled!
bindWorkService();
} else {
// In this case, the user has been presented with a prompt
// to enable work mode, but we have no means to distinguish
// "ok" and "cancel", so the only way is to tell the user
// to start again.
Toast.makeText(this,
getString(R.string.work_mode_disabled), Toast.LENGTH_LONG).show();
finish();
}
} else if (requestCode == REQUEST_START_SERVICE_IN_WORK_PROFILE && resultCode == RESULT_OK) {
Bundle extra = data.getBundleExtra("extra");
IBinder binder = extra.getBinder("service");
mServiceWork = IShelterService.Stub.asInterface(binder);
startKiller();
buildView();
} else if (requestCode == REQUEST_SET_DEVICE_ADMIN) {
if (resultCode == RESULT_OK) {
// Device Admin is now set, go ahead to provisioning (or initialization)
init();
} else {
Toast.makeText(this, getString(R.string.device_admin_toast), Toast.LENGTH_LONG).show();
finish();
}
} else if (requestCode == REQUEST_DOCUMENTS_CHOOSE_APK && resultCode == RESULT_OK && data != null) {
Uri uri = data.getData();
UriForwardProxy proxy = new UriForwardProxy(getApplicationContext(), uri); UriForwardProxy proxy = new UriForwardProxy(getApplicationContext(), uri);
try { try {
@ -485,42 +462,5 @@ public class MainActivity extends AppCompatActivity {
} catch (RemoteException e) { } catch (RemoteException e) {
// Well, I don't know what to do then // Well, I don't know what to do then
} }
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private class AppListFragmentAdapter extends FragmentPagerAdapter {
AppListFragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 2;
}
@Override
public Fragment getItem(int i) {
if (i == 0) {
return AppListFragment.newInstance(mServiceMain, false);
} else if (i == 1) {
return AppListFragment.newInstance(mServiceWork, true);
} else {
return null;
}
}
@Nullable
@Override
public CharSequence getPageTitle(int i) {
if (i == 0) {
return getString(R.string.fragment_profile_main);
} else if (i == 1) {
return getString(R.string.fragment_profile_work);
} else {
return null;
}
}
} }
} }

View file

@ -2,6 +2,7 @@ package net.typeblog.shelter.ui;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -10,6 +11,7 @@ import net.typeblog.shelter.R;
public class SettingsActivity extends AppCompatActivity { public class SettingsActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
EdgeToEdge.enable(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings); setContentView(R.layout.activity_settings);
setSupportActionBar(findViewById(R.id.settings_toolbar)); setSupportActionBar(findViewById(R.id.settings_toolbar));

View file

@ -1,14 +1,24 @@
package net.typeblog.shelter.ui; package net.typeblog.shelter.ui;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.provider.Settings; import android.provider.Settings;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.preference.CheckBoxPreference; import androidx.preference.CheckBoxPreference;
import androidx.preference.DropDownPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
@ -17,30 +27,43 @@ import net.typeblog.shelter.services.IShelterService;
import net.typeblog.shelter.util.SettingsManager; import net.typeblog.shelter.util.SettingsManager;
import net.typeblog.shelter.util.Utility; import net.typeblog.shelter.util.Utility;
import mobi.upod.timedurationpicker.TimeDurationPicker; import java.util.Arrays;
import mobi.upod.timedurationpicker.TimeDurationPickerDialogFragment;
import mobi.upod.timedurationpicker.TimeDurationUtil;
public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener { public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {
private static final String SETTINGS_VERSION = "settings_version"; private static final String SETTINGS_VERSION = "settings_version";
private static final String SETTINGS_SOURCE_CODE = "settings_source_code"; private static final String SETTINGS_SOURCE_CODE = "settings_source_code";
private static final String SETTINGS_TRANSLATE = "settings_translate";
private static final String SETTINGS_BUG_REPORT = "settings_bug_report"; private static final String SETTINGS_BUG_REPORT = "settings_bug_report";
private static final String SETTINGS_PATREON = "settings_patreon"; private static final String SETTINGS_PATREON = "settings_patreon";
private static final String SETTINGS_CROSS_PROFILE_FILE_CHOOSER = "settings_cross_profile_file_chooser"; private static final String SETTINGS_CROSS_PROFILE_FILE_CHOOSER = "settings_cross_profile_file_chooser";
private static final String SETTINGS_CAMERA_PROXY = "settings_camera_proxy"; private static final String SETTINGS_BLOCK_CONTACTS_SEARCHING = "settings_block_contacts_searching";
private static final String SETTINGS_AUTO_FREEZE_SERVICE = "settings_auto_freeze_service"; private static final String SETTINGS_AUTO_FREEZE_SERVICE = "settings_auto_freeze_service";
private static final String SETTINGS_AUTO_FREEZE_DELAY = "settings_auto_freeze_delay"; private static final String SETTINGS_AUTO_FREEZE_DELAY = "settings_auto_freeze_delay";
private static final String SETTINGS_SKIP_FOREGROUND = "settings_dont_freeze_foreground"; private static final String SETTINGS_SKIP_FOREGROUND = "settings_dont_freeze_foreground";
private static final String SETTINGS_PAYMENT_STUB = "settings_payment_stub";
private static final int[] AUTO_FREEZE_DELAY_SECONDS = new int[]{0, 60, 2 * 60, 5 * 60};
private SettingsManager mManager = SettingsManager.getInstance(); private SettingsManager mManager = SettingsManager.getInstance();
private IShelterService mServiceWork = null; private IShelterService mServiceWork = null;
private CheckBoxPreference mPrefCrossProfileFileChooser = null; private CheckBoxPreference mPrefCrossProfileFileChooser = null;
private CheckBoxPreference mPrefCameraProxy = null; private CheckBoxPreference mPrefBlockContactsSearching = null;
private CheckBoxPreference mPrefAutoFreezeService = null; private CheckBoxPreference mPrefAutoFreezeService = null;
private CheckBoxPreference mPrefSkipForeground = null; private CheckBoxPreference mPrefSkipForeground = null;
private CheckBoxPreference mPrefPaymentStub = null;
private Preference mPrefAutoFreezeDelay = null; private DropDownPreference mPrefAutoFreezeDelay = null;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ViewCompat.setOnApplyWindowInsetsListener(view.findViewById(androidx.preference.R.id.recycler_view), (v, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPaddingRelative(0, 0, 0, insets.bottom);
return WindowInsetsCompat.CONSUMED;
});
}
@Override @Override
public void onCreatePreferences(Bundle bundle, String s) { public void onCreatePreferences(Bundle bundle, String s) {
@ -64,25 +87,46 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
.setOnPreferenceClickListener(this::openSummaryUrl); .setOnPreferenceClickListener(this::openSummaryUrl);
findPreference(SETTINGS_PATREON) findPreference(SETTINGS_PATREON)
.setOnPreferenceClickListener(this::openSummaryUrl); .setOnPreferenceClickListener(this::openSummaryUrl);
findPreference(SETTINGS_TRANSLATE)
.setOnPreferenceClickListener(this::openSummaryUrl);
// === Interactions === // === Interactions ===
mPrefCrossProfileFileChooser = (CheckBoxPreference) findPreference(SETTINGS_CROSS_PROFILE_FILE_CHOOSER); mPrefCrossProfileFileChooser = (CheckBoxPreference) findPreference(SETTINGS_CROSS_PROFILE_FILE_CHOOSER);
mPrefCrossProfileFileChooser.setChecked(mManager.getCrossProfileFileChooserEnabled()); mPrefCrossProfileFileChooser.setChecked(mManager.getCrossProfileFileChooserEnabled());
mPrefCrossProfileFileChooser.setOnPreferenceChangeListener(this); mPrefCrossProfileFileChooser.setOnPreferenceChangeListener(this);
mPrefCameraProxy = (CheckBoxPreference) findPreference(SETTINGS_CAMERA_PROXY); mPrefBlockContactsSearching = (CheckBoxPreference) findPreference(SETTINGS_BLOCK_CONTACTS_SEARCHING);
mPrefCameraProxy.setChecked(mManager.getCameraProxyEnabled()); mPrefBlockContactsSearching.setChecked(mManager.getBlockContactsSearchingEnabled());
mPrefCameraProxy.setOnPreferenceChangeListener(this); mPrefBlockContactsSearching.setOnPreferenceChangeListener(this);
mPrefPaymentStub = (CheckBoxPreference) findPreference(SETTINGS_PAYMENT_STUB);
mPrefPaymentStub.setChecked(mManager.getPaymentStubEnabled());
mPrefPaymentStub.setOnPreferenceChangeListener(this);
// === Services === // === Services ===
mPrefAutoFreezeService = (CheckBoxPreference) findPreference(SETTINGS_AUTO_FREEZE_SERVICE); mPrefAutoFreezeService = (CheckBoxPreference) findPreference(SETTINGS_AUTO_FREEZE_SERVICE);
mPrefAutoFreezeService.setChecked(mManager.getAutoFreezeServiceEnabled()); mPrefAutoFreezeService.setChecked(mManager.getAutoFreezeServiceEnabled());
mPrefAutoFreezeService.setOnPreferenceChangeListener(this); mPrefAutoFreezeService.setOnPreferenceChangeListener(this);
mPrefAutoFreezeDelay = findPreference(SETTINGS_AUTO_FREEZE_DELAY); mPrefAutoFreezeDelay = findPreference(SETTINGS_AUTO_FREEZE_DELAY);
mPrefAutoFreezeDelay.setOnPreferenceClickListener(this::openAutoFreezeDelayPicker); mPrefAutoFreezeDelay.setOnPreferenceChangeListener(this);
mPrefAutoFreezeDelay.setEntries(Arrays.stream(AUTO_FREEZE_DELAY_SECONDS).mapToObj((it) -> getString(R.string.format_minutes, it / 60)).toArray(String[]::new));
mPrefAutoFreezeDelay.setEntryValues(Arrays.stream(AUTO_FREEZE_DELAY_SECONDS).mapToObj(String::valueOf).toArray(String[]::new));
updateAutoFreezeDelay(); updateAutoFreezeDelay();
mPrefSkipForeground = (CheckBoxPreference) findPreference(SETTINGS_SKIP_FOREGROUND); mPrefSkipForeground = (CheckBoxPreference) findPreference(SETTINGS_SKIP_FOREGROUND);
mPrefSkipForeground.setChecked(mManager.getSkipForegroundEnabled()); mPrefSkipForeground.setChecked(mManager.getSkipForegroundEnabled());
mPrefSkipForeground.setOnPreferenceChangeListener(this); mPrefSkipForeground.setOnPreferenceChangeListener(this);
// Disable FileSuttle on Q for now
// Supported on R and beyond
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
mPrefCrossProfileFileChooser.setEnabled(false);
}
// Disable FileShuttle for Android Go
// as it requires SYSTEM_ALERT_WINDOW which
// is not allowed on Go devices
ActivityManager am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
if (am.isLowRamDevice()) {
mPrefCrossProfileFileChooser.setEnabled(false);
}
} }
@Override @Override
@ -95,9 +139,7 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
} }
private void updateAutoFreezeDelay() { private void updateAutoFreezeDelay() {
mPrefAutoFreezeDelay.setSummary(TimeDurationUtil.formatMinutesSeconds( mPrefAutoFreezeDelay.setSummary(getString(R.string.format_minutes, mManager.getAutoFreezeDelay() / 60));
((long) mManager.getAutoFreezeDelay()) * 1000
));
} }
private boolean openSummaryUrl(Preference pref) { private boolean openSummaryUrl(Preference pref) {
@ -107,64 +149,105 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
return true; return true;
} }
private boolean openAutoFreezeDelayPicker(Preference pref) {
new AutoFreezeDelayPickerFragment().show(getActivity().getFragmentManager(), "dialog");
return true;
}
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newState) { public boolean onPreferenceChange(Preference preference, Object newState) {
if (preference == mPrefCrossProfileFileChooser) { if (preference == mPrefCrossProfileFileChooser) {
mManager.setCrossProfileFileChooserEnabled((boolean) newState); boolean enabled = (boolean) newState;
if (!enabled) {
mManager.setCrossProfileFileChooserEnabled(false);
return true; return true;
} else if (preference == mPrefCameraProxy) { }
mManager.setCameraProxyEnabled(((boolean) newState));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// Request all files permission on R and beyond
boolean hasPermission = ensureSpecialAccessPermission(() -> {
try {
return mServiceWork.hasAllFileAccessPermission() && Utility.checkAllFileAccessPermission();
} catch (RemoteException e) {
return false;
}
}, R.string.request_storage_manager, Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
if (!hasPermission) {
return false;
}
// Also needs system alert window permission
// because File Shuttle needs to start activities in the background
// We cannot do the same notification trick as in initial setup
// because it would be too annoying having to click a notification
// every time a user tries to use File Shuttle.
// NOTE: Enabling this permission may mask some bugs with background
// activities. Always test with this disabled.
hasPermission = ensureSpecialAccessPermission(() -> {
try {
return mServiceWork.hasSystemAlertPermission() && Utility.checkSystemAlertPermission(getContext());
} catch (RemoteException e) {
return false;
}
}, R.string.request_system_alert, Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
if (!hasPermission) {
return false;
}
}
mManager.setCrossProfileFileChooserEnabled(true);
return true;
} else if (preference == mPrefBlockContactsSearching) {
mManager.setBlockContactsSearchingEnabled((boolean) newState);
return true; return true;
} else if (preference == mPrefAutoFreezeService) { } else if (preference == mPrefAutoFreezeService) {
mManager.setAutoFreezeServiceEnabled((boolean) newState); mManager.setAutoFreezeServiceEnabled((boolean) newState);
return true; return true;
} else if (preference == mPrefAutoFreezeDelay) {
mManager.setAutoFreezeDelay(Integer.parseInt((String) newState));
updateAutoFreezeDelay();
return true;
} else if (preference == mPrefSkipForeground) { } else if (preference == mPrefSkipForeground) {
boolean enabled = (boolean) newState; boolean enabled = (boolean) newState;
boolean hasPermission = false; if (!enabled) {
try { mManager.setSkipForegroundEnabled(false);
hasPermission = mServiceWork.hasUsageStatsPermission() && Utility.checkUsageStatsPermission(getContext()); return true;
} catch (RemoteException e) {
} }
if (!enabled || hasPermission) {
mManager.setSkipForegroundEnabled(enabled); boolean hasPermission = ensureSpecialAccessPermission(() -> {
try {
return mServiceWork.hasUsageStatsPermission() && Utility.checkUsageStatsPermission(getContext());
} catch (RemoteException e) {
return false;
}
}, R.string.request_usage_stats, Settings.ACTION_USAGE_ACCESS_SETTINGS);
if (!hasPermission)
return false;
mManager.setSkipForegroundEnabled(true);
return true;
} else if (preference == mPrefPaymentStub) {
mManager.setPaymentStubEnabled((boolean) newState);
return true; return true;
} else { } else {
return false;
}
}
private interface CheckPermissionCallback {
boolean check();
}
private boolean ensureSpecialAccessPermission(CheckPermissionCallback checkPermission, int alertRes, String settingsAction) {
if (!checkPermission.check()) {
new AlertDialog.Builder(getContext()) new AlertDialog.Builder(getContext())
.setMessage(R.string.request_usage_stats) .setMessage(alertRes)
.setPositiveButton(android.R.string.ok, .setPositiveButton(android.R.string.ok,
(dialog, which) -> startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS))) (dialog, which) -> startActivity(new Intent(settingsAction)))
.setNegativeButton(android.R.string.cancel, .setNegativeButton(android.R.string.cancel,
(dialog, which) -> dialog.dismiss()) (dialog, which) -> dialog.dismiss())
.show(); .show();
return false; return false;
}
} else { } else {
return false; return true;
}
}
public static class AutoFreezeDelayPickerFragment extends TimeDurationPickerDialogFragment {
@Override
protected long getInitialDuration() {
return ((long) SettingsManager.getInstance().getAutoFreezeDelay()) * 1000;
}
@Override
protected int setTimeUnits() {
return TimeDurationPicker.MM_SS;
}
@Override
public void onDurationSet(TimeDurationPicker view, long duration) {
long seconds = duration / 1000;
if (seconds >= Integer.MAX_VALUE) return;
SettingsManager.getInstance().setAutoFreezeDelay((int) seconds);
} }
} }
} }

View file

@ -0,0 +1,448 @@
package net.typeblog.shelter.ui;
import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.android.setupwizardlib.SetupWizardLayout;
import com.android.setupwizardlib.view.NavigationBar;
import net.typeblog.shelter.R;
import net.typeblog.shelter.receivers.ShelterDeviceAdminReceiver;
import net.typeblog.shelter.util.AuthenticationUtility;
import net.typeblog.shelter.util.LocalStorageManager;
import net.typeblog.shelter.util.Utility;
public class SetupWizardActivity extends AppCompatActivity {
// RESUME_SETUP should be used when MainActivity detects the provisioning has been
// finished by the system, but the Shelter inside the profile has never been brought up
// due to the user having not clicked on the notification yet (on Android 7 or lower).
// TODO: When we remove support for Android 7, get rid of all of these nonsense :)
public static final String ACTION_RESUME_SETUP = "net.typeblog.shelter.RESUME_SETUP";
public static final String ACTION_PROFILE_PROVISIONED = "net.typeblog.shelter.PROFILE_PROVISIONED";
private DevicePolicyManager mPolicyManager = null;
private LocalStorageManager mStorage = null;
private final ActivityResultLauncher<Void> mProvisionProfile =
registerForActivityResult(new ProfileProvisionContract(), this::setupProfileCb);
@Override
protected void onCreate(Bundle savedInstanceState) {
EdgeToEdge.enable(this);
super.onCreate(savedInstanceState);
// The user could click on the "finish provisioning" notification while having removed
// this activity from the recents stack, in which case the notification will start a new
// instance of activity
if (ACTION_PROFILE_PROVISIONED.equals(getIntent().getAction()) && Utility.isWorkProfileAvailable(this)) {
// ...in which case we should finish immediately and go back to MainActivity
startActivity(new Intent(this, MainActivity.class));
finish();
return;
}
setContentView(R.layout.activity_setup_wizard);
mPolicyManager = getSystemService(DevicePolicyManager.class);
mStorage = LocalStorageManager.getInstance();
// Don't use switchToFragment for the first time
// because we don't want animation for the first fragment
// (it would have nothing to animate upon, resulting in a black background)
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.setup_wizard_container,
ACTION_RESUME_SETUP.equals(getIntent().getAction()) ?
new ActionRequiredFragment() : new WelcomeFragment())
.commit();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// DummyActivity will start this activity with an empty intent
// once the provision is finalized
if (ACTION_PROFILE_PROVISIONED.equals(intent.getAction()) && Utility.isWorkProfileAvailable(this))
finishWithResult(true);
}
private<T extends BaseWizardFragment> void switchToFragment(T fragment, boolean reverseAnimation) {
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(
reverseAnimation ? R.anim.slide_in_from_left : R.anim.slide_in_from_right,
reverseAnimation ? R.anim.slide_out_to_right : R.anim.slide_out_to_left
)
.replace(R.id.setup_wizard_container, fragment)
.commit();
}
private void finishWithResult(boolean succeeded) {
setResult(succeeded ? RESULT_OK : RESULT_CANCELED);
finish();
}
private void setupProfile() {
if (!mPolicyManager.isProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)) {
switchToFragment(new FailedFragment(), false);
return;
}
// The user may have aborted provisioning before without clearing data
// This can cause issues if the authentication utility thinks we
// could do authentication due to the presence of keys
AuthenticationUtility.reset();
try {
mProvisionProfile.launch(null);
} catch (ActivityNotFoundException e) {
// How could this fail???
switchToFragment(new FailedFragment(), false);
}
}
private void setupProfileCb(Boolean result) {
if (result) {
if (Utility.isWorkProfileAvailable(this)) {
// On Oreo and later versions, since we make use of the activity intent
// ACTION_PROVISIONING_SUCCESSFUL, the provisioning UI will not finish
// until that activity returns. In this case, there is really no need for us
// to do anything else here (and this callback may not even be called because
// the activity will likely be already finished by this point).
// There is no need for more action
finishWithResult(true);
return;
}
// Provisioning finished, but we still need to tell the user
// to click on the notification to bring up Shelter inside the
// profile. Otherwise, the setup will not be complete
mStorage.setBoolean(LocalStorageManager.PREF_IS_SETTING_UP, true);
switchToFragment(new ActionRequiredFragment(), false);
} else {
switchToFragment(new FailedFragment(), false);
}
}
public static class SetupWizardContract extends ActivityResultContract<Void, Boolean> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void input) {
return new Intent(context, SetupWizardActivity.class);
}
@Override
public Boolean parseResult(int resultCode, @Nullable Intent intent) {
return resultCode == RESULT_OK;
}
}
public static class ResumeSetupContract extends ActivityResultContract<Void, Boolean> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void input) {
Intent intent = new Intent(context, SetupWizardActivity.class);
intent.setAction(ACTION_RESUME_SETUP);
return intent;
}
@Override
public Boolean parseResult(int resultCode, @Nullable Intent intent) {
return resultCode == RESULT_OK;
}
}
private static class ProfileProvisionContract extends ActivityResultContract<Void, Boolean> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void input) {
ComponentName admin = new ComponentName(context.getApplicationContext(), ShelterDeviceAdminReceiver.class);
Intent intent = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE);
intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION, true);
intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, admin);
return intent;
}
@Override
public Boolean parseResult(int resultCode, @Nullable Intent intent) {
return resultCode == RESULT_OK;
}
}
// ==== SetupWizard steps ====
private static abstract class BaseWizardFragment extends Fragment implements NavigationBar.NavigationBarListener {
protected SetupWizardActivity mActivity = null;
protected SetupWizardLayout mWizard = null;
protected abstract int getLayoutResource();
@Override
public void onNavigateBack() {
// For sub-classes to implement
}
@Override
public void onNavigateNext() {
// For sub-classes to implement
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
mActivity = (SetupWizardActivity) getActivity();
}
@Override
public void onDetach() {
super.onDetach();
mActivity = null;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutResource(), container, false);
mWizard = view.findViewById(R.id.wizard);
mWizard.getNavigationBar().setNavigationBarListener(this);
mWizard.setLayoutBackground(ContextCompat.getDrawable(inflater.getContext(), R.color.colorAccent));
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ViewCompat.setOnApplyWindowInsetsListener(mWizard, (v, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
mWizard.setDecorPaddingTop(insets.top);
NavigationBar nav = mWizard.getNavigationBar();
ViewGroup.LayoutParams params = nav.getLayoutParams();
params.height += insets.bottom;
nav.setLayoutParams(params);
nav.setPadding(nav.getPaddingLeft(), nav.getPaddingTop(), nav.getPaddingRight(), insets.bottom);
return WindowInsetsCompat.CONSUMED;
});
}
}
protected static abstract class TextWizardFragment extends BaseWizardFragment {
protected abstract int getTextRes();
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView tv = view.findViewById(R.id.setup_wizard_generic_text);
tv.setText(getTextRes());
}
}
public static class WelcomeFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_welcome_text;
}
@Override
public void onNavigateNext() {
super.onNavigateNext();
mActivity.switchToFragment(new PermissionsFragment(), false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_welcome);
mWizard.getNavigationBar().getBackButton().setVisibility(View.GONE);
}
}
public static class PermissionsFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_permissions_text;
}
@Override
public void onNavigateBack() {
super.onNavigateBack();
mActivity.switchToFragment(new WelcomeFragment(), true);
}
@Override
public void onNavigateNext() {
super.onNavigateNext();
mActivity.switchToFragment(new CompatibilityFragment(), false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_permissions);
}
}
public static class CompatibilityFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_compatibility_text;
}
@Override
public void onNavigateBack() {
super.onNavigateBack();
mActivity.switchToFragment(new PermissionsFragment(), true);
}
@Override
public void onNavigateNext() {
super.onNavigateNext();
mActivity.switchToFragment(new ReadyFragment(), false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_compatibility);
}
}
public static class ReadyFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_ready_text;
}
@Override
public void onNavigateBack() {
super.onNavigateBack();
mActivity.switchToFragment(new CompatibilityFragment(), true);
}
@Override
public void onNavigateNext() {
super.onNavigateNext();
mActivity.switchToFragment(new PleaseWaitFragment(), false);
mActivity.setupProfile();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_ready);
}
}
public static class PleaseWaitFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_please_wait_text;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_please_wait);
mWizard.setProgressBarColor(view.getContext().getColorStateList(R.color.setup_wizard_progress_bar));
mWizard.setProgressBarShown(true);
mWizard.getNavigationBar().getBackButton().setVisibility(View.GONE);
mWizard.getNavigationBar().getNextButton().setVisibility(View.GONE);
}
}
public static class ActionRequiredFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_action_required_text;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_action_required);
mWizard.setProgressBarColor(view.getContext().getColorStateList(R.color.setup_wizard_progress_bar));
mWizard.setProgressBarShown(true);
mWizard.getNavigationBar().getBackButton().setVisibility(View.GONE);
mWizard.getNavigationBar().getNextButton().setVisibility(View.GONE);
}
}
public static class FailedFragment extends TextWizardFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_setup_wizard_generic_text;
}
@Override
protected int getTextRes() {
return R.string.setup_wizard_failed_text;
}
@Override
public void onNavigateNext() {
super.onNavigateNext();
mActivity.finishWithResult(false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mWizard.setHeaderText(R.string.setup_wizard_failed);
mWizard.getNavigationBar().getBackButton().setVisibility(View.GONE);
}
}
}

View file

@ -1,7 +1,9 @@
package net.typeblog.shelter.util; package net.typeblog.shelter.util;
import android.annotation.TargetApi;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@ -55,6 +57,11 @@ public class ApplicationInfoWrapper implements Parcelable {
return mInfo.sourceDir; return mInfo.sourceDir;
} }
@TargetApi(Build.VERSION_CODES.O)
public String[] getSplitApks() {
return mInfo.splitSourceDirs;
}
// NOTE: This does not relate to the "freezing" feature in Shelter // NOTE: This does not relate to the "freezing" feature in Shelter
public boolean getEnabled() { public boolean getEnabled() {
return mInfo.enabled; return mInfo.enabled;

View file

@ -22,6 +22,7 @@ import net.typeblog.shelter.services.IFileShuttleService;
import net.typeblog.shelter.services.IFileShuttleServiceCallback; import net.typeblog.shelter.services.IFileShuttleServiceCallback;
import net.typeblog.shelter.ui.DummyActivity; import net.typeblog.shelter.ui.DummyActivity;
import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -50,7 +51,7 @@ public class CrossProfileDocumentsProvider extends DocumentsProvider {
// We just release the service when idle, thus enabling the // We just release the service when idle, thus enabling the
// system to release memory // system to release memory
private Runnable mReleaseServiceTask = this::releaseService; private Runnable mReleaseServiceTask = this::releaseService;
private Object mLock = new Object(); private final Object mLock = new Object();
private void doBindService() { private void doBindService() {
// Call DummyActivity on the other side to bind the service for us // Call DummyActivity on the other side to bind the service for us
@ -137,7 +138,7 @@ public class CrossProfileDocumentsProvider extends DocumentsProvider {
public Cursor queryDocument(String documentId, String[] projection) { public Cursor queryDocument(String documentId, String[] projection) {
ensureServiceBound(); ensureServiceBound();
final MatrixCursor result = new MatrixCursor(projection == null ? DEFAULT_DOCUMENT_PROJECTION : projection); final MatrixCursor result = new MatrixCursor(projection == null ? DEFAULT_DOCUMENT_PROJECTION : projection);
Map<String, Object> fileInfo = null; Map<String, Serializable> fileInfo;
try { try {
fileInfo = mService.loadFileMeta(documentId); fileInfo = mService.loadFileMeta(documentId);
} catch (RemoteException e) { } catch (RemoteException e) {
@ -150,7 +151,7 @@ public class CrossProfileDocumentsProvider extends DocumentsProvider {
@Override @Override
public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) { public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) {
ensureServiceBound(); ensureServiceBound();
List<Map<String, Object>> files = null; List<Map<String, Serializable>> files;
try { try {
files = mService.loadFiles(parentDocumentId); files = mService.loadFiles(parentDocumentId);
} catch (RemoteException e) { } catch (RemoteException e) {
@ -161,7 +162,7 @@ public class CrossProfileDocumentsProvider extends DocumentsProvider {
result.setNotificationUri(getContext().getContentResolver(), result.setNotificationUri(getContext().getContentResolver(),
DocumentsContract.buildDocumentUri(AUTHORITY, parentDocumentId)); DocumentsContract.buildDocumentUri(AUTHORITY, parentDocumentId));
for (Map<String, Object> file : files) { for (Map<String, Serializable> file : files) {
includeFile(result, file); includeFile(result, file);
} }
return result; return result;
@ -223,7 +224,7 @@ public class CrossProfileDocumentsProvider extends DocumentsProvider {
} }
} }
private void includeFile(MatrixCursor cursor, Map<String, Object> fileInfo) { private void includeFile(MatrixCursor cursor, Map<String, Serializable> fileInfo) {
final MatrixCursor.RowBuilder row = cursor.newRow(); final MatrixCursor.RowBuilder row = cursor.newRow();
for (String col : DEFAULT_DOCUMENT_PROJECTION) { for (String col : DEFAULT_DOCUMENT_PROJECTION) {
row.add(col, fileInfo.get(col)); row.add(col, fileInfo.get(col));

View file

@ -0,0 +1,67 @@
package net.typeblog.shelter.util;
import android.app.Activity;
import android.content.pm.PackageInstaller;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import androidx.appcompat.app.AlertDialog;
import net.typeblog.shelter.R;
public class InstallationProgressListener extends PackageInstaller.SessionCallback {
private AlertDialog mDialog;
private ProgressBar mProgress;
private int mSessionId;
private PackageInstaller mPi;
// Create a listener from an activity, and show a progress dialog for the sessionId
// Only cares about the one sessionId provided here.
// The caller is responsible for registering the callback;
// however, this class will remove itself once the session has been finished.
public InstallationProgressListener(Activity activity, PackageInstaller pi, int sessionId) {
mPi = pi;
ViewGroup layout = (ViewGroup) LayoutInflater.from(activity)
.inflate(R.layout.progress_dialog, (ViewGroup) activity.getWindow().getDecorView(), false);
mProgress = layout.findViewById(R.id.progress);
mDialog = new AlertDialog.Builder(activity)
.setCancelable(false)
.setTitle(R.string.app_installing)
.setView(layout)
.create();
mDialog.show();
}
@Override
public void onCreated(int sessionId) {
}
@Override
public void onBadgingChanged(int sessionId) {
}
@Override
public void onActiveChanged(int sessionId, boolean active) {
}
@Override
public void onProgressChanged(int sessionId, float progress) {
mProgress.setProgress((int) (progress * 100));
}
@Override
public void onFinished(int sessionId, boolean success) {
if (sessionId != mSessionId) {
return;
}
mDialog.hide();
mPi.unregisterSessionCallback(this);
}
}

View file

@ -8,7 +8,6 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
public class LocalStorageManager { public class LocalStorageManager {
public static final String PREF_IS_DEVICE_ADMIN = "is_device_admin";
public static final String PREF_IS_SETTING_UP = "is_setting_up"; public static final String PREF_IS_SETTING_UP = "is_setting_up";
public static final String PREF_HAS_SETUP = "has_setup"; public static final String PREF_HAS_SETUP = "has_setup";
public static final String PREF_AUTO_FREEZE_LIST_WORK_PROFILE = "auto_freeze_list_work_profile"; public static final String PREF_AUTO_FREEZE_LIST_WORK_PROFILE = "auto_freeze_list_work_profile";
@ -17,7 +16,8 @@ public class LocalStorageManager {
public static final String PREF_AUTO_FREEZE_SERVICE = "auto_freeze_service"; public static final String PREF_AUTO_FREEZE_SERVICE = "auto_freeze_service";
public static final String PREF_DONT_FREEZE_FOREGROUND = "dont_freeze_foreground"; public static final String PREF_DONT_FREEZE_FOREGROUND = "dont_freeze_foreground";
public static final String PREF_AUTO_FREEZE_DELAY = "auto_freeze_delay"; public static final String PREF_AUTO_FREEZE_DELAY = "auto_freeze_delay";
public static final String PREF_CAMERA_PROXY = "camera_proxy"; public static final String PREF_BLOCK_CONTACTS_SEARCHING = "block_contacts_searching";
public static final String PREF_PAYMENT_STUB = "payment_stub";
private static final String LIST_DIVIDER = ","; private static final String LIST_DIVIDER = ",";

View file

@ -5,7 +5,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import net.typeblog.shelter.ui.CameraProxyActivity; import net.typeblog.shelter.services.PaymentStubService;
import net.typeblog.shelter.ui.DummyActivity; import net.typeblog.shelter.ui.DummyActivity;
public class SettingsManager { public class SettingsManager {
@ -47,7 +47,7 @@ public class SettingsManager {
// Enforce all settings // Enforce all settings
public void applyAll() { public void applyAll() {
applyCrossProfileFileChooser(); applyCrossProfileFileChooser();
applyCameraProxy(); applyPaymentStub();
} }
// Read and apply the enabled state of the cross profile file chooser // Read and apply the enabled state of the cross profile file chooser
@ -59,15 +59,6 @@ public class SettingsManager {
PackageManager.DONT_KILL_APP); PackageManager.DONT_KILL_APP);
} }
// Read and apply the enabled state of the camera proxy
public void applyCameraProxy() {
boolean enabled = mStorage.getBoolean(LocalStorageManager.PREF_CAMERA_PROXY);
mContext.getPackageManager().setComponentEnabledSetting(
new ComponentName(mContext, CameraProxyActivity.class),
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
// Set the enabled state of the cross profile file chooser // Set the enabled state of the cross profile file chooser
public void setCrossProfileFileChooserEnabled(boolean enabled) { public void setCrossProfileFileChooserEnabled(boolean enabled) {
mStorage.setBoolean(LocalStorageManager.PREF_CROSS_PROFILE_FILE_CHOOSER, enabled); mStorage.setBoolean(LocalStorageManager.PREF_CROSS_PROFILE_FILE_CHOOSER, enabled);
@ -80,16 +71,15 @@ public class SettingsManager {
return mStorage.getBoolean(LocalStorageManager.PREF_CROSS_PROFILE_FILE_CHOOSER); return mStorage.getBoolean(LocalStorageManager.PREF_CROSS_PROFILE_FILE_CHOOSER);
} }
// Set the enabled state of the cross profile file chooser // Set the blocked state of cross-profile contacts searching
public void setCameraProxyEnabled(boolean enabled) { public void setBlockContactsSearchingEnabled(boolean enabled) {
mStorage.setBoolean(LocalStorageManager.PREF_CAMERA_PROXY, enabled); mStorage.setBoolean(LocalStorageManager.PREF_BLOCK_CONTACTS_SEARCHING, enabled);
applyCameraProxy(); syncSettingsToProfileBool(LocalStorageManager.PREF_BLOCK_CONTACTS_SEARCHING, enabled);
syncSettingsToProfileBool(LocalStorageManager.PREF_CAMERA_PROXY, enabled);
} }
// Get the enabled state of the cross profile file chooser // Get the blocked state of cross-profile contacts searching
public boolean getCameraProxyEnabled() { public boolean getBlockContactsSearchingEnabled() {
return mStorage.getBoolean(LocalStorageManager.PREF_CAMERA_PROXY); return mStorage.getBoolean(LocalStorageManager.PREF_BLOCK_CONTACTS_SEARCHING);
} }
// Set the enabled state of the auto freeze service // Set the enabled state of the auto freeze service
@ -129,4 +119,22 @@ public class SettingsManager {
public boolean getSkipForegroundEnabled() { public boolean getSkipForegroundEnabled() {
return mStorage.getBoolean(LocalStorageManager.PREF_DONT_FREEZE_FOREGROUND); return mStorage.getBoolean(LocalStorageManager.PREF_DONT_FREEZE_FOREGROUND);
} }
public boolean getPaymentStubEnabled() {
return mStorage.getBoolean(LocalStorageManager.PREF_PAYMENT_STUB);
}
public void setPaymentStubEnabled(boolean enabled) {
mStorage.setBoolean(LocalStorageManager.PREF_PAYMENT_STUB, enabled);
applyPaymentStub();
}
// Enable / disable the payment stub component based on settings in local storage
public void applyPaymentStub() {
boolean enabled = mStorage.getBoolean(LocalStorageManager.PREF_PAYMENT_STUB);
mContext.getPackageManager().setComponentEnabledSetting(
new ComponentName(mContext, PaymentStubService.class),
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
} }

View file

@ -23,11 +23,16 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Build; import android.os.Build;
import android.os.Environment;
import android.os.UserManager; import android.os.UserManager;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.provider.Settings; import android.provider.Settings;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.typeblog.shelter.R; import net.typeblog.shelter.R;
import net.typeblog.shelter.receivers.ShelterDeviceAdminReceiver; import net.typeblog.shelter.receivers.ShelterDeviceAdminReceiver;
import net.typeblog.shelter.services.IShelterService; import net.typeblog.shelter.services.IShelterService;
@ -36,7 +41,10 @@ import net.typeblog.shelter.ui.MainActivity;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -89,6 +97,27 @@ public class Utility {
} }
} }
// Determine if the work profile is already available
// If so, return true and set all the corresponding flags to true
// This is for scenarios where the asynchronous part of the
// setup process might be finished before the synchronous part
public static boolean isWorkProfileAvailable(Context context) {
LocalStorageManager storage = LocalStorageManager.getInstance();
Intent intent = new Intent(DummyActivity.TRY_START_SERVICE);
try {
// DO NOT sign this request, because this won't be actually sent to work profile
// If this is signed, and is the first request to be signed,
// then the other side would never receive the auth_key
Utility.transferIntentToProfileUnsigned(context, intent);
storage.setBoolean(LocalStorageManager.PREF_IS_SETTING_UP, false);
storage.setBoolean(LocalStorageManager.PREF_HAS_SETUP, true);
return true;
} catch (IllegalStateException e) {
// If any exception is thrown, this means that the profile is not available
return false;
}
}
// Enforce policies and configurations in the work profile // Enforce policies and configurations in the work profile
public static void enforceWorkProfilePolicies(Context context) { public static void enforceWorkProfilePolicies(Context context) {
DevicePolicyManager manager = context.getSystemService(DevicePolicyManager.class); DevicePolicyManager manager = context.getSystemService(DevicePolicyManager.class);
@ -148,8 +177,18 @@ public class Utility {
new IntentFilter(DummyActivity.SYNCHRONIZE_PREFERENCE), new IntentFilter(DummyActivity.SYNCHRONIZE_PREFERENCE),
DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT); DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT);
// Needed by ShelterService and has to be proxied by the MainActivity in main profile
manager.addCrossProfileIntentFilter(
adminComponent,
new IntentFilter(DummyActivity.INSTALL_PACKAGE),
DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT);
manager.addCrossProfileIntentFilter(
adminComponent,
new IntentFilter(DummyActivity.UNINSTALL_PACKAGE),
DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT);
// Allow ACTION_SEND and ACTION_SEND_MULTIPLE to cross from managed to parent // Allow ACTION_SEND and ACTION_SEND_MULTIPLE to cross from managed to parent
// TODO: Make this configurable
IntentFilter actionSendFilter = new IntentFilter(); IntentFilter actionSendFilter = new IntentFilter();
actionSendFilter.addAction(Intent.ACTION_SEND); actionSendFilter.addAction(Intent.ACTION_SEND);
actionSendFilter.addAction(Intent.ACTION_SEND_MULTIPLE); actionSendFilter.addAction(Intent.ACTION_SEND_MULTIPLE);
@ -165,15 +204,27 @@ public class Utility {
DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED); DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED);
// Browser intents are allowed from work profile to parent // Browser intents are allowed from work profile to parent
// TODO: Make this configurable, just as ALLOW_PARENT_PROFILE_APP_LINKING in the next function IntentFilter browsableIntentFilter = new IntentFilter(Intent.ACTION_VIEW);
IntentFilter i = new IntentFilter(Intent.ACTION_VIEW); browsableIntentFilter.addCategory(Intent.CATEGORY_BROWSABLE);
i.addCategory(Intent.CATEGORY_BROWSABLE); browsableIntentFilter.addDataScheme("http");
i.addDataScheme("http"); browsableIntentFilter.addDataScheme("https");
i.addDataScheme("https");
manager.addCrossProfileIntentFilter( manager.addCrossProfileIntentFilter(
adminComponent, adminComponent,
i, browsableIntentFilter,
DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED); DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED);
IntentFilter browsableDefaultIntentFilter = new IntentFilter(Intent.ACTION_VIEW);
browsableDefaultIntentFilter.addCategory(Intent.CATEGORY_BROWSABLE);
browsableDefaultIntentFilter.addCategory(Intent.CATEGORY_DEFAULT);
browsableDefaultIntentFilter.addDataScheme("http");
browsableDefaultIntentFilter.addDataScheme("https");
manager.addCrossProfileIntentFilter(
adminComponent,
browsableDefaultIntentFilter,
DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED);
// Block contacts searching optionally
manager.setCrossProfileContactsSearchDisabled(adminComponent,
SettingsManager.getInstance().getBlockContactsSearchingEnabled());
manager.setProfileEnabled(adminComponent); manager.setProfileEnabled(adminComponent);
} }
@ -191,8 +242,6 @@ public class Utility {
manager.setSecureSetting(adminComponent, Settings.Secure.INSTALL_NON_MARKET_APPS, "1"); manager.setSecureSetting(adminComponent, Settings.Secure.INSTALL_NON_MARKET_APPS, "1");
} }
// TODO: This should be configured by the user, instead of being enforced each time Shelter starts
// TODO: But we should also have some default restrictions that are set the first time Shelter starts
manager.addUserRestriction(adminComponent, UserManager.ALLOW_PARENT_PROFILE_APP_LINKING); manager.addUserRestriction(adminComponent, UserManager.ALLOW_PARENT_PROFILE_APP_LINKING);
} }
@ -263,7 +312,7 @@ public class Utility {
.build(); .build();
Intent addIntent = shortcutManager.createShortcutResultIntent(info); Intent addIntent = shortcutManager.createShortcutResultIntent(info);
shortcutManager.requestPinShortcut(info, shortcutManager.requestPinShortcut(info,
PendingIntent.getBroadcast(context, 0, addIntent, 0).getIntentSender()); PendingIntent.getBroadcast(context, 0, addIntent, PendingIntent.FLAG_IMMUTABLE).getIntentSender());
} else { } else {
// TODO: Maybe implement this for launchers without pin shortcut support? // TODO: Maybe implement this for launchers without pin shortcut support?
// TODO: Should be the same with the fallback for Android < O // TODO: Should be the same with the fallback for Android < O
@ -353,7 +402,7 @@ public class Utility {
public static String getFileExtension(String filePath) { public static String getFileExtension(String filePath) {
int index = filePath.lastIndexOf("."); int index = filePath.lastIndexOf(".");
if (index > 0) { if (index > 0) {
return filePath.substring(index + 1, filePath.length()); return filePath.substring(index + 1);
} else { } else {
return null; return null;
} }
@ -364,6 +413,17 @@ public class Utility {
return checkSpecialAccessPermission(context, AppOpsManager.OPSTR_GET_USAGE_STATS); return checkSpecialAccessPermission(context, AppOpsManager.OPSTR_GET_USAGE_STATS);
} }
// Check if SYSTEM_ALERT_WINDOW is granted
public static boolean checkSystemAlertPermission(Context context) {
return checkSpecialAccessPermission(context, AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW);
}
// Check if all file access r/w is granted
@TargetApi(Build.VERSION_CODES.R)
public static boolean checkAllFileAccessPermission() {
return Environment.isExternalStorageManager();
}
// Check special access permission through AppOps // Check special access permission through AppOps
public static boolean checkSpecialAccessPermission(Context context, String name) { public static boolean checkSpecialAccessPermission(Context context, String name) {
AppOpsManager appops = context.getSystemService(AppOpsManager.class); AppOpsManager appops = context.getSystemService(AppOpsManager.class);
@ -371,51 +431,98 @@ public class Utility {
return mode == AppOpsManager.MODE_ALLOWED; return mode == AppOpsManager.MODE_ALLOWED;
} }
// Pipe an InputStream to OutputStream
public static void pipe(InputStream is, OutputStream os) throws IOException {
int n;
byte[] buffer = new byte[65536];
while ((n = is.read(buffer)) > -1) {
os.write(buffer, 0, n);
}
}
// Utilities to build notifications for cross-version compatibility // Utilities to build notifications for cross-version compatibility
private static final String NOTIFICATION_CHANNEL_ID = "ShelterService"; private static final String NOTIFICATION_CHANNEL_ID = "ShelterService";
private static final String NOTIFICATION_CHANNEL_IMPORTANT = "ShelterService-Important";
public static Notification buildNotification(Context context, String ticker, String title, String desc, int icon) { public static Notification buildNotification(Context context, String ticker, String title, String desc, int icon) {
return buildNotification(context, false, ticker, title, desc, icon);
}
public static Notification buildNotification(Context context, boolean important, String ticker, String title, String desc, int icon) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return buildNotificationOreo(context, ticker, title, desc, icon); return buildNotificationOreo(context, important, ticker, title, desc, icon);
} else { } else {
return buildNotificationLollipop(context, ticker, title, desc, icon); return buildNotificationLollipop(context, important, ticker, title, desc, icon);
} }
} }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) @TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static Notification buildNotificationLollipop(Context context, String ticker, String title, String desc, int icon) { private static Notification buildNotificationLollipop(Context context, boolean important, String ticker, String title, String desc, int icon) {
return new Notification.Builder(context) return new Notification.Builder(context)
.setTicker(ticker) .setTicker(ticker)
.setContentTitle(title) .setContentTitle(title)
.setContentText(desc) .setContentText(desc)
.setSmallIcon(icon) .setSmallIcon(icon)
.setPriority(Notification.PRIORITY_MIN) .setPriority(important ? Notification.PRIORITY_MAX : Notification.PRIORITY_MIN)
.build(); .build();
} }
@TargetApi(Build.VERSION_CODES.O) @TargetApi(Build.VERSION_CODES.O)
private static Notification buildNotificationOreo(Context context, String ticker, String title, String desc, int icon) { private static Notification buildNotificationOreo(Context context, boolean important, String ticker, String title, String desc, int icon) {
String id = important ? NOTIFICATION_CHANNEL_IMPORTANT : NOTIFICATION_CHANNEL_ID;
// Android O and later: Notification Channel // Android O and later: Notification Channel
NotificationManager nm = context.getSystemService(NotificationManager.class); NotificationManager nm = context.getSystemService(NotificationManager.class);
if (nm.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null) { if (nm.getNotificationChannel(id) == null) {
NotificationChannel chan = new NotificationChannel( NotificationChannel chan = new NotificationChannel(
NOTIFICATION_CHANNEL_ID, context.getString(R.string.app_name), id,
NotificationManager.IMPORTANCE_MIN); important ? context.getString(R.string.notifications_important)
: context.getString(R.string.app_name),
important ? NotificationManager.IMPORTANCE_HIGH
: NotificationManager.IMPORTANCE_MIN);
nm.createNotificationChannel(chan); nm.createNotificationChannel(chan);
} }
// Disable everything: do not disturb the user // Disable everything: do not disturb the user
NotificationChannel chan = nm.getNotificationChannel(NOTIFICATION_CHANNEL_ID); NotificationChannel chan = nm.getNotificationChannel(id);
if (!important) {
chan.enableVibration(false); chan.enableVibration(false);
chan.enableLights(false); chan.enableLights(false);
chan.setImportance(NotificationManager.IMPORTANCE_MIN); chan.setImportance(NotificationManager.IMPORTANCE_MIN);
} else {
chan.enableVibration(true);
chan.setImportance(NotificationManager.IMPORTANCE_HIGH);
}
nm.createNotificationChannel(chan); nm.createNotificationChannel(chan);
// Create foreground notification to keep the service alive // Create foreground notification to keep the service alive
return new Notification.Builder(context, NOTIFICATION_CHANNEL_ID) return new Notification.Builder(context, id)
.setTicker(ticker) .setTicker(ticker)
.setContentTitle(title) .setContentTitle(title)
.setContentText(desc) .setContentText(desc)
.setSmallIcon(icon) .setSmallIcon(icon)
.build(); .build();
} }
// A wrapper over arbitrary ActivityResultContract that provides
// hardcoded input parameters and do not accept input with launch()
public static class ActivityResultContractInputWrapper<I, O, T extends ActivityResultContract<I, O>>
extends ActivityResultContract<Void, O> {
private final T mInner;
private final I mInput;
public ActivityResultContractInputWrapper(T inner, I input) {
mInner = inner;
mInput = input;
}
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void input) {
return mInner.createIntent(context, mInput);
}
@Override
public O parseResult(int resultCode, @Nullable Intent intent) {
return mInner.parseResult(resultCode, intent);
}
}
} }

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_shortAnimTime"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="-100%"
android:toXDelta="0%" />

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_shortAnimTime"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="100%"
android:toXDelta="0%" />

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_shortAnimTime"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="0%"
android:toXDelta="-100%" />

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_shortAnimTime"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="0%"
android:toXDelta="100%" />

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true"
android:color="@color/colorAccentSetupWizard" />
</selector>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorNavigationIconTint" android:state_checked="true" />
<item android:color="@color/colorNavigationIconTintSelected" android:state_checked="false" />
</selector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
</vector>

View file

@ -0,0 +1,35 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="737.01dp"
android:height="850.36dp"
android:viewportWidth="737.01"
android:viewportHeight="850.36">
<path
android:pathData="m171.04,181.02 l-85,77.59 -5.21,-6.64C50.53,317.75 31.12,390.57 28.72,463.15l28,13.74 113.38,-80 28.35,80 28.35,-26.68 56.75,29.34 56.69,-56 56.7,80 56.69,-53.36 56.69,53.36 85,-106.72 85,106.72 28.32,-26.36c-0.2,-76.35 -19.77,-153.52 -51.42,-222.96l-32.68,30.23 -85,-77.58 -56.7,51.72 -56.69,-25.86 -56.69,25.86 -28.35,-51.72 -56.69,51.72 -56.69,-25.86 -28.35,25.86zM255.12,311.81c15.66,0 28.35,19.04 28.35,42.52 -0,23.48 -12.69,42.52 -28.35,42.52 -15.66,-0 -28.35,-19.04 -28.35,-42.52 0,-9.58 2.12,-18.42 5.68,-25.53 0,0 0,-0.01 0,-0.01 0.02,-0.03 0.04,-0.06 0.06,-0.1 0.76,-1.5 1.58,-2.93 2.46,-4.27 0.01,-0.01 0.02,-0.03 0.03,-0.04 0.91,-1.37 1.88,-2.65 2.9,-3.82 0,0 0,0 0.01,-0.01 4.77,-5.48 10.74,-8.74 17.21,-8.74zM481.89,311.81c15.66,0 28.35,19.04 28.35,42.52 -0,23.48 -12.69,42.52 -28.35,42.52 -15.66,-0 -28.35,-19.04 -28.35,-42.52 0,-9.58 2.12,-18.42 5.68,-25.53 0,0 0,-0.01 0,-0.01 0.02,-0.03 0.04,-0.06 0.06,-0.1 5.18,-10.25 13.38,-16.88 22.61,-16.88z"
android:strokeWidth="8"
android:fillColor="#ffffff"
android:strokeColor="#000000"
android:fillType="evenOdd"
android:fillAlpha="0"/>
<path
android:pathData="m255.12,311.81c-6.48,0 -12.44,3.26 -17.21,8.74 2.06,-2.36 4.35,-4.31 6.79,-5.76 0.64,-0.09 1.28,-0.13 1.92,-0.14v-0.03c12.63,-0 18.95,15.26 10.02,24.19 -8.92,8.92 -24.18,2.61 -24.19,-10.01 -3.57,7.11 -5.68,15.95 -5.68,25.53 0,23.48 12.69,42.52 28.35,42.52 15.66,-0 28.35,-19.04 28.35,-42.52 -0,-23.48 -12.69,-42.52 -28.35,-42.52zM237.9,320.56c-1.02,1.18 -2,2.45 -2.9,3.82 0.91,-1.37 1.88,-2.65 2.9,-3.82zM234.97,324.42c-0.88,1.34 -1.71,2.77 -2.46,4.27 0.76,-1.5 1.58,-2.93 2.46,-4.27z"
android:fillColor="#20190a"/>
<path
android:pathData="m481.89,311.81c-9.24,0 -17.44,6.63 -22.61,16.88 3.11,-6.15 7.32,-11.01 12.19,-13.9 0.64,-0.09 1.28,-0.13 1.92,-0.14v-0.03c12.63,-0 18.95,15.26 10.02,24.19 -8.92,8.92 -24.18,2.61 -24.19,-10.01 -3.57,7.11 -5.68,15.95 -5.68,25.53 0,23.48 12.69,42.52 28.35,42.52 15.66,-0 28.35,-19.04 28.35,-42.52 -0,-23.48 -12.69,-42.52 -28.35,-42.52z"
android:fillColor="#20190a"/>
<path
android:pathData="m473.39,314.62v0.03c-0.64,0.01 -1.28,0.05 -1.92,0.14 -4.9,2.91 -9.13,7.8 -12.25,14 0,12.63 15.26,18.95 24.19,10.02 8.93,-8.93 2.61,-24.19 -10.02,-24.19z"
android:fillColor="#f9f8f4"
android:fillType="evenOdd"/>
<path
android:pathData="m246.62,314.62v0.03c-0.64,0.01 -1.28,0.05 -1.92,0.14 -4.9,2.91 -9.14,7.8 -12.25,14 -0,12.63 15.26,18.95 24.19,10.02 8.93,-8.93 2.61,-24.19 -10.02,-24.19z"
android:fillColor="#f9f8f4"
android:fillType="evenOdd"/>
<path
android:pathData="M369.51,0C259.31,0 137.21,99.48 64.9,231.69l21.14,26.92 85,-77.59 28.35,77.59 28.35,-25.86 56.69,25.86 56.69,-51.72 28.35,51.72 56.69,-25.86 56.69,25.86 56.7,-51.72 85,77.58 52,-48.11C604.67,101.83 481,0 369.51,0Z"
android:fillColor="#1a1a1a"
android:fillType="evenOdd"/>
<path
android:pathData="m595.32,396.83 l-85,106.72 -56.69,-53.36 -56.69,53.36 -56.7,-80 -56.69,56 -56.75,-29.34 -28.35,26.68 -28.35,-80 -113.38,80 -55.84,-27.4c0,0 -0.88,18.25 -0.88,27.36 0,235.75 165,373.51 368.51,373.51 203.51,0 368.5,-137.76 368.5,-373.51 0,-8.42 -0.25,-16.87 -0.75,-25.36l-55.94,52.06z"
android:fillColor="#1a1a1a"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM14,6h-4L10,4h4v2z"/>
</vector>

View file

@ -8,8 +8,11 @@
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/main_appbar" android:id="@+id/main_appbar"
android:fitsSystemWindows="true"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:elevation="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"> app:layout_constraintEnd_toEndOf="parent">
@ -21,22 +24,29 @@
app:layout_scrollFlags="scroll|enterAlways" app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/main_tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ToolbarTheme"
app:layout_scrollFlags="scroll|enterAlways" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager <androidx.viewpager2.widget.ViewPager2
android:id="@+id/main_pager" android:id="@+id/main_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/main_appbar" app:layout_constraintTop_toBottomOf="@id/main_appbar"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" /> app:layout_constraintBottom_toTopOf="@+id/main_bottom_navigation" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@id/main_bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorNavigationBar"
app:menu="@menu/bottom_navigation_menu"
app:itemBackground="@color/colorNavigationBar"
app:itemIconTint="@drawable/bottom_navigation_color_selector"
app:itemTextColor="@drawable/bottom_navigation_color_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/main_pager"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -5,8 +5,10 @@
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/settings_appbar" android:id="@+id/settings_appbar"
android:fitsSystemWindows="true"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"> app:layout_constraintEnd_toEndOf="parent">

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<View
android:id="@+id/status_bar_spacer"
android:background="?attr/colorAccent"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/setup_wizard_container"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<FrameLayout
android:id="@+id/setup_wizard_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.SetupWizardActivity" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -24,7 +24,7 @@
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginBottom="0dp" android:layout_marginBottom="0dp"
android:textColor="@color/black" android:textColor="@color/colorTextPrimary"
android:ellipsize="marquee" android:ellipsize="marquee"
app:layout_constraintStart_toEndOf="@id/list_app_icon" app:layout_constraintStart_toEndOf="@id/list_app_icon"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@ -38,7 +38,7 @@
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:textColor="@color/grey" android:textColor="@color/colorTextSecondary"
android:ellipsize="marquee" android:ellipsize="marquee"
app:layout_constraintStart_toEndOf="@id/list_app_icon" app:layout_constraintStart_toEndOf="@id/list_app_icon"
app:layout_constraintTop_toBottomOf="@id/list_app_title" app:layout_constraintTop_toBottomOf="@id/list_app_title"
@ -50,7 +50,7 @@
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginTop="28dp" android:layout_marginTop="28dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:textColor="@android:color/white" android:textColor="@color/colorPrimary"
android:textStyle="bold" android:textStyle="bold"
android:background="@drawable/circle_accent" android:background="@drawable/circle_accent"
android:gravity="center" android:gravity="center"

View file

@ -1,17 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/fragment_swipe_refresh" android:id="@+id/fragment_swipe_refresh"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent">
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent" android:layout_width="match_parent"
@ -21,4 +16,4 @@
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<com.android.setupwizardlib.SetupWizardLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/wizard"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/setup_wizard_generic_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="40dp" />
</com.android.setupwizardlib.SetupWizardLayout>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ProgressBar
android:id="@+id/progress"
style="@android:style/Widget.Material.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="10dp"
android:indeterminate="false"
android:max="100"/>
</FrameLayout>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/bottom_navigation_main"
android:icon="@drawable/ic_home"
android:title="@string/fragment_profile_main" />
<item
android:id="@+id/bottom_navigation_work"
android:icon="@drawable/ic_work"
android:title="@string/fragment_profile_work" />
</menu>

View file

@ -28,6 +28,10 @@
android:id="@+id/main_menu_install_app_to_profile" android:id="@+id/main_menu_install_app_to_profile"
android:title="@string/install_app_to_profile" /> android:title="@string/install_app_to_profile" />
<item
android:id="@+id/main_menu_documents_ui"
android:title="@string/documents_ui" />
<item <item
android:id="@+id/main_menu_show_all" android:id="@+id/main_menu_show_all"
android:title="@string/show_all" android:title="@string/show_all"

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_egg_background"/>
<foreground android:drawable="@mipmap/ic_launcher_egg_foreground"/>
<monochrome>
<inset
android:drawable="@drawable/ic_launcher_egg_foreground_monochrome"
android:insetLeft="26%"
android:insetTop="26%"
android:insetRight="26%"
android:insetBottom="26%" />
</monochrome>
</adaptive-icon>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_egg_background"/>
<foreground android:drawable="@mipmap/ic_launcher_egg_foreground"/>
<monochrome>
<inset
android:drawable="@drawable/ic_launcher_egg_foreground_monochrome"
android:insetLeft="26%"
android:insetTop="26%"
android:insetRight="26%"
android:insetBottom="26%" />
</monochrome>
</adaptive-icon>

View file

@ -1,70 +1,87 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="first_run_alert">أنت على وشك إعداد العازل.\n\nيعتمد هذا التطبيق على ميزة ملف العمل في أندرويد لعزل التطبيقات. إذا كنت تستخدم نسخة أندرويد معدله او مخصصه بصانع الهاتف (مثل MIUI) ، يجب عليك الآن الخروج و عدم استخدام هذا التطبيق.\n\nإذا اخترت المتابعة ، فسيقوم العازل بإعداد ملف العمل.\n\nإذا كنت مطورًا وترغب في جعل العازل يعمل على الأجهزة غير المتوافقة مثل MIUI ، فإن طلبات التعديل تكون دائمًا موضع ترحيب. المطور غير مسؤول إطلاقًا في حالة حدوث مشكله بجهازك غير متوافق.</string> <string name="first_run_alert">أنت على وشك إعداد العازل.\n\nيعتمد هذا التطبيق على ميزة ملف العمل في أندرويد لعزل التطبيقات. إذا كنت تستخدم نسخة أندرويد معدله او مخصصه بصانع الهاتف (مثل MIUI) ، يجب عليك الآن الخروج و عدم استخدام هذا التطبيق.\n\nإذا اخترت المتابعة ، فسيقوم العازل بإعداد ملف العمل.\n\nإذا كنت مطورًا وترغب في جعل العازل يعمل على الأجهزة غير المتوافقة مثل MIUI ، فإن طلبات التعديل تكون دائمًا موضع ترحيب. المطور غير مسؤول إطلاقًا في حالة حدوث مشكله بجهازك غير متوافق.</string>
<string name="first_run_alert_cancel">وداعا</string> <string name="first_run_alert_cancel">وداعًا</string>
<string name="first_run_alert_continue">اكمل</string> <string name="first_run_alert_continue">إكمال</string>
<string name="device_admin_desc">خدمة عزل التطبيقات</string> <string name="device_admin_desc">خدمة عزل التطبيقات</string>
<string name="device_admin_explanation">يحتاج العازل إلى أن يصبح مسؤول الجهاز من أجل تنفيذ مهام العزل الخاصة به.</string> <string name="device_admin_explanation">يحتاج العازل إلى أن يصبح مسؤول الجهاز من أجل تنفيذ مهام العزل الخاصة به.</string>
<string name="service_title">خدمة العزل</string> <string name="service_title">خدمة العزل</string>
<string name="service_desc">العازل يعمل الآن &#8230;</string> <string name="service_desc">العازل يعمل الآن </string>
<string name="fragment_profile_main">الرئيسيه</string> <string name="fragment_profile_main">الرئيسية</string>
<string name="fragment_profile_work">العازل</string> <string name="fragment_profile_work">العازل</string>
<string name="list_item_disabled">%s [مجمد]</string> <string name="list_item_disabled">[مجمد] %s</string>
<string name="clone_to_work_profile">انسخ الي العازل (ملف العمل)</string> <string name="clone_to_work_profile">نسخ إلى العازل (ملف العمل)</string>
<string name="clone_to_main_profile">انسخ للملف الرئيسي</string> <string name="clone_to_main_profile">نسخ للملف الرئيسي</string>
<string name="uninstall_app">الغاء التثبيت</string> <string name="uninstall_app">إلغاء التثبيت</string>
<string name="freeze_app">تجميد</string> <string name="freeze_app">تجميد</string>
<string name="unfreeze_app">الغاء التجميد</string> <string name="unfreeze_app">إلغاء التجميد</string>
<string name="launch">ابدأ</string> <string name="launch">بدأ</string>
<string name="create_unfreeze_shortcut">إنشاء اختصار لإلغاء التجميد و البدء</string> <string name="create_unfreeze_shortcut">إنشاء اختصار لإلغاء التجميد والبدء</string>
<string name="unfreeze_and_launch">إلغاء التجميد و البدء</string> <string name="unfreeze_and_launch">إلغاء التجميد والبدء</string>
<string name="auto_freeze">تجميد تلقائي</string> <string name="auto_freeze">تجميد تلقائي</string>
<string name="freeze_all">تجميد الكل</string> <string name="freeze_all">تجميد الكل</string>
<string name="create_freeze_all_shortcut">إنشاء اختصار لتجميد دفعة</string> <string name="create_freeze_all_shortcut">إنشاء اختصار لتجميد دفعة</string>
<string name="freeze_all_shortcut">تجميد</string> <string name="freeze_all_shortcut">تجميد</string>
<string name="settings">الإعدادات</string> <string name="settings">الإعدادات</string>
<string name="settings_about">حول</string> <string name="settings_about">حول</string>
<string name="settings_version">النسخه</string> <string name="settings_version">النسخة</string>
<string name="settings_source_code">كود المصدر</string> <string name="settings_source_code">كود المصدر</string>
<string name="settings_bug_report">الإبلاغ عن الأخطاء / تتبع المشاكل</string> <string name="settings_bug_report">الإبلاغ عن الأخطاء / تتبع المشاكل</string>
<string name="device_admin_toast">يجب منح إذن إدارة الجهاز لالعازل للعمل. حاول مرة اخرى.</string> <string name="device_admin_toast">يجب منح إذن إدارة الجهاز لالعازل للعمل. حاول مرة اخرى.</string>
<string name="provision_still_pending">&#8230;الرجاء الانتظار بينما نقوم بإعداد ملف عمل العازل لك </string> <string name="provision_still_pending">الرجاء الانتظار بينما نقوم بإعداد ملف عمل العازل لك </string>
<string name="provision_finished">اكتمل إعداد العازل. جاري إعادة تشغيل العازل الآن. إذا لم يبدأ العازل تلقائيًا ، يمكنك بدءه مرة أخرى.</string> <string name="provision_finished">اكتمل إعداد العازل. جاري إعادة تشغيل العازل الآن. إذا لم يبدأ العازل تلقائيًا، يمكنك بدءه مرة أخرى من مشغّلك.</string>
<string name="msg_device_unsupported">تم رفض الإذن أو جهاز غير مدعوم</string> <string name="msg_device_unsupported">تم رفض الإذن أو جهاز غير مدعوم</string>
<string name="work_profile_not_found">لم يتم العثور على ملف العمل. يرجى إعادة تشغيل التطبيق لإعادة توفير الملف الشخصي.</string> <string name="work_profile_not_found">لم يتم العثور على ملف العمل. يرجى إعادة تشغيل التطبيق لإعادة توفير الملف الشخصي.</string>
<string name="work_profile_provision_failed">لا يمكن توفير ملف العمل. يمكنك المحاولة مرة أخرى عن طريق إعادة تشغيل العازل.</string> <string name="work_profile_provision_failed">لا يمكن توفير ملف العمل. يمكنك المحاولة مرة أخرى عن طريق إعادة تشغيل العازل.</string>
<string name="work_mode_disabled">يبدو أنك قمت بتعطيل وضع العمل أثناء تشغيل العازل. إذا قمت بتفعيله الآن ، يرجى بدء العازل مرة أخرى.</string> <string name="work_mode_disabled">يبدو أنك قمت بتعطيل وضع العمل أثناء تشغيل العازل. إذا قمت بتفعيله الآن، يرجى بدء العازل مرة أخرى.</string>
<string name="clone_success">تم نسخ التطبيق \"%s\" بنجاح</string> <string name="clone_success">تم نسخ التطبيق \"%s\" بنجاح</string>
<string name="uninstall_success">تم إلغاء تثبيت التطبيق \"%s\" بنجاح</string> <string name="uninstall_success">تم إلغاء تثبيت التطبيق \"%s\" بنجاح</string>
<string name="freeze_success">تم تجميد التطبيق \"%s\" بنجاح</string> <string name="freeze_success">تم تجميد التطبيق \"%s\" بنجاح</string>
<string name="unfreeze_success">تم إلغاء تجميد التطبيق \"%s\" بنجاح</string> <string name="unfreeze_success">تم إلغاء تجميد التطبيق \"%s\" بنجاح</string>
<string name="clone_fail_system_app">لا يمكن استنساخ تطبيقات النظام إلى ملف تعريف لا يتحكم فيه العازل.</string> <string name="clone_fail_system_app">لا يمكن استنساخ تطبيقات النظام إلى ملف تعريف لا يتحكم فيه العازل.</string>
<string name="uninstall_fail_system_app">لا يمكن الغاء تثبيت تطبيقات النظام في ملف تعريف لا يتحكم فيه العازل.</string> <string name="uninstall_fail_system_app">لا يمكن إلغاء تثبيت تطبيقات النظام في ملف تعريف لا يتحكم فيه العازل.</string>
<string name="unsupported_launcher">لا يمكن إضافة اختصارات إلى منصة الإطلاق الخاصه بك. يرجى الاتصال بالمطور لمزيد من المعلومات.</string> <string name="unsupported_launcher">لم يمكن إضافة اختصارات إلى مشغّلك. يرجى الاتصال بالمطور للمزيد من المعلومات.</string>
<string name="app_context_menu_title">عمليات ل %s</string> <string name="app_context_menu_title">عمليات لـ%s</string>
<string name="freeze_all_success">تم تجميد جميع التطبيقات في قائمة \"التجميد التلقائي\" بنجاح.</string> <string name="freeze_all_success">تم تجميد جميع التطبيقات في قائمة \"التجميد التلقائي\" بنجاح.</string>
<string name="shortcut_create_success">تم انشاء الاختصار</string> <string name="shortcut_create_success">تم إنشاء اختصار لمشغلك.</string>
<string name="miui_cannot_clone">لا يمكن حاليًا استنساخ تطبيقات غير تابعة للنظام إلى ملف شخصي آخر على MIUI. الرجاء استنساخ متجر تطبيقات النظام (مثل متجر جوجل) في الملف الشخصي الآخر ثم تثبيت التطبيقات من هناك.</string> <string name="miui_cannot_clone">استنساخ تطبيقات غير تابعة للنظام إلى ملف شخصي آخر غير مدعوم حاليًّا على MIUI. الرجاء استنساخ متجر تطبيقات النظام (مثل <b>متجر جوجل بلاي</b>) في الملف الشخصي الآخر ثم تثبيت التطبيقات من هناك.</string>
<string name="camera_proxy_activity">اختر ملف الصور</string>
<string name="service_auto_freeze_title">التجميد التلقائي معلق</string> <string name="service_auto_freeze_title">التجميد التلقائي معلق</string>
<string name="service_auto_freeze_desc">سيقوم العازل تلقائيًا بتجميد التطبيقات التي تم إطلاقها من \"إلغاء التجميد و الإطلاق\" في حدث قفل الشاشة التالي.</string> <string name="service_auto_freeze_desc">سيقوم العازل بتجميد التطبيقات التي تم إطلاقها من \"إلغاء التجميد و الإطلاق\" في حدث قفل الشاشة التالي تلقائيًا.</string>
<string name="batch_operation">عملية علي دفعة</string> <string name="batch_operation">عملية على دفعة</string>
<string name="install_app_to_profile">تثبيت APK في العازل</string> <string name="install_app_to_profile">تثبيت APK في العازل</string>
<string name="install_app_to_profile_success">انتهى تركيب التطبيق في ملف العمل.</string> <string name="install_app_to_profile_success">انتهى تثبيت التطبيق في ملف العمل.</string>
<string name="settings_interaction">التفاعل</string> <string name="settings_interaction">التفاعل</string>
<string name="settings_cross_profile_file_chooser">مكوك الملفات</string> <string name="settings_cross_profile_file_chooser">مكوك الملفات</string>
<string name="settings_cross_profile_file_chooser_desc">عند التمكين ، ستتمكن من تصفح / عرض / اختيار / نسخ الملفات من العازل الي الملف الرئيسي والعكس ، عن طريق المستندات (المسماة الملفات أو المستندات الموجودة على منصة الإطلاق) أو التطبيقات التي تحتوي على دعم واجهة مستخدم المستندات (لا تحصل إلا على الوصول المؤقت إلى الملفات التي تختارها في واجهة مستخدم المستندات) ، في حين لا تزال تمتلك عزل نظام الملفات.</string> <string name="settings_cross_profile_file_chooser_desc">عند التمكين، ستتمكن من تصفح / عرض / اختيار / نسخ الملفات من العازل إلى الملف الرئيسي والعكس، عن طريق المستندات (المسماة الملفات أو المستندات الموجودة على منصة الإطلاق) أو التطبيقات التي تحتوي على دعم واجهة مستخدم المستندات (لا تحصل إلا على الوصول المؤقت إلى الملفات التي تختارها في واجهة مستخدم المستندات)، في حين لا تزال تمتلك عزل نظام الملفات.</string>
<string name="settings_camera_proxy">اختيار صورة كاميرا وهمية</string>
<string name="settings_camera_proxy_desc">قدم تطبيق كميرا مزيفًا إلى تطبيقات أخرى ، مما يسمح لك باختيار صورة عشوائية من واجهة المستندات (و مكوك الملفات إذا تم تمكينه) كصورة ملتقطة. يؤدي ذلك إلى تمكين ميزة \"نقل الملفات\" لأي تطبيق يدعم استخدام تطبيقات كاميرا أخرى لالتقاط صورة ، حتى إذا كانت لا تدعم واجهة المستندات.</string>
<string name="settings_services">خدمات</string> <string name="settings_services">خدمات</string>
<string name="settings_auto_freeze_service">خدمة التجميد التلقائي</string> <string name="settings_auto_freeze_service">خدمة التجميد التلقائي</string>
<string name="settings_auto_freeze_service_desc">عندما يتم قفل الشاشة ، قم تلقائيًا بتجميد التطبيقات التي بدأت من اختصار \"إلغاء التجميد و البدأ\".</string> <string name="settings_auto_freeze_service_desc">عندما يتم قفل الشاشة، قم تلقائيًا بتجميد التطبيقات التي بدأت من اختصار \"إلغاء التجميد والبدأ\".</string>
<string name="settings_dont_freeze_foreground">تخطي تطبيقات المفتوحه</string> <string name="settings_dont_freeze_foreground">تخطي التطبيقات المفتوحة</string>
<string name="settings_dont_freeze_foreground_desc">لا تقم بتجميد التطبيقات المفتوحه (مع نشاط مرئي) عند قفل الشاشة. يمكن أن يكون هذا مفيدًا للتطبيقات مثل مشغل الموسيقى ، ولكن ستحتاج إلى تجميدها يدويًا من خلال \"اختصار تجميد دفعة\" بعد ذلك.</string> <string name="settings_dont_freeze_foreground_desc">لا تقم بتجميد التطبيقات المفتوحة (مع نشاط مرئي) عند قفل الشاشة. يمكن أن يكون هذا مفيدًا للتطبيقات مثل مشغل الموسيقى، ولكن ستحتاج إلى تجميدها يدويًا من خلال \"اختصار تجميد دفعة\" بعد ذلك.</string>
<string name="continue_anyway">اكمل على أي حال</string> <string name="continue_anyway">إكمال على أي حال</string>
<string name="request_usage_stats">يحتاج العازل إلى إذن إحصائيات الاستخدام للقيام بذلك. الرجاء تمكين الإذن لكلي التطبيقين بعد الضغط على "موافق". سيؤدي عدم القيام بذلك إلى عدم عمل هذه الميزة بشكل صحيح.</string> <string name="request_usage_stats">يحتاج العازل إلى <b>إذن إحصائيات الاستخدام</b> للقيام بذلك. الرجاء تمكين الإذن <b>لكلي التطبيقين</b> بعد الضغط على موافق. سيؤدي عدم القيام بذلك إلى عدم عمل هذه الميزة بشكل صحيح.</string>
<string name="allow_cross_profile_widgets">السماح للأدوات في الملف الرئيسي</string> <string name="allow_cross_profile_widgets">السماح للأدوات في الملف الرئيسي</string>
<string name="show_all">إظهار كل التطبيقات</string> <string name="show_all">إظهار كل التطبيقات</string>
<string name="show_all_warning">قد يتسبب التلاعب بالتطبيقات المخفية من القائمة في حدوث أعطال وكل أنواع السلوك غير المتوقع. على الرغم من ذلك ، يمكن أن تكون هذه الميزة مفيدة عندما لا يقوم ROM المخصص بتمكين جميع تطبيقات النظام الضرورية في الملف العمل بشكل افتراضي. إذا تابعت ، فهذا علي مسؤليتك الخاصه.</string> <string name="show_all_warning">قد يتسبب التلاعب بالتطبيقات المخفية من القائمة في حدوث أعطال وكل أنواع السلوك غير المتوقع. على الرغم من ذلك، يمكن أن تكون هذه الميزة مفيدة عندما لا يقوم ROM المخصص بتمكين جميع تطبيقات النظام الضرورية في ملف العمل بشكل افتراضي. إذا تابعت، فهذا على مسؤليتك الخاصة.</string>
<string name="settings_auto_freeze_delay">تأخير التجميد التلقائي</string> <string name="settings_auto_freeze_delay">تأخير التجميد التلقائي</string>
<string name="setup_wizard_failed">فشل التثبيت</string>
<string name="app_installing">تثبيت...</string>
<string name="setup_wizard_ready">مستعد؟</string>
<string name="setup_wizard_compatibility">توافق</string>
<string name="service_auto_freeze_now">تجميد الآن</string>
<string name="setup_wizard_please_wait">من فضلك انتظر…</string>
<string name="documents_ui">فتح واجهة المستندات</string>
<string name="setup_wizard_welcome">مرحبًا بك في Shelter</string>
<string name="search">بحث</string>
<string name="settings_translate">ترجمة</string>
<string name="settings_block_contacts_searching">منع البحث عن جهات الاتصال</string>
<string name="setup_wizard_please_wait_text">نحاول تهيئة الملف الشخصي للعمل وإعداد العازل على جهازك.</string>
<string name="finish_provision_title">اضغط هنا لإنهاء إعداد العازل</string>
<string name="finish_provision_desc">تهانينا! أنا على بعد ضغطة واحدة من إنهاء إعداد العازل.</string>
<string name="launch_app_fail">لا يمكن تشغيل التطبيق %s لأنه لا واجهة مستخدم له.</string>
<string name="setup_wizard_welcome_text">Shelter هو تطبيق يساعدك على تشغيل التطبيقات الأخرى في ملف تعريف منفصل. يقوم بذلك عن طريق الاستفادة من ميزة <b>الملف الشخصي للعمل</b> في Android.
\n
\nانقر \"التالي\"، وسنوفر لك المزيد من المعلومات حول العازل، وسترشدك خلال عملية الإعداد.
\n
\nنقترح عليك قراءة جميع الصفحات التالية بعناية.</string>
</resources> </resources>

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="setup_wizard_permissions">Falemos de los permisos</string>
<string name="setup_wizard_compatibility">Compatibilidá</string>
<string name="provision_finished">Completóse la configuración de Shelter y va reaniciase. Si Shelter nun s\'anició automáticamente, pues volver llanzalu dende\'l llanzador.</string>
<string name="msg_device_unsupported">Negóse\'l permisu o\'l preséu nun ta sofitáu</string>
<string name="work_profile_not_found">Nun s\'atopó\'l perfil de trabayu. Volvi aniciar l\'aplicación pa volver fornir el perfil, por favor.</string>
<string name="work_profile_provision_failed">Nun pue fornise\'l perfil de trabayu. Pues volver tentalo reaniciando Shelter.</string>
<string name="first_run_alert_cancel">Marchar d\'equí</string>
<string name="first_run_alert_continue">Siguir</string>
<string name="device_admin_desc">Serviciu d\'aislamientu d\'aplicaciones</string>
<string name="device_admin_explanation">Shelter ha convertise n\'alministrador del preséu pa facer les xeres d\'aislamientu.</string>
<string name="setup_wizard_welcome">Afáyate en Shelter</string>
<string name="setup_wizard_welcome_text">Shelter ye una aplicación que t\'ayuda a executar aplicaciones nun perfil aisláu. Esto ye posible per duana de la carauterística <b>Perfil de trabayu</b> d\'Android.
\n
\nCalca «Siguiente» pa consiguir más información tocante a Shelter y guiate pel procesu de configuración.
\n
\nSuxerímoste que lleas con atención les páxines que vienen darréu.</string>
<string name="setup_wizard_compatibility_text">Shelter desendólcase pa y pruébase en derivaos d\'Android asemeyaos a AOSP. Estos derivaos inclúin a AOSP (Android Open Source Project), Google Android (en móviles Pixel) y <b>la mayoría de ROMs personalizaes basaes n\'AOSP</b> como LineageOS. Si esti preséu executa un deriváu d\'estos, entós ye mui probable que Shelter funcione correutamente.
\n
\nDalgunos fabricantes y ROMs personalizaes introducen cambeos invasivos nel códigu d\'Android qu\'orixinen conflictos, incompatibilidaes y comportamientos inesperaos. Sicasí, nel casu de les ROMs personalizaes, ye raro que xurdan fallos.
\n
\nShelter ye namás una interfaz pa la carauterística «Perfil de trabayu» fornida pol sistema. Si esta carauterística la forne un sistema incompatible o que nun ye estándar, <b>Shelter nun pue funcionar máxicamente</b>. Si uses una versión d\'Android modificada pol fabricante y conocida por nun ser compatible con «Perfil de trabayu», <b>sentímoslo</b>. Pues siguir si quies, mas nun hai garantíes de que Shelter se comporte correutamente baxo estes circunstancies.</string>
<string name="setup_wizard_ready">Prepárate</string>
<string name="setup_wizard_ready_text">Yá pues configurar Shelter. Asegúrate primero de que\'l preséu <b>nun</b> ta nel mou «Nun molestar» porque tienes de <b>calcar nun avisu</b> namás finar el procesu de configuración.
\n
\nCuando quieras, calca «Siguiente» pa comenzar el procesu de configuración.</string>
<string name="setup_wizard_please_wait">Espera…</string>
<string name="setup_wizard_please_wait_text">Tamos aniciando\'l perfil de trabayu y configurando Shelter nel preséu.</string>
<string name="setup_wizard_failed">La configuración falló</string>
<string name="setup_wizard_failed_text">Llamentamos informate de que nun fuimos a configurar Shelter.
\n
\nSi nun encaboxesti la configuración, entós el problema ye qu\'hai incompatibilidaes col sistema o hai conflictos ente Shelter y otros xestores del perfil de trabayu. Desafortunadamente, nun podemos facer muncho más.
\n
\nCalca «Siguiente» pa colar.</string>
<string name="setup_wizard_action_required">Cuasi acabemos</string>
<string name="setup_wizard_action_required_text">Agora habríes ver un avisu de Shelter.<b>Calca nel avisu</b> pa finar el procesu de configuración, por favor.
\n
\nSi nun ves esti avisu, asegúrate de que\'l preséu nun ta nel mou «Nun molestar» y espande\'l centru d\'avisos.
\n
\nPa reafitar Shelter y volver comenzar, pues llimpiar los datos de Shelter n\'Axustes.</string>
<string name="notifications_important">Avisu importante</string>
<string name="finish_provision_title">Calca equí pa finar la configuración de Shelter</string>
<string name="finish_provision_desc">¡Norabona! Tas a un calcu de finar la configuración de Shelter.</string>
<string name="service_title">Serviciu d\'aislamientu</string>
<string name="service_desc">Shelter ta n\'execución…</string>
<string name="service_auto_freeze_title">Desactivación automática pendiente</string>
<string name="service_auto_freeze_desc">Shelter va desactivar les aplicaciones llanzaes dende «Activar y llanzar» la próxima vegada que se bloquie la pantalla.</string>
<string name="service_auto_freeze_now">Desactivar agora</string>
<string name="app_installing">Instalando…</string>
<string name="fragment_profile_main">Perfil principal</string>
<string name="fragment_profile_work">Perfil aisláu</string>
<string name="list_item_disabled">[Desactivóse] %s</string>
<string name="batch_operation">Operación per llotes</string>
<string name="clone_to_work_profile">Clonar al perfil aisláu</string>
<string name="clone_to_main_profile">Clonar al perfil principal</string>
<string name="uninstall_app">Desinstalar</string>
<string name="freeze_app">Desactivar</string>
<string name="unfreeze_app">Activar</string>
<string name="launch">Llanzar</string>
<string name="create_unfreeze_shortcut">Crear l\'atayu d\'activar y/o llanzar</string>
<string name="unfreeze_and_launch">Activar y llanzar</string>
<string name="auto_freeze">Desactivación automática</string>
<string name="allow_cross_profile_widgets">Widgets nel perfil principal</string>
<string name="search">Buscar</string>
<string name="freeze_all">Desactivación per llotes</string>
<string name="create_freeze_all_shortcut">Crear l\'atayu de desactivación per llotes</string>
<string name="freeze_all_shortcut">Desactivación</string>
<string name="install_app_to_profile">Instalar una APK en Shelter</string>
<string name="install_app_to_profile_success">La instalación d\'aplicaciones nel perfil de trabayu finó.</string>
<string name="show_all">Amosar toles aplicaciones</string>
<string name="show_all_warning">Maricar les aplicaciones que s\'anubren pue causar casques y comportamientos inesperaos. Por embargu, esta carauterística pue ser útil cuando, por defeutu, una ROM nun activa toles aplicaciones precises nel perfil de trabayu. Si sigues, failo baxo la to responsabilidá.</string>
<string name="documents_ui">Abrir la interfaz de Documentos</string>
<string name="settings">Axustes</string>
<string name="settings_interaction">Interaición</string>
<string name="settings_cross_profile_file_chooser">Pasera de ficheros</string>
<string name="settings_cross_profile_file_chooser_desc">Al activar la opción, vas ser a restolar/ver/escoyer/copiar ficheros en Shelter dende\'l perfil principal y viceversa. NAMÁS pente la interfaz de Documentos (col nome de Ficheros o Documentos nel llanzador), o pente aplicaciones con sofitu pa la interfaz de Documentos qu\'acceden temporalmente a los ficheros qu\'escueyas nesa interfaz, ensin dexar de tar nel aislamientu del sistema de ficheros.</string>
<string name="settings_block_contacts_searching">Bloquiar la busca de contautos</string>
<string name="settings_block_contacts_searching_desc">Niega l\'accesu dende\'l perfil principal a los contautos del perfil de trabayu.</string>
<string name="settings_services">Servicios</string>
<string name="settings_auto_freeze_service">Serviciu de desactivación automática</string>
<string name="settings_auto_freeze_service_desc">Al bloquiar la pantalla, desactiva automáticamente les aplicaciones llanzaes dende l\'atayu «Desactivar y llanzar».</string>
<string name="settings_auto_freeze_delay">Retrasu de la desactivación automática</string>
<string name="settings_dont_freeze_foreground">Omitir les aplicaciones en primer planu</string>
<string name="settings_dont_freeze_foreground_desc">NUN desactiva les aplicaciones en primer planu (con actividá visible) al bloquiar la pantalla. Esto pue ser útil p\'aplicaciones como reproductores multimedia, mas dempués vas tener de desactivales pente l\'atayu de «Desactivación per llotes».</string>
<string name="settings_about">Tocante a</string>
<string name="settings_version">Versión</string>
<string name="settings_source_code">Códigu fonte</string>
<string name="settings_translate">Traducción</string>
<string name="settings_bug_report">Rastrexador de fallos</string>
<string name="work_mode_disabled">Paez que desactivesti\'l perfil de trabayu mentanto s\'aniciaba Shelter. Si actives el perfil agora, volvi aniciar Shelter.</string>
<string name="clone_success">L\'aplicación «%s» clonóse con ésitu</string>
<string name="uninstall_success">L\'aplicación «%s» desinstalóse con ésitu</string>
<string name="freeze_success">L\'aplicación «%s» desactivóse con ésitu</string>
<string name="unfreeze_success">L\'aplicación «%s» activóse con ésitu</string>
<string name="clone_fail_system_app">Nun puen clonase les aplicaciones del sistema a un perfil nel que Shellter nun tien el control.</string>
<string name="uninstall_fail_system_app">Nun puen desinstalase les aplicaciones d\'un perfil nel que Shelter nun tien el control.</string>
<string name="unsupported_launcher">Nun puen amestase atayos al llanzador. Ponte en contautu col desendolcador pa consiguir más información, por favor.</string>
<string name="app_context_menu_title">Operaciones pa %s</string>
<string name="freeze_all_success">Toles aplicaciones de la llista «Desactivación automática» desactiváronse con ésitu.</string>
<string name="shortcut_create_success">L\'atayu creóse nel llanzador.</string>
<string name="request_usage_stats">Shelter precisa\'l permisu <b>Estadístiques d\'usu</b> pa facer esto. Activa\'l permisu pa les instancies de Shelter <b>DE LOS DOS PERFILES</b> nel diálogu qu\'apaez dempués de primir «D\'acuerdu». Si nun lo faes, carauterística nun va funcionar afayadizamente.</string>
<string name="launch_app_fail">Nun pue llanzase l\'aplicación %s porque nun tien nenguna interfaz gráfica.</string>
<string name="request_storage_manager">Shelter tien d\'acceder a <b>Tolos ficheros</b> pa la pasera de ficheros. Activa\'l permisu pa les instancies de Shelter <b>DE LOS DOS PERFILES</b> nel diálogu qu\'apaez dempués de primir «D\'acuerdu».</string>
<string name="request_system_alert">Shelter tien de <b>superponese a otres aplicaciones</b> pa que la pasera de ficheros funcione correutamente. Activa\'l permisu pa les instancies de Shelter <b>DE LOS DOS PERFILES</b> nel diálogu qu\'apaez dempués de primir «D\'acuerdu». Esti permisu úsase p\'aniciar los servicios de la pasera de ficheros en segundu planu.</string>
<string name="miui_cannot_clone">Anguaño, en MIUI, nun ye posible la clonación de les aplicaciones que nun son del sistema a otru perfil. Clona la tienda d\'aplicaciones del sistema al perfil aisláu y dempués instala les aplicaciones dende ehí, por favor.</string>
<string name="continue_anyway">Siguir de toes toes</string>
<string name="setup_wizard_permissions_text">Por defeutu, Shelter nun pide nengún permisu. Por embargu, al siguir col procesu de configuración, Shelter va configurar el perfil de trabayu y convertise nel <b>xestor d\'esi perfil</b>.
\n
\nEsto concede a Shelter una llista estensa de permisos dientro del perfil, comparable al d\'un xestor del preséu, magar que aislaos nesi perfil. Ser el xestor del perfil ye un requirimientu pa la mayoría de funciones de Shelter.
\n
\nDalgunes carauterístiques de Shelter puen riquir más permisos <b>fuera</b> del perfil de trabayu. Cuando seya\'l momentu, Shelter va pidir esos permisos per separtao al activar les carauterístiques correspondientes.</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">বিদায়</string>
</resources>

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">Nashle</string>
<string name="first_run_alert_continue">Pokračovat</string>
<string name="device_admin_desc">Služba izolace aplikací</string>
<string name="device_admin_explanation">Shelter musí být správcem zařízení, aby mohl fungovat.</string>
<string name="setup_wizard_welcome">Vítejte v Shelteru</string>
<string name="setup_wizard_permissions">Pár slov o oprávněních</string>
<string name="setup_wizard_welcome_text">Shelter je aplikace, která pomáhá spouštět aplikace v izolovaném profilu. Dělá to za použití <b>Pracovního profilu</b>, který je součástí Androidu.
\n
\n
\nKlikni na \"Další\" a my ti poskytneme další informace o Shelter a provedeme tě procesem jeho nastavení.
\n
\nDoporučujeme, aby jsi si následující stránky pečlivě přečetl.</string>
<string name="setup_wizard_failed_text">Je nám líto, že pro Vás nemůžeme Shelter nastavit.
\n
\nPakliže máte již nastavený Pracovní profil, buď z předchozí instalace Shelteru, nebo jiné aplikace, budete jej muset odstranit v Nastavení -&gt; Účty předtím, než bude Shelter moci pokračovat.
\n
\nJinak, pokud jste nezrušili nastavení ručně, pak důvodem chyby je obvykle těžce upravený systém nebo rozpor mezi Shelterem a jinými správci Pracovního profilu. Bohužel, zde není nic, co s tím můžeme udělat.
\n
\nKlikněte na \"Další\" pro ukončení.</string>
<string name="setup_wizard_permissions_text">Ve výchozím stavu se Vás Shelter neptá na žádná individuální oprávnění. Nicméně, pokud budete pokračovat procesem nastavení, Shelter se pokusí nastavit Pracovní profil a proto se stane jeho <b>správcem</b>.
\n
\nTímto bude Shelteru udělen rozsáhlý seznam oprávnění v rámci tohoto profilu srovnatelný s profilem správce zařízení, i když omezený na tento profil. Bytí správcem profilu je nutné k většině funkcí Shelteru.
\n
\nNěkteré pokročilé funcke Shelteru můžou vyžadovat více oprávnění <b>mimo</b> Pracovní profil. Když budou potřeba, Shelter se na tato oprávnění zeptá samostatně, jakmile povolíte odpovídající funkce.</string>
<string name="setup_wizard_compatibility">Kompatibilita</string>
<string name="fragment_profile_work">Shelter</string>
<string name="setup_wizard_ready">Připraven?</string>
<string name="setup_wizard_ready_text">Nyní jsme připraveni pro Vás nastavit Shelter. Nejdříve se prosím ujistěte, že Vaše zařízení <b>není</b> v režimu Nerušit, protože budete muset později <b>kliknout na oznámení</b> k dokonční nastavení.
\n
\nPokud jste připraveni, klikněte na \"Další\" pro zahájení procesu nastavení.</string>
<string name="unfreeze_and_launch">Rozmrazit a spustit</string>
<string name="auto_freeze">Automatické zamrznutí</string>
<string name="allow_cross_profile_widgets">Povolit widgety v hlavním profilu</string>
<string name="setup_wizard_action_required">Je vyžadována akce</string>
<string name="notifications_important">Důležité pro Shelter</string>
<string name="finish_provision_title">Klikněte zde pro dokončení nastavení Shelteru</string>
<string name="allow_cross_profile_interaction">Povolit interakci napříč profily</string>
<string name="create_freeze_all_shortcut">Vytvořit zkratku Dávkové zmrazení</string>
<string name="settings_interaction">Interakce</string>
<string name="settings_services">Služby</string>
<string name="setup_wizard_compatibility_text">Shelter je vyvíjen a testován na AOSP Android zařízeních. To zahrnuje AOSP (Android Open Source Project), Google Android (na Pixelech), a <b>mnoho na AOSP založených open-source operačních systémech (ROM)</b> jako je LineageOS. Pokud Váš telefon běží na jednom z těchto Android derivátů zmíněných výše, pak gratuluji! Shelter bude na Vašem zařízení fungovat správně.
\n
\nNěkteří výrobci zařízení přichází s velice invazivními úpravami základního kódu Androidu, vedoucí k problémům, nekompatibilitě a neočekávanému chování. Některé vlastní ROM mohou také zavádět kompatibilitu narušující úpravy, ale většinou jsou to vzácnější případy ve srovnání s nekompatibilitami vytvořenými výrobci telefonů.
\n
\nShelter je pouze rozhraní pro Pracovní profil, jenž je funkcí poskytovanou operačním systémem. Pokud je tato funkce poskytovaná systémem rozbitá nebo nestandardní, <b>Shelter nebude moci vyřešit takový problém sám</b>. Pokud nyní používáte výrobcem upravenou verzi Androidu, o které se ví, že v ní nefungují Pracovní profily, <b>byli jste upozorněni</b>. Pokud i tak budete pokračovat, neexistuje garance, že Shelter se bude za těchto okolností chovat správně.</string>
<string name="show_all_warning">Manipulace se skrytými aplikacemi může způsobit pády a všechny druhy neočekávaného chování. Nicméně, tato funkce může být užitečná, pokud výrobcem upravená ROM nenabízí všechny systémové aplikace v pracovním profilu ve výchozím stavu. Pokračujete sami na sebe.</string>
<string name="settings_cross_profile_file_chooser_desc">Pokud je povoleno, budete moci prohlížet / zobrazovat / vybírat / kopírovat mezi Shelterem a hlavním profilem a naopak, POUZE skrze rozhraní Dokumentů (nazýváno Soubory nebo dokumenty ve vašem spouštěči) nebo aplikace s podporou rozhraní Dokumentů (získají pouze dočasný přístup k souborům v rozhraní Dokumentů), stále při zachování izolace souborového systému.</string>
<string name="settings_bug_report">Hlášení chyb / Sledování problémů</string>
<string name="batch_operation">Hromadná akce</string>
<string name="clone_to_main_profile">Naklonovat do hlavního profilu</string>
<string name="clone_to_work_profile">Naklonovat do Shelteru (Pracovního profilu)</string>
<string name="freeze_app">Zmrazit</string>
<string name="payment_stub_description">Údaj o platební službě (NEPOUŽÍVAT)</string>
<string name="setup_wizard_please_wait">Prosím čekejte…</string>
<string name="setup_wizard_please_wait_text">Snažíme se zapnout Pracovní profil a nastavit Shelter.</string>
<string name="setup_wizard_failed">Nastavení selhalo</string>
<string name="install_app_to_profile">Nainstalovat APK do Shelteru</string>
<string name="setup_wizard_action_required_text">Nyní byste měli dostat oznámení od Shelteru. <b>Klikněte na něj</b> k dokončení procesu nastavení.
\n
\nPokud žádné oznámení nevidíte, ujistěte se, že na Vašem zařízení není zapnutý režim Nerušit a zkuste stáhnou centrum oznámení.
\n
\nPokud chcete resetovat Shelter a začít od začátku, můžete odstranit data Shelteru v Nastavení.</string>
<string name="service_desc">Shelter právě běží …</string>
<string name="finish_provision_desc">Gratuluji! Jste jeden klik od dokončení nastavování Shelteru.</string>
<string name="service_title">Služba Shelteru</string>
<string name="service_auto_freeze_title">Automatické zmrazení je pozdrženo</string>
<string name="service_auto_freeze_desc">Shelter automaticky zamrazí aplikace spuštěné z \"Rozmrazit &amp; Spustit\" při dalším zamčení obrazovky.</string>
<string name="service_auto_freeze_now">Ihned zmrazit</string>
<string name="app_installing">Instaluji...</string>
<string name="fragment_profile_main">Hlavní</string>
<string name="uninstall_app">Odinstalovat</string>
<string name="unfreeze_app">Rozmrazit</string>
<string name="launch">Spustit</string>
<string name="create_unfreeze_shortcut">Vytvořit zkratku Rozmrazit a/nebo spustit</string>
<string name="search">Hledat</string>
<string name="freeze_all">Dávkové zmrazení</string>
<string name="list_item_disabled">[Zamraženo] %s</string>
<string name="freeze_all_shortcut">Zmrazit</string>
<string name="install_app_to_profile_success">Instalace aplikace v pracovním profilu dokončena.</string>
<string name="show_all">Zobrazit všechny aplikace</string>
<string name="documents_ui">Otevřít rozhraní Dokumentů</string>
<string name="settings_block_contacts_searching_desc">Zamítnout přístup z hlavního profilu ke kontaktům uvnitř pracovního profilu.</string>
<string name="settings_payment_stub">Účtenka platební služby</string>
<string name="settings">Nastavení</string>
<string name="settings_payment_stub_desc">Povolte v hlavním profilu falešnou platební službu NFC, aby byla v části Nastavení - NFC povolena. Tato možnost vám umožní vybrat platební aplikaci v pracovním profilu. Tím se obejde chyba systému Android, která znemožňuje výběr platební aplikace uvnitř pracovního profilu, pokud v hlavním profilu není žádná dostupná.</string>
<string name="settings_auto_freeze_service">Služba automatického zmrazení</string>
<string name="settings_auto_freeze_delay">Prodleva automatického zamrznutí</string>
<string name="settings_translate">Překlad</string>
<string name="provision_finished">Nastavení Shelteru je kompletní. Nyní se Shelter restartuje. Pokud se nespustí automaticky, budete jej muset znova spustit z Vašeho spouštěče.</string>
<string name="msg_device_unsupported">Oprávnění bylo zamítnuto nebo používáte nepodporované zařízení</string>
<string name="work_mode_disabled">Vypadá to, že jste vypnuli Pracovní režim během zapínání Shelteru. Pokud jste ho nyní povolili, prosím restartujte Shelter.</string>
<string name="clone_success">Aplikace \"%s\" úspěšně naklonována</string>
<string name="settings_auto_freeze_service_desc">Pokud je obrazovka uzamčena, automaticky zamrazit aplikace spuštěné ze zkratky \"Rozmrazit a Spustit\".</string>
<string name="settings_cross_profile_file_chooser">Výměna souborů</string>
<string name="uninstall_success">Aplikace \"%s\" úspěšně odinstalována</string>
<string name="uninstall_fail_system_app">Nelze odinstalovat systémové aplikace v profilu, který Shelter nemá pod kontrolou.</string>
<string name="unsupported_launcher">Není možné přidat zkratku na Váš spuštěč. Prosím kontaktuje vývojáře pro další informace.</string>
<string name="app_context_menu_title">Operace pro %s</string>
<string name="freeze_all_success">Všechny aplikace na seznamu \"Automatického zamrznutí\" byly úspěšně zamrazeny.</string>
<string name="settings_block_contacts_searching">Zamezit hledání kontaktů</string>
<string name="shortcut_create_success">Na Vašem spouštěči byl vytvořen zástupce.</string>
<string name="launch_app_fail">Není možné spustit aplikaci %s, protože nemá GUI.</string>
<string name="request_system_alert">Shelter potřebuje oprávnění <b>Zobrazit přes ostatní aplikace</b> pro správnou funkčnost Výměny souborů. Prosím, povolte jej pro <b>OBĚ DVĚ</b> (Osobní / Pracovní) aplikace Shelter zobrazené v dialogu poté, co stisknete \"Ok\". Toto oprávnění je využito pro spuštění služeb Výměny souborů na pozadí.</string>
<string name="settings_dont_freeze_foreground">Přeskočit aplikace na popředí</string>
<string name="settings_dont_freeze_foreground_desc">NEZAMRAZIT aplikace na popředí (s viditelnou aktivitou) když zamknete obrazovku. Toto může být užitečné pro aplikace jako jsou přehrávače hudby, ale budete je muset poté zamrazit prostřednictvím zkratky \"Hromadné zamrznutí\".</string>
<string name="settings_about">O aplikaci</string>
<string name="settings_version">Verze</string>
<string name="settings_source_code">Zdrojový kód</string>
<string name="continue_anyway">Přesto pokračovat</string>
<string name="work_profile_not_found">Pracovní profil nenalezen. Restartujte prosím aplikaci pro opětovné nastavení profilu.</string>
<string name="work_profile_provision_failed">Nelze zjistit pracovní profil. Můžete to zkusit znovu restartováním Shelteru.</string>
<string name="unfreeze_success">Aplikace \"%s\" úspěšně rozmrazena</string>
<string name="freeze_success">Aplikace \"%s\" úspěšně zamrazena</string>
<string name="clone_fail_system_app">Není možné naklonovat systémovou aplikaci, protože Shelter nad ní nemá kontrolu.</string>
<string name="request_usage_stats">Shelter potřebuje oprávnění <b>Statistiky využití</b> pro provedení této akce. Prosím povolte oprávnění pro <b>OBĚ DVĚ</b> aplikace Shelteru zobrazené v dialogu poté, co stisnete \"Ok\". Pokud tak neučiníte, tato funkce nebude fungovat správně.</string>
<string name="request_storage_manager">Shelter potřebuje přístup ke <b>všem souborům</b> pro funkci Výměny souborů. Prosím, udělte oprávnění pro <b>OBĚ DVĚ</b> (Osobní / Pracovní) aplikace Shelter zobrazené v dialogu poté, co stisknete \"Ok\".</string>
<string name="miui_cannot_clone">Klonování nesystémových aplikací do jiného profilu není v tuto chvíli v MIUI k dispozici. Prosím, naklonujte systémový obchod s aplikacemi (např. <b>Obchod Play</b>) do druhého profilu a aplikace instalujte z něj.</string>
</resources>

View file

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">Beenden</string>
<string name="first_run_alert_continue">Fortsetzen</string>
<string name="first_run_alert">Sie sind dabei, Shelter (dt. \"Bunker\") zu installieren.
\n
\nDiese Anwendung verwendet die Android-Funktion <b>Arbeitsprofil</b>, um Apps vom verwendeten Hauptsystem zu isolieren. Wenn sie ein Hersteller-/Custom-ROM verwenden, das nicht standardkonform ist (z. B. MIUI), sollten Sie die Installation <b>ABBRECHEN</b> und diese Anwendung <b>NICHT</b> benutzen.
\n
\nWenn Sie fortfahren, wird Shelter ein Arbeitsprofil für Sie einrichten.
\n
\nWenn Sie Entwickler sind und Shelter mit ihrem inkompatiblen ROM wie MIUI laufen soll, können Sie gern eine Anfrage stellen. Der Entwickler übernimmt <b>ABSOLUT KEINE VERANTWORTUNG</b>, wenn Sie durch Verwendung eines inkompatiblen ROMs Ihr Gerät zerstören.
\n
\nIm Laufe der Installation werden Sie eine Benachrichtigung zum Installationsabschluss erhalten, stellen Sie also sicher, dass Ihr Gerät <b>NICHT</b> im \"Bitte nicht stören\"-Modus ist.</string>
<string name="device_admin_desc">App-Isolations-Dienst</string>
<string name="device_admin_explanation">Shelter muss Geräte-Administrator werden, um Apps isolieren zu können.</string>
<string name="notifications_important">Shelter - Achtung</string>
<string name="finish_provision_title">Klicken Sie hier, um die Installation von Shelter abzuschliessen</string>
<string name="finish_provision_desc">Glückwunsch! Nur noch ein Klick und die Installation von Shelter ist abgeschlossen.</string>
<string name="service_title">Shelter-Dienst</string>
<string name="service_desc">Shelter läuft jetzt …</string>
<string name="service_auto_freeze_title">Auto-Frost ausstehend</string>
<string name="service_auto_freeze_desc">Bei der nächsten Bildschirmsperre wird Shelter die Apps automatisch einfrosten, die durch \"Auftauen &amp; Starten\" gestartet wurden.</string>
<string name="service_auto_freeze_now">Froste jetzt ein</string>
<string name="app_installing">Wird installiert...</string>
<string name="fragment_profile_main">Persönlich</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Eingefrostet] %s</string>
<string name="batch_operation">Stapelverabeitung</string>
<string name="clone_to_work_profile">Klone zu Shelter (Arbeits-Profil)</string>
<string name="clone_to_main_profile">Klone zum persönlichen Profil</string>
<string name="uninstall_app">Deinstallieren</string>
<string name="freeze_app">Einfrosten</string>
<string name="unfreeze_app">Auftauen</string>
<string name="launch">Starten</string>
<string name="create_unfreeze_shortcut">Erzeuge eine Verknüpfung für Auftauen und/oder Starten</string>
<string name="unfreeze_and_launch">Auftauen und starten</string>
<string name="auto_freeze">Auto-Frost</string>
<string name="allow_cross_profile_widgets">Erlaube Widgets im persönlichen Profil</string>
<string name="search">Suche</string>
<string name="freeze_all">Alle einfrosten</string>
<string name="create_freeze_all_shortcut">Verknüpfung zum Einfrosten aller Apps erzeugen</string>
<string name="freeze_all_shortcut">Alle Apps Einfrosten</string>
<string name="install_app_to_profile">Ein APK in Shelter installieren</string>
<string name="install_app_to_profile_success">Die Installation der App im Arbeits-Profil wurde abgeschlossen.</string>
<string name="show_all">Zeige alle Apps</string>
<string name="show_all_warning">Die Nutzung von Apps, die in der Liste ausgeblendet sind, kann zu Abstürzen und allem möglichen unerwartetem Verhalten führen. Dieses Feature kann aber nützlich sein, wenn vom Hersteller fehlerhaft angepasste ROMs nicht alle notwendigen System-Apps für das Arbeits-Profil zur Verfügung stellen. Wenn sie fortfahren, handeln Sie auf eigenes Risiko.</string>
<string name="settings">Einstellungen</string>
<string name="settings_interaction">Interaktion</string>
<string name="settings_cross_profile_file_chooser">Datei-Shuttle</string>
<string name="settings_cross_profile_file_chooser_desc">Datei-Shuttle ermöglicht den Zugriff auf Dateien des persönlichen Profils vom Arbeitsprofil und umgekehrt. Sie können Dateien durchsuchen, ansehen, auswählen und kopieren. Dazu können der systemeigene Dateimanager oder auch Apps mit Dateizugriff benutzt werden. Diese Apps erhalten lediglich temporären Zugriff auf die ausgewählten Dateien, die eigentliche Dateisystem-Isolation bleibt bestehen.</string>
<string name="settings_services">Dienste</string>
<string name="settings_auto_freeze_service">Auto-Frost Dienst</string>
<string name="settings_auto_freeze_service_desc">Bei Bildschirmsperre automatisch Apps einfrosten, die über die Verknüpfung für \"Auftauen &amp; Starten\" gestartet wurden.</string>
<string name="settings_auto_freeze_delay">Auto-Frost Verzögerung</string>
<string name="settings_dont_freeze_foreground">Apps, die im Vordergrund laufen nicht einfrosten</string>
<string name="settings_dont_freeze_foreground_desc">Apps, die im Vordergrund mit sichtbarer Aktivität laufen, NICHT bei Bildschirmsperre einfrosten. Dies kann für Apps wie Music-Player nützlich sein. Nachträglich können diese über die Verknüpfung \"Batch Freeze Shortcut\" manuell eingefrostet werden.</string>
<string name="settings_about">Über das Programm</string>
<string name="settings_version">Version</string>
<string name="settings_source_code">Quelltext</string>
<string name="settings_bug_report">Fehler melden / Probleme lösen</string>
<string name="device_admin_toast">Shelter benötigt Geräteadministrator-Rechte. Bitte versuchen sie es noch einmal.</string>
<string name="provision_still_pending">Bitte warten Sie, bis Ihr Shelter-Profil eingerichtet wurde …</string>
<string name="provision_finished">Die Einrichtung von Shelter ist abgeschlossen. Das Programm wird jetzt neu gestartet. Sollte Shelter nicht automatisch starten, rufen Sie das Programm erneut manuell über das Shelter-Symbol auf.</string>
<string name="msg_device_unsupported">Zugriff verweigert oder nicht unterstütztes Gerät</string>
<string name="work_profile_not_found">Das Arbeits-Profil wurde nicht gefunden. Bitte starten Sie die App nochmals, um das Profil erneut bereitzustellen.</string>
<string name="work_profile_provision_failed">Das Arbeits-Profil konnte nicht bereitgestellt werden. Bitte starten Sie Shelter erneut.</string>
<string name="work_mode_disabled">Anscheinend haben Sie das Arbeits-Profil vor dem Starten von Shelter abgeschaltet. Sofern Sie es jetzt eingeschaltet haben, starten Sie Shelter erneut.</string>
<string name="clone_success">Die Anwendung \"%s\" wurde erfolgreich geklont</string>
<string name="uninstall_success">Die Anwendung \"%s\" wurde erfolgreich deinstalliert</string>
<string name="freeze_success">Die Anwendung \"%s\" wurde erfolgreich eingefrostet</string>
<string name="unfreeze_success">Die Anwendung \"%s\" wurde erfolgreich aufgetaut</string>
<string name="clone_fail_system_app">Das Klonen von System-Apps in ein Profil, auf das Shelter keinen Zugriff hat ist fehlgeschlagen.</string>
<string name="uninstall_fail_system_app">Die Deinstallation von System-Apps in einem Profil, auf das Shelter keinen Zugriff hat, ist fehlgeschlagen.</string>
<string name="unsupported_launcher">Das Hinzufügen einer Verknüpfung zu Ihrem Startprogramm ist fehlgeschlagen. Bitte kontaktieren sie den Entwickler, um weitere Informationen zu erhalten.</string>
<string name="app_context_menu_title">Aktionen für %s</string>
<string name="freeze_all_success">Alle Anwendungen aus der \"Auto-Frost\" Liste wurden erfolgreich eingefrostet.</string>
<string name="shortcut_create_success">Eine Verknüpfung wurde Ihrem Startprogramm hinzugefügt.</string>
<string name="request_usage_stats">Shelter benötigt Zugriffsrechte auf <b>Nutzungs-Statistiken</b>. Bitte erteilen Sie die nötigen Zugriffsrechte für <b>BEIDE</b> Shelter Apps, die nach Klick auf \"OK\" im folgenden Dialog angezeigt werden. Bei Nichterteilung der Zugriffsrechte kann diese Programmfunktion nicht korrekt ausgeführt werden.</string>
<string name="launch_app_fail">Die Anwendung %s konnte nicht gestartet werden, das sie keine grafische Benutzeroberfläche hat.</string>
<string name="request_storage_manager">Shelter benötigt Zugriff auf <b>Alle Dateien</b> um Datei-Shuttle anbieten zu können. Bitte erteilen Sie die notwendigen Zugriffsrechte für <b>BEIDE</b> (persönliches Profil / Arbeitsprofil) Shelter-Apps, die nach dem Klick auf \"OK\" in der nachfolgenden Meldung angezeigt werden.</string>
<string name="request_system_alert">Damit der Datei-Shuttle korrekt funktioniert, muss Shelter über anderen Anwendungen eingeblendet werden können. Bitte erteilen Sie die notwendigen Zugriffsrechte für <b>BEIDE</b> (persönliches Profil / Arbeitsprofil) Shelter-Apps, die nach dem Klick auf \"OK\" in der nachfolgenden Meldung angezeigt werden. Diese Berechtigung wird genutzt, um die Datei-Shuttle-Dienste im Hintergrund zu starten.</string>
<string name="miui_cannot_clone">Das Klonen von Nicht-System-Apps in das Arbeits-Profil ist derzeit unter MIUI nicht möglich. Bitte klonen sie den App-Store Ihres Systems (z.B. <b>Play Store</b>) in ihr Arbeits-Profil und installieren sie ihre benötigten Anwendungen von dort aus.</string>
<string name="continue_anyway">Trotzdem fortsetzen</string>
<string name="settings_translate">Übersetzung</string>
<string name="documents_ui">Datei-Manager-Oberfläche</string>
<string name="settings_block_contacts_searching">Blockiere Suche nach Kontakten</string>
<string name="settings_block_contacts_searching_desc">Zugriff vom persönlichen Profil zu den Kontakten im Arbeitsprofil blockieren.</string>
<string name="setup_wizard_ready">Bereit?</string>
<string name="setup_wizard_please_wait">Bitte warten…</string>
<string name="setup_wizard_please_wait_text">Wir versuchen, das Arbeitsprofil zu initialisieren und Shelter auf deinem Gerät einzurichten.</string>
<string name="setup_wizard_failed">Einrichtung fehlgeschlagen</string>
<string name="setup_wizard_action_required">Handeln erforderlich</string>
<string name="setup_wizard_action_required_text">Du solltest nun eine Benachrichtigung von Shelter sehen. <b>Bitte tippe auf diese Benachrichtigung</b>, um den Einrichtungsprozess abzuschließen.
\n
\nWenn du die Benachrichtigung nicht siehst stelle sicher, dass dein Gerät nicht im \"Nicht stören\"-Modus ist und versuche, das Benachrichtigungspanel herunterzuziehen.
\n
\nUm Shelter zurückzusetzen und von vorne zu beginnen kannst du die Daten von Shelter in den Einstellungen löschen.</string>
<string name="setup_wizard_compatibility_text">Shelter wurde auf AOSP-ähnlichen Android-Derivaten entwickelt und getestet. Diese schließen AOSP (Android Open Source Project), Google Android (auf Pixels) sowie <b>die meisten auf AOSP basierenden open-source-Custom-ROMs</b> wie beispielsweise LineageOS ein. Wenn auf deinem Telefon eines der oben genannten Android-Derivate läuft, dann Glückwunsch! Shelter wird wahrscheinlich korrekt auf deinem Gerät funktionieren.
\n
\nEinige Geräteanbieter fügen dem Android-Basiscode sehr tiefgehende Anpassungen hinzu, welche in Konflikten, Inkompatibilität und unerwartetem Verhalten enden können. Einige Custom-ROMs fügen ebenfalls kompatibilitätshindernde Änderungen hinzu, wobei diese seltener vorzufinden sind als anbieterverursachte Inkompatibilitäten.
\n
\nShelter ist lediglich eine Schnittstelle zur Arbeitsprofil-Funktion die das System bereitstellt. Wenn diese Systemfunktion kaputt oder nicht standardisiert ist, <b>kann Shelter dieses Problem nicht auf magische Weise selbstständig beheben.</b> Wenn du momentan eine durch den Anbieter modifizierte Androidversion nutzt, die für das Kaputtmachen der Arbeitsprofilfunktion bekannt ist: <b>Du wurdest gewarnt</b>. Du kannst trotzdem fortfahren, aber es gibt keine Garantie, dass Shelter unter diesen Umständen korrekt funktioniert.</string>
<string name="setup_wizard_ready_text">Wir sind nun bereit, Shelter für dich einzurichten. Falls dein Gerät mit Android 7 oder älter läuft, stelle bitte zuerst sicher, dass sich dein Gerät <b>nicht</b> im \"Nicht stören\"-Modus befindet. Du wirst später <b>eine Benachrichtigung antippen</b> müssen, um den Einrichtungsprozess abzuschließen.
\n
\nWenn du bereit bist, tippe auf \"Weiter\", um den Einrichtungsprozess zu starten.</string>
<string name="setup_wizard_failed_text">Es tut uns leid dir mitzuteilen, dass es uns nicht gelungen ist, Shelter für dich einzurichten.
\n
\nWenn dein Gerät bereits ein Arbeitsprofil hatte, entweder von einer früheren Installation von Shelter oder von einer anderen Anwendung, musst du dieses Profil unter Einstellungen -&gt; Konto entfernen, bevor Shelter fortgesetzt werden kann.
\n
\nAndernfalls, wenn du die Einrichtung nicht selbstständig abgebrochen hast, ist der Grund für das Fehlschlagen höchstwahrscheinlich ein stark modifiziertes System oder ein Konflikt zwischen Shelter und anderen Arbeitsprofilverwaltern. Leider gibt es nicht viel, das wir diesbezüglich unternehmen können.
\n
\nTippe auf \"Weiter\" zum Beenden.</string>
<string name="setup_wizard_welcome">Willkommen bei Shelter</string>
<string name="setup_wizard_welcome_text">Shelter ist eine Anwendung, mit der du andere Anwendungen in einem isolierten Profil ausführen kannst. Dazu nutzt es die <b>Arbeitsprofil</b>-Funktion von Android.
\n
\nKlicke auf \"Weiter\", und wir werden dich mit weiteren Informationen über Shelter versorgen und dich durch den Einrichtungsprozess führen.
\n
\nWir empfehlen dir, alle folgenden Seiten sorgfältig durchzulesen.</string>
<string name="setup_wizard_permissions_text">Standardmäßig wird Shelter nicht nach einzelnen Berechtigungen fragen. Allerdings wird Shelter, nachdem du den Einrichtungsprozess beginnst, versuchen ein Arbeitsprofil einzurichten und wird infolgedessen <b>Profilverwalter</b> dieses Profils.
\n
\nDies gibt Shelter eine umfangreiche Liste an Berechtigungen innerhalb des Profils, vergleichbar mit denen eines Geräteadministrators, allerdings beschränkt auf das Profil. Profilverwalter zu sein ist für die meisten Funktionen von Shelter zwingend nötig.
\n
\nEinige erweiterte Funktionen von Shelter benötigen eventuell mehr Berechtigungen <b>außerhalb</b> des Arbeitsprofils. Shelter wird beim Aktivieren der entsprechenden Funktionen separat nach diesen Berechtigungen fragen, sofern nötig.</string>
<string name="setup_wizard_compatibility">Kompatibilität</string>
<string name="setup_wizard_permissions">Ein Wort zu den Berechtigungen</string>
<string name="allow_cross_profile_interaction">Profilübergreifende Interaktion erlauben</string>
<string name="payment_stub_description">Zahlungsdienst Platzhalter (NICHT VERWENDEN)</string>
<string name="settings_payment_stub">Zahlungsdienst-Platzhalter</string>
<string name="settings_payment_stub_desc">Richten Sie einen unechten NFC Zahlungsdienst im Hauptprofil ein, so dass die kontaktlosen Zahlungsoptionen unter Einstellungen - NFC aktiviert werden. So kann ein Zahlungsanbieter im Arbeitsprofil eingerichtet und gewählt werden. Damit wird ein Fehler in Android umgangen, der es unmöglich macht, im Arbeitsprofil einen Zahlungsanbieter auszuwählen, wenn kein Zahlungsdienst im Hauptprofil verfügbar ist.</string>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="clone_to_main_profile">Κλωνοποίηση στο Κύριο Προφίλ</string>
<string name="uninstall_app">Απεγκατάσταση</string>
<string name="unfreeze_app">Ξεπάγωσε</string>
<string name="launch">Εκκίνηση</string>
<string name="batch_operation">Ομαδική εκτέλεση</string>
<string name="unfreeze_and_launch">Ξεπάγωσε και τρέξε</string>
<string name="allow_cross_profile_widgets">Επίτρεψε γραφικά στοιχεία (widgets) στο Κύριο Προφίλ</string>
<string name="search">Αναζήτηση</string>
<string name="freeze_all">Πάγωσε ομαδικά</string>
<string name="freeze_all_shortcut">Πάγωσε</string>
<string name="install_app_to_profile">Εγκατάσταση APK (αρχείου εφαρμογής) στο Shelter</string>
<string name="show_all">Εμφάνιση όλων των εφαρμογών</string>
<string name="documents_ui">Άνοιξε το Περιβάλλον Διαχείρισης Αρχείων (Documents UI)</string>
<string name="settings">Ρυθμίσεις</string>
<string name="settings_interaction">Αλληλεπίδραση</string>
<string name="settings_block_contacts_searching">Αποκλεισμός αναζήτησης εφαρμογών</string>
<string name="settings_services">Υπηρεσίες</string>
<string name="settings_auto_freeze_service">Υπηρεσία αυτόματου παγώματος εφαρμογών</string>
<string name="settings_cross_profile_file_chooser">Ευέλικτη Διαχείριση Αρχείων</string>
<string name="settings_auto_freeze_delay">Καθυστέρηση αυτόματου παγώματος</string>
<string name="settings_dont_freeze_foreground">Παράβλεψη εφαρμογών που βρίσκονται στο προσκήνιο</string>
<string name="settings_about">Σχετικά με την εφαρμογή</string>
<string name="settings_version">Έκδοση</string>
<string name="settings_source_code">Πηγαίος κώδικας</string>
<string name="settings_translate">Μετάφραση</string>
<string name="msg_device_unsupported">Άρνηση αδειοδότησης ή μη υποστηριζόμενη συσκευή</string>
<string name="work_profile_provision_failed">Αποτυχία φόρτωσης του Προφίλ Εργασίας. Προσπάθησε ξανά επανεκκινώντας το Shelter.</string>
<string name="clone_success">Η εφαρμογή \"%s\" κλωνοποιήθηκε επιτυχώς</string>
<string name="uninstall_success">Η εφαρμογή \"%s\" απεγκαταστάθηκε επιτυχώς</string>
<string name="freeze_success">Η εφαρμογή \"%s\" πάγωσε επιτυχώς</string>
<string name="unfreeze_success">Η εφαρμογή \"%s\" ξεπάγωσε επιτυχώς</string>
<string name="uninstall_fail_system_app">Αδυναμία απεγκατάστασης εφαρμογών συστήματος από ένα προφίλ που δεν ελέγχεται από το Shelter.</string>
<string name="freeze_all_success">Όλες οι εφαρμογές στη λίστα \"Πάγωσε Αυτόματα\" έχουν παγώσει επιτυχώς.</string>
<string name="shortcut_create_success">Επιτυχής δημιουργία συντόμευσης.</string>
<string name="app_context_menu_title">Διεργασίες για την εφαρμογή %s</string>
<string name="continue_anyway">Συνέχισε παρόλα αυτά</string>
<string name="miui_cannot_clone">Η κλωνοποίηση εφαρμογών χρήστη μεταξύ των Προφίλ είναι προς το παρόν αδύνατη στο MIUI. Μια πιθανή λύση σε αυτό το πρόβλημα είναι η κλωνοποίηση του καταστήματος εφαρμογών του συστήματος (πχ. <b>Play Store, Fdroid</b>) στο Προφίλ Εργασίας και η εγκατάσταση εφαρμογών από εκεί.</string>
<string name="device_admin_explanation">Το Shelter χρειάζεται να οριστεί ως Διαχειριστής Συσκευής ώστε να εκτελέσει τις υπηρεσίες απομόνωσης.</string>
<string name="settings_auto_freeze_service_desc">Όταν η οθόνη είναι κλειδωμένη, πάγωσε αυτόματα εφαρμογές που έχουν εκκινηθεί από τη συντόμευση \"Ξεπάγωσε και τρέξε\".</string>
<string name="setup_wizard_welcome_text">To Shelter είναι μια εφαρμογή που δίνει τη δυνατότητα να τρέξουν άλλες εφαρμογές μέσα σε ένα απομονωμένο προφίλ. Αυτό επιτυγχάνεται μέσω της χρήσης του <b>Προφίλ Εργασίας</b> , που αποτελεί μια δυνατότητα του Android.
\n
\nΠάτησε στο \"Επόμενο\" για να διαβάσεις περισσότερες πληροφορίες σχετικά με το Shelter και για να σε καθοδηγήσουμε κατά την διαδικασία ενεργοποίησής του.
\n
\nΠροτείνουμε να διαβάσεις τις πληροφορίες που ακολουθούν προσεκτικά.</string>
<string name="settings_dont_freeze_foreground_desc">Παράβλεψη παγώματος εφαρμογών που βρίσκονται στο προσκήνιο (με εμφανή δραστηριότητα) όταν κλειδώνει η οθόνη. Αυτό μπορεί να φανεί χρήσιμο για εφαρμογές όπως εφαρμογές αναπαραγωγής μουσικής, αλλά θα χρειαστεί αυτές να παγώσουν ενεργά μέσω της συντόμευσης \"Πάγωσε Αυτόματα\" σε δεύτερο χρόνο.</string>
<string name="setup_wizard_ready">Έτοιμος/η;</string>
<string name="settings_bug_report">Αναφορά προβλήματος (bug) / Παρακολούθηση προβλημάτων</string>
<string name="request_system_alert">Το Shelter χρειάζεται την άδεια <b>Εμφάνιση πάνω σε άλλες εφαρμογές</b> για τη σωστή λειτουργία της δυνατότητας \"Έξυπνη Διαχείριση Αρχείων\". Ενεργοποίησε την άδεια <b>και για τις δύο</b> εφαρμογές Shelter που θα εμφανιστούν στην επόμενη οθόνη, αφού πατήσεις \"ΟΚ\". Η άδεια αυτή χρειάζεται για τη δυνατότητα χρήσης της δυνατότητας \"Έξυπνη Διαχείριση Αρχείων\" στο παρασκήνιο.</string>
<string name="setup_wizard_please_wait">Λίγη υπομονή…</string>
<string name="setup_wizard_please_wait_text">Προσπάθεια ενεργοποίησης του Προφίλ Εργασίας και παραμετροποίησης του Shelter στη συσκευή.</string>
<string name="provision_finished">Η παραμετροποίηση του Shelter ολοκληρώθηκε. Πραγματοποιείται επανεκκίνηση του Shelter. Αν το Shelter δεν ξεκίνησε αυτόματα, μπορείς να το εκκινήσεις ξανά από το μενού εφαρμογών της συσκευής.</string>
<string name="work_profile_not_found">Το Προφίλ Εργασίας δεν βρέθηκε. Επανεκκίνησε την εφαρμογή για προσπάθεια επαναφόρτωσής του.</string>
<string name="work_mode_disabled">Φαίνεται ότι το Προφίλ Εργασίας ήταν απενεργοποιημένο κατά την εκκίνηση του Shelter. Εάν τώρα το έχεις ενεργοποιήσει, ξεκίνησε ξανά το Shelter.</string>
<string name="clone_fail_system_app">Αδυναμία κλωνοποίησης εφαρμογών συστήματος σε ένα Προφίλ που δεν ελέγχεται από το Shelter.</string>
<string name="unsupported_launcher">Αδυναμία δημιουργίας συντομεύσεων. Επικοινώνησε με τον προγραμματιστή του Shelter για περισσότερες πληροφορίες.</string>
<string name="launch_app_fail">Αδυναμία εκκίνησης της εφαρμογής %s λόγω του ότι δεν υποστηρίζει γραφικό περιβάλλον (GUI).</string>
<string name="setup_wizard_action_required_text">Λογικά, πρέπει τώρα να βλέπεις μια ειδοποίηση από το Shelter. <b>Χρειάζεται να επιλέξεις αυτή την ειδοποίηση</b> ώστε να ολοκληρωθεί η διαδικασία ενεργοποίησης.
\n
\nΑν δεν βλέπεις την ειδοποίηση, βεβαιώσου πως η συσκευή σου δεν είναι σε λειτουργία \"Μην ενοχλείτε\" και προσπαθήστε να τραβήξετε προς τα κάτω τη μπάρα ειδοποιήσεων.
\n
\nΓια να επαναφέρεις το Shelter στην αρχική κατάσταση και να ξεκινήσεις από την αρχή, μπορείς να καθαρίσεις τα δεδομένα του από το μενού ρυθμίσεων της συσκευής.</string>
<string name="setup_wizard_compatibility_text">Το Shelter έχει αναπτυχθεί και δοκιμαστεί σε συστήματα παράγωγα του Android. Αυτό περιλαμβάνει το AOSP (Android Open Source Project), το Google Android (πχ. Σε συσκευές Pixel) και <b> τα περισσότερα λειτουργικά συστήματα (ROM) ανοιχτού κώδικα που βασίζονται σε AOSP</b>, όπως το LineageOS. Εάν το τηλέφωνό σας χρησιμοποιεί ένα από τα παράγωγα Android που αναφέρονται παραπάνω, τότε συγχαρητήρια! Το Shelter πιθανότατα θα λειτουργήσει σωστά στη συσκευή σας.
\n
\nΟρισμένοι κατασκευαστές συσκευών πραγματοποιούν πολύ επεμβατικές προσαρμογές στον κώδικα του Android, με αποτέλεσμα ασυμβατότητα με κάποιες εφαρμογές και απροσδόκητη συμπεριφορά. Ορισμένες προσαρμοσμένες ROM μπορεί επίσης να περιέχουν αλλαγές που μειώνουν τη συμβατότητα, αλλά γενικά αυτές είναι πιο σπάνιες σε σχέση με τις ασυμβατότητες που εισάγουν οι κατασκευαστές συσκευών.
\n
\nΤο Shelter αποτελεί απλώς έναν μεσολαβητή που έχει το ρόλο διαχειριστή της λειτουργίας Προφίλ Εργασίας που παρέχεται από το σύστημα. Εάν η δυνατότητα αυτή, που παρέχεται από το σύστημα, δεν λειτουργεί σωστά ή είναι εφαρμοσμένη με ασυνήθιστο τρόπο, το <b>Το Shelter δεν μπορεί να επιλύσει το πρόβλημα αυτό από μόνο του</b>. Εάν αυτήν τη στιγμή χρησιμοποιείς μια έκδοση Android που έχει τροποποιηθεί από τον προμηθευτή ώστε να εμποδίζει τη χρήση του Προφίλ Εργασίας, <b>θεωρούμε πως έχεις προειδοποιηθεί</b>. Μπορείς φυσικά να δοκιμάσεις να συνεχίσεις, αλλά δεν υπάρχει καμία εγγύηση ότι το Shelter θα λειτουργήσει σωστά υπό αυτές τις συνθήκες.</string>
<string name="setup_wizard_ready_text">Είμαστε έτοιμοι να ενεργοποιήσουμε το Shelter μαζί σου. Βεβαιώσου πρώτα πως η συσκευή σου <b>δεν</b> είναι σε λειτουργία \"Μην ενοχλείτε\", επειδή θα χρειαστεί να <b>πατήσεις σε μια ειδοποίηση</b> που θα εμφανιστεί, ώστε να ολοκληρωθεί η διαδικασία παραμετροποίησης.
\n
\nΌταν είσαι έτοιμος/η, πάτησε στο \"Επόμενο\", ώστε να ξεκινήσει η διαδικασία παραμετροποίησης.</string>
<string name="setup_wizard_failed_text">Δυστυχώς δεν ήταν δυνατό να ενεργοποιηθεί το Shelter στη συσκευή σου
\n
\nΑν η συσκευή σου έχει ήδη ένα ενεργοποιημένο Προφίλ Εργασίας, είτε από προηγούμενη εγκατάσταση του Shelter είτε από κάποια άλλη εφαρμογή, χρειάζεται αυτό να διαγραφεί από το μενού Ρυθμίσεις-&gt;Λογαριασμοί, ώστε το Shelter να μπορέσει να συνεχίσει.
\n
\nΑλλιώς, αν δεν ακύρωσες τη διαδικασία ο ίδιος/η ίδια, τότε η αποτυχία ενεργοποίησης συνήθως σχετίζεται με την ύπαρξη ενός ιδιαίτερα τροποποιημένου συστήματος ή μιας ασυμβατότητας μεταξύ του Shelter και άλλων εφαρμογών-διαχειριστών του Προφίλ Εργασίας. Δυστυχώς δεν υπάρχει κάποια συγκεκριμένη λύση γι\' αυτό.
\n
\nΠάτησε \"Επόμενο\" για έξοδο.</string>
<string name="settings_cross_profile_file_chooser_desc">Όταν είναι ενεργό, παρέχεται η δυνατότητα πρόσβασης/προβολής/επιλογής/αντιγραφής αρχείων του Προφίλ Εργασίας από το Κύριο Προφίλ και αντίστροφα Αυτό επιτυγχάνεται μέσω της λειτουργίας \"Documents UI\" (παρέχεται από την εφαρμογή \"Αρχεία\" ή \"Έγγραφα\" της συσκευής) ή μέσω εφαρμογών που υποστηρίζουν τη λειτουργία \"Documents UI\", ενώ παράλληλα διατηρείται η απομόνωση του συστήματος αρχείων μεταξύ των Προφίλ. Οι εφαρμογές που χρησιμοποιούνται για αυτή τη λειτουργία αποκτούν μόνο προσωρινή πρόσβαση στα αρχεία που επιλέγονται μέσω της λειτουργίας \"Documents UI\".</string>
<string name="clone_to_work_profile">Κλωνοποίηση στο Shelter (Προφίλ Εργασίας)</string>
<string name="freeze_app">Πάγωσε</string>
<string name="create_unfreeze_shortcut">Δημιούργησε συντόμευση \"Ξεπάγωσε και/ή τρέξε\"</string>
<string name="auto_freeze">Πάγωσε αυτόματα</string>
<string name="request_usage_stats">Το Shelter χρειάζεται την άδεια <b>Usage Stats</b> για την πραγματοποίηση αυτής της ενέργειας. Ενεργοποίησε την άδεια <b>και για τις δύο</b> εφαρμογές Shelter που θα εμφανιστούν στην επόμενη οθόνη, αφού πατήσεις \"ΟΚ\". Αν αυτό δεν πραγματοποιηθεί, ενδέχεται η εφαρμογή να μην λειτουργήσει σωστά.</string>
<string name="create_freeze_all_shortcut">Δημιουργία συντόμευσης \"Πάγωσε ομαδικά\"</string>
<string name="install_app_to_profile_success">Η εγκατάσταση εφαρμογής στο Προφίλ Εργασίας ολοκληρώθηκε.</string>
<string name="show_all_warning">Η τροποποίηση εφαρμογών που είναι κρυμμένες από τη λίστα μπορεί να προκαλέσει διαφόρων ειδών προβλήματα. Ωστόσο, αυτή η δυνατότητα μπορεί να είναι χρήσιμη όταν λειτουργικά συστήματα (ROMs) που είναι τροποποιημένα από τον κατασκευαστή δεν ενεργοποιούν αυτόματα όλες τις απαραίτητες εφαρμογές συστήματος στο Προφίλ Εργασίας. Είσαι μόνος σου σε αυτό, αν επιλέξεις να συνεχίσεις.</string>
<string name="settings_block_contacts_searching_desc">Άρνηση πρόσβασης από το Κύριο Προφίλ στις επαφές του Προφίλ Εργασίας.</string>
<string name="request_storage_manager">Το Shelter χρειάζεται πρόσβαση σε <b>όλα τα αρχεία</b> για τη χρήση της λειτουργίας \"Ευέλικτη διαχείριση αρχείων\". Ενεργοποίησε την άδεια <b>και για τις δύο</b> εφαρμογές Shelter που θα εμφανιστούν στην επόμενη οθόνη, αφού πατήσεις \"ΟΚ\".</string>
<string name="first_run_alert_cancel">Αντίο</string>
<string name="first_run_alert_continue">Συνέχεια</string>
<string name="device_admin_desc">Υπηρεσία απομόνωσης εφαρμογών</string>
<string name="setup_wizard_welcome">Καλώς όρισες στο Shelter</string>
<string name="setup_wizard_permissions">Λίγα λόγια σχετικά με τα δικαιώματα της εφαρμογής</string>
<string name="setup_wizard_compatibility">Συμβατότητα</string>
<string name="setup_wizard_permissions_text">Από προεπιλογή, το Shelter δεν θα ζητήσει μεμονωμένες άδειες. Ωστόσο, μόλις προχωρήσετε στη διαδικασία ρύθμισης, το Shelter θα προσπαθήσει να δημιουργήσει ένα προφίλ εργασίας και ως εκ τούτου να γίνει ο <b>διαχειριστής προφίλ</b> του εν λόγω προφίλ.
\n
\nΑυτό θα παραχωρήσει στο Shelter μια εκτενή λίστα αδειών εντός του προφίλ, συγκρίσιμη με αυτή ενός Διαχειριστή συσκευής, αν και περιορίζεται στο προφίλ. Το να είnαι διαχειριστής προφίλ είναι απαραίτητο για το μεγαλύτερο μέρος της λειτουργικότητας του Shelter.
\n
\nΟρισμένες προηγμένες λειτουργίες του Shelter ενδέχεται να απαιτούν περισσότερες άδειες <b>εκτός</b> του προφίλ εργασίας. Όταν χρειάζεται, το Shelter θα ζητήσει ξεχωριστά αυτά τα δικαιώματα όταν ενεργοποιήσετε τις αντίστοιχες δυνατότητες.</string>
<string name="setup_wizard_failed">Αποτυχία ενεργοποίησης</string>
<string name="setup_wizard_action_required">Απαιτείται ενέργεια</string>
<string name="notifications_important">Σημαντικό για το Shelter</string>
<string name="finish_provision_title">Πάτησε εδώ για να ολοκληρώσεις την ενεργοποίηση του Shelter</string>
<string name="finish_provision_desc">Συγχαρητήρια! Είσαι μόνο ένα κλικ μακριά από την ολοκλήρωση ενεργοποίησης του Shelter.</string>
<string name="service_title">Υπηρεσία του Shelter</string>
<string name="service_desc">Το Shelter είναι σε λειτουργία…</string>
<string name="service_auto_freeze_title">Αναμονή αυτόματου παγώματος εφαρμογών</string>
<string name="service_auto_freeze_now">Πάγωσε τώρα</string>
<string name="app_installing">Εγκατάσταση...</string>
<string name="fragment_profile_main">Κύριο</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Παγωμένο] %s</string>
<string name="service_auto_freeze_desc">Το Shelter θα παγώσει αυτόματα εφαρμογές που εκκινούνται με την επιλογή \"Ξεπάγωσε και τρέξε\" την επόμενη φορά που θα κλειδώσει η οθόνη της συσκευής.</string>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="service_title">Servicio Shelter</string>
<string name="service_desc">Shelter se esta ejecutando actualmente…</string>
<string name="service_auto_freeze_title">Suspensión automática pendiente</string>
<string name="first_run_alert_cancel">Adiós</string>
<string name="first_run_alert_continue">Continuar</string>
<string name="device_admin_desc">Servicio de aislamiento de aplicaciones</string>
<string name="device_admin_explanation">Shelter necesita convertirse en el administrador del dispositivo para realizar tareas de aislamiento.</string>
<string name="notifications_important">Importante</string>
<string name="finish_provision_title">Haz click aquí para finalizar la configuración de Shelter</string>
<string name="show_all_warning">Manipular aplicaciones ocultas en la lista podría causar fallos y toda clase de comportamientos inesperados. Sin embargo, esta característica podría ser de utilidad cuando las ROMs personalizadas del fabricante no habilitan todas las aplicaciones del sistema necesarias dentro del perfil de trabajo por defecto. Si continuas, estas por tu cuenta.</string>
<string name="documents_ui">Abrir interfaz de documentos</string>
<string name="settings">Configuraciones</string>
<string name="settings_interaction">Interacción</string>
<string name="settings_cross_profile_file_chooser">Pasarela de archivos</string>
<string name="finish_provision_desc">Felicitaciones! Se encuentra a un click de terminar la configuración de Shelter.</string>
<string name="provision_finished">Configuración de Shelter completa. Reiniciando Shelter a continuación. Si Shelter no se inicia de manera automática puedes iniciarlo nuevamente desde tu lanzador de aplicaciones.</string>
<string name="msg_device_unsupported">Permiso denegado o dispositivo no soportado</string>
<string name="work_profile_not_found">Perfil de trabajo no encontrado. Por favor reinicia la aplicación para aprovisionar el perfil.</string>
<string name="work_profile_provision_failed">No se puede proveer un perfil de trabajo. Puedes intentar de nuevo reiniciando Shelter.</string>
<string name="work_mode_disabled">Parece que has deshabilitado el modo de trabajo mientras Shelter se reiniciaba. Si lo has habilitado ahora, por favor reinicia Shelter de nuevo.</string>
<string name="clone_success">Aplicación \"%s\" clonada exitosamente</string>
<string name="uninstall_success">Aplicación \"%s\" desinstalada exitosamente</string>
<string name="freeze_success">Aplicación \"%s\" suspendida exitosamente</string>
<string name="unfreeze_success">Aplicación \"%s\" reiniciada exitosamente</string>
<string name="service_auto_freeze_desc">Shelter va a suspender de manera automática las aplicaciones iniciadas con \"Descongelar e iniciar\" en el siguiente bloqueo de pantalla.</string>
<string name="clone_fail_system_app">No se pueden clonar aplicaciones del sistema a un perfil del cual Shelter no tiene el control.</string>
<string name="freeze_all_success">Todas las aplicaciones en la lista de \"suspensión automática\" han sido suspendidas exitosamente.</string>
<string name="miui_cannot_clone">Clonar aplicaciones que no son del sistema a otro perfil actualmente no es posible en MIUI. Por favor clona la tienda de aplicaciones del sistema (ej: <b>Play Store</b>) dentro del otro perfil e instala aplicaciones desde ahí.</string>
<string name="setup_wizard_permissions_text">Por defecto, Shelter no te solicitará permisos individuales. Sin embargo, una vez que procedas con el proceso de instalación, Shelter tratara de configurar un perfil de trabajo y por lo tanto se convertirá en <b>administrador de dicho perfil</b>.
\n
\nEsto proporcionara a Shelter una lista extensa de permisos dentro del perfil, comparables a los del administrador del dispositivo, aunque confinado al perfil. Ser el administrador de perfil es necesario para la mayoría de la funcionalidad de Shelter.
\n
\nAlgunas características avanzadas de Shelter podrían requerir mas permisos <b>fuera</b> del perfil de trabajo. Cuando sean necesarios, Shelter te solicitara esos permisos de manera individual cuando habilites tales características.</string>
<string name="setup_wizard_compatibility_text">Shelter es desarrollado y probado en derivados de Android AOSP. Esto incluye AOSP (Android Open Source Project), Google Android (en Pixel) y <b> la mayoría de las ROMs basadas en Android AOSP</b> como LineageOS. Si tu dispositivo esta ejecutando alguno de los derivados de Android listados anteriormente, ¡felicitaciones! Shelter probablemente funcionara correctamente en tu dispositivo.
\n
\nAlgunos fabricantes de dispositivos introducen personalizaciones demasiado invasivas dentro del código fuente de Android lo cual resulta en conflictos, incompatibilidades y comportamientos inesperados. Algunas ROMs personalizadas también pueden introducir cambios que rompen con la compatibilidad pero generalmente son raros en comparación con las incompatibilidades introducidas por los fabricantes.
\n
\nShelter es únicamente una interfaz a la característica del perfil de trabajo provista por el sistema. Si la característica provista por el sistema esta dañada o no es estándar <b>Shelter no puede resolver el problema mágicamente por sí mismo</b>. Si actualmente estas usando una versión de Android modificada por el fabricante de la cual se sabe que incumple con los perfiles de trabajo <b>has sido advertido</b>. Puedes proceder de todos modos, pero no hay garantía de que Shelter se comporte de manera adecuada bajo esas circunstancias.</string>
<string name="uninstall_fail_system_app">No se pueden desinstalar aplicaciones del sistema en un perfil del cual Shelter no tiene control.</string>
<string name="unsupported_launcher">No se pueden agregar accesos directos a tu lanzador de aplicaciones. Por favor contacta al desarrollador para mas información.</string>
<string name="app_context_menu_title">Operaciones para \"%s\"</string>
<string name="setup_wizard_please_wait">Por favor espera…</string>
<string name="setup_wizard_please_wait_text">Estamos tratando de inicializar el perfil de trabajo y configurar Shelter en tu dispositivo.</string>
<string name="setup_wizard_failed">La configuración falló</string>
<string name="setup_wizard_ready_text">Ahora estamos listos para configurar Shelter para ti. Por favor primero asegurate de que tu dispositivo <b>no</b> se encuentra en modo no molestar debido a que necesitaras <b> hacer click en una notificación</b> mas tarde para finalizar el proceso de instalación.
\n
\nCuando estés listo, haz click en \"Siguiente\" para iniciar el proceso de instalación.</string>
<string name="setup_wizard_failed_text">Lamentamos informarte que no fuimos capaces de configurar Shelter para ti.
\n
\nSi tu dispositivo ya tenía un perfil de trabajo, ya sea de una instalación previa de Shelter o de otra aplicación, deberás eliminar ese perfil en Ajustes -&gt; Cuentas antes de que Shelter pueda proceder.
\n
\nDe lo contrario, si no cancelaste la instalación de manera manual, entonces una de las razones del fallo es comúnmente debido a un sistema fuertemente modificado o a un conflicto entre Shelter y otros administradores del perfil de trabajo. Desafortunadamente, no hay mucho que podamos hacer sobre esto.
\n
\nHaz click en Siguiente para Salir.</string>
<string name="setup_wizard_action_required">Acción requerida</string>
<string name="setup_wizard_action_required_text">Ahora debieras estar viendo la notificación de Shelter. <b> Por favor haz click en esa notificación</b> para finalizar el proceso de configuración.
\n
\nSi no ves la notificación, asegúrate de que tu dispositivo no esta en modo No molestar y trata de abrir el centro de notificaciones.
\n
\nPara reiniciar Shelter e iniciar de nuevo, puedes limpiar los datos de Shelter en la configuración.</string>
<string name="service_auto_freeze_now">Suspender ahora</string>
<string name="app_installing">Instalando...</string>
<string name="fragment_profile_main">Principal</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Suspendida]%s</string>
<string name="batch_operation">Operación en lote</string>
<string name="clone_to_work_profile">Clonar a Shelter (perfil de trabajo)</string>
<string name="clone_to_main_profile">Clonar al perfil principal</string>
<string name="uninstall_app">Desinstalar</string>
<string name="freeze_app">Suspender</string>
<string name="unfreeze_app">Reanudar</string>
<string name="launch">Iniciar</string>
<string name="create_unfreeze_shortcut">Crear un acceso directo para suspender y/o iniciar</string>
<string name="unfreeze_and_launch">Reanudar e iniciar</string>
<string name="auto_freeze">Auto suspender</string>
<string name="allow_cross_profile_widgets">Permitir Widgets en el perfil principal</string>
<string name="settings_cross_profile_file_chooser_desc">Cuando esta habilitado, seras capaz de buscar / ver / seleccionar / copiar archivos dentro de Shelter del perfil principal y viceversa. Únicamente a través de la interfaz de documentos (llamada Archivos o Documentos en tu lanzador de aplicaciones) o aplicaciones con soporte para interfaz de archivos (únicamente obtienen acceso temporal a los archivos que escogiste en la interfaz de documentos), mientras aun pertenecen al sistema de archivos aislado.</string>
<string name="settings_block_contacts_searching">Bloquear búsqueda de contactos</string>
<string name="settings_block_contacts_searching_desc">Denegar acceso del perfil principal a los contactos dentro del perfil de trabajo.</string>
<string name="settings_services">Servicios</string>
<string name="settings_auto_freeze_delay">Retraso de la suspensión automática</string>
<string name="settings_dont_freeze_foreground_desc">NO suspendas aplicaciones en el fondo (con actividad visible) cuando bloquees la pantalla. Esto puede ser útil para aplicaciones como reproductores de música, pero vas a necesitar suspenderlas a través de \"Acceso directo a suspensión por lote\" más tarde.</string>
<string name="settings_version">Versión</string>
<string name="settings_source_code">Código fuente</string>
<string name="settings_translate">Traducir</string>
<string name="settings_bug_report">Reporte de errores/ Seguimiento de problemas</string>
<string name="shortcut_create_success">Acceso directo creado en tu lanzador de aplicaciones.</string>
<string name="request_usage_stats">Shelter necesita el permiso <b> Estadísticas de uso</b> para hacer esto. Por favor habilita el permiso para <b>AMBAS</b> de las aplicaciones Shelter mostradas en la ventana siguiente a que presiones \"Ok\". No hacerlo causara que esta característica no funcione adecuadamente.</string>
<string name="launch_app_fail">No se puede lanzar la aplicación %s por que no tiene interfaz gráfica.</string>
<string name="request_storage_manager">Shelter necesita acceder a <b>Todos los archivos</b> para el selector de archivos. Por favor habilita el permiso para <b>AMBAS</b> aplicaciones Shelter (Personal / Trabajo) en la ventana siguiente al presionar \"Ok\".</string>
<string name="request_system_alert">Shelter necesita <b>Mostrarse sobre otras aplicaciones</b> para que la función de pasarela de archivos funciones correctamente. Por favor habilita el permiso para <b>AMBAS</b> aplicaciones Shelter mostradas en la ventana después de que hagas click en \"Ok\". Este permiso es usado para iniciar el servicio de pasarela en segundo plano.</string>
<string name="continue_anyway">Continuar de todos modos</string>
<string name="setup_wizard_welcome">Bienvenido a Shelter</string>
<string name="setup_wizard_welcome_text">Shelter es una aplicación que te ayuda a ejecutar otras aplicaciones en un perfil aislado. Lo hace haciendo uso de la característica <b>Perfil de trabajo</b> de Android.
\n
\nHaz click en \"Siguiente\" y te proveeremos con mas información sobre Shelter y te guiaremos a través del proceso de instalación
\n
\nTe sugerimos que leas todas las paginas siguientes cuidadosamente.</string>
<string name="setup_wizard_permissions">Sobre los permisos</string>
<string name="setup_wizard_ready">¿Listo?</string>
<string name="setup_wizard_compatibility">Compatibilidad</string>
<string name="search">Buscar</string>
<string name="freeze_all">Suspensión en lote</string>
<string name="create_freeze_all_shortcut">Crear un acceso directo a suspensión en lote</string>
<string name="freeze_all_shortcut">Suspender</string>
<string name="install_app_to_profile">Instalar APK dentro de Shelter</string>
<string name="install_app_to_profile_success">Instalación de aplicación en perfil de trabajo finalizada.</string>
<string name="show_all">Mostrar todas las aplicaciones</string>
<string name="settings_auto_freeze_service">Servicio de auto suspensión</string>
<string name="settings_auto_freeze_service_desc">Cuando la pantalla esta bloqueada, automáticamente suspende las aplicaciones iniciadas con \"Acceso directo a Reanudar e iniciar\".</string>
<string name="settings_dont_freeze_foreground">Omitir aplicaciones de fondo</string>
<string name="settings_about">Acerca de</string>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="freeze_all_shortcut">قفل</string>
<string name="install_app_to_profile_success">نصب اپلیکیشن داخل پروفایل کاری تمام شد.</string>
<string name="show_all">نمایش تمام برنامه‌ها</string>
<string name="settings">تنظیمات</string>
<string name="settings_interaction">تعامل</string>
<string name="settings_cross_profile_file_chooser">شاتل فایل</string>
<string name="first_run_alert_cancel">خدانگهدار</string>
<string name="first_run_alert_continue">ادامه</string>
<string name="device_admin_explanation">جهت انجام پروسه‌ی ایزوله‌سازی شلتر (Shelter) لازم است که دسترسی Device Admin داشته باشد.</string>
<string name="setup_wizard_welcome_text">شلتر (Shelter) یک برنامه است که بتوانید اپلیکیشن های دیگر را در یک محیط ایزوله باز کنید. این عملیات با استفاده از قابلیت <b>Work Profile</b> اندروید امکان‌پذیر شده‌است.
\n
\nروی \"بعدی\" کلیک کنید تا ما اطلاعات بیشتری را درباره‌ی استفاده از شلتر در اختیار شما بگذاریم و همچنین در پروسه‌ی تنظیم برنامه شما را راهنمایی کنیم.
\n
\nپیشنهاد میکنیم تا همه‌ی صفحات بعدی را با دقت بخوانید.</string>
<string name="setup_wizard_permissions_text">به صورت پیش‌فرضف شلتر درخواستی برای دسترسی‌های خاص ندارد. اما با ورود به پروسه‌ی تنظیم برنامه، Shelter تلاش خواهد کرد که یک Work Profile را آماده کند، بنابراین، <b>profile manager</b> برای پروفایل مربوطه میشود.
\n
\nاین به Shelter تعداد زیادی دسترسی را در داخل پروفایل میدهد، چیزی مشابه Device Admin، اما محدود به آن پروفایل. Profile manager بودن برای اکثر قابلیت‌های Shelter ضروری است.
\n
\nبرخی قابلیت‌های ویژه‌ی Shelter ممکن از دسترسی‎‌هایی <b>خارج از</b> آن Work Profile را احتیاج داشته باشند. در صورت نیاز و زمانی که قابلیت‌های ویژه را روشن می‌کنید، Shelter برای این دسترسی‌ها به صورت مجزا درخواستی ارسال میکند.</string>
<string name="setup_wizard_compatibility_text">شلتر روی نسخه‌های نظیر AOSP اندروید توسعه داده و تست شده است. این شامل AOSP (پروژه‌ی متن باز اندروید)، اندروید گوگل (روی پیکسل ها)، و <b>اکثر کاستوم رام‌های بر پایه‌ی AOSP و متن‌ باز</b> مانند LineageOS می‌باشد. اگر دستگاه شما روی یکی از نسخه‌های ذکر شده از اندروید اجرا می‌شود، تبریک میگیم! احتمالا Shelter روی دستگاه به درستی کار خواهد کرد.
\n
\nبعضی تولیدکنندگان دستگاه‌ها شخصی‌سازی های شدیدی روی پایه‌ی اندروید انجام می‌دهند که نتیجه‌ی آن وجود ناسازگاری‌ها و عملکرد غیرعادی می‌شود. بعضی کاستوم رام ها هم می‌توانند تغییرات سازگاری‌شکنی اعمال کرده باشند، اما به طور کلی این‌ها نسبت به تغییرات اعمال شده توسط تولیدکنندگان نادرتر هستند.
\n
\nشلتر صرفا یک سازه روی قابلیت Work Profile است که سیستم ارائه می‌دهد. <b>اگر قابلیت ارائه‌شده خراب یا غیر استاندارد باشد، Shelter نمی‌تواند به تنهایی مشکل را حل کند</b>. اگر از یک نسخه‌ای از اندروید که توسط تولیدکننده دستکاری شده است استفاده میکنید که قابلیت Work Profiles را از کار انداخته است، <b>به شما اخطار داده شد</b>. البته می‌توانید به هر حال به استفاده ادامه دهید، اما ضمانتی نیست که Shelter در این شرایط به‌طور عادی عمل کند.</string>
<string name="setup_wizard_failed_text">متاسفانه باید بگوییم که امکان راه‌اندازی Shelter برا شما نیست.
\n
\nاگر دستگاه شما توسط یک نسخه‎‌ی قبل یا برنامه‌ای دیگر از قبل یک Work Profile داشته است، باید آن را در بخش تنظیمات -&gt; حساب حذف کنید.
\n
\nدر غیر این صورت، اگر شما شخصا راه‌اندازی را قطع نکردید مشکل احتمال زیاد به خاطر یک سیستم با تغییرات شدید یا یک ناسازگاری بین Shelter و دیگر مدیریت‌کنندگان Work Profile است. متاسفانه کاری از دست ما بر نمی‌آید.
\n
\nبرای خروج روی \"بعدی\" کلیک کنید.</string>
<string name="setup_wizard_action_required_text">شما الآن باید یک پیغام (نوتیفیکیشن) از Shelter ببینید. <b>لطفا روی آن پیغام کلیک کرده</b> تا فرایند راه‌اندازی پایان یابد.
\n
\nاگر این پیغام را نمی‌بینید، مطمئن شوید که دستگاه شما روی حالت Do Not Disturb نبوده و سعی کنید بخش پیغام‌ها را به پایین بکشید.
\n
\nجهت بازگردانی Shelter و شروع از اول می‌توانید داده‌های برنامه را در تتظیمات پاک کنید.</string>
<string name="service_auto_freeze_desc">Shelter برنامه‌های باز شده از \"شکستن قفل و باز کردن\" را در دستور قفل صفحه‌ی بعدی به طور خودکار قفل می‌کند.</string>
<string name="create_freeze_all_shortcut">ساخت میانبر قفل گروهی</string>
<string name="install_app_to_profile">نصب APK داخل شلتر</string>
<string name="show_all_warning">دستکاری برنامه‌هایی که داخل لیست نمایش داده نشده‌اند می‌تواند باعث خروج از برنامه و انواع دیگر مشکلات شود. البته این قابلیت می‌تواند در زمان وجود رام دستکاری شده توسط سازنده مفید شود اگر همه‌ی برنامه‌های سیستمی فعال نشده‌اند. اگر ادامه دهید، مسئولیت آن با خود شماست.</string>
<string name="documents_ui">باز کردن بخش مستندات</string>
<string name="settings_cross_profile_file_chooser_desc">اگر فعال شود تنها از طریق Documents UI (فایل‌ها و مستندات دارای نام داخل لانچر) یا برنامه‌های دارای قابلیت Documents UI (به مدت موقت به فایل هایی که انتخاب میکنید دسترسی میگیرند) می‌توانید از طریق Shelter، فایل های پروفایل اصلی را ببنید / انتخاب کنید و یا کپی کنید، در عین اینکه ساختار ایزوله را حفظ می‌کنیم.</string>
<string name="settings_dont_freeze_foreground_desc">در زمان قفل شدن صفحه، برنامه‌های پس‌زمینه‌ی قابل مشاهده را قفل نکن. این قابلیت برای برنامه‌های پخش موسیقی می‌تواند مفید باشد، اما ممکن است لازم باشد به طور دستی از \"میانبر قفل جمعی\" آنها را قفل کنید.</string>
<string name="work_profile_provision_failed">امکان آماده‌سازی پروفایل کاری نبود. برای تلاش دوباره برنامه را ریستارت کنید.</string>
<string name="work_mode_disabled">به نظر میاد شما Work Mode را هنگام راه‌ندازی شلتر غیرفعال کرده‌اید. اگر آن را فعال کرده‌اید، لطفا شلتر را دوباره باز کنید.</string>
<string name="clone_fail_system_app">امکان کپی برنامه‌های سیستمی به یک پروفایل که شلتر کنترلی بر آن ندارد نیست.</string>
<string name="request_usage_stats">برای اینکار، شلتر نیازمند دسترسی <b>Usage Stats</b> است. لطفا پس از کلیک کردن روی \"Ok\" داخل دیالوگ، این دسترسی را برای <b>هر دوی</b> اپ‌های شلتر فعال کنید. اگر اینکار انجام نگیرد این قابلیت به درستی کار نخواهد نکرد.</string>
<string name="request_storage_manager">شلتر برای شاتل فایل نیازمند دسترسی به <b>All Files</b> دارد. لطفا این دسترسی را برای <b>هر دوی</b> برنامه‌های شلتر که با زدن روی \"Ok\" داخل دیالوگ نمایش داده می‌شود فعال کنید.</string>
<string name="device_admin_desc">سرویس ایزوله‌سازی برنامه</string>
<string name="setup_wizard_welcome">به شلتر (Shelter) خوش آمدید</string>
<string name="setup_wizard_permissions">صحبتی درباره‌ی دسترسی ها</string>
<string name="setup_wizard_compatibility">سازگاری</string>
<string name="setup_wizard_ready">آماده‌اید؟</string>
<string name="setup_wizard_ready_text">اکنون آماده‌ی راه‌اندازی Shelter برای شما هستیم. اگر دستگاه شما دارای اندروید 7 یا کمتر است، مطمئن شوید که حالت Do Not Disturb روشن <b>نیست</b>، زیرا در ادامه لازم است <b>روی یک پیغام (نوتیفیکشن) کلیک کنید</b> تا مراحل راه‌اندازی تکمیل شوند.
\n
\nهروقت آماده بودید، روی \"بعدی\" کلیک کنید تا پروسه‎‌ی آماده‌سازی را شروع کنیم.</string>
<string name="setup_wizard_please_wait">لطفا صبر کنید…</string>
<string name="setup_wizard_please_wait_text">در حال تلاش برای راه اندازی Work Profile و Shelter روی دستگاه شما هستیم.</string>
<string name="setup_wizard_failed">راه‌اندازی به مشکل خورد</string>
<string name="setup_wizard_action_required">اقدامی نیاز است</string>
<string name="notifications_important">پیام مهم Shelter</string>
<string name="finish_provision_title">اینجا کلیک کنید تا راه‌اندازی Shelter تکمیل شود</string>
<string name="finish_provision_desc">تبریک می‌گوییم! تنها یک کلیک با تکمیل راه‌اندازی Shelter فاصله دارید.</string>
<string name="service_title">سرویس Shelter</string>
<string name="service_desc">Shelter در حال اجرا است …</string>
<string name="service_auto_freeze_title">منتظر قفل خودکار هستیم</string>
<string name="service_auto_freeze_now">قفل کن</string>
<string name="app_installing">در حال نصب...</string>
<string name="fragment_profile_main">اصلی</string>
<string name="fragment_profile_work">شلتر</string>
<string name="list_item_disabled">%s قفل شده</string>
<string name="batch_operation">عملیات جمعی</string>
<string name="clone_to_work_profile">کپی به شلتر (Work Profile)</string>
<string name="clone_to_main_profile">کپی به پروفایل اصلی</string>
<string name="uninstall_app">حذف نصب</string>
<string name="freeze_app">قفل</string>
<string name="unfreeze_app">رفع قفل</string>
<string name="launch">راه اندازی</string>
<string name="unfreeze_and_launch">رفع قفل و اجرا</string>
<string name="auto_freeze">قفل خودکار</string>
<string name="allow_cross_profile_widgets">آزاد کردن ویجت‌ها در پروفایل اصلی</string>
<string name="search">جستجو</string>
<string name="freeze_all">قفل جمعی</string>
<string name="create_unfreeze_shortcut">ساخت میانبر رفع قفل و یا اجرا کردن</string>
<string name="settings_block_contacts_searching">بستن جستجوی مخاطبین</string>
<string name="settings_block_contacts_searching_desc">گرفتن دسترسی مخاطبین از پروفایل اصلی داخل پروفایل کاری.</string>
<string name="settings_services">سرویس‌ها</string>
<string name="settings_auto_freeze_service">سرویس قفل خودکار</string>
<string name="settings_auto_freeze_service_desc">در زمان قفل بودن صفحه، به طور خودکار برنامه‌های باز شده از \"میانبر رفع قفل و باز کردن\" را قفل کن.</string>
<string name="settings_auto_freeze_delay">تاخیر قفل خودکار</string>
<string name="settings_dont_freeze_foreground">رد کردن برنامه‌های ‎پیش‌زمینه</string>
<string name="settings_about">درباره</string>
<string name="settings_version">نسخه</string>
<string name="settings_source_code">سورس کد</string>
<string name="settings_translate">ترجمه</string>
<string name="settings_bug_report">گزارش مشکلات / ردیاب مشکلات</string>
<string name="provision_finished">راه‌اندازی شلتر انجام شد. اکنون شلتر را ریستارت میکنیم. اگر برنامه به طور خودکار باز نشد، دوباره آن را باز کنید.</string>
<string name="msg_device_unsupported">نبود دسترسی یا دستگار ناسازگار</string>
<string name="work_profile_not_found">پروفایل کاری یافت نشد. لطفا برنامه را ریستارت کنید تا پروفایل دوباره آماده شود.</string>
<string name="uninstall_success">برنامه %s با موفقیت حذف شده است</string>
<string name="freeze_success">برنامه %s با موفقیت قفل شده است</string>
<string name="clone_success">برنامه %s با موفقیت کپی شده است</string>
<string name="unfreeze_success">برنامه %s با موفقیت رفع قفل شده است</string>
<string name="uninstall_fail_system_app">امکان حذف برنامه‌های سیستمی داخل یک پروفایل که شلتر کنترلی بر آن ندارد نیست.</string>
<string name="unsupported_launcher">امکان اضافه کردن میانبر به لانچر شما نیست. لطفا با توسعه‌دهنده تماس بگیرید.</string>
<string name="app_context_menu_title">عملیات‌ها برای %s</string>
<string name="freeze_all_success">همه‌ی برنامه‌های داخل \"قفل خودکار\" با موفقیت قفل شدند.</string>
<string name="shortcut_create_success">میانبر داخل لانچر شما ساخته شد.</string>
<string name="launch_app_fail">امکان باز کردن برنامه‌ی %s نیست زیرا رابط کاربری ندارد.</string>
<string name="request_system_alert">شلتر نیازمند <b>نمایش روی دیگر برنامه‌ها</b> است تا شاتل فایل به درستی عمل کند. لطفا پس از زدن روی \"Ok\" در دیالوگ نمایش داده شده این دسترسی را برای <b>هر دوی</b> برنامه‌های شلتر فعال کنید. این دسترسی امکان راه‌اندازی سرویس‌های شاتل فایل در پس زمینه را میدهد.</string>
<string name="miui_cannot_clone">کپی کردن برنامه‌های سیستمی به پروفایل دیگر در حال حاضر در MIUI امکان‌پذیر نیست. لطفا اپلیکیشن فروشگاه برنامه‌های سیستم خود (مانند <b>Play Store</b>) را به یک پروفایل دیگر کپی کنید سپس برنامه‌ها را از آنجا نصب کنید.</string>
<string name="continue_anyway">ادامه دادن</string>
</resources>

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="service_auto_freeze_now">Geler Maintenant</string>
<string name="notifications_important">Shelter Important</string>
<string name="first_run_alert_continue">Continuer</string>
<string name="device_admin_desc">Service d\'isolation d\'application</string>
<string name="finish_provision_title">Cliquez ici pour finir de configurer Shelter</string>
<string name="finish_provision_desc">Félicitations ! Vous êtes à un clic de finir de configurer Shelter.</string>
<string name="service_title">Service Shelter</string>
<string name="service_desc">Shelter est en fonctionnement…</string>
<string name="service_auto_freeze_title">Gel automatique en attente</string>
<string name="service_auto_freeze_desc">Shelter va geler automatiquement les applications chargées depuis \"Dégeler &amp; Lancer\" sur le prochain verrouillage d\'écran.</string>
<string name="app_installing">Installation...</string>
<string name="batch_operation">Opération par lots</string>
<string name="clone_to_work_profile">Cloner vers Shelter (Profil Professionnel)</string>
<string name="uninstall_app">Désinstaller</string>
<string name="freeze_all_shortcut">Geler</string>
<string name="fragment_profile_main">Profil Principal</string>
<string name="fragment_profile_work">Shelter</string>
<string name="clone_to_main_profile">Cloner vers le Profil Principal</string>
<string name="freeze_app">Geler</string>
<string name="unfreeze_app">Dégeler</string>
<string name="launch">Lancer</string>
<string name="unfreeze_and_launch">Dégeler et Lancer</string>
<string name="auto_freeze">Gel Automatique</string>
<string name="allow_cross_profile_widgets">Autoriser les Widgets dans le Profil Principal</string>
<string name="search">Chercher</string>
<string name="freeze_all">Gel par lots</string>
<string name="create_freeze_all_shortcut">Créer un Raccourci de Gel par Lots</string>
<string name="create_unfreeze_shortcut">Créer un Raccourci de Dégel et/ou de Lancement</string>
<string name="install_app_to_profile">Installer un APK dans Shelter</string>
<string name="install_app_to_profile_success">Installation de l\'application terminée dans le Profil Professionnel.</string>
<string name="first_run_alert">Vous allez à présent configurer Shelter.
\n
\nCette application dépend de la fonctionnalité &lt;b&gt;Profil Professionnel&lt;/b&gt; d\'Android pour isoler les application. Si vous utilisez une ROM vendeur / custom qui casse ces fonctionnalités (ex: MIUI), vous devriez &lt;b&gt;QUITTER&lt;/b&gt; maintenant et &lt;b&gt;NE PAS&lt;/b&gt; utiliser cette application.
\n
\nSi vous choisissez de continuer, Shelter va configurer le Profil Professionnel pour vous.
\n
\nSi vous êtes un développeur et que vous voulez faire en sorte que Shelter fonctionne sur des ROMs incompatibles telles que MIUI, les contributions sont bienvenues. Le développeur ne prend &lt;b&gt;AUCUNE RESPONSABILITÉ&lt;/b&gt; si vous cassez votre appareil utilisant une ROM incompatible.
\n
\nVous devez recevoir une notification pour finir la configuration, s\'il vous plaît veuillez vérifier que votre appareil n\'est &lt;b&gt;PAS&lt;/b&gt; en mode Ne Pas Déranger.<b>Work Profile</b> feature of Android to isolate the apps. If you use a vendor / custom ROM that breaks related features (e.g. MIUI), you should now <b>QUIT</b> and <b>DO NOT</b> use this app.\n\nIf you choose to continue, Shelter will set up Work Profile for you.\n\nIf you are a developer and would like to make Shelter work on those incompatible ROMs like MIUI, pull requests are always welcome. The developer takes <b>ABSOLUTELY NO RESPONSIBILITY</b> if you break your device running an incompatible ROM.\n\nYou will need to receive a notification in order to finish setup, please make sure your device is <b>NOT</b> on Do Not Disturb mode.</string>
<string name="show_all_warning">Manipuler des applications qui ne sont pas visibles dans la liste pourrait causer des plantages et toutes sortes de comportements inattendus. Cependant, cette fonctionnalité peut être utile quand des ROMs personnalisées fautives n\'activent pas toutes les applications systèmes nécessaires dans le Profil Professionnel par défaut. Ne continuez que si vous êtes sûr de vous.</string>
<string name="settings_cross_profile_file_chooser_desc">Si activé, vous pourrez parcourir / afficher / sélectionner / copier des fichiers dans Shelter depuis le Profil Principal et vice-versa. UNIQUEMENT via l\'application Documents (nommée Fichiers ou Documents dans votre lanceur d\'applications) ou via des applications supportant la gestion de Documents (elles n\'obtiennent qu\'un accès temporaire aux fichiers à choisir), tout en concervant l\'isolation du système de fichiers.</string>
<string name="settings_dont_freeze_foreground_desc">Ne PAS geler les applications en premier plan (avec une activité visible) quand l\'écran est verrouillé. Cela peut être utile pour des applications telles que des lecteurs de musique, mais vous devrez ensuite les geler depuis \"Raccourci de Gel par Lots\".</string>
<string name="provision_finished">Configuration de Shelter complète. L\'application redémarre. Si Shelter ne redémarre pas automatiquement, vous pouvez le lancer depuis votre Lanceur d\'Applications.</string>
<string name="work_mode_disabled">Il semble que vous ayez désactivé le Mode de Travail en démarrant Shelter. Si vous l\'avez activé maintenant, veuillez redémarrer Shelter.</string>
<string name="list_item_disabled">[Gelé] %s</string>
<string name="show_all">Afficher Toutes les Applications</string>
<string name="settings">Paramètres</string>
<string name="settings_interaction">Interaction</string>
<string name="settings_block_contacts_searching">Bloquer la recherche de contacts</string>
<string name="settings_block_contacts_searching_desc">Refuser au Profil Principal l\'accès aux contacts à l\'intérieur du Profil Professionnel.</string>
<string name="settings_services">Services</string>
<string name="settings_auto_freeze_service">Service de gel automatique</string>
<string name="settings_auto_freeze_service_desc">Lorsque l\'écran est verrouillé, gèle automatiquement les applications lancées à partir de \"Raccourcis de Dégel &amp; Lancement\".</string>
<string name="settings_auto_freeze_delay">Délai de gel automatique</string>
<string name="settings_dont_freeze_foreground">Ignorer les applications au premier plan</string>
<string name="settings_about">À propos</string>
<string name="settings_version">Version</string>
<string name="settings_source_code">Code Source</string>
<string name="settings_bug_report">Rapport de bogue / Suivi des problèmes</string>
<string name="device_admin_toast">Vous devez autoriser l\'Administration de l\'Appareil pour que Shelter fonctionne. Veuillez réessayer.</string>
<string name="provision_still_pending">Veuillez patienter pendant que nous préparons le Profil de Shelter pour vous…</string>
<string name="msg_device_unsupported">L\'autorisation est refusée ou l\'appareil n\'est pas pris en charge</string>
<string name="work_profile_not_found">Profil Professionnel introuvable. Veuillez redémarrer l\'application pour réapprovisionner le Profil.</string>
<string name="work_profile_provision_failed">Impossible de provisionner le Profil Professionnel. Vous pouvez réessayer en redémarrant Shelter.</string>
<string name="clone_success">Application \"%s\" clonée avec succès</string>
<string name="freeze_success">Application \"%s\" gelée avec succès</string>
<string name="uninstall_success">Application \"%s\" désinstallée avec succès</string>
<string name="unfreeze_success">Application \"%s\" dégelée avec succès</string>
<string name="clone_fail_system_app">Impossible de cloner des applications système vers un profil sur lequel Shelter n\'a aucun contrôle.</string>
<string name="uninstall_fail_system_app">Impossible de désinstaller les applications système dans un profil sur lequel Shelter n\'a aucun contrôle.</string>
<string name="documents_ui">Ouvrir la Navigation de Documents</string>
<string name="settings_translate">Traduire</string>
<string name="unsupported_launcher">Impossible d\'ajouter de raccourcis à votre lanceur d\'applications. Veuillez contacter le développeur pour plus d\'informations.</string>
<string name="first_run_alert_cancel">Au revoir</string>
<string name="device_admin_explanation">Shelter à besoin de devenir Administrateur d\'Appareil pour pouvoir executer les tâches d\'isolation.</string>
<string name="app_context_menu_title">Opérations pour %s</string>
<string name="freeze_all_success">Toutes les applications de la liste \"Gel Automatique\" ont été gelées avec succès.</string>
<string name="shortcut_create_success">Raccourci créé sur votre lanceur d\'applications.</string>
<string name="request_usage_stats">Shelter à besoin de la permission <b>Statistiques d\'Usage</b> pour faire ça. S\'il vous plaît activez la permission pour <b>LES DEUX</b> applications Shelter dans la boite de dialogue affichée après avoir appuyé sur \"Ok\". Sinon cette fonctionnalité de pourra pas fonctionner correctement.</string>
<string name="launch_app_fail">Impossible de lancer l\'application %s car elle n\'a pas d\'interface graphique.</string>
<string name="request_storage_manager">Shelter doit accéder à <b>Tous les Fichiers</b> pour la Navigation de Fichiers. Veuillez activer l\'autorisation pour <b>LES DEUX</b> applications Shelter (personnelle / professionnelle) dans la boîte de dialogue affichée après avoir appuyé sur \"Ok\".</string>
<string name="request_system_alert">Shelter doit <b>Dessiner par dessus les autres applications</b> pour que la Navigation de Fichier fonctionne correctement. Veuillez activer l\'autorisation pour <b>LES DEUX</b> applications Shelter (personnelle / professionnelle) dans la boîte de dialogue affichée après avoir appuyé sur \"Ok\". Cette autorisation est utilisée pour démarrer les services de Navigation de Fichiers en arrière-plan.</string>
<string name="miui_cannot_clone">Le clonage d\'applications non système vers un autre profil n\'est actuellement pas possible sur MIUI. Veuillez cloner la boutique d\'applications de votre système (par exemple, &lt;b&gt;Play Store&lt;/b&gt;) dans l\'autre profil, puis installer les applications à partir de là.<b>Play Store</b>) into the other profile and then install apps from there.</string>
<string name="continue_anyway">Continuer quand même</string>
<string name="settings_cross_profile_file_chooser">Navigation de Documents</string>
<string name="setup_wizard_please_wait">Veuillez patienter…</string>
<string name="setup_wizard_failed">Échec de l\'installation</string>
<string name="setup_wizard_action_required">Action requise</string>
<string name="setup_wizard_action_required_text">Vous devriez maintenant voir une notification de Shelter. <b>Veuillez cliquer sur cette notification</b> pour terminer le processus d\'installation.
\n
\nSi vous ne voyez pas la notification, assurez-vous que votre appareil n\'est pas en mode Ne pas déranger et essayez de tirer le centre de notifications vers le bas.
\n
\nPour réinitialiser Shelter et recommencer, vous pouvez vider l\'espace de stockage de Shelter dans les paramètres de votre téléphone.</string>
<string name="setup_wizard_please_wait_text">Nous essayons d\'initialiser le profil professionnel et de configurer Shelter sur votre appareil.</string>
<string name="setup_wizard_failed_text">Nous avons le regret de vous informer que nous n\'avons pas réussi à configurer Shelter.
\n
\nSi vous n\'avec pas annulé manuellement la configuration, alors l\'origine de cet échec est probablement liée à une version d\'Android trop lourdement modifiée, ou bien à un conflit entre Shelter et d\'autres gestionnaires de Profil professionnel. Malheureusement, nous ne pouvons pas y faire grand chose.
\n
\nAppuyez sur \"Suivant\" pour sortir.</string>
<string name="setup_wizard_welcome">Bienvenue dans Shelter</string>
<string name="setup_wizard_permissions">Un point sur les permissions</string>
<string name="setup_wizard_compatibility">Compatibilité</string>
<string name="setup_wizard_ready">Prêt(e) ?</string>
<string name="setup_wizard_welcome_text">Shelter est une application permettant d\'exécuter d\'autres application à l\'intérieur d\'un compartiment isolé. Pour cela, elle utilise la fonctionnalité &lt;b&gt;Profil Professionnel&lt;b&gt; d\'Android.
\n
\nAppuyez sur \"Suivant\", afin que nous puissions vous fournir de plus amples informations sur Shelter et vous guider dans le processus de configuration.
\n
\nNous vous suggérons de lire attentivement l\'intégralité des informations suivantes.</string>
<string name="setup_wizard_permissions_text">Par défaut, Shelter ne demandera pas de permissions spécifiques. Cependant, une fois que vous aurez terminé le processus de configuration, Shelter essaiera de créer un profil de travail et en deviendra donc le <b>gestionnaire de profil</b>.
\n
\nCela accordera à Shelter une liste étendue d\'autorisations à l\'intérieur du profil, comparable à celle d\'un Administrateur de l\'appareil, mais bien limitée au profil. Le statut de gestionnaire de profil est indispensable à la plupart des fonctionnalités de Shelter.
\n
\nCertaines fonctionnalités avancées de Shelter peuvent nécessiter davantage de permissions <b>en dehors</b> du profil de travail. Au besoin, Shelter demandera ces autorisations séparément lorsque vous activerez les fonctionnalités correspondantes.</string>
<string name="setup_wizard_compatibility_text">Shelter est développé et testé sur des dérivés d\'Android de type AOSP. Cela inclut AOSP (Android Open Source Project), Google Android (sur la gamme Google Pixel), et &lt;b&gt;la plupart des ROM customisées open-source basées sur AOSP&lt;/b&gt; comme LineageOS. Si votre téléphone exécute l\'un des dérivés d\'Android énumérés ci-dessus, alors félicitations ! Shelter va probablement fonctionner correctement sur votre appareil.
\n
\nCertains fabricants de téléphones introduisent des éléments personnalisés très envahissants dans la base de code Android, ce qui entraîne des conflits, une incompatibilité et un comportement inattendu. Certaines ROM customisées peuvent également introduire des modifications qui compromettent le bon fonctionnement de Shelter, mais celles-ci sont généralement plus rares que les incompatibilités liées aux fabricants.
\n
\nShelter est simplement une interface permettant de contrôler la fonctionnalité d\'Android \"Profil professionnel\". Si celle-ci est défaillante ou non-conforme, &lt;/b&gt;Shelter sera incapable de résoudre le problème tout seul&lt;/b&gt;. Si vous utilisez actuellement une version d\'Android modifiée par le fabricant qui est connue pour altérer le fonctionnement du Profil professionnel, &lt;/b&gt;vous êtes prévenu(e)&lt;/b&gt;. Vous pouvez quand même continuer, mais il n\'est pas garanti que Shelter fonctionne normalement dans ces circonstances.</string>
<string name="setup_wizard_ready_text">Nous sommes maintenant prêts à configurer Shelter pour vous. Veuillez d\'abord vous assurer que votre appareil n\'est <b>pas</b> en mode Ne pas déranger, car vous devrez <b>cliquer sur une notification</b> plus tard pour finaliser le processus de configuration.
\n
\nLorsque vous serez prêt(e), cliquez sur \"Suivant\" pour commencer le processus de configuration.</string>
</resources>

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">Selamat tinggal</string>
<string name="first_run_alert_continue">Lanjutkan</string>
<string name="device_admin_explanation">Shelter harus menjadi Admin Perangkat untuk melakukan tugas isolasinya.</string>
<string name="device_admin_desc">Layanan Isolasi Aplikasi</string>
<string name="setup_wizard_welcome">Selamat datang di Shelter</string>
<string name="setup_wizard_permissions">Sepatah kata tentang izin</string>
<string name="setup_wizard_welcome_text">Shelter adalah aplikasi untuk membantu Anda menjalankan aplikasi lain dalam profil yang terisolasi. Ia melakukannya dengan memanfaatkan fitur <b>Profil Kerja</b> Android.
\n
\nKlik \"Selanjutnya\", dan kami akan memberi Anda informasi tentang Shelter dan petunjuk untuk menyelesaikan proses pengaturan.
\n
\nKami menyarankan Anda membaca semua halaman berikut dengan cermat.</string>
<string name="documents_ui">Buka Aplikasi Dokumen</string>
<string name="settings">Pengaturan</string>
<string name="settings_interaction">Interaksi</string>
<string name="settings_cross_profile_file_chooser">Penyimpanan Shuttle</string>
<string name="uninstall_fail_system_app">Tidak dapat mencopot pemasangan aplikasi sistem di profil yang tidak dapat dikontrol oleh Shelter.</string>
<string name="auto_freeze">Otomatis Bekukan</string>
<string name="allow_cross_profile_widgets">Izinkan Widget di Profil Utama</string>
<string name="search">Pencarian</string>
<string name="freeze_all">Pengelompokan Pembekuan</string>
<string name="create_freeze_all_shortcut">Buat Kelompok Pintasan Pembekuan</string>
<string name="freeze_all_shortcut">Bekukan</string>
<string name="install_app_to_profile">Pasang APK ke Shelter</string>
<string name="install_app_to_profile_success">Penginstalan aplikasi selesai di profil kerja.</string>
<string name="show_all">Lihat Semua Aplikasi</string>
<string name="setup_wizard_compatibility">Kesesuaian</string>
<string name="setup_wizard_ready">Siap?</string>
<string name="setup_wizard_please_wait">Silakan tunggu. . .</string>
<string name="setup_wizard_please_wait_text">Kami mencoba menginisialisasi Work Profile dan menyiapkan Shelter di perangkat Anda.</string>
<string name="setup_wizard_failed">Penyiapan gagal</string>
<string name="setup_wizard_action_required">Diperlukan tindakan</string>
<string name="setup_wizard_action_required_text">Anda sekarang akan melihat notifikasi dari Shelter. <b>Silakan klik notifikasi itu</b> untuk menyelesaikan proses penyiapan.
\n
\nJika Anda tidak melihat notifikasi, pastikan perangkat Anda tidak dalam mode Jangan Ganggu dan coba turunkan pusat notifikasi.
\n
\nUntuk menyetel ulang Shelter dan memulai kembali, Anda dapat menghapus data Shelter di Setelan.</string>
<string name="notifications_important">Penampungan Penting</string>
<string name="finish_provision_title">Klik di sini untuk menyelesaikan penyiapan Shelter</string>
<string name="finish_provision_desc">Selamat! Anda hanya perlu satu klik untuk menyelesaikan penyiapan Shelter.</string>
<string name="service_title">Layanan Shelter</string>
<string name="service_desc">Shelter sekarang berjalan …</string>
<string name="service_auto_freeze_title">Pembekuan otomatis tertunda</string>
<string name="service_auto_freeze_desc">Shelter akan membekukan aplikasi secara otomatis yang diluncurkan dari \"Cairan &amp; Luncurkan\" pada acara penguncian layar berikutnya.</string>
<string name="service_auto_freeze_now">Bekukan Sekarang</string>
<string name="app_installing">Memasang...</string>
<string name="fragment_profile_main">Utama</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Bekukan] %s</string>
<string name="batch_operation">Kelompok operasi</string>
<string name="clone_to_work_profile">Salin ke Shelter (Profil Kerja)</string>
<string name="clone_to_main_profile">Salin ke Profil Utama</string>
<string name="uninstall_app">Copot</string>
<string name="freeze_app">Bekukan</string>
<string name="unfreeze_app">Cairkan</string>
<string name="launch">Jalankan</string>
<string name="create_unfreeze_shortcut">Buat Pencairan dan/atau Luncurkan Pintasan</string>
<string name="unfreeze_and_launch">Cairkan dan Luncurkan</string>
<string name="settings_block_contacts_searching">Blokir Pencarian Kontak</string>
<string name="settings_block_contacts_searching_desc">Tolak akses dari profil utama ke kontak di dalam profil kerja.</string>
<string name="settings_services">Layanan</string>
<string name="settings_auto_freeze_service">Layanan Pembekuan Otomatis</string>
<string name="settings_auto_freeze_service_desc">Saat layar terkunci, secara otomatis bekukan aplikasi yang diluncurkan dari \"Cabut &amp; Luncurkan Pintasan\".</string>
<string name="settings_auto_freeze_delay">Penundaan Pembekuan Otomatis</string>
<string name="settings_dont_freeze_foreground">Lewati Aplikasi Latar Depan</string>
<string name="settings_about">Tentang</string>
<string name="settings_version">Versi</string>
<string name="settings_source_code">Kode Sumber</string>
<string name="settings_translate">Terjemah</string>
<string name="settings_bug_report">Laporan Masalah / Pelacak Masalah</string>
<string name="provision_finished">Pengaturan tempat berlindung selesai. Sekarang memulai kembali Shelter. Jika Shelter tidak memulai secara otomatis, Anda dapat meluncurkannya lagi dari peluncur.</string>
<string name="msg_device_unsupported">Izin ditolak atau Perangkat tidak didukung</string>
<string name="work_profile_not_found">Profil kerja tidak ditemukan. Mulai ulang aplikasi untuk menyediakan ulang profil.</string>
<string name="work_profile_provision_failed">Tidak dapat menyediakan profil kerja. Anda dapat mencoba lagi dengan memulai ulang Shelter.</string>
<string name="clone_success">Aplikasi \"%s\" berhasil digandakan</string>
<string name="uninstall_success">Aplikasi \"%s\" berhasil dihapus instalasinya</string>
<string name="freeze_success">Aplikasi \"%s\" berhasil dibekukan</string>
<string name="unfreeze_success">Aplikasi \"%s\" berhasil dicairkan</string>
<string name="clone_fail_system_app">Tidak dapat mengkloning aplikasi sistem ke profil yang tidak dapat dikontrol oleh Shelter.</string>
<string name="unsupported_launcher">Tidak dapat menambahkan pintasan ke peluncur Anda. Silakan hubungi pengembang untuk informasi lebih lanjut.</string>
<string name="app_context_menu_title">Operasi untuk %s</string>
<string name="freeze_all_success">Semua aplikasi dalam daftar \"Bekukan Otomatis\" telah berhasil dibekukan.</string>
<string name="shortcut_create_success">Pintasan dibuat di peluncur Anda.</string>
<string name="launch_app_fail">Tidak dapat meluncurkan aplikasi %s karena tidak memiliki GUI.</string>
<string name="continue_anyway">Tetap lanjutkan</string>
<string name="setup_wizard_permissions_text">Secara bawaan, Shelter tidak akan meminta izin individu apa pun. Namun, setelah Anda melanjutkan proses penyiapan, Shelter akan mencoba menyiapkan Profil Kerja dan karenanya menjadi <b>pengelola profil</b> profil tersebut.
\n
\nIni akan memberi Shelter daftar panjang izin di dalam profil, sebanding dengan Admin Perangkat, meskipun terbatas pada profil. Menjadi pengelola profil diperlukan untuk sebagian besar fungsi Shelter.
\n
\nBeberapa fitur lanjutan Shelter mungkin memerlukan lebih banyak izin <b>di luar</b> Profil Kerja. Saat dibutuhkan, Shelter akan meminta izin tersebut secara terpisah saat Anda mengaktifkan fitur yang sesuai.</string>
<string name="setup_wizard_compatibility_text">Shelter dikembangkan dan diuji pada turunan Android mirip AOSP. Ini termasuk AOSP (Proyek Sumber Terbuka Android), Google Android (pada Piksel), dan <b>kebanyakan ROM kustom sumber terbuka berbasis AOSP</b> seperti LineageOS. Jika ponsel Anda menjalankan salah satu turunan Android yang tercantum di atas, selamat! Shelter mungkin akan berfungsi dengan benar di perangkat Anda.
\n
\nBeberapa vendor perangkat memperkenalkan penyesuaian yang sangat invasif ke dalam basis kode Android, yang mengakibatkan konflik, ketidakcocokan, dan perilaku yang tidak terduga. Beberapa ROM kustom juga dapat memperkenalkan perubahan yang merusak kompatibilitas, tetapi umumnya ini jarang terjadi dibandingkan dengan ketidakcocokan yang diperkenalkan oleh vendor ponsel.
\n
\nShelter hanyalah antarmuka ke fitur Work Profile yang disediakan oleh sistem. Jika fitur yang disediakan oleh sistem rusak atau tidak standar, <b>Shelter tidak dapat secara ajaib menyelesaikan masalahnya sendiri</b>. Jika saat ini Anda menggunakan versi Android modifikasi vendor yang diketahui dapat merusak Profil Kerja, <b>Anda telah diperingatkan</b>. Anda tetap dapat melanjutkan, tetapi tidak ada jaminan bahwa Shelter akan bertindak dengan benar dalam situasi seperti ini.</string>
<string name="setup_wizard_ready_text">Kami sekarang siap menyiapkan Shelter untuk Anda. Jika perangkat Anda menjalankan Android 7 atau lebih rendah, pertama-tama pastikan bahwa perangkat Anda <b>tidak</b> dalam mode Jangan Ganggu, karena nanti Anda harus <b>mengeklik pemberitahuan</b> untuk menyelesaikan proses penyetelan.
\n
\nSaat Anda siap, klik \"Berikutnya\" untuk memulai proses penyiapan.</string>
<string name="setup_wizard_failed_text">Dengan menyesal kami memberi tahu Anda bahwa kami tidak dapat menyiapkan Shelter untuk Anda.
\n
\nJika perangkat Anda sudah memiliki Profil Kerja, baik dari penginstalan Shelter sebelumnya atau dari aplikasi lain, Anda harus menghapus profil tersebut di Pengaturan -&gt; Akun sebelum Shelter dapat melanjutkan.
\n
\nJika tidak, jika Anda tidak membatalkan penyiapan secara manual, maka penyebab kegagalan biasanya karena sistem yang banyak dimodifikasi, atau konflik antara Shelter dan pengelola Work Profile lainnya. Sayangnya, tidak banyak yang bisa kami lakukan terkait hal ini.
\n
\nKlik \"Selanjutnya\" untuk keluar.</string>
<string name="show_all_warning">Memanipulasi aplikasi yang disembunyikan dari daftar dapat menyebabkan crash dan segala macam perilaku tak terduga. Namun, fitur ini dapat berguna saat ROM yang disesuaikan dengan vendor tidak mengaktifkan semua aplikasi sistem yang diperlukan di profil kerja secara default. Jika Anda melanjutkan, Anda sendirian.</string>
<string name="settings_cross_profile_file_chooser_desc">Saat diaktifkan, Anda akan dapat menelusuri/melihat/memilih/menyalin file di Shelter dari profil utama dan sebaliknya, HANYA melalui UI Dokumen (bernama File atau Dokumen di peluncur Anda) atau aplikasi dengan dukungan UI Dokumen (mereka hanya mendapatkan akses sementara ke file yang Anda pilih di Documents UI), sementara masih berkaitan dengan isolasi sistem file.</string>
<string name="settings_dont_freeze_foreground_desc">JANGAN membekukan aplikasi latar depan (dengan aktivitas yang terlihat) saat Anda mengunci layar. Ini dapat berguna untuk aplikasi seperti pemutar musik, tetapi Anda harus membekukannya secara manual melalui \"Pintasan Pembekuan Batch\" setelahnya.</string>
<string name="work_mode_disabled">Sepertinya Anda telah menonaktifkan Mode Kerja saat memulai Shelter. Jika Anda telah mengaktifkannya sekarang, harap mulai kembali Shelter.</string>
<string name="request_usage_stats">Shelter memerlukan izin <b>Statistik Penggunaan</b> untuk melakukan ini. Harap aktifkan izin untuk <b>KESELURUHAN</b> aplikasi Shelter yang ditampilkan di dialog setelah Anda menekan \"Ok\". Gagal melakukannya akan menyebabkan fitur ini tidak berfungsi dengan baik.</string>
<string name="request_storage_manager">Shelter memerlukan akses ke <b>Semua File</b> untuk File Shuttle. Harap aktifkan izin untuk <b>KESELURUHAN </b> (Pribadi / Kantor) aplikasi Shelter yang ditampilkan dalam dialog setelah Anda menekan \"Ok\".</string>
<string name="request_system_alert">Shelter harus <b>Draw over Other Apps</b> agar File Shuttle berfungsi dengan benar. Harap aktifkan izin untuk <b>KESELURUHAN </b> (Pribadi / Kantor) aplikasi Shelter yang ditampilkan dalam dialog setelah Anda menekan \"Ok\". Izin ini digunakan untuk memulai layanan File Shuttle di latar belakang.</string>
<string name="miui_cannot_clone">Mengkloning aplikasi non-sistem ke profil lain saat ini tidak dimungkinkan di MIUI. Harap gandakan toko aplikasi sistem Anda (mis. <b>Play Store</b>) ke profil lain, lalu instal aplikasi dari sana.</string>
<string name="payment_stub_description">Rintisan Layanan Pembayaran (JANGAN GUNAKAN)</string>
<string name="settings_payment_stub">Rintisan Layanan Pembayaran</string>
<string name="settings_payment_stub_desc">Aktifkan layanan pembayaran NFC palsu di profil utama, sehingga opsi pembayaran nirsentuh di bawah Pengaturan - NFC diaktifkan untuk memungkinkan Anda memilih aplikasi pembayaran di dalam profil kerja. Ini mengatasi bug Android yang membuat aplikasi pembayaran di dalam profil kerja tidak dapat dipilih jika tidak ada yang tersedia di profil utama.</string>
<string name="allow_cross_profile_interaction">Izinkan Interaksi Lintas Profil</string>
</resources>

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">Ciao</string>
<string name="first_run_alert_continue">Continua</string>
<string name="device_admin_desc">Servizio di isolazione app</string>
<string name="device_admin_explanation">Shelter ha bisogno di diventare amministratore del dispositivo per eseguire l\'isolamento delle app.</string>
<string name="notifications_important">Notifiche importanti</string>
<string name="finish_provision_title">Premi qui per finire la configurazione di Shelter</string>
<string name="finish_provision_desc">Congratulazioni! Ti manca solo un passo per finire la configurazione di Shelter.</string>
<string name="service_title">Servizio Shelter</string>
<string name="service_desc">Shelter in esecuzione …</string>
<string name="service_auto_freeze_title">Congelamento automatico in attesa</string>
<string name="settings_bug_report">Segnalazione di errori / Tracciatore dei problemi</string>
<string name="service_auto_freeze_now">Congela adesso</string>
<string name="app_installing">Installazione...</string>
<string name="fragment_profile_main">Pagina principale</string>
<string name="fragment_profile_work">Shelter</string>
<string name="clone_to_work_profile">Clona in Shelter (Profilo di Lavoro)</string>
<string name="clone_to_main_profile">Clona nel Profilo principale</string>
<string name="uninstall_app">Disinstalla</string>
<string name="freeze_app">Congela</string>
<string name="unfreeze_app">Scongela</string>
<string name="launch">Avvia</string>
<string name="unfreeze_and_launch">Scongela e avvia</string>
<string name="auto_freeze">Auto-congela</string>
<string name="allow_cross_profile_widgets">Permetti i widget nel profilo principale</string>
<string name="search">Cerca</string>
<string name="freeze_all">Congela in massa</string>
<string name="freeze_all_shortcut">Congela</string>
<string name="show_all">Mostra tutte le app</string>
<string name="settings">Impostazioni</string>
<string name="documents_ui">Apri interfaccia dei documenti</string>
<string name="settings_interaction">Interazione</string>
<string name="settings_cross_profile_file_chooser">Shuttle dei file</string>
<string name="device_admin_toast">Serve i permessi di Amministratore Dispositivo per far funzionare Shelter. Riprovare.</string>
<string name="settings_block_contacts_searching">Blocca la ricerca dei contatti</string>
<string name="settings_block_contacts_searching_desc">Impedisci l\'accesso dal profilo principale ai contatti dentro il profilo lavorativo.</string>
<string name="settings_services">Servizi</string>
<string name="settings_auto_freeze_service">Servizio di auto-congelamento</string>
<string name="settings_auto_freeze_service_desc">Quando lo schermo è bloccato, congela automaticamente le app avviate da \"Scorciatoia scongela e avvia\".</string>
<string name="settings_auto_freeze_delay">Ritardo di auto-congelamento</string>
<string name="settings_dont_freeze_foreground">Tralascia le app in primo piano</string>
<string name="settings_version">Versione</string>
<string name="settings_source_code">Codice sorgente</string>
<string name="settings_translate">Traduci</string>
<string name="provision_still_pending">Attendi mentre Shelter prepara il profilo per te …</string>
<string name="msg_device_unsupported">Autorizzazione negata o dispositivo non supportato</string>
<string name="work_profile_not_found">Profilo di lavoro non trovato. Si prega di riavviare l\'app per ricreare il profilo.</string>
<string name="work_profile_provision_failed">Non è possibile ricreare il profilo di lavoro. Riprova riavviando Shelter.</string>
<string name="clone_success">Applicazione \"%s\" clonata correttamente</string>
<string name="uninstall_success">App \"%s\" disinstallata correttamente</string>
<string name="freeze_success">App \"%s\" congelata correttamente</string>
<string name="unfreeze_success">App \"%s\" scongelata correttamente</string>
<string name="clone_fail_system_app">Non è possibile clonare le app di sistema su un profilo di cui Shelter non ha controllo.</string>
<string name="unsupported_launcher">Non è possibile aggiungere una scorciatoia. Si prega di contattare lo sviluppatore per maggiori informazioni.</string>
<string name="app_context_menu_title">Operazioni per %s</string>
<string name="freeze_all_success">Tutte le app nella lista \"Auto-congela\" sono state congelate correttamente.</string>
<string name="shortcut_create_success">Scorciatoia creata correttamente nel launcher.</string>
<string name="launch_app_fail">Non è possibile avviare l\'app %s perché non ha alcuna interfaccia utente.</string>
<string name="request_system_alert">Shelter ha bisogno di <b>Disegnare sopra le altre applicazioni</b> per far funzionare lo Shuttle dei file correttamente. Attiva <b>ENTRAMBE</b> le app di Shelter (Personale / Lavorativo) mostrate nella finestra dopo aver premuto \"Ok\". Questa autorizzazione è usata per avviare i servizi dello Shuttle dei file in secondo piano.</string>
<string name="continue_anyway">Continua comunque</string>
<string name="first_run_alert">Stai per configurare Shelter.
\n
\nQuest\'app dipende dal &lt;b&gt;Profilo lavorativo&lt;/b&gt; di Android per isolare le app. Se il brand o la ROM personalizzata rompe questa funzionalita(es. Xiaomi/MIUI), &lt;b&gt;USCITE&lt;/b&gt; adesso e &lt;b&gt;NON&lt;/b&gt; usate quest\'app.
\n
\nSe si sceglie di continuare, Shelter impostera\' un profilo di lavoro per te.
\n
\n(Se sei uno sviluppatore e ti piacerebbe rendere Shelter funzionante su ROM incompatibili come MIUI, il contrinuto al codice e\' benvenuto. Lo sviluppatore &lt;b&gt;NON SI ASSUME ALCUNA RESPONSABILITA\'&lt;/b&gt; se si rompe il dispositivo che fa girare l\'app su ROM incompatibili.)
\n
\nC\'e\' bisogno di ricevere una notifica per finire la configurazione, assicurarsi che il dispositivo &lt;b&gt;NON&lt;/b&gt; e\' in modalita Silenziosa.<b>Work Profile</b> feature of Android to isolate the apps. If you use a vendor / custom ROM that breaks related features (e.g. MIUI), you should now <b>QUIT</b> and <b>DO NOT</b> use this app.\n\nIf you choose to continue, Shelter will set up Work Profile for you.\n\nIf you are a developer and would like to make Shelter work on those incompatible ROMs like MIUI, pull requests are always welcome. The developer takes <b>ABSOLUTELY NO RESPONSIBILITY</b> if you break your device running an incompatible ROM.\n\nYou will need to receive a notification in order to finish setup, please make sure your device is <b>NOT</b> on Do Not Disturb mode.</string>
<string name="show_all_warning">Manipolare le app nascoste dalla lista può causare crash e ogni tipo di comportamento inaspettato. Tuttavia, questa funzionalità può essere utile quando le ROM personalizzate in modo errato non attivano in modo predefinito tutte le app di sistema necessarie nel profilo lavorativo. Se continui, ti assumi la responsabilità delle tue azioni.</string>
<string name="provision_finished">Configurazione di Shelter completata. Shelter verrà riavviato. Se Shelter non si avvia automaticamente, riaprilo a mano.</string>
<string name="miui_cannot_clone">La clonazione di app non di sistema su un altro profilo attualmente non è possibile su MIUI. Si prega di clonare il negozio delle app (es. <b>Play Store</b>) nell\'altro profilo e poi installarle da lì.</string>
<string name="service_auto_freeze_desc">Shelter congelerà automaticamente le app avviate da \"Scongela e avvia\" al prossimo blocco schermo.</string>
<string name="settings_cross_profile_file_chooser_desc">Quando attivo, potrai sfogliare / vedere / selezionare / copiare i file in Shelter dal profilo principale e viceversa, SOLO tramite l\'interfaccia dei documenti (chiamata File o Documenti nel tuo launcher) o tramite le app con il supporto all\'interfaccia dei documenti (ottengono accesso solo temporaneo ai file che scegli), mantenendo al contempo l\'isolamento del filesystem.</string>
<string name="work_mode_disabled">Sembra che tu abbia disattivato la modalità lavorativa mentre avviavi Shelter. Se la attivi adesso, riavvia Shelter.</string>
<string name="list_item_disabled">[Congelata] %s</string>
<string name="uninstall_fail_system_app">Non è possibile disinstallare le app di sistema in un profilo di cui Shelter non ha controllo.</string>
<string name="batch_operation">Operazione in massa</string>
<string name="create_unfreeze_shortcut">Crea una scorciatoia di scongelamento e/o avvio</string>
<string name="create_freeze_all_shortcut">Crea una scorciatoia di congelamento in massa</string>
<string name="install_app_to_profile">Installa l\'APK in Shelter</string>
<string name="settings_dont_freeze_foreground_desc">NON congelare le app in primo piano (con attività visibile) quando si blocca lo schermo. Ciò può essere utile per app come i riproduttori musicali, ma poi dovrai congelarle a mano tramite \"Scorciatoia di congelamento in massa\".</string>
<string name="request_usage_stats">Shelter ha bisogno dell\'autorizzazione <b>Statistiche d\'uso</b> per farlo. Attiva l\'autorizzazione per <b>ENTRAMBE</b> le app di Shelter mostrate nella finestra dopo aver premuto \"Ok\". Altrimenti questa funzione non funzionerà correttamente.</string>
<string name="install_app_to_profile_success">L\'installazione dell\'app nel profilo lavorativo è finita.</string>
<string name="settings_about">Al riguardo</string>
<string name="request_storage_manager">Shelter ha bisogno dell\'accesso a <b>Tutti i file</b> per lo Shuttle dei file. Attiva l\'autorizzazione per <b>ENTRAMBE</b> le app di Shelter (Personale / Lavorativo) mostrate nella finestra dopo aver premuto \"Ok\".</string>
<string name="setup_wizard_failed">Configurazione fallita</string>
<string name="setup_wizard_action_required">Azione richiesta</string>
<string name="setup_wizard_compatibility_text">Shelter viene sviluppato e testato su derivate AOSP-like di Android . Ciò include AOSP (Android Open Source Project), Google Android (sui Pixel) e <b>la maggior parte delle ROM open-source basate su AOSP</b> come LineageOS. Se il tuo telefono utilizza una delle derivate di Android elencate sopra, congratulazioni! Shelter probabilmente funzionerà correttamente sul tuo dispositivo.
\n
\nAlcuni produttori di dispositivi introducono personalizzazioni molto invasive nel codice di Android, risultanti in conflitti, incompatibilità e comportamenti inattesi. Anche alcune ROM personalizzate possono introdurre modifiche che intaccano la compatibilità, ma generalmente sono casi più rari a confronto di quelle introdotte dai produttori di telefoni.
\n
\nShelter è una mera interfaccia per la funzione Profilo di Lavoro fornita dal sistema. Se la funzione fornita dal sistema è malfunzionante o non-standard, <b>Shelter non può risolvere magicamente il problema da solo</b>. Se stai usando una versione di Android modificata dal produttore nota per rovinare i Profili di Lavoro, <b>sei stato avvisato</b>. Puoi comunque proseguire, ma non c\'è alcuna garanzia che Shelter si comporti correttamente in queste circostanze.</string>
<string name="setup_wizard_failed_text">Ci spiace informarti che non siamo stati in grado di configurare Shelter per te.
\n
\nSe non hai annullato la configurazione a mano, allora il motivo dell\'errore solitamente è a causa di un sistema pesantemente modificato, o di un conflitto tra Shelter e altri gestori del Profilo di Lavoro. Sfortunatamente, non c\'è molto che possiamo fare.
\n
\nClicca Avanti per uscire.</string>
<string name="setup_wizard_action_required_text">Ora dovresti vedere una notifica da Shelter. <b>Clicca quella notifica</b> per completare il processo di configurazione.
\n
\nSe non la vedi, assicurati che il dispositivo non sia in modalità Non Disturbare e prova a tirare giù il centro delle notifiche.
\n
\nPre ripristinare Shelter e ricominciare, puoi cancellare i dati di Shelter nelle impostazioni.</string>
<string name="setup_wizard_ready_text">Siamo pronti per configurare Shelter per te. Prima assicurati che il dispositivo <b>non</b> sia in modalità Non Disturbare, poiché tra poco dovrai <b>cliccare una notifica</b> per finalizzare il processo di configurazione.
\n
\nQuando è tutto pronto, clicca \"Avanti\" per iniziare la configurazione.</string>
<string name="setup_wizard_welcome">Benvenuti in Shelter</string>
<string name="setup_wizard_permissions">Una parola in merito alle autorizzazioni</string>
<string name="setup_wizard_compatibility">Compatibilità</string>
<string name="setup_wizard_ready">Iniziamo?</string>
<string name="setup_wizard_please_wait">Attendere prego…</string>
<string name="setup_wizard_please_wait_text">Stiamo provando a inizializzare il Profilo di Lavoro e configurare Shelter sul tuo dispositivo.</string>
<string name="setup_wizard_welcome_text">Shelter è un\'app che ti permette di usare altre applicazioni in un profilo isolato. Tutto questo viene fatto sfruttando la funzione <b>Profilo di Lavoro</b> di Android.
\n
\nClicca \"Avanti\" e ti daremo più informazioni riguardo Shelter, oltre a guidarti nel processo di configurazione.
\n
\nTi consigliamo di leggere attentamente tutte le pagine seguenti.</string>
<string name="setup_wizard_permissions_text">Shelter non chiederà alcuna autorizzazione in modo predefinito. Tuttavia, andando avanti con il processo di configurazione, Shelter proverà a creare un Profilo di Lavoro e di conseguenza a diventarne l\'<b>amministratore</b>.
\n
\nCiò darà a Shelter numerose autorizzazioni all\'interno del profilo, comparabili a quelle di un admin di dispositivo, ma pur sempre confinate nel profilo. Essere l\'amministratore del profilo è necessario perché Shelter funzioni correttamente.
\n
\nAlcune funzioni avanzate di Shelter potrebbero richiedere più autorizzazioni <b>fuori</b> dal Profilo di Lavoro. Se necessarie, Shelter le richiederà separatamente quando attivi le funzioni corrispondenti.</string>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_continue">להמשיך</string>
<string name="setup_wizard_welcome">ברוכים הבאים Shelter</string>
<string name="setup_wizard_permissions">מילה על הרשאות</string>
<string name="setup_wizard_compatibility">תאימות</string>
<string name="first_run_alert_cancel">ביי</string>
<string name="device_admin_desc">שירות בידוד אפליקציות</string>
<string name="device_admin_explanation">Shelter צריך להפוך ל-מנהל המכשיר כדי לבצע את משימות הבידוד שלו.</string>
<string name="setup_wizard_welcome_text">Shelter הוא יישום שעוזר לך להפעיל יישומים אחרים בפרופיל מבודד. זה עושה זאת על ידי שימוש בתכונה <b>פרופיל עבודה</b> של Android.
\n
\nלחץ על \"הבא\", ואנו נספק לך מידע נוסף על Shelter, וננחה אותך בתהליך ההגדרה.
\n
\nאנו ממליצים לקרוא בעיון את כל העמודים הבאים.</string>
<string name="allow_cross_profile_widgets">אפשר ווידג\'טים בפרופיל הראשי</string>
<string name="install_app_to_profile_success">התקנת האפליקציה הסתיימה בפרופיל העבודה.</string>
<string name="setup_wizard_ready">מוכן?</string>
<string name="setup_wizard_ready_text">כעת אנו מוכנים להקים עבורך את Shelter. אם המכשיר שלך פועל עם אנדרואיד 7 ומטה, אנא ודא תחילה שהמכשיר שלך <b>לא</b> במצב \'נא לא להפריע\', מכיוון שתצטרך <b>ללחוץ על הודעה</b> מאוחר יותר כדי לסיים תהליך ההגדרה.
\n
\nכשתהיה מוכן, לחץ על \"הבא\" כדי להתחיל בתהליך ההגדרה.</string>
<string name="setup_wizard_please_wait">נא להמתין…</string>
<string name="setup_wizard_please_wait_text">אנחנו מנסים לאתחל את פרופיל העבודה ולהגדיר את Shelter במכשיר שלך.</string>
<string name="setup_wizard_failed">ההגדרה נכשלה</string>
<string name="setup_wizard_action_required">פעולה נדרשת</string>
<string name="setup_wizard_action_required_text">כעת אתה אמור לראות הודעה מ-Shelter. <b>אנא לחץ על הודעה זו</b> כדי לסיים את תהליך ההגדרה.
\n
\nאם אינך רואה את ההתראה, ודא שהמכשיר שלך אינו במצב \'נא לא להפריע\' ונסה למשוך את מרכז ההתראות כלפי מטה.
\n
\nכדי לאפס את Shelter ולהתחיל מחדש, אתה יכול לנקות את הנתונים של Shelter בהגדרות.</string>
<string name="notifications_important">מקלט חשוב</string>
<string name="finish_provision_title">לחץ כאן כדי לסיים את הגדרת מקלט</string>
<string name="finish_provision_desc">מזל טוב! אתה במרחק קליק אחד מסיום ההגדרה של Shelter.</string>
<string name="service_desc">Shelter פועל כעת…</string>
<string name="service_auto_freeze_title">הקפאה אוטומטית בהמתנה</string>
<string name="service_title">שירות Shelter</string>
<string name="service_auto_freeze_desc">Shelter יקפיא אוטומטית אפליקציות שהושקו מ-\"Unfreeze &amp; Launch\" באירוע נעילת המסך הבא.</string>
<string name="service_auto_freeze_now">להקפיא עכשיו</string>
<string name="app_installing">מתקין...</string>
<string name="fragment_profile_main">ראשי</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[מוקפא] %s</string>
<string name="batch_operation">תפעול אצווה</string>
<string name="clone_to_work_profile">שיכפול ל-Shelter (פרופיל עבודה)</string>
<string name="clone_to_main_profile">שיכפול לפרופיל ראשי</string>
<string name="uninstall_app">הסר התקנה</string>
<string name="freeze_app">הקפאה</string>
<string name="launch">הרץ</string>
<string name="unfreeze_app">להפשיר</string>
<string name="create_unfreeze_shortcut">צור בטל הקפאה ו/או הפעל קיצור דרך</string>
<string name="unfreeze_and_launch">בטל את ההקפאה והפעל</string>
<string name="auto_freeze">הקפאה אוטומטית</string>
<string name="freeze_all">הקפאת אצווה</string>
<string name="search">חיפוש</string>
<string name="create_freeze_all_shortcut">צור קיצור דרך להקפאת אצווה</string>
<string name="freeze_all_shortcut">הקפאה</string>
<string name="install_app_to_profile">התקן APK לתוך Shelter</string>
<string name="setup_wizard_permissions_text">כברירת מחדל, Shelter לא יבקש הרשאות בודדות. עם זאת, לאחר שתמשיך בתהליך ההגדרה, Shelter ינסה להגדיר פרופיל עבודה ולפיכך יהפוך ל<b>מנהל הפרופיל</b> של הפרופיל האמור.
\n
\nזה יעניק ל-Shelter רשימה נרחבת של הרשאות בתוך הפרופיל, הדומה לזו של מנהל מכשיר, אם כי מוגבלת לפרופיל. להיות מנהל הפרופילים הכרחי עבור רוב הפונקציונליות של Shelter.
\n
\nחלק מהתכונות המתקדמות של Shelter עשויות לדרוש הרשאות נוספות <b>מחוץ</b> לפרופיל העבודה. בעת הצורך, Shelter יבקש את ההרשאות הללו בנפרד כאשר תפעיל את התכונות המתאימות.</string>
<string name="setup_wizard_compatibility_text">Shelter פותח ונבדק על נגזרות אנדרואיד דמויות AOSP. זה כולל AOSP (Android Open Source Project), Google Android (על פיקסלים), ו<b>רוב ה-ROMs המותאמים אישית מבוססי AOSP</b> כגון LineageOS. אם בטלפון שלך פועלת אחת מנגזרות האנדרואיד המפורטות למעלה, אז מזל טוב! Shelter כנראה הולך לעבוד כראוי במכשיר שלך.
\n
\nספקי מכשירים מסוימים מציגים התאמות אישיות פולשניות מאוד לבסיס הקוד של אנדרואיד, וכתוצאה מכך התנגשויות, חוסר תאימות והתנהגות בלתי צפויה. חלק מה-ROMs המותאמים אישית יכולים גם להציג שינויים שוברי תאימות, אך בדרך כלל אלו מקרים נדירים יותר בהשוואה לאי תאימות שהוצגו על ידי ספקי הטלפון.
\n
\nShelter הוא רק ממשק לתכונת פרופיל העבודה שמסופקת על ידי המערכת. אם התכונה שסופקה על ידי המערכת פגומה או לא סטנדרטית, <b>Shelter לא הצליח לפתור את הבעיה בכוחות עצמו</b>. אם אתה משתמש כעת בגרסת אנדרואיד ששונתה על ידי הספק, שידוע שהיא מפרה את פרופילי העבודה, <b>הוזהרתם</b>. אתה יכול להמשיך בכל מקרה, אבל אין ערובה ששלטר יתנהג נכון בנסיבות אלה.</string>
<string name="setup_wizard_failed_text">אנו מצטערים להודיע לך שלא הצלחנו להקים עבורך את מקלט.
\n
\nאם למכשיר שלך כבר היה פרופיל עבודה, מהתקנה קודמת של Shelter או מאפליקציה אחרת, תצטרך להסיר את הפרופיל הזה בהגדרות -&gt; חשבון לפני ש-Shelter יוכל להמשיך.
\n
\nאחרת, אם לא ביטלת את ההגדרה באופן ידני, הסיבה לכשל נובעת לרוב ממערכת ששונתה מאוד, או התנגשות בין Shelter ומנהלי פרופיל עבודה אחרים. למרבה הצער, אין הרבה מה שאנחנו יכולים לעשות בנידון.
\n
\nלחץ על \"הבא\" כדי לצאת.</string>
<string name="show_all">הצג את כל האפליקציות</string>
<string name="documents_ui">פתח את ממשק המשתמש של מסמכים</string>
<string name="settings">הגדרות</string>
<string name="settings_interaction">אינטראקציה</string>
<string name="settings_cross_profile_file_chooser">מעבורת קבצים</string>
<string name="uninstall_fail_system_app">לא ניתן להסיר את ההתקנה של אפליקציות מערכת בפרופיל של-Shelter אין שליטה עליו.</string>
<string name="settings_block_contacts_searching">חסום חיפוש אנשי קשר</string>
<string name="settings_services">שירותים</string>
<string name="settings_auto_freeze_service">שירות הקפאה אוטומטית</string>
<string name="settings_auto_freeze_delay">השהיית הקפאה אוטומטית</string>
<string name="settings_dont_freeze_foreground">דלג על אפליקציות חזית</string>
<string name="settings_about">אודות</string>
<string name="settings_version">גירסה</string>
<string name="settings_translate">תרגם</string>
<string name="settings_bug_report">דוח באגים / מעקב אחר בעיות</string>
<string name="work_profile_provision_failed">לא ניתן להקצות פרופיל עבודה. תוכל לנסות שוב על ידי הפעלה מחדש של Shelter.</string>
<string name="uninstall_success">היישום \"%s\" הוסר בהצלחה</string>
<string name="freeze_success">האפליקציה \"%s\" הוקפאה בהצלחה</string>
<string name="unsupported_launcher">לא ניתן להוסיף קיצורי דרך למפעיל שלך. אנא צור קשר עם המפתח לקבלת מידע נוסף.</string>
<string name="app_context_menu_title">פעולות עבור %s</string>
<string name="shortcut_create_success">קיצור דרך נוצר על הלאנצר שלך.</string>
<string name="launch_app_fail">לא ניתן להפעיל את האפליקציה %s כי אין לה GUI.</string>
<string name="miui_cannot_clone">שכפול אפליקציות שאינן מערכתיות לפרופיל אחר אינו אפשרי כרגע ב-MIUI. נא לשכפל את חנות האפליקציות של המערכת שלך (למשל <b>חנות Play</b>) לפרופיל האחר ולאחר מכן התקן אפליקציות משם.</string>
<string name="continue_anyway">המשך בכל זאת</string>
<string name="freeze_all_success">כל האפליקציות ברשימת \"הקפאה אוטומטית\" הוקפאו בהצלחה.</string>
<string name="work_mode_disabled">נראה שהשבתת את מצב עבודה בזמן הפעלת Shelter. אם הפעלת את זה עכשיו, הפעל שוב את Shelter.</string>
<string name="provision_finished">הגדרת המקלט הושלמה. כעת מפעיל מחדש את Shelter. אם Shelter לא הופעל אוטומטית, תוכל להפעיל אותו שוב מהמפעיל שלך.</string>
<string name="msg_device_unsupported">ההרשאה נדחתה או מכשיר לא נתמך</string>
<string name="clone_success">היישום \"%s\" שוכפל בהצלחה</string>
<string name="work_profile_not_found">פרופיל עבודה לא נמצא. אנא הפעל מחדש את האפליקציה כדי להקצות מחדש את הפרופיל.</string>
<string name="settings_dont_freeze_foreground_desc">אל תקפיא אפליקציות בחזית (עם פעילות גלויה) כאשר אתה נועל את המסך. זה יכול להיות שימושי עבור אפליקציות כמו נגני מוזיקה, אבל תצטרך להקפיא אותן באופן ידני באמצעות \"קיצור דרך להקפאת אצווה\" לאחר מכן.</string>
<string name="settings_source_code">קוד מקור</string>
<string name="settings_block_contacts_searching_desc">דחיית גישה מהפרופיל הראשי לאנשי קשר בתוך פרופיל העבודה.</string>
<string name="unfreeze_success">האפליקציה \"%s\" הופשרה בהצלחה</string>
<string name="clone_fail_system_app">לא ניתן לשכפל אפליקציות מערכת לפרופיל של-Shelter אין שליטה עליו.</string>
<string name="settings_auto_freeze_service_desc">כאשר המסך נעול, הקפיא אוטומטית אפליקציות שהופעלו מ\"בטל הקפאה והפעל קיצור דרך\".</string>
<string name="show_all_warning">מניפולציה של אפליקציות המוסתרות מהרשימה עלולה לגרום לקריסות ולכל מיני התנהגות בלתי צפויה. עם זאת, תכונה זו יכולה להיות שימושית כאשר ROMs פגומים המותאמים אישית של ספקים אינם מפעילים את כל אפליקציות המערכת הנחוצות בפרופיל העבודה כברירת מחדל. אם תמשיך, אתה לבד.</string>
<string name="settings_cross_profile_file_chooser_desc">כאשר מופעל, תוכל לדפדף / להציג / לבחור / להעתיק קבצים ב-Shelter מהפרופיל הראשי ולהיפך, רק דרך ממשק המשתמש של מסמכים (ששמו קבצים או מסמכים במפעיל שלך) או אפליקציות עם תמיכה בממשק המשתמש של מסמכים (הם רק מרוויחים גישה זמנית לקבצים שתבחר בממשק המשתמש של מסמכים), תוך שמירה על בידוד מערכת הקבצים.</string>
<string name="request_usage_stats">Shelter זקוק להרשאת <b>סטטיסטיקות שימוש</b> כדי לעשות זאת. אנא הפעל את ההרשאה עבור אפליקציות מקלט <b>שתיים</b> המוצגות בתיבת הדו-שיח לאחר לחיצה על \"אישור\". אם לא תעשה זאת, תכונה זו לא תפעל כראוי.</string>
<string name="request_storage_manager">Shelter זקוק לגישה אל <b>כל הקבצים</b> עבור סייר הקבצים. אנא הפעל את ההרשאה עבור יישומי מקלט <b>שניים </b> (אישי / עבודה) המוצגים בתיבת הדו-שיח לאחר לחיצה על \"אישור\".</string>
<string name="request_system_alert">Shelter צריך <b>לצייר מעל אפליקציות אחרות</b> כדי ש-File Shuttle יפעל כהלכה. אנא הפעל את ההרשאה עבור יישומי מקלט <b>שניים </b> (אישי / עבודה) המוצגים בתיבת הדו-שיח לאחר לחיצה על \"אישור\". הרשאה זו משמשת להפעלת שירותי File Shuttle ברקע.</string>
</resources>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">終了</string>
<string name="first_run_alert_continue">続行</string>
<string name="device_admin_desc">アプリ隔離サービス</string>
<string name="device_admin_explanation">隔離処理を行うためにShelterをデバイス管理者に設定する必要があります。</string>
<string name="notifications_important">Shelterの重要な通知</string>
<string name="finish_provision_title">タップしてShelterのセットアップを完了してください</string>
<string name="finish_provision_desc">おめでとうございますShelterのセットアップ完了まであと一歩です。</string>
<string name="service_title">Shelterサービス</string>
<string name="service_desc">Shelterは実行中です…</string>
<string name="service_auto_freeze_title">自動凍結は保留中です</string>
<string name="service_auto_freeze_now">今すぐ凍結</string>
<string name="service_auto_freeze_desc">Shelterは、次の画面ロック時に「凍結解除起動」から実行したアプリを自動でフリーズさせます。</string>
<string name="app_installing">インストール中...</string>
<string name="fragment_profile_main">メイン</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[凍結中%s]</string>
<string name="batch_operation">一括処理</string>
<string name="clone_to_main_profile">標準プロファイルに複製</string>
<string name="uninstall_app">アンインストール</string>
<string name="freeze_app">凍結</string>
<string name="unfreeze_app">凍結解除</string>
<string name="launch">起動</string>
<string name="unfreeze_and_launch">凍結解除して起動</string>
<string name="auto_freeze">自動凍結</string>
<string name="allow_cross_profile_widgets">メインプロファイル内でウィジェットの作成を許可する</string>
<string name="search">検索</string>
<string name="freeze_all">一括凍結</string>
<string name="create_freeze_all_shortcut">自動凍結するショートカットを作成</string>
<string name="freeze_all_shortcut">凍結</string>
<string name="install_app_to_profile">APKをShelter内にインストール</string>
<string name="show_all">全てのアプリを表示</string>
<string name="documents_ui">標準ファイラーを開く</string>
<string name="settings">設定</string>
<string name="settings_block_contacts_searching">連絡先の検索をブロック</string>
<string name="settings_services">サービス</string>
<string name="settings_auto_freeze_service">自動凍結サービス</string>
<string name="settings_dont_freeze_foreground">フォアグラウンドで実行中のアプリをスキップ</string>
<string name="settings_about">このアプリについて</string>
<string name="settings_version">バージョン</string>
<string name="settings_source_code">ソースコード</string>
<string name="settings_translate">翻訳</string>
<string name="settings_interaction">対話型</string>
<string name="settings_auto_freeze_delay">自動凍結する時間</string>
<string name="show_all_warning">リストから非表示になっているアプリを操作すると、クラッシュや予期せぬ動作を引き起こす可能性があります。この機能は、ベンダーによって欠陥のあるカスタマイズされたROMがデフォルトで作業プロファイルで必要なシステムアプリをすべて有効にしていない場合に便利です。自己責任で続行してください。</string>
<string name="settings_auto_freeze_service_desc">画面ロック中に「凍結解除&起動」のショートカットから実行されたアプリを自動的に凍結します。</string>
<string name="device_admin_toast">Shelterが正常に動作するためにデバイス管理者として設定する必要があります。再試行してください。</string>
<string name="provision_still_pending">Shelterがプロファイルを準備しています。しばらくお待ちください…</string>
<string name="provision_finished">Shelterのセットアップが完了しました。Shelterを再起動しています。Shelterが自動的に再度立ち上がらない場合ランチャーから手動で起動してください。</string>
<string name="msg_device_unsupported">権限が付与されてないか未対応の端末です</string>
<string name="continue_anyway">無視して続行</string>
<string name="work_profile_not_found">仕事用プロファイルが見つかりません。プロファイルを再生成するためにアプリを再起動してください。</string>
<string name="work_profile_provision_failed">プロファイルを生成できませんでした。Shelterを再起動して再試行できます。</string>
<string name="work_mode_disabled">Shelterの実行中に仕事用プロファイルが無効になりました。再度有効にした後Shelterを再起動してください。</string>
<string name="clone_success">アプリ「%s」は正常に複製されました</string>
<string name="uninstall_success">アプリ「%s」は正常にアンインストールされました</string>
<string name="freeze_success">アプリ「%s」は正常に凍結されました</string>
<string name="unfreeze_success">アプリ「%s」は正常に凍結解除されました</string>
<string name="clone_fail_system_app">Shelterに制御できないシステムアプリを複製することができませんでした。</string>
<string name="uninstall_fail_system_app">Shelterに制御できないシステムアプリをアンインストールすることができませんでした。</string>
<string name="unsupported_launcher">ホーム画面ショートカットを追加できませんでした。詳細な情報は開発者にご確認ください。</string>
<string name="app_context_menu_title">%sの操作</string>
<string name="freeze_all_success">自動凍結リストにある全てのアプリは正常に凍結されました。</string>
<string name="shortcut_create_success">ショートカットがホーム画面に作成されました。</string>
<string name="request_usage_stats">この操作を行うためにはShelterに<b>使用状況へのアクセス</b>を許可する必要があります。OKをタップした後、表示されるShelterアプリの<b>二つとも</b>に権限を付与してください。これを行わないとこの機能は正常に動作しません。</string>
<string name="launch_app_fail">GUIが見つからないためアプリ%sを起動することができません。</string>
<string name="request_storage_manager">ファイル同期を利用するにはShelterに<b>全てのファイルへのアクセス</b>を許可する必要があります。OKをタップした後、表示されるShelterアプリの個人用/仕事用の<b>二つとも</b>に権限を付与してください。</string>
<string name="miui_cannot_clone">MIUIでは現在非システムアプリを別のプロファイルに複製できません。システムのアプリストア<b>Playストア</b>など)を別のプロファイルに複製してそこからアプリをインストールしてください。</string>
<string name="first_run_alert">Shelterのセットアップを開始しようとしています。
\n
\nこのアプリはAndroidの<b>仕事用プロファイル</b>機能を使用することでアプリの隔離を行います。あなたの端末のベンダーのまたはカスタムROMがこの機能と競合する場合、MIUIなどはこのアプリを<b>使用せず終了</b>してください。
\n
\n続行すると、Shelterは仕事用プロファイルのセットアップを行います。
\n
\nもしあなたが開発者でShelterをMIUIのような未対応のROMに対応させたいならば、プルリクエストを歓迎します。未対応のROMでこのアプリを使用しようとして、端末に損害が生じても私は<b>一切の責任を負いません</b>
\n
\nセットアップの完了のために通知を受け取る必要があるためDNDマナーモードを一時的に無効にしてください。</string>
<string name="clone_to_work_profile">Shelter(仕事用プロファイル)内に複製</string>
<string name="create_unfreeze_shortcut">凍結解除・起動するショートカットを作成する</string>
<string name="install_app_to_profile_success">仕事用プロファイル内にアプリがインストールされました。</string>
<string name="settings_block_contacts_searching_desc">メインプロファイルから仕事用プロファイル内の連絡先へのアクセスを拒否します。</string>
<string name="settings_bug_report">バグレポート/イシュートラッカー</string>
<string name="settings_cross_profile_file_chooser">ファイル同期</string>
<string name="settings_cross_profile_file_chooser_desc">有効にした場合、メインプロファイルからShelter内のファイルを管理できるようになります。Shelter内のファイルへはDocument UI標準ファイラーのみから隔離されたファイルシステムにアクセスできます。</string>
<string name="request_system_alert">ファイル同期が正常に機能するためにShelterに<b>他のアプリに重ねて表示</b>を許可する必要があります。OKをタップした後、表示されるShelterアプリの個人用/仕事用の<b>二つとも</b>に権限を付与してください。この権限はファイル同期サービスがバックグラウンドで動作するために使われます。</string>
<string name="setup_wizard_welcome_text">Shelterはアプリを隔離されたプロファイル内で実行するためのツールです。このアプリではAndroidの <b>仕事用プロファイル</b> 機能を利用しています。
\n
\n「次へ」をタップするとShelterの詳細が表示されセットアップに進みます。
\n
\n次のページの項目をよく読んでおくことを推奨します。</string>
<string name="setup_wizard_compatibility">互換性</string>
<string name="setup_wizard_ready">準備はよろしいですか?</string>
<string name="setup_wizard_please_wait">しばらくお待ちください…</string>
<string name="setup_wizard_please_wait_text">仕事用プロファイルを設定してShelterをセットアップしようとしています。</string>
<string name="setup_wizard_failed">セットアップに失敗しました</string>
<string name="setup_wizard_action_required">操作が必要です</string>
<string name="setup_wizard_welcome">Shelterへようこそ</string>
<string name="settings_dont_freeze_foreground_desc">画面をロックしたときに、フォアグラウンドのアプリ(アクティビティが表示されているもの)を凍結しない。これは音楽プレーヤーなどのアプリには便利ですが、その後「バッチフリーズ・ショートカット」を使って手動で凍結する必要があります。</string>
<string name="setup_wizard_ready_text">これで、Shelterの設定が完了しました。Android 7以下の端末の場合、セットアッププロセスを完了させるには、後で<b>通知をタップ</b>する必要があるため、まずお使いのデバイスが<b>サイレントモードになっていない</b>ことを確認してください。
\n
\n準備ができたら、「次へ」をタップして、セットアッププロセスを開始します。</string>
<string name="setup_wizard_permissions">権限についてひとこと</string>
<string name="setup_wizard_action_required_text">これで、Shelterからの通知が表示されるはずです。<b>通知をタップして</b>、セットアッププロセスを終了してください。
\n
\n通知が表示されない場合は、デバイスが「サイレントモード」になっていないことを確認し、通知センターを下げてみてください。
\n
\nShelterをリセットして最初からやり直すには、「設定」でShelterのデータを消去してください。</string>
<string name="setup_wizard_permissions_text">デフォルトでは、Shelterは個々の権限を要求しません。しかし、セットアッププロセスを進めると、Shelterは仕事用プロファイルを設定しようとします。設定が完了すると、そのプロファイルの<b>プロファイルマネージャー</b>になります。
\n
\nこれにより、Shelterには、プロファイル内に限定されてはいるものの、デバイス管理者に匹敵する幅広い権限が与えられます。プロファイルマネージャーになることは、Shelterのほとんどの機能に必要です。
\n
\nShelterの高度な機能の中には、仕事用プロファイル<b>以外</b>のより多くの権限を必要とするものがあります。必要な場合は、あなたが対応する機能を有効したときに、Shelterはそれらの権限を別途要求します。</string>
<string name="setup_wizard_compatibility_text">Shelterは、AOSPライクなAndroid派生機種で開発・テストされています。これには、AOSPAndroid Open Source Project、Google AndroidPixel、およびLineageOSなどの<b>ほとんどのAOSPベースのオープンソース・カスタムROM</b>が含まれます。お使いの携帯電話が上記のAndroid派生機種のいずれかを搭載しているのであれば、おめでとうございます。シェルターはおそらくあなたの端末で正しく動作するでしょう。
\n
\n一部の端末ベンダーは、Androidのコードベースに非常に侵襲的なカスタマイズを導入しているため、競合や非互換性、予期せぬ動作が発生することがあります。また、カスタムROMの中には、互換性を壊すような変更を加えるものもありますが、一般的には、端末ベンダーが導入した非互換性に比べれば、そのようなことはほとんどありません。
\n
\nShelterは、システムが提供する機能のインターフェイスに過ぎません。システムが提供する機能が壊れていたり、非標準であったりした場合、<b>Shelter は魔法のように独自に問題を解決することはできません。</b>仕事用プロファイルが壊れることが知られているベンダー修正の Android バージョンを現在使用している場合は、<b>警告</b>されます。いずれにしても続行しても構いませんが、このような状況下でシェルターが正しく動作するという保証はありません。</string>
<string name="setup_wizard_failed_text">Shelterのセットアップを行うことができませんでした。
\n
\nお使いのデバイスに、以前にShelterをインストールしたことがある場合や、他のアプリケーションで作成した仕事用プロファイルがすでに設定されている場合は、Shelterの設定を始める前に、「設定」→「アカウント」→「仕事用」でそのプロファイルを削除する必要があります。
\n
\nそうでなければ、あなたが途中でセットアップをキャンセルしたわけではない場合、失敗の原因は、システムが大きく変更されているか、Shelterと他の仕事用プロファイルマネージャーとの間で競合が発生していることがほとんどです。残念ながら、これに対してできることはあまりありません。
\n
\nNext \"をタップして終了します。</string>
</resources>

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="setup_wizard_welcome">Shelter에 어서오세요</string>
<string name="first_run_alert_cancel">돌아가기</string>
<string name="first_run_alert_continue">계속 진행</string>
<string name="device_admin_desc">앱 격리 서비스</string>
<string name="setup_wizard_permissions">권한 관련 안내</string>
<string name="service_auto_freeze_desc">다음 화면 잠금이 실행될 때 Shelter가 \"활성화 후 실행\"을 통해 실행된 앱을 자동으로 비활성화 처리합니다.</string>
<string name="unfreeze_app">활성화</string>
<string name="setup_wizard_ready">준비되셨나요?</string>
<string name="setup_wizard_failed">설정 실패</string>
<string name="setup_wizard_action_required">수동 조치 필요</string>
<string name="notifications_important">Shelter 알림</string>
<string name="service_title">Shelter 서비스</string>
<string name="service_auto_freeze_title">자동 비활성화 대기 중</string>
<string name="app_installing">설치 중...</string>
<string name="service_auto_freeze_now">지금 비활성화 시작하기</string>
<string name="fragment_profile_main">개인</string>
<string name="fragment_profile_work">직장</string>
<string name="uninstall_app">제거하기</string>
<string name="batch_operation">일괄 작업</string>
<string name="clone_to_work_profile">직장 프로필로 복제하기</string>
<string name="clone_to_main_profile">개인 프로필로 복제하기</string>
<string name="launch">실행하기</string>
<string name="freeze_all_shortcut">비활성화</string>
<string name="freeze_all">일괄 비활성화</string>
<string name="create_unfreeze_shortcut">활성화/실행 바로 가기 만들기</string>
<string name="allow_cross_profile_widgets">개인 프로필에서 위젯 표시 허용</string>
<string name="create_freeze_all_shortcut">일괄 비활성화 바로 가기 만들기</string>
<string name="auto_freeze">자동 비활성화</string>
<string name="documents_ui">파일 관리자 열기</string>
<string name="settings_interaction">프로필 간 동작</string>
<string name="show_all">모든 앱 보이기</string>
<string name="install_app_to_profile_success">앱이 직장 프로필에 설치되었습니다.</string>
<string name="settings_cross_profile_file_chooser">프로필 간 파일 공유</string>
<string name="settings_auto_freeze_service">자동 비활성화 서비스</string>
<string name="settings_auto_freeze_delay">자동 비활성화 대기 시간</string>
<string name="settings_dont_freeze_foreground">포어그라운드 실행 중인 앱 제외하기</string>
<string name="settings_version">버전</string>
<string name="settings_translate">번역</string>
<string name="settings_bug_report">버그 제보 / 이슈 추적 시스템</string>
<string name="work_profile_not_found">직장 프로필을 찾을 수 없습니다. 프로필을 다시 구성하려면 앱을 다시 실행해 주세요.</string>
<string name="provision_finished">Shelter의 설정 작업이 완료되어 Shelter를 다시 시작합니다. Shelter가 자동으로 시작되지 않을 경우 홈 화면에서 수동으로 Shelter를 실행해 주세요.</string>
<string name="clone_success">\"%s\" 앱이 복제되었습니다</string>
<string name="uninstall_success">\"%s\" 앱이 제거되었습니다</string>
<string name="freeze_success">\"%s\" 앱이 비활성화되었습니다</string>
<string name="clone_fail_system_app">Shelter가 제어하지 않는 프로필에는 시스템 앱을 복제할 수 없습니다.</string>
<string name="shortcut_create_success">홈 화면에 바로 가기 아이콘을 만들었습니다.</string>
<string name="uninstall_fail_system_app">Shelter가 제어하지 않는 프로필의 시스템 앱은 제거할 수 없습니다.</string>
<string name="unsupported_launcher">홈 화면에 바로 가기 아이콘을 만들지 못했습니다. 상세한 정보는 개발자에게 문의해 주세요.</string>
<string name="app_context_menu_title">%s 앱에 대해 수행할 작업</string>
<string name="freeze_all_success">\"자동 비활성화\" 목록에 등록된 모든 앱이 비활성화되었습니다.</string>
<string name="continue_anyway">계속 진행</string>
<string name="miui_cannot_clone">현재 MIUI 환경에서는 비 시스템 앱을 다른 프로필로 복제하는 기능이 지원되지 않습니다. 현재 시스템의 앱 스토어(<b>Play Store</b> 등)를 다른 프로필로 복제하신 후 복제된 앱 스토어 애플리케이션에서 앱을 내려받아 주세요.</string>
<string name="device_admin_explanation">Shelter가 격리 작업을 진행하려면 기기 관리자 권한을 필요로 합니다.</string>
<string name="settings_cross_profile_file_chooser_desc">이 기능을 활성화하면 개인 및 직장 프로필에서 각각 상대 프로필의 파일에 접근하거나 상대 프로필 간 파일 작업을 할 수 있습니다. 이 기능은 파일 시스템 간 격리를 유지한 상태에서 문서 사용자 인터페이스(Documents UI, 보통 \"파일\" 또는 \"문서\"라는 이름을 가진 기본 파일 관리자 앱) 또는 이를 지원(문서 사용자 인터페이스를 통해 선택된 파일에 한해서만 임시적으로 접근 허용)하는 앱을 통해서만 작동합니다.</string>
<string name="setup_wizard_compatibility">호환성</string>
<string name="setup_wizard_please_wait">잠시만 기다려 주세요…</string>
<string name="install_app_to_profile">직장 프로필에 APK 설치하기</string>
<string name="request_usage_stats">이 기능을 켜려면 <b>사용 기록 액세스</b> 권한을 필요로 합니다. \"확인\" 버튼을 누르신 후 <b>양쪽 프로필 모두의 Shelter 앱에 대해 해당 권한을 허용</b>해 주세요. 해당 권한이 허용되지 않은 경우 기능이 정상적으로 작동하지 않습니다.</string>
<string name="request_storage_manager">프로필 간 파일 공유 기능을 켜려면 <b>모든 파일에 액세스</b> 권한을 필요로 합니다. \"확인\" 버튼을 누르신 후 개인 및 직장 <b>양쪽 프로필 모두의 Shelter 앱에 대해 해당 권한을 허용</b>해 주세요.</string>
<string name="setup_wizard_please_wait_text">지금 직장 프로필 생성 및 Shelter의 설정 작업을 진행하고 있습니다.</string>
<string name="settings_about">정보</string>
<string name="request_system_alert">프로필 간 파일 공유 기능을 정상적으로 사용하려면 <b>다른 앱 위에 표시</b> 권한을 필요로 합니다. \"확인\" 버튼을 누르신 후 개인 및 직장 <b>양쪽 프로필 모두의 Shelter 앱에 대해 해당 권한을 허용</b>해 주세요. 해당 권한은 프로필 간 파일 공유 서비스를 백그라운드로 실행시킬 때 필요합니다.</string>
<string name="setup_wizard_welcome_text">Shelter는 Android 시스템의 <b>직장 프로필</b> 기능을 이용하여 격리된 프로필 내에서 다른 앱을 실행할 수 있도록 도와줍니다.
\n
\n\"다음\" 버튼을 누르시면 Shelter에 대한 상세한 정보와 함께 설정 과정이 안내됩니다.
\n
\n원활한 설정 과정을 위해 다음 페이지부터 표시되는 모든 내용을 자세히 읽어 주시기 바랍니다.</string>
<string name="setup_wizard_failed_text">죄송합니다. Shelter 설정에 실패했습니다.
\n
\n만약 이전에 설치된 Shelter 또는 다른 앱에 의해 직장 프로필이 활성화되었다면 Shelter 설정을 진행하기에 앞서 [설정] → [계정]에서 해당 프로필을 제거해 주세요.
\n
\n위 사항에 해당하지 않으며 설정 과정을 임의로 중단하지 않았다면, 큰 규모의 변형 또는 수정이 가해진 시스템 또는 Shelter와 다른 직장 프로필 관리 도구와의 충돌이 원인일 수 있으며 이 경우 정상적인 Shelter 설정 작업이 어렵습니다.
\n
\n\"다음\" 버튼을 누르시면 Shelter가 종료됩니다.</string>
<string name="launch_app_fail">%s 앱에 그래픽 인터페이스가 존재하지 않아 실행할 수 없습니다.</string>
<string name="finish_provision_title">Shelter 설정 작업 마무리하기</string>
<string name="settings">설정</string>
<string name="settings_source_code">소스 코드</string>
<string name="service_desc">Shelter 서비스가 실행 중입니다.</string>
<string name="show_all_warning">목록에서 숨겨진 앱을 수정할 경우 앱 오작동을 비롯한 예상치 못한 현상을 유발할 수 있습니다. 다만 오류가 있는 제조사 ROM으로 인해 모든 필수 시스템 앱이 직장 프로필에서 활성화되지 않았다면 이 기능이 유용할 수 있습니다. 계속 진행하시는 경우 상기된 위험을 감수하는 것입니다.</string>
<string name="search">검색</string>
<string name="setup_wizard_ready_text">이제 Shelter 설정 작업을 시작합니다. 본 기기가 Android 버전 7 이하를 실행 중이라면, 방해 금지 모드가 <b>꺼진 상태</b>인지 꼭 확인해 주세요. 이후 <b>푸시 알림을 눌러야</b> 설정 작업이 마무리되기 때문입니다.
\n
\n\"다음\" 버튼을 누르시면 설정 작업이 진행됩니다.</string>
<string name="finish_provision_desc">이곳을 누르시면 Shelter의 설정 작업이 모두 마무리됩니다.</string>
<string name="settings_block_contacts_searching">연락처 검색 차단</string>
<string name="settings_block_contacts_searching_desc">개인 프로필에서 직장 프로필 내에 저장된 연락처로의 접근을 막습니다.</string>
<string name="setup_wizard_compatibility_text">Shelter는 AOSP(Android Open Source Project), Google Android(Pixel 탑재 운영 체제) 및 <b>대다수의 AOSP 기반 오픈 소스 커스텀 ROM</b>(LineageOS 등)과 같이 AOSP를 기반으로 파생된 Android 시스템들에서 개발 및 테스트되었습니다. 본 기기가 상기된 Android 시스템 중 하나를 실행하고 있다면, 이는 Shelter가 본 기기에서 올바르게 동작할 가능성이 높다는 뜻입니다. 👏
\n
\n그러나 일부 기기 제조사의 경우 Android의 핵심 소스 코드에 매우 공격적인 변형 또는 수정을 가하여 충돌, 호환성 문제 및 예상치 못한 현상을 유발할 가능성이 있습니다. 일부 커스텀 ROM 또한 호환성 문제를 유발하는 수정 사항이 포함된 경우가 있으나, 기기 제조사에 의해 수정된 ROM의 경우보다는 호환성 문제가 발생할 가능성이 상대적으로 낮습니다.
\n
\nShelter는 Android 시스템이 지원하는 직장 프로필 기능을 사용하기 위한 인터페이스 역할을 합니다. 상기된 변형 또는 수정으로 인해 해당 기능이 오류를 포함하거나 표준에서 벗어난 상태로 제공될 경우, <b>이로 인해 발생하는 문제를 Shelter가 스스로 해결하지 못할 수 있습니다.</b> 만약 기기 제조사에 의한 변형 또는 수정이 가해져 직장 프로필 기능에 영향이 발생한 Android 시스템을 실행 중일 경우라면 <b>특별한 주의가 필요합니다.</b> 이러한 사항을 무시하고 설정을 진행하실 수 있으나, 위와 같은 환경에서 Shelter의 올바른 동작을 보장할 수는 없습니다.</string>
<string name="setup_wizard_permissions_text">Shelter는 기본적으로 개별 권한들의 활성화를 요구하지 않으나, 설정 작업을 진행하면 Shelter는 직장 프로필의 생성을 시도하게 되며 이에 따라 해당 프로필의 <b>프로필 관리자</b>로 설정됩니다.
\n
\nShelter가 프로필 관리자로 설정되면 해당 프로필에 한정하여 기기 관리자 앱과 유사한 수준의 각종 권한이 Shelter에 부여됩니다. Shelter의 대부분의 기능을 사용하기 위해서는 Shelter가 프로필 관리자로 설정되어야 합니다.
\n
\nShelter의 일부 고급 기능들의 경우 <b>직장 프로필 외부의 권한</b>이 추가로 필요할 수 있습니다. 관련된 고급 기능들을 켤 때 해당 권한들의 부여가 필요할 경우 Shelter는 해당 권한들의 활성화를 요청하게 됩니다.</string>
<string name="settings_services">서비스</string>
<string name="settings_auto_freeze_service_desc">기기의 화면 잠금이 설정된 상태일 때 \"활성화 후 실행 바로 가기\"를 통해 실행된 앱들을 자동으로 비활성화 처리합니다.</string>
<string name="setup_wizard_action_required_text">이제 Shelter가 띄운 푸시 알림이 보이실 것입니다. <b>해당 푸시 알림을 눌러주시면</b> 설정 작업이 마무리됩니다.
\n
\n만약 푸시 알림이 보이지 않으시다면, 방해 금지 모드가 켜져 있지 않은지 확인하시고 알림 센터를 아래로 스와이프하여 푸시 알림이 표시되어 있는지 확인해 주세요.
\n
\nShelter를 초기화하고 처음부터 설정을 다시 진행하시려면 [설정]의 Shelter의 앱 정보 화면에서 [데이터 지우기]를 누른 후 다시 시도해 주시기 바랍니다.</string>
<string name="freeze_app">비활성화</string>
<string name="list_item_disabled">[비활성] %s</string>
<string name="settings_dont_freeze_foreground_desc">화면 잠금이 실행되었을 때 포어그라운드에서 실행 중(화면에 표시 중)인 앱에 대하여 비활성화 처리를 하지 않습니다. 음악 플레이어 등의 앱을 사용하고 있을 때 유용한 기능이나, \"일괄 비활성화 바로 가기\"를 통하여 수동으로 비활성화해 주어야 합니다.</string>
<string name="work_mode_disabled">Shelter를 실행하는 도중 직장 프로필을 비활성화하신 것 같습니다. 이미 직장 프로필을 활성화하셨을 경우 Shelter를 다시 실행해 주세요.</string>
<string name="msg_device_unsupported">권한이 거부되었거나 지원되지 않는 기기입니다</string>
<string name="work_profile_provision_failed">직장 프로필 구성에 실패했습니다. Shelter를 다시 실행한 후 재시도해 보세요.</string>
<string name="unfreeze_and_launch">활성화 후 실행하기</string>
<string name="unfreeze_success">\"%s\" 앱이 활성화되었습니다</string>
<string name="payment_stub_description">모의 결제 서비스 (사용금지)</string>
<string name="settings_payment_stub_desc">개인 프로필에 모의 NFC 결제 서비스를 추가하여 [설정] - [NFC]의 비접촉 결제 옵션을 활성화합니다. 개인 프로필에 설치된 결제 앱이 없을 경우 직장 프로필에 있는 앱의 비접촉 결제 서비스 사용이 불가능한 Android 상 버그를 우회하기 위한 기능입니다.</string>
<string name="allow_cross_profile_interaction">프로필 간 상호 동작 허용</string>
<string name="settings_payment_stub">모의 결제 서비스</string>
</resources>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">@android:color/system_accent1_1000</color>
<color name="colorAccent">@android:color/system_accent1_500</color>
<color name="colorNavigationBar">@android:color/system_accent1_800</color>
<color name="colorAccentSetupWizard">@android:color/system_accent3_500</color>
<color name="disabledAppBackground">@android:color/system_accent1_800</color>
<color name="selectedAppBackground">@android:color/system_accent1_900</color>
<color name="selectedAndDisabledAppBackground">@android:color/system_accent1_700</color>
</resources>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#00100D</color>
<color name="colorAccent">#009688</color>
<color name="colorAccentSetupWizard">#FFC107</color>
<color name="colorNavigationBar">#004D3F</color>
<color name="colorNavigationIconTint">@color/colorTextPrimary</color>
<color name="colorNavigationIconTintSelected">@color/colorAccent</color>
<color name="colorTextPrimary">#EEEEEE</color>
<color name="colorTextSecondary">#CCCCCC</color>
<color name="disabledAppBackground">#004D3F</color>
<color name="selectedAppBackground">#10201D</color>
<color name="selectedAndDisabledAppBackground">#105D4F</color>
</resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="AppTheme.Override">
<item name="android:windowLightStatusBar">false</item>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">false</item>
</style>
</resources>

View file

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">Tot ziens</string>
<string name="first_run_alert_continue">Ga verder</string>
<string name="device_admin_explanation">Shelter moet beheerder van dit apparaat worden om zijn isolatietaken uit te voeren.</string>
<string name="notifications_important">Shelter belangrijk</string>
<string name="finish_provision_title">Druk hier om het instellen van Shelter te voltooien</string>
<string name="finish_provision_desc">Gefeliciteerd! Je bent een klik verwijderd om het instellen van Shelter te voltooien.</string>
<string name="device_admin_desc">App isolatiedienst</string>
<string name="service_title">Shelter Service</string>
<string name="service_desc">Shelter is nu actief …</string>
<string name="auto_freeze">Bevries automatisch</string>
<string name="allow_cross_profile_widgets">Widgets toestaan in Hoofdprofiel</string>
<string name="search">Zoeken</string>
<string name="freeze_all">Reeks Bevriezen</string>
<string name="create_freeze_all_shortcut">Creëer Reeks Bevriezing Snelkoppeling</string>
<string name="freeze_all_shortcut">Bevriezen</string>
<string name="install_app_to_profile">Installeer APK in Shelter</string>
<string name="show_all">Toon Alle Apps</string>
<string name="install_app_to_profile_success">Installatie applicatie voltooid in werkprofiel.</string>
<string name="first_run_alert">Je staat op het punt om Shelter in te stellen.
\n
\nDeze app hang af van de <b>Werkmodus</b> functie van Android om apps te isoleren. Als je een verkoper / op maat gemaakte ROM die deze functie breekt (bv. MIUI) , zou je nu moeten <b>VERLATEN</b> en gebruik <b>NIET</b> deze app.
\n
\nAls je beslist om verder te gaan, zal Shelter een Werkmodus voor je opstellen.
\n
\nAls je en ontwikkerlaar bent en graag Shelter wilt laten werken op deze onverenigbare ROMs zoals MIUI, pull requests zijn altijd welkom. De ontwikkelaar neemt <b>ABSOLUUT GEEN VERANTWOORDELIJKHEID</b> op als je je apperaat met een onverenigbare ROM breekt.
\n
\nJe zal een melding moeten krijgen om je instelling af te ronden, zorg er alsjeblieft voor dat je apperaat <b>NIET</b> op Niet Storen staat.</string>
<string name="setup_wizard_compatibility_text">Shelter is ontwikkeld en getest op AOSP-achtige Android-afgeleiden. Dit omvat AOSP (Android Open Source Project), Google Android (op Pixels), en <b>de meeste op AOSP gebaseerde open-source custom ROM\'s</b> zoals LineageOS. Als je telefoon draait op één van de Android afgeleiden hierboven vermeld: gefeliciteerd! Shelter zal waarschijnlijk goed werken op je telefoon.
\n
\nSommige leveranciers van toestellen voegen zeer ingrijpende aanpassingen aan de Android grondslag code toe, met conflicten, incompatibiliteit en onverwacht gedrag als gevolg. Sommige aangepaste ROM\'s kunnen ook veranderingen toevoegen die de compatibiliteit vernietigen, maar over het algemeen zijn dit zeldzame voorvallen in vergelijking met door de telefoonleverancier toegevoegde incompatibiliteiten.
\n
\nShelter is slechts een interface naar de functie Werkprofiel die door het systeem wordt geleverd. Als het Werkprofiel dat door het systeem wordt geleverd kapot of niet standaard is, kan <b>Shelter het probleem niet op magische wijze zelf oplossen</b>. Als je momenteel een Android-versie gebruikt die door de leverancier is aangepast, waarvan bekend is dat deze werkprofielen stuk maakt, dan <b>ben je gewaarschuwd</b>. Je kunt toch doorgaan, maar er is geen garantie dat Shelter zich onder deze omstandigheden correct zou gedragen.</string>
<string name="service_auto_freeze_desc">Shelter zal automatisch apps invriezen die zijn gestart vanuit \"Ontdooien &amp; Start\" bij de volgende schermvergrendelingsgebeurtenis.</string>
<string name="create_unfreeze_shortcut">Snelkoppeling voor ontdooien en/of starten maken</string>
<string name="unfreeze_and_launch">Ontdooien en starten</string>
<string name="setup_wizard_welcome">Welkom bij Shelter</string>
<string name="setup_wizard_welcome_text">Shelter is een applicatie om je te helpen andere applicaties te draaien in een geïsoleerd profiel. Het doet dit door gebruik te maken van de functie <b>Werkprofiel</b> van Android.
\n
\nKlik op \"Volgende\", en we zullen je meer informatie geven over Shelter en je door het installatieproces leiden.
\n
\nWe raden u aan alle volgende pagina\'s zorgvuldig door te lezen.</string>
<string name="setup_wizard_permissions">Even dit over rechten</string>
<string name="setup_wizard_permissions_text">Shelter zal standaard niet om individuele toegangsrechten vragen. Echter, zodra je verder gaat met het installatieproces, zal Shelter proberen een Werkprofiel op te zetten en daarmee de <b>profielmanager</b> van dat profiel worden.
\n
\nDit geeft Shelter een uitgebreide lijst van toegangsrechten <b>binnen</b> het profiel, vergelijkbaar met die van een apparaatbeheerder, maar dan beperkt tot het profiel. Profielbeheerder zijn is noodzakelijk voor de meeste functies van Shelter.
\n
\nSommige geavanceerde functies van Shelter kunnen meer toegangsrechten <b>buiten</b> het werkprofiel vereisen. Indien nodig, zal Shelter apart om die rechten vragen wanneer u de betreffende functies inschakelt.</string>
<string name="setup_wizard_compatibility">Compatibiliteit</string>
<string name="setup_wizard_ready">Klaar?</string>
<string name="setup_wizard_ready_text">We zijn nu klaar om Shelter voor je in te stellen. Zorg er eerst voor dat jouw toestel <b>niet</b> in Niet Storen modus staat, omdat je later <b>op een melding moet klikken</b> om het installatieproces af te ronden.
\n
\nAls je klaar bent, klik op \"Volgende\" om het installatieproces te beginnen.</string>
<string name="setup_wizard_please_wait">Wacht alstublieft…</string>
<string name="setup_wizard_please_wait_text">We proberen het Werkprofiel te initialiseren en Shelter op jouw toestel in te stellen.</string>
<string name="setup_wizard_failed">Setup mislukt</string>
<string name="setup_wizard_failed_text">Tot onze spijt moeten wij u meedelen dat wij niet in staat waren Shelter voor je in te stellen.
\n
\nAls u de setup niet handmatig heeft geannuleerd, dan is de reden voor het mislukken meestal te wijten aan een sterk gewijzigd systeem of een conflict tussen Shelter en andere werkprofiel-managers. Helaas is hier niet veel aan te doen.
\n
\nKlik op Volgende om af te sluiten.</string>
<string name="setup_wizard_action_required">Actie vereist</string>
<string name="setup_wizard_action_required_text">Je zou nu een melding van Shelter moeten zien. <b>Klik op die melding</b> om het installatieproces te voltooien.
\n
\nAls je de melding niet ziet, controleer dan of je toestel niet in de Niet storen modus staat en probeer het meldingencentrum naar beneden te halen.
\n
\nOm Shelter te resetten en opnieuw te beginnen, kun je de gegevens van Shelter wissen in Instellingen.</string>
<string name="service_auto_freeze_now">Nu bevriezen</string>
<string name="app_installing">Installeren...</string>
<string name="fragment_profile_main">Hoofd</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Bevroren] %s</string>
<string name="batch_operation">Batchbewerking</string>
<string name="clone_to_work_profile">Kloon naar Shelter (Werkprofiel)</string>
<string name="clone_to_main_profile">Kloon naar Hoofdprofiel</string>
<string name="uninstall_app">Verwijderen</string>
<string name="freeze_app">Bevriezen</string>
<string name="unfreeze_app">Ontdooien</string>
<string name="launch">Starten</string>
<string name="settings_interaction">Interactie</string>
<string name="settings_block_contacts_searching">Blokkeer contacten zoeken</string>
<string name="settings_services">Diensten</string>
<string name="service_auto_freeze_title">Auto-bevriezen in afwachting</string>
<string name="settings">Intellingen</string>
<string name="settings_block_contacts_searching_desc">Verbied de toegang van het hoofdprofiel tot contacten in het werkprofiel.</string>
</resources>

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">Anuluj</string>
<string name="first_run_alert_continue">Kontynuuj</string>
<string name="device_admin_desc">Usługa izolowania aplikacji</string>
<string name="device_admin_explanation">Shelter musi zostać administratorem urządzenia, aby wykonywać zadania związane z izolacją.</string>
<string name="finish_provision_title">Kliknij tu, aby zakończyć konfigurację Shelter</string>
<string name="finish_provision_desc">Gratulacje! Jesteś jedno kliknięcie od skończenia konfiguracji Shelter.</string>
<string name="service_title">Usługa Shelter</string>
<string name="service_desc">Shelter jest uruchomiony…</string>
<string name="service_auto_freeze_title">Auto-zamrożenie w trakcie</string>
<string name="service_auto_freeze_desc">Shelter automatycznie zamrozi aplikacje uruchomione przez \"Odmróź i uruchom\" na następnym zablokowaniu ekranu.</string>
<string name="service_auto_freeze_now">Zamróź teraz</string>
<string name="app_installing">Instalowanie...</string>
<string name="fragment_profile_main">Główny</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Zamrożone] %s</string>
<string name="first_run_alert">Zamierzasz skonfigurować Shelter.
\n
\nTa aplikacja polega na wykorzystaniu funkcji &lt;b&gt;Profil Służbowy&lt;/b&gt; w Androidzie, aby izolować aplikacje. Jeżeli korzystasz z systemu zmodyfikowanego przez producenta telefonu (np. MIUI), należy &lt;b&gt;ZAMKNĄĆ&lt;/b&gt; Shelter i &lt;b&gt;NIE UŻYWAĆ&lt;/b&gt; tej aplikacji.
\n
\nJeżeli kontynuujesz, Shelter ustawi dla Profil Służbowy dla Ciebie.
\n
\nJeśli jesteś programistą i chcesz wprowadzić obsługę dla niewspieranych ROMów, jak np. MIUI, pull requesty są mile widziane. Programiści nie biorą &lt;b&gt;ABSOLUTNIE ŻADNEJ ODPOWIEDZIALNOŚCI&lt;/b&gt; w wypadku uszkodzenia urządzenia z niewspieranym systemem.
\n
\nOtrzymasz powiadomienie wymagane do dokończenia konfiguracji, upewnij się, że twoje urządzenie &lt;b&gt;NIE&lt;/b&gt; jest w trybie Nie przeszkadzać.<b>Work Profile</b> feature of Android to isolate the apps. If you use a vendor / custom ROM that breaks related features (e.g. MIUI), you should now <b>QUIT</b> and <b>DO NOT</b> use this app.\n\nIf you choose to continue, Shelter will set up Work Profile for you.\n\nIf you are a developer and would like to make Shelter work on those incompatible ROMs like MIUI, pull requests are always welcome. The developer takes <b>ABSOLUTELY NO RESPONSIBILITY</b> if you break your device running an incompatible ROM.\n\nYou will need to receive a notification in order to finish setup, please make sure your device is <b>NOT</b> on Do Not Disturb mode.</string>
<string name="unfreeze_and_launch">Odmróź i uruchom</string>
<string name="notifications_important">Shelter - ważne</string>
<string name="batch_operation">Masowa operacja</string>
<string name="clone_to_main_profile">Sklonuj do profilu głównego</string>
<string name="uninstall_app">Odinstaluj</string>
<string name="freeze_app">Zamróź</string>
<string name="unfreeze_app">Odmróź</string>
<string name="launch">Uruchom</string>
<string name="auto_freeze">Zamróź automatycznie</string>
<string name="allow_cross_profile_widgets">Zezwalaj na widżety na profilu głównym</string>
<string name="search">Szukaj</string>
<string name="freeze_all">Masowe zamrażanie</string>
<string name="create_freeze_all_shortcut">Utwórz skrót do masowego zamrażania</string>
<string name="freeze_all_shortcut">Zamróź</string>
<string name="install_app_to_profile">Zainstaluj APK do Shelter</string>
<string name="install_app_to_profile_success">Instalacja aplikacji na profilu służbowym zakończona.</string>
<string name="show_all">Pokaż wszystkie aplikacje</string>
<string name="documents_ui">Otwórz Pliki</string>
<string name="settings">Ustawienia</string>
<string name="settings_interaction">Interakcja</string>
<string name="settings_cross_profile_file_chooser">Mostek plików</string>
<string name="settings_block_contacts_searching">Zablokuj wyszukiwanie kontaktów</string>
<string name="settings_block_contacts_searching_desc">Zablokuj dostęp z profilu głównego do kontaktów w profilu służbowym.</string>
<string name="settings_services">Usługi</string>
<string name="settings_auto_freeze_service">Usługa automatycznego zamrażania</string>
<string name="settings_auto_freeze_service_desc">Automatycznie zamrażaj aplikacje uruchomione z \"skrót do odmrożenia i/lub uruchomienia\" gdy ekran jest zablokowany.</string>
<string name="settings_auto_freeze_delay">Opóźnienie przed automatycznym zamrożeniem</string>
<string name="settings_dont_freeze_foreground">Pomiń widoczne aplikacje</string>
<string name="settings_about">O aplikacji</string>
<string name="settings_version">Wersja</string>
<string name="settings_source_code">Kod źródłowy</string>
<string name="settings_translate">Przetłumacz</string>
<string name="settings_bug_report">Zgłaszanie / śledzenie błędów</string>
<string name="device_admin_toast">Aby Shelter działał, musisz nadać uprawnienia Administratora. Spróbuj ponownie.</string>
<string name="provision_still_pending">Proszę poczekać, podczas gdy przygotowujemy dla Ciebie profil Shelter…</string>
<string name="provision_finished">Instalacja Shelter zakończona. Restartowanie Shelter. Jeżeli Shelter nie włączy się automatycznie, uruchom go ponownie z poziomu launchera.</string>
<string name="msg_device_unsupported">Urządzenie niewspierane, lub nie udzielono uprawnień</string>
<string name="work_profile_not_found">Nie znaleziono profilu służbowego. Proszę uruchomić aplikację ponownie, aby sprawdzić profil ponownie.</string>
<string name="work_profile_provision_failed">Nie można przeprowadzić rewizji profilu służbowego. Możesz spróbować ponownie, restartując Shelter.</string>
<string name="work_mode_disabled">Wygląda na to, że profil służbowy został wyłączony podczas uruchamiania Shelter. Jeżeli jest już uruchomiony, uruchom Shelter ponownie.</string>
<string name="clone_success">Aplikacja \"%s\" została sklonowana pomyślnie</string>
<string name="uninstall_success">Aplikacja \"%s\" została odinstalowana pomyślnie</string>
<string name="freeze_success">Aplikacja \"%s\" została zamrożona pomyślnie</string>
<string name="unfreeze_success">Aplikacja \"%s\" została odmrożona pomyślnie</string>
<string name="uninstall_fail_system_app">Nie można odinstalować aplikacji systemowych w profilu, nad którym Shelter nie ma kontroli.</string>
<string name="clone_fail_system_app">Nie można sklonować aplikacji systemowych na profil, nad którym Shelter nie ma kontroli.</string>
<string name="unsupported_launcher">Nie można dodawać skrótów na Twój launcher. Skontaktuj się z programistą po więcej informacji.</string>
<string name="app_context_menu_title">Operacje dla %s</string>
<string name="freeze_all_success">Wszystkie aplikacje na liście automatycznego zamrażania zostały pomyślnie zamrożone.</string>
<string name="shortcut_create_success">Skrót został utworzony na twoim launcherze.</string>
<string name="launch_app_fail">Nie można uruchomić aplikacji %s ponieważ nie posiada GUI.</string>
<string name="request_storage_manager">Shelter wymaga dostępu do <b>Wszystkich plików</b> dla mostka plików. Proszę nadać uprawnienie <b>OBU Z DWÓCH</b> (Główna / Służbowa) aplikacjom Shelter na liście pokazanej po naciśnięciu \"Ok\".</string>
<string name="miui_cannot_clone">Klonowanie aplikacji użytkownika na inny profil nie jest możliwe na MIUI. Proszę skopiować systemowy sklep z aplikacjami (np. <b>Sklep Play</b>) na inny profil i z niego instalować aplikacje.</string>
<string name="continue_anyway">Tak czy inaczej, kontynuuj</string>
<string name="clone_to_work_profile">Sklonuj do Shelter (Profil służbowy)</string>
<string name="create_unfreeze_shortcut">Utwórz skrót do odmrożenia i/lub uruchomienia</string>
<string name="show_all_warning">Manipulacja aplikacjami, które są ukryte na tej liście może spowodować crashe i inne niespodziewane problemy. Funkcja ta jednak może być przydatna, gdy problematyczny ROM zmodyfikowany przez producenta nie umożliwia wszystkim potrzebnym aplikacjom możliwości działania w profilu służbowym. Jak kontynuujesz, jesteś zdany na siebie.</string>
<string name="settings_cross_profile_file_chooser_desc">Gdy włączone, możesz przeglądać / wyświetlać / wybierać / kopiować pliki w Shelter z profilu głównego i na odwrót, TYLKO poprzez Documents UI (Nazwane Pliki albo Dokumenty w twoim launcherze) lub w aplikacjach z wsparciem Documents UI (otrzymają tylko tymczasowy dostęp do plików, które wybierzesz w Documents UI), wciąż utrzymując izolację systemu plików.</string>
<string name="settings_dont_freeze_foreground_desc">NIE zamrażaj aplikacji na wierzchu (z widoczną aktywnością) gdy zablokujesz ekran. To może być przydatne dla np. odtwarzaczy muzyki, ale musisz je zamrozić ręcznie poprzez \"skrót do masowego zamrażania\".</string>
<string name="request_usage_stats">Shelter aby to zrobić wymaga uprawnienia <b>dostępu do danych o użyciu</b>. Proszę nadać uprawnienie <b>OBU Z DWÓCH</b> aplikacji Shelter na liście pokazanej po naciśnięciu \"Ok\". Nie nadanie uprawnienia spowoduje, że funkcja nie będzie działać prawidłowo.</string>
<string name="request_system_alert">Shelter wymaga uprawnienia do <b>Wyświetlania nad innymi aplikacji</b>, aby mostek plików działał poprawnie. Proszę nadać uprawnienie <b>OBU Z DWÓCH</b> (Główna / Służbowa) aplikacjom Shelter na liście pokazanej po naciśnięciu \"Ok\". To uprawnienie jest używane aby uruchamiać usługę mostka plików w tle.</string>
<string name="setup_wizard_welcome">Witaj w Shelter</string>
<string name="setup_wizard_welcome_text">Shelter to aplikacja, która pozwala uruchamiać inne aplikacje w wyizolowanym profilu. Jest to możliwe dzięki funkcji Androida <b>profil roboczy</b>.
\n
\nNaciśnij \"Dalej\", by otrzymać więcej informacji o Shelterze oraz by otrzymać wsparcie w konfigurowaniu aplikacji.
\n
\nZalecamy przeczytać wszystko uważnie.</string>
<string name="setup_wizard_permissions">Uprawnienia</string>
<string name="setup_wizard_permissions_text">Domyślnie Shelter nie prosi o żadne uprawnienia. Jednak gdy skończysz konfigurację Shelter spróbuje stworzyć profil roboczy i stać się menadżerem tego profilu.
\n
\nTo przyzna Shelterowi obszerną listę uprawnień dotyczących profilu, porównywalnych do administratora urządzenia, jednak skupionych tylko na tym profilu. Bycie menadżerem profilu jest wymagane przez większość funkcji Sheltera.
\n
\nNiektóre zaawansowane funkcje Sheltera mogą wymagać więcej uprawnień <b>poza</b> profilem roboczym. Gdy zajdzie taka potrzeba, Shelter poprosi o uprawnienia konieczne do działania wybranej funkcji.</string>
<string name="setup_wizard_compatibility">Kompatybilność</string>
<string name="setup_wizard_compatibility_text">Shelter jest tworzony i testowany na pochodnych AOSP. Zaliczają się do nich: AOSP (Android Open Source Project), Google Android (na Pixelach oraz &lt;b&gt;większość opartych na AOSP otwartoźródłowych systemów,&lt;/b&gt; takich jak LineageOS. Jeśli na swoim telefonie masz jedną z wersji Androida wymienionych powyżej — gratulacje! Shelter prawdopodobnie zadziała poprawnie na twoim urządzeniu.
\n
\nNiektórzy producenci urządzeń przeprowadzają bardzo inwazyjne zmiany w bazowym kodzie Androida, doprowadzając do konfliktów, niezgodności i nieprzewidywalnych zachowań. Niektóre systemy niezwiązane z producentami również mogą wprowadzać zmiany psujące kompatybilność, ale generalnie zdarza się to rzadziej niż problemy z modyfikacjami producentów.
\n
\nShelter jest zaledwie interfejsem dla profilu roboczego zapewnionego przez system. Jeśli funkcja dostarczona przez system jest popsuta lub niestandardowa, &lt;b&gt;Shelter tego magicznie nie naprawi./b&gt; Jeśli używasz zmodyfikowanej przez producenta wersji Androida, która znana jest z psucia profili roboczych, &lt;b&gt;otrzymałeś/aś ostrzeżenie.&lt;/b&gt; Oczywiście, możesz kontynuować, ale nie ma żadnej gwarancji, że Shelter będzie funkcjonować poprawnie w takich warunkach.</string>
<string name="setup_wizard_failed_text">Przykro nam, ale nie udało nam się skonfigurować Sheltera dla ciebie.
\n
\nJeśli nie anulowałeś konfiguracji ręcznie, powodem niepowodzenia jest najczęściej mocno zmodyfikowany system lub konflikt pomiędzy Shelterem a innymi menadżerami profilu roboczego. Niestety nie możemy z tym nic zrobić.
\n
\nNaciśnij Dalej by wyjść.</string>
<string name="setup_wizard_ready_text">Jesteśmy gotowi by skonfigurować Sheltera dla ciebie. Najpierw upewnij się, że urządzenie <b>nie jest</b> w trybie Nie Przeszkadzać, ponieważ konieczne będzie <b>kliknięcie na powiadomienie</b> w celu zakończenia konfiguracji.
\n
\nGdy będziesz gotowy/a, naciśnij \"Dalej\" by rozpocząć proces konfiguracji.</string>
<string name="setup_wizard_please_wait">Proszę czekać…</string>
<string name="setup_wizard_please_wait_text">Próbujemy przygotować profil roboczy i skonfigurować Shelter na twoim urządzeniu.</string>
<string name="setup_wizard_failed">Konfiguracja nieudana</string>
<string name="setup_wizard_action_required">Wymagane działanie</string>
<string name="setup_wizard_action_required_text">Powinieneś teraz widzieć powiadomienie od Sheltera. <b>Naciśnij na to powiadomienie</b> by zakończyć proces konfiguracji.
\n
\nJeśli nie widzisz powiadomienia upewnij się, że nie masz włączonego trybu Nie Przeszkadzać lub spróbuj rozwinąć centrum powiadomień.
\n
\nBy zresetować Sheltera i zacząć od nowa możesz wyczyścić dane Sheltera w Ustawieniach.</string>
<string name="setup_wizard_ready">Gotowy/a?</string>
</resources>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert">Você esta a ponto de configurar o Shelter.
\n
\nEste aplicativo depende de <b>Perfil de Trabalho</b> recurso do Android que permite isolar os aplicativos. Se você usa um Stock / ROM personalizado que interfere nesta funcionalidade (por ex. MIUI), você deve <b>SAIR</b> agora e <b>NÃO</b> usar este app.
\n
\nSe você optar por continuar, o Shelter criará Perfil de Trabalho para você.
\n
\nSe você é um desenvolvedor e gostaria de fazer o Shelter compatível com os ROMs como MIUI, faça Pull Request, sua ajuda é bem-vinda. O desenvolvedor não assume <b>ABSOLUTAMENTE NENHUMA RESPONSABILIDADE</b> se você quebrar seu dispositivo executando o Shelter num ROM incompatível.
\n
\nVocê precisará receber uma notificação para finalizar a configuração, por favor, certifique-se de que seu dispositivo <b>NÃO</b> está no modo Não Perturbe.</string>
<string name="first_run_alert_cancel">Tchau</string>
<string name="first_run_alert_continue">Continuar</string>
<string name="device_admin_desc">Serviço de isolamento</string>
<string name="device_admin_explanation">Shelter precisa tornar-se o Administrador do seu dispositivo para poder executar as tarefas de isolamento.</string>
<string name="notifications_important">Importante (Shelter)</string>
<string name="finish_provision_title">Clique aqui para concluir a configuração do Shelter</string>
<string name="finish_provision_desc">Parabéns! Você está a um clique para concluir a configuração do Shelter.</string>
<string name="service_title">Serviço do Shelter</string>
<string name="service_desc">O Shelter está funcionando …</string>
<string name="service_auto_freeze_title">Auto-suspensão pendente</string>
<string name="service_auto_freeze_desc">O Shelter automaticamente suspenderá os apps executados via \"Reativar e Iniciar\" no próximo intento de bloqueio da tela.</string>
<string name="service_auto_freeze_now">Suspender agora</string>
<string name="app_installing">Instalando...</string>
<string name="fragment_profile_main">Principal</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Suspenso] %s</string>
<string name="batch_operation">Operação em grupo</string>
<string name="clone_to_work_profile">Clonar ao Shelter (Perfil de trabalho)</string>
<string name="clone_to_main_profile">Clonar ao Perfil Principal</string>
<string name="uninstall_app">Desinstalar</string>
<string name="freeze_app">Suspender</string>
<string name="unfreeze_app">Reativar</string>
<string name="launch">Iniciar</string>
<string name="create_unfreeze_shortcut">Criar um atalho de Reativar e/ou Iniciar</string>
<string name="unfreeze_and_launch">Reativar e Iniciar</string>
<string name="auto_freeze">Auto-Suspender</string>
<string name="allow_cross_profile_widgets">Permitir os widgets no Perfil Principal</string>
<string name="search">Pesquisar</string>
<string name="freeze_all">Suspensão em grupo</string>
<string name="create_freeze_all_shortcut">Criar um atalho para Suspensão em grupo</string>
<string name="freeze_all_shortcut">Suspender</string>
<string name="install_app_to_profile">Instalar APK no Shelter</string>
<string name="install_app_to_profile_success">A instalação do app no perfil de trabalho foi concluída.</string>
<string name="show_all">Mostrar todos os apps</string>
<string name="show_all_warning">Administrar os apps que não estão visíveis na lista pode causar todo tipo de comportamentos inesperados e falhas. Entretanto, este recurso pode ser útil quando as ROMs personalizadas defeituosas, por padrão não descobrem todos os apps do sistema no Perfil de trabalho. Se continuar, esteja ciente disto.</string>
<string name="settings">Configurações</string>
<string name="settings_cross_profile_file_chooser">Transferência de arquivos</string>
<string name="settings_cross_profile_file_chooser_desc">Quando ativado, você será capaz de explorar / ver / escolher e copiar os arquivos de Perfil principal no Shelter e vice-versa, SOMENTE via a interface de Documentos (Arquivos ou Documentos em seu lançador) ou apps com suporte à Interface de Documentos (recebem acesso temporário aos arquivos que você escolher via interface de Documentos), enquanto ainda pertencendo ao isolamento do sistema de arquivos.</string>
<string name="settings_services">Serviços</string>
<string name="settings_auto_freeze_service">Serviço de Auto-Suspensão</string>
<string name="settings_auto_freeze_service_desc">Quando a tela for bloqueada, suspende automaticamente os apps executados de \"Atalho de Reativar e Iniciar\".</string>
<string name="settings_auto_freeze_delay">Atraso de Auto-Suspensão</string>
<string name="settings_dont_freeze_foreground">Ignorar os apps em primeiro plano</string>
<string name="settings_dont_freeze_foreground_desc">NÃO suspenda os apps em primeiro plano (com atividade visível) quando a tela for bloqueada. Isto pode ser útil para os apps como reprodutor de música, mas será necessário suspendê-los manualmente através do \"Atalho de suspensão em grupo\".</string>
<string name="settings_about">Sobre</string>
<string name="settings_version">Versão</string>
<string name="settings_source_code">Código-fonte</string>
<string name="provision_still_pending">Favor, aguarde enquanto nos preparamos perfil de Shelter para você …</string>
<string name="provision_finished">Configuração do Shelter concluída. Reiniciando o Shelter. Se o Shelter não iniciar automaticamente, você pode executá-lo novamente do seu lançador.</string>
<string name="msg_device_unsupported">Ou a permissão foi negada ou dispositivo não é suportado</string>
<string name="work_profile_not_found">Perfil de trabalho não foi encontrado. Por favor reinicie o app para verificar o perfil de novo.</string>
<string name="work_profile_provision_failed">Não foi possível criar o perfil de trabalho. Você pode tentar novamente reiniciando o Shelter.</string>
<string name="work_mode_disabled">Parece que você desativou o Perfil de Trabalho ao iniciar o Shelter. Se você tiver ativado agora, por favor, reinicie o Shelter.</string>
<string name="uninstall_success">O app \"%s\" foi desinstalado com sucesso</string>
<string name="freeze_success">O app \"%s\" foi suspenso com sucesso</string>
<string name="unfreeze_success">O app \"%s\" foi reativado com sucesso</string>
<string name="clone_fail_system_app">Não é possível clonar os apps do sistema ao perfil sobre qual o Shelter não tem controle.</string>
<string name="uninstall_fail_system_app">Não é possível desinstalar os apps de sistema do perfil sobre qual o Shelter não tem controle.</string>
<string name="unsupported_launcher">Não é possível adicionar os atalhos ao seu lançador. Entre em contato com o desenvolvedor para mais detalhes.</string>
<string name="app_context_menu_title">Operações para %s</string>
<string name="freeze_all_success">Todos os apps na lista de \"Auto-Suspensão\" foram suspensos com sucesso.</string>
<string name="shortcut_create_success">Atalho foi criado no seu lançador.</string>
<string name="request_usage_stats">O Shelter precisa de permissão para <b>Estatísticas de uso</b> para fazer isto. Por favor ative a permissão para <b>AMBOS</b> os apps do Shelter que aparecerão no diálogo após clicar no \"Ok\". Se isso não for feito, este recurso não funcionará corretamente.</string>
<string name="launch_app_fail">Não podia iniciar o app %s porque não tem interface.</string>
<string name="miui_cannot_clone">A clonagem de apps fora do sistema para outro perfil não é suportado no MIUI. Por favor, clone a loja de apps do seu sistema (p.ex. a <b>Play Store</b>) ao outro perfil e depois instale os apps a partir daí.</string>
<string name="settings_interaction">Interação</string>
<string name="device_admin_toast">Tem que conceder permissão de administração do dispositivo para que Shelter funcione bem. Favor, tente de novo.</string>
<string name="clone_success">O app \"%s\" foi clonado com sucesso</string>
<string name="documents_ui">Abrir interface de Documentos</string>
<string name="settings_block_contacts_searching">Bloquear a pesquisa em contatos</string>
<string name="settings_block_contacts_searching_desc">Negar o acesso do perfil principal aos contatos no perfil de trabalho.</string>
<string name="settings_translate">Traduzir</string>
<string name="settings_bug_report">Relatar as falhas / problemas</string>
<string name="request_storage_manager">O Shelter precisa ter acesso a <b>Todos os arquivos</b> para poder usar a Transferência de arquivos. Por favor ative a permissão para <b>AMBOS</b> (Pessoal / Trabalho) apps do Shelter que aparecerão no diálogo após clicar no \"Ok\".</string>
<string name="request_system_alert">O Shelter precisa <b>Exibir sobre outros apps</b> para que a Transferência de arquivos funcione corretamente. Por favor ative a permissão para <b>Ambos</b> (Pessoal / Trabalho) apps do Shelter que aparecerão no diálogo após clicar no \"Ok\". Esta permissão é usada para iniciar os serviços de Transferência de arquivos em segundo plano.</string>
<string name="continue_anyway">Quero continuar</string>
<string name="setup_wizard_welcome">Bem-vindo ao Shelter</string>
<string name="setup_wizard_permissions">Detalhes sobre as permissões</string>
<string name="setup_wizard_compatibility">Compatibilidade</string>
<string name="setup_wizard_ready_text">Vamos configurar o Shelter para você. Se o seu dispositivo estiver rodando Android 7 ou superior, por favor, certifique-se primeiro de que seu dispositivo <b>não</b> esteja no modo \"Não Perturbe\", porque mais tarde você precisará <b>clicar em uma notificação</b> para finalizar o processo de configuração.
\n
\nQuando estiver pronto, clique em \"Próximo\" para iniciar o processo de configuração.</string>
<string name="setup_wizard_please_wait">Por favor, aguarde…</string>
<string name="setup_wizard_failed">A configuração falhou</string>
<string name="setup_wizard_failed_text">Lamentamos informar que não foi possível configurar o Shelter para você.
\n
\nSe seu dispositivo já tinha configurado um Perfil de Trabalho, seja através uma instalação anterior do Shelter ou de outro app, você terá que remover primeiro esse perfil em Configurações -&gt; Conta, para que o Shelter possa prosseguir.
\n
\nSe você não cancelou a configuração manualmente, então é bem provável que a falha aconteceu devido a um sistema excessivamente modificado ou um conflito entre o Shelter e outros gerenciadores do Perfil de Trabalho. Infelizmente, não há muito que dá para fazer sobre isso.
\n
\nClique no \"Próximo\" para sair.</string>
<string name="setup_wizard_action_required">Ação necessária</string>
<string name="setup_wizard_ready">Pronto?</string>
<string name="setup_wizard_please_wait_text">Estamos tentando criar o Perfil de Trabalho e configurar o Shelter no seu dispositivo.</string>
<string name="setup_wizard_welcome_text">O Shelter é um app que ajuda a executar outros apps em um perfil isolado. Para isto ele usa o recurso de <b>Perfil de Trabalho</b> no Android.
\n
\nClique no \"Próximo\", para ver mais informações sobre o Shelter e o guia de como fazer o processo de configuração.
\n
\nSugerimos que você leia cuidadosamente todas as dicas a seguir.</string>
<string name="setup_wizard_permissions_text">O Shelter, por padrão não pedirá nenhuma permissão. Entretanto, uma vez que você prossiga com o processo de configuração, ele tentará configurar o Perfil de Trabalho e tornar-se o <b>Gerenciador dele</b>.
\n
\nIsto concederá ao Shelter uma ampla lista de permissões dentro do perfil, comparável com um Administrador de Dispositivo, embora confinado somente neste perfil. O gerenciamento do perfil é necessário para realizar a maioria das funcionalidades do Shelter.
\n
\nAlgumas funcionalidades avançadas do Shelter podem exigir mais permissões <b>fora</b> do perfil de trabalho. Quando for necessário o Shelter solicitará essas permissões separadamente para ativar as funcionalidades correspondentes.</string>
<string name="setup_wizard_compatibility_text">O Shelter é desenvolvido e testado em ROMs tipo AOSP do Android. Isto inclui AOSP (Android Open Source Project), Android do Google (telefones Pixel), e a <b>maioria de ROMs personalizadas de software livre baseadas em AOSP</b> como o LineageOS. Se seu telefone está rodando um dos derivativos do Android listados acima, então parabéns! O Shelter provavelmente vai funcionar corretamente no seu aparelho.
\n
\nAlguns fornecedores de dispositivos introduzem customizações bem invasivas no código fonte do Android, resultando em conflitos, incompatibilidades e comportamentos inesperados. Algumas ROMs personalizadas podem conter as alterações que causam incompatibilidades, mas geralmente estes casos são muito raros em comparação às modificações introduzidas pelo vendedor do telefone.
\n
\nO Shelter é meramente uma interface para o recurso do Perfil de Trabalho fornecido pelo sistema. Se o recurso for alterado ou não padrão, o <b>Shelter não poderá resolver o problema por si só</b>. Se você tiver uma versão do Android modificada pelo fornecedor, que é conhecida por quebrar os Perfis de Trabalho, <b>você foi avisado</b>. Você pode proceder mesmo assim, mas não há garantia de que o Shelter funcionará corretamente sob estas circunstâncias.</string>
<string name="setup_wizard_action_required_text">Neste momento você deveria ver uma notificação do Shelter. <b>Por favor, clique nessa notificação</b> para terminar o processo de configuração.
\n
\nSe você não vê a notificação, certifique-se de que seu dispositivo não está no modo \"Não Perturbe\" e tente recuperar ela da área de notificações deslizando de cima para baixo.
\n
\nPara reiniciar o Shelter e começar de novo, você pode limpar os dados em Configurações do app.</string>
</resources>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert_cancel">La revedere</string>
<string name="first_run_alert_continue">Continuă</string>
<string name="device_admin_desc">Serviciu de izolare a aplicațiilor</string>
<string name="settings_auto_freeze_delay">Intarziere Auto Inghetare</string>
<string name="settings_dont_freeze_foreground">Sariti Aplicatiile din Prim-Plan</string>
<string name="settings_about">Despre</string>
<string name="settings_version">Versiune</string>
<string name="settings_source_code">Codul Sursa</string>
<string name="settings_translate">Traducere</string>
<string name="settings_bug_report">Raportare eroare / Urmarirea erorilor</string>
<string name="device_admin_toast">Trebuie sa permiteti permisiunea de Administrator Dispozitiv pentru ca Shelter sa funcționeze. Va rugam sa incercati din nou.</string>
<string name="provision_still_pending">Va rugam sa asteptati in timp ce va pregătim profilul Shelter pentru dvs. …</string>
<string name="msg_device_unsupported">Permisiunea este refuzata sau dispozitivul nu este acceptat</string>
<string name="clone_success">Aplicatia \"%s\" a fost clonata cu succes</string>
<string name="settings_dont_freeze_foreground_desc">NU ingheta aplicatiile din Prim-Plan (cu activitate vizibila) cand blocati ecranul. Acest lucru poate fi util pentru aplicatii precum playere de muzica, dar va trebui să le înghetati manual prin „Comandă rapidă de Inghetare Grup(lot)” dupa aceea.</string>
<string name="provision_finished">Configurarea Shelter s-a incheiat. Acum reporniti Shelter. Daca Shelter nu a pornit automat, il puteți porni din nou manual.</string>
<string name="show_all_warning">Manipularea aplicațiilor ascunse din listă ar putea provoca blocări și tot felul de comportamente neașteptate. De asemenea această caracteristică poate fi utilă atunci când ROM-urile defecte personalizate de furnizor nu activează în mod implicit toate aplicațiile de sistem necesare în profilul de lucru. Dacă continuați, sunteți pe cont propriu.</string>
<string name="settings_cross_profile_file_chooser_desc">Când este activat, veți putea răsfoi / vizualiza / alege / copia fișiere în Shelter din profilul principal și invers, DOAR prin interfața de utilizare a documentelor (denumită Fișiere sau documente pe launcher-ul dvs.) sau aplicații cu suport pentru interfața de utilizare a documentelor (acestea câștigă numai acces temporar la fișierele pe care le alegeți în interfața de utilizare Documente), în timp ce aparține încă izolării sistemului de fișiere.</string>
<string name="request_usage_stats">Shelter are nevoie de permisiunea <b> Statistici de utilizare </b> pentru a face acest lucru. Activați permisiunea pentru <b> AMBELE </b> aplicații Shelter afișate în casetă de dialog după ce apăsați „Ok”. În caz contrar, această caracteristică nu va funcționa corect.</string>
<string name="request_system_alert">Shelter trebuie să <b> Afiseze peste alte aplicații </b> pentru ca File Shuttle să funcționeze corect. Vă rugăm să activați permisiunea pentru <b> AMBELE </b> (Principal / Lucru) aplicații Shelter afișate în caseta de dialog după ce apăsați „Ok”. Această permisiune este utilizată pentru a porni serviciile File Shuttle în fundal.</string>
<string name="first_run_alert">Ești pe cale să configurezi Shelter.
\n
\nAceastă aplicație depinde de funcția <b> Profil de lucru </b> a Android pentru a izola aplicațiile. Dacă utilizați un furnizor / ROM personalizat care întrerupe funcțiile conexe (de exemplu, MIUI), ar trebui să <b> RENUNTATI </b> si sa <b> NU </b> utilizați această aplicație
\n
\nDacă alegeți să continuați, Shelter vă va configura profilul de lucru.
\n
\nDacă sunteți dezvoltator și doriți să faceți Shelter să funcționeze pe acele ROM-uri incompatibile precum MIUI, solicitările sunt întotdeauna binevenite. Dezvoltatorul <b> NU ISI ASUMA ABSOLUT NICI O RESPONSABILITATE </b> dacă vă stricati dispozitivul care rulează un ROM incompatibil.
\n
\nVa trebui să primiți o notificare pentru a finaliza configurarea, vă rugăm să vă asigurați că dispozitivul dvs. <b> NU </b> este în modul Nu deranjați.</string>
<string name="create_freeze_all_shortcut">Creați o comandă rapidă de Inghetare Grup(lot)</string>
<string name="notifications_important">Important</string>
<string name="finish_provision_title">Click aici pentru a finaliza configurarea Shelter</string>
<string name="service_title">Serviciul Shelter</string>
<string name="service_desc">Shelter ruleaza acum …</string>
<string name="service_auto_freeze_title">Auto-inghetare în așteptare</string>
<string name="service_auto_freeze_desc">Shelter va îngheța automat aplicațiile lansate din „Deblocați și lansați” la următorul eveniment de blocare a ecranului.</string>
<string name="service_auto_freeze_now">Îngheață acum</string>
<string name="app_installing">Se instalează ...</string>
<string name="fragment_profile_main">Principal</string>
<string name="list_item_disabled">[S-a Inghetat] %s</string>
<string name="clone_to_work_profile">Clonați la Shelter (profilul de lucru)</string>
<string name="uninstall_app">Dezinstalați</string>
<string name="freeze_app">Îngheaţa</string>
<string name="unfreeze_app">Dezghețați</string>
<string name="launch">Porneste</string>
<string name="unfreeze_and_launch">Dezgheața și Porniti</string>
<string name="search">Cauta</string>
<string name="freeze_all_shortcut">Îngheaţa</string>
<string name="install_app_to_profile">Instalați APK în Shelter</string>
<string name="settings">Setări</string>
<string name="settings_interaction">Interacţiune</string>
<string name="settings_cross_profile_file_chooser">Tranzit de fișiere</string>
<string name="device_admin_explanation">Shelter trebuie să devină Administrator de Dispozitiv pentru a-și îndeplini sarcinile de izolare.</string>
<string name="fragment_profile_work">Shelter</string>
<string name="clone_to_main_profile">Clonați la Profilul Principal</string>
<string name="auto_freeze">Înghețare Automată</string>
<string name="allow_cross_profile_widgets">Permiteți widgeturile în Profilul Principal</string>
<string name="freeze_all">Înghețare in Grup(lot)</string>
<string name="install_app_to_profile_success">Instalarea aplicației a fost finalizată în Profilul de Lucru.</string>
<string name="show_all">Afișați toate Aplicațiile</string>
<string name="documents_ui">Deschideți Interfața de Utilizare a Documentelor</string>
<string name="work_mode_disabled">Se pare că ați dezactivat Profilul de Lucru în timp ce porniți Shelter. Dacă l-ați activat acum, porniți din nou Shelter.</string>
<string name="request_storage_manager">Shelter are nevoie de acces la <b> Toate fișierele </b> pentru File Shuttle. Vă rugăm să activați permisiunea pentru <b> AMBELE </b> (Principal/ Lucru) aplicații Shelter afișate în caseta de dialog după ce apăsați „Ok”.</string>
<string name="settings_block_contacts_searching">Blocați Căutarea Contactelor</string>
<string name="settings_services">Servicii</string>
<string name="uninstall_success">Aplicația \"%s\" a fost dezinstalată cu succes</string>
<string name="freeze_success">Aplicația \"%s\" s-a inghetat cu succes</string>
<string name="unfreeze_success">Aplicația \"%s\" s-a dezghetat cu succes</string>
<string name="clone_fail_system_app">Nu pot clona aplicațiile de sistem la un profil pe care Shelter nu îl controlează.</string>
<string name="uninstall_fail_system_app">Nu se pot dezinstala aplicațiile de sistem într-un profil pe care Shelter nu îl controlează.</string>
<string name="unsupported_launcher">Nu se pot adăuga comenzi rapide la launcher-ul dvs. Vă rugăm să contactați dezvoltatorul pentru mai multe informații.</string>
<string name="app_context_menu_title">Operații pentru %s</string>
<string name="freeze_all_success">Toate aplicațiile din lista „Inghetare Automata” au fost înghețate cu succes.</string>
<string name="shortcut_create_success">Comandă rapidă creată pe launcher.</string>
<string name="launch_app_fail">Nu se poate porni %s deoarece nu are GUI.</string>
<string name="settings_block_contacts_searching_desc">Refuzați accesul din Profilul Principal la contactele din Profilul de Lucru.</string>
<string name="settings_auto_freeze_service">Serviciu de înghețare Automată</string>
<string name="settings_auto_freeze_service_desc">Când ecranul este blocat, înghețați automat aplicațiile pornite din „Deblocați și Porniti comanda rapidă”.</string>
<string name="work_profile_not_found">Profilul de Lucru nu a fost găsit. Reporniți aplicația pentru a re-furniza profilul.</string>
<string name="work_profile_provision_failed">Nu se poate furniza Profilul de Lucru. Puteți încerca din nou repornind Shelter.</string>
<string name="miui_cannot_clone">Clonarea aplicațiilor non-sistem pe un alt profil nu este momentan posibilă pe MIUI. Vă rugăm să clonați magazinul de aplicații al sistemului (de ex. <b> Magazin Play </b>) în celălalt profil și apoi instalați aplicații de acolo.</string>
<string name="continue_anyway">Continua oricum</string>
<string name="finish_provision_desc">Felicitări! Sunteți la un click distanță de finalizarea configurării Shelter.</string>
<string name="batch_operation">Operatiune in grup(lot)</string>
<string name="create_unfreeze_shortcut">Creați Dezgheata și/sau Pornire comandă rapidă</string>
<string name="setup_wizard_permissions_text">În mod implicit, Shelter nu va cere nicio permisiune individuală. Cu toate acestea, odată ce continuați cu procesul de configurare, Shelter va încerca să configureze un profil de lucru și, prin urmare, va deveni <b>managerul de profil</b> al profilului respectiv.
\n
\nAcest lucru va oferi Shelter o listă extinsă de permisiuni în interiorul profilului, comparabilă cu cea a unui administrator de dispozitiv, deși limitată la profil. A fi manager de profil este necesar pentru majoritatea funcționalității Shelter.
\n
\nUnele funcții avansate ale Shelter pot necesita mai multe permisiuni <b>în afara</b> Profilului de serviciu. Când este necesar, Shelter va cere aceste permisiuni separat atunci când activați funcțiile corespunzătoare.</string>
<string name="setup_wizard_welcome">Bun venit la Shelter</string>
<string name="setup_wizard_permissions">Un cuvânt despre permisiuni</string>
<string name="setup_wizard_compatibility">Compatibilitate</string>
<string name="setup_wizard_welcome_text">Shelter este o aplicație care vă ajută să rulați alte aplicații într-un profil izolat. Face acest lucru utilizând funcția <b>Profil de serviciu</b> din Android.
\n
\nFaceți clic pe „Următorul” și vă vom oferi mai multe informații despre Shelter și vă vom ghida prin procesul de configurare.
\n
\nVă sugerăm să citiți cu atenție toate paginile următoare.</string>
<string name="setup_wizard_ready">Pregatit?</string>
<string name="setup_wizard_compatibility_text">Shelter este dezvoltat și testat pe derivate Android asemănătoare AOSP. Aceasta include AOSP (Android Open Source Project), Google Android (pe Pixels) și <b>majoritatea ROM-urilor personalizate open source bazate pe AOSP</b>, cum ar fi LineageOS. Dacă telefonul dvs. rulează unul dintre derivatele Android enumerate mai sus, atunci felicitări! Adăpostul va funcționa probabil corect pe dispozitivul dvs.
\n
\nUnii furnizori de dispozitive introduc personalizări foarte invazive în baza de coduri Android, ducând la conflicte, incompatibilități și comportament neașteptat. Unele ROM-uri personalizate pot introduce, de asemenea, modificări care distrug compatibilitatea, dar, în general, acestea sunt apariții mai rare în comparație cu incompatibilitățile introduse de furnizorul de telefoane.
\n
\nShelter este doar o interfață în caracteristica Profil de lucru oferită de sistem. Dacă funcția furnizată de sistem este defectă sau nu este standard, <b>Shelter nu ar putea rezolva problema în mod magic</b>. Dacă utilizați în prezent o versiune Android modificată de furnizor despre care se știe că încalcă Profilurile de lucru, <b>ai fost avertizat</b>. Puteți continua oricum, dar nu există nicio garanție că Shelter se va comporta corect în aceste circumstanțe.</string>
<string name="setup_wizard_failed">Configurarea a eșuat</string>
<string name="setup_wizard_action_required">Actiune necesară</string>
<string name="setup_wizard_action_required_text">Acum ar trebui să vedeți o notificare de la Shelter. <b>Faceți clic pe notificarea respectivă</b> pentru a finaliza procesul de configurare.
\n
\nDacă nu vedeți notificarea, asigurați-vă că dispozitivul nu este în modul Nu deranjați și încercați să trageți în jos centrul de notificări.
\n
\nPentru a reseta Shelter și a începe de la capăt, puteți șterge datele Shelter din Setări.</string>
<string name="setup_wizard_ready_text">Acum suntem gata să configuram Shelter pentru tine. Dacă dispozitivul dvs. rulează Android 7 sau o versiune anterioară, asigurați-vă mai întâi că dispozitivul dvs. <b>nu</b> este în modul Nu deranja, deoarece va trebui să <b>dați clic pe o notificare</b> mai târziu pentru a finaliza procesul de configurare.
\n
\nCând sunteți gata, faceți clic pe „Următorul” pentru a începe procesul de configurare.</string>
<string name="setup_wizard_please_wait">Vă rugăm așteptați…</string>
<string name="setup_wizard_please_wait_text">Încercăm să inițializam Profilul de lucru și să setăm Shelter pe dispozitivul dvs.</string>
<string name="setup_wizard_failed_text">Ne pare rău să vă informăm că nu am putut configura Shelter pentru dvs.
\n
\nDacă dispozitivul dvs. avea deja un Profil de serviciu, fie dintr-o instalare anterioară a Shelter, fie dintr-o altă aplicație, va trebui să eliminați acel profil din Setări -&gt; Cont înainte ca Shelter să poată continua.
\n
\nÎn caz contrar, dacă nu ați anulat manual configurarea, atunci motivul eșecului este cel mai frecvent din cauza unui sistem puternic modificat sau a unui conflict între Shelter și alți manageri de profil de lucru. Din păcate, nu am putea face mare lucru în acest sens.
\n
\nFaceți clic pe „Next” pentru a ieși.</string>
</resources>

View file

@ -1,48 +1,130 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="first_run_alert">Сейчас Shelter будет настроен. Это приложение зависит от реализации <b>Рабочего профиля</b> системой Android для изоляции приложений. Если ваш производитель / кастомная прошивка не поддерживают эту функцию или сломали ее (как, например, MIUI), вам следует <b>ВЫЙТИ</b> и <b>НЕ ИСПОЛЬЗОВАТЬ</b> это приложение. Если вы продолжите, Shelter настроит Рабочий профиль для вас. Если вы являетесь разработчиком и хотели бы сделать так, чтобы Shelter работал на этих сломаных прошивках, таких как MIUI, - пулл реквесты в Git с удовольствием принимаются. Разработчик приложения не несет <b>АБСОЛЮТНО НИКАКОЙ ОТВЕТСТВЕННОСТИ</b> если вы сломаете ваше устройство с несовместимой прошивкой.</string> <string name="first_run_alert">Сейчас Shelter будет настроен.
<string name="first_run_alert_cancel">Пока</string> \n
\nЭто приложение зависит от реализации <b>Рабочего профиля</b> системой Android для изоляции приложений. Если ваш производитель / кастомная прошивка не поддерживают эту функцию или сломали ее (как, например, MIUI), вам следует <b>ВЫЙТИ</b> и <b>НЕ ИСПОЛЬЗОВАТЬ</b> это приложение.
\n
\nЕсли вы продолжите, Shelter настроит Рабочий профиль для вас.
\n
\nЕсли вы являетесь разработчиком и хотели бы сделать так, чтобы Shelter работал на этих сломаных прошивках, таких как MIUI, - пулл реквесты в Git с удовольствием принимаются. Разработчик приложения не несет <b>АБСОЛЮТНО НИКАКОЙ ОТВЕТСТВЕННОСТИ</b> если вы сломаете ваше устройство с несовместимой прошивкой.
\n
\nВам нужно будет кликнуть на оповещение для успешного завершения установки, убедитесь, что устройство находится <b>НЕ</b> в режиме \"Не беспокоить\".</string>
<string name="first_run_alert_cancel">Выйти</string>
<string name="first_run_alert_continue">Продолжить</string> <string name="first_run_alert_continue">Продолжить</string>
<string name="device_admin_desc">Сервис изоляции приложений</string> <string name="device_admin_desc">Служба изоляции приложений</string>
<string name="device_admin_explanation">Shelter требуется стать Аднимистратором устройства, чтобы управлять изоляцией.</string> <string name="device_admin_explanation">Shelter требуется стать администратором устройства, чтобы управлять изоляцией.</string>
<string name="service_title">Сервис Shelter</string> <string name="service_title">Служба Shelter</string>
<string name="service_desc">Shelter запущен …</string> <string name="service_desc">Shelter запущен …</string>
<string name="fragment_profile_main">Основной</string> <string name="fragment_profile_main">Основной</string>
<string name="fragment_profile_work">Shelter</string> <string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Замороженно] %s</string> <string name="list_item_disabled">[Заморожено] %s</string>
<string name="clone_to_work_profile">Клонировать в Shelter (Рабочий профиль)</string> <string name="clone_to_work_profile">Клонировать в Shelter</string>
<string name="clone_to_main_profile">Клонировать в Основной рофиль</string> <string name="clone_to_main_profile">Клонировать в осн. профиль</string>
<string name="uninstall_app">Удалить</string> <string name="uninstall_app">Удалить</string>
<string name="freeze_app">Заморозить</string> <string name="freeze_app">Заморозить</string>
<string name="unfreeze_app">Разморозить</string> <string name="unfreeze_app">Разморозить</string>
<string name="launch">Запустить</string> <string name="launch">Запустить</string>
<string name="create_unfreeze_shortcut">Создать ярлык для разморозки и/или запуска</string> <string name="create_unfreeze_shortcut">Ярлык разморозки и запуска</string>
<string name="unfreeze_and_launch">Разморозить и запустить</string> <string name="unfreeze_and_launch">Разморозить и запустить</string>
<string name="auto_freeze">Авто заморозка</string> <string name="auto_freeze">Автозаморозка</string>
<string name="freeze_all">Групповая заморозка</string> <string name="freeze_all">Групповая заморозка</string>
<string name="create_freeze_all_shortcut">Создать ярлык групповой заморозки</string> <string name="create_freeze_all_shortcut">Ярлык групповой заморозки</string>
<string name="freeze_all_shortcut">Заморозить</string> <string name="freeze_all_shortcut">Заморозить</string>
<string name="settings">Настройки</string> <string name="settings">Настройки</string>
<string name="settings_about">О программе</string> <string name="settings_about">О программе</string>
<string name="settings_version">Версия</string> <string name="settings_version">Версия</string>
<string name="settings_source_code">Исходный код</string> <string name="settings_source_code">Исходный код</string>
<string name="settings_bug_report">Трекер багов и проблем</string> <string name="settings_bug_report">Отслеживание проблем</string>
<string name="device_admin_toast">Вам необходимо дать Shelter права Администратора устройства для правильной работы. Пожалуйста, попробуйте снова.</string> <string name="device_admin_toast">Вам необходимо дать Shelter права Администратора устройства для правильной работы. Пожалуйста, попробуйте снова.</string>
<string name="provision_still_pending">Пожалуйста подождите пока мы подготавливаем профиль Shelter для вас …</string> <string name="provision_still_pending">Пожалуйста подождите пока мы подготавливаем профиль Shelter для вас …</string>
<string name="provision_finished">Настройка Shelter завершена. Перезапускаем Shelter. Если Shelter не откроется сам, запустите его из вашего лаучнера.</string> <string name="provision_finished">Настройка Shelter завершена. Перезапускам Shelter. Если Shelter не откроется сам, запустите его из вашего лаучнера.</string>
<string name="msg_device_unsupported">Доступ запрещен или устройство не поддерживается</string> <string name="msg_device_unsupported">Доступ запрещён или устройство не поддерживается</string>
<string name="work_profile_not_found">Рабочий профиль не найден. Пожалуйста, перезапустите приложение чтобы пересоздать профиль.</string> <string name="work_profile_not_found">Рабочий профиль не найден. Перезапустите приложение, чтобы пересоздать профиль.</string>
<string name="work_profile_provision_failed">Невозможно создать Рабочий профиль. Вы можете попробовать снова перезапустив Shelter.</string> <string name="work_profile_provision_failed">Невозможно создать рабочий профиль. Вы можете попробовать снова, перезапустив Shelter.</string>
<string name="work_mode_disabled">Похоже, что вы отключили Рабочий режим пока Shelter запускался. Если вы включили его сейчас то перезапустите Shelter.</string> <string name="work_mode_disabled">Похоже, что вы отключили рабочий режим, пока Shelter запускался. Если вы включили его сейчас, то перезапустите Shelter.</string>
<string name="clone_success">Приложение %s успешно клонированно</string> <string name="clone_success">Приложение \"%s\" успешно клонировано</string>
<string name="uninstall_success">Приложение %s успешно удалено</string> <string name="uninstall_success">Приложение \"%s\" успешно удалено</string>
<string name="freeze_success">Приложение %s успешно заморожено</string> <string name="freeze_success">Приложение \"%s\" успешно заморожено</string>
<string name="unfreeze_success">Приложение %s успешно разморожено</string> <string name="unfreeze_success">Приложение \"%s\" успешно разморожено</string>
<string name="clone_fail_system_app">Невозможно клонировать системные приложения в профиль который Shelter не контролирует.</string> <string name="clone_fail_system_app">Невозможно клонировать системные приложения в профиль, который Shelter не контролирует.</string>
<string name="uninstall_fail_system_app">Невозможно удалить системные приложения в профиле который Shelter не контролирует.</string> <string name="uninstall_fail_system_app">Невозможно удалить системные приложения в профиле, который Shelter не контролирует.</string>
<string name="unsupported_launcher">Невозможно добавить ярлык в ваш лаунчер. Пожалуйста, свяжитесь с разработчиком.</string> <string name="unsupported_launcher">Невозможно добавить ярлык в ваш лаунчер. Пожалуйста, свяжитесь с разработчиком.</string>
<string name="app_context_menu_title">Операции для %s</string> <string name="app_context_menu_title">Операции для %s</string>
<string name="freeze_all_success">Все приложения в списке Авто заморозки были успешно замороженны.</string> <string name="freeze_all_success">Все приложения в списке автозаморозки были успешно заморожены.</string>
<string name="shortcut_create_success">Ярлык создан в вашем лаунчере.</string> <string name="shortcut_create_success">Ярлык создан в вашем лаунчере.</string>
<string name="miui_cannot_clone">Клонирование не системных приложений в другой профиль невозможно на MIUI в данный момент. Пожалуйста, клонируйте магазин приложений вашей системы (например <b>Play Store</b>) в ваш другой профиль и установите приложения оттуда.</string> <string name="miui_cannot_clone">Клонирование несистемных приложений в другой профиль в данный момент невозможно на MIUI. Пожалуйста, клонируйте магазин приложений вашей системы (например, <b>Play Маркет</b>) в ваш другой профиль и установите приложения оттуда.</string>
<string name="finish_provision_title">Нажмите, чтобы завершить настройку Shelter</string>
<string name="app_installing">Установка...</string>
<string name="allow_cross_profile_widgets">Виджеты в осн. профиле</string>
<string name="search">Поиск</string>
<string name="service_auto_freeze_title">Ожидание автозаморозки</string>
<string name="service_auto_freeze_now">Заморозить</string>
<string name="batch_operation">Выбрать несколько</string>
<string name="show_all">Все приложения</string>
<string name="settings_cross_profile_file_chooser">Перенос файлов</string>
<string name="documents_ui">Открыть проводник</string>
<string name="settings_interaction">Взаимодействие</string>
<string name="settings_auto_freeze_service">Служба автозаморозки</string>
<string name="settings_auto_freeze_service_desc">При блокировке экрана автоматически замораживать приложения, запущенные с помощью ярлыка \"Разморозить и запустить\".</string>
<string name="settings_auto_freeze_delay">Задержка автозаморозки</string>
<string name="request_storage_manager">Shelter необходим доступ ко <b>всем файлам</b> для переноса файлов. Пожалуйста, дайте разрешение приложениям Shelter в <b>ОБОИХ</b> профилях (основном и рабочем) в диалогах, которые появятся после того, как вы нажмёте \"OK\".</string>
<string name="settings_services">Службы</string>
<string name="continue_anyway">Всё равно продолжить</string>
<string name="notifications_important">Shelter: важное</string>
<string name="finish_provision_desc">Поздравляем! Вы в одном шаге от завершения настройки Shelter.</string>
<string name="install_app_to_profile">Установить APK в Shelter</string>
<string name="install_app_to_profile_success">Приложение установлено в рабочий профиль.</string>
<string name="settings_block_contacts_searching">Не отслеживать контакты</string>
<string name="settings_translate">Перевод</string>
<string name="settings_block_contacts_searching_desc">Запретить получение доступа к контактам рабочего профиля из основного профиля.</string>
<string name="settings_cross_profile_file_chooser_desc">Если включено, вы сможете искать/просматривать/выбирать/копировать файлы в Shelter из рабочего профиля и обратно ТОЛЬКО через системный менеджер файлов (он называется \"Файлы\" или \"Документы\" на вашем устройстве) или через приложения, поддерживающие Documents UI (с помощью них возможно получить лишь временный доступ к файлам), при этом изоляция файловой системы останется нетронутой.</string>
<string name="show_all_warning">Управление скрытыми в списке приложениями может привести к разного рода нестабильностям и сбоям, однако эта функция может оказаться полезной в случаях, когда в некачественно настроенных производителем прошивках не включены все необходимые системные приложения в рабочем профиле по умолчанию. Продолжайте на свой страх и риск.</string>
<string name="settings_dont_freeze_foreground">Пропускать активные приложения</string>
<string name="settings_dont_freeze_foreground_desc">Не замораживать приложение на переднем плане при блокировке экрана. Это может быть полезно для приложений типа аудиопроигрывателя, но вам придётся вручную замораживать их через ярлык \"Групповая заморозка\".</string>
<string name="request_system_alert">Shelter необходимо разрешение на <b>отображение поверх других приложений</b> для того, чтобы функция переноса файлов работала корректно. Пожалуйста, дайте разрешение приложениям Shelter в <b>ОБОИХ</b> профилях (основном и рабочем) в диалогах, которые появятся после того, как вы нажмёте \"OK\". Это разрешение необходимо для того, чтобы перенос файлов мог работать в фоновом режиме.</string>
<string name="request_usage_stats">Для этого Shelter необходим доступ к <b>истории использования приложений</b>. Пожалуйста, дайте разрешение приложениям Shelter в <b>ОБОИХ</b> профилях (основном и рабочем) в диалогах, которые появятся после того, как вы нажмёте \"OK\". В противном случае эта возможность не будет работать правильно.</string>
<string name="launch_app_fail">Невозможно запустить приложение %s, так как оно не имеет графического интерфейса.</string>
<string name="service_auto_freeze_desc">Shelter автоматически заморозит приложения, запущенные с помощью \"Разморозить и запустить\" при следующей блокировке экрана.</string>
<string name="setup_wizard_welcome">Добро пожаловать в Shelter</string>
<string name="setup_wizard_permissions">Пару слов о разрешениях</string>
<string name="setup_wizard_compatibility">Совместимость</string>
<string name="setup_wizard_failed">Установка не выполнена</string>
<string name="setup_wizard_action_required">Требуется действие</string>
<string name="setup_wizard_ready">Готовы?</string>
<string name="setup_wizard_please_wait">Подождите…</string>
<string name="setup_wizard_please_wait_text">Выполняется инициализация рабочего профиля и настройка Shelter на вашем устройстве.</string>
<string name="setup_wizard_ready_text">Приготовления к установке Shelter выполнены. Если ваше устройство работает на Android 7 и ниже, пожалуйста, убедитесь, что оно <b>не</b> в режиме \"Не беспокоить\". Вам позже потребуется <b>нажать на уведомление</b> для завершения процесса настройки.
\n
\nНажмите \"Далее\", чтобы начать процесс настройки.</string>
<string name="setup_wizard_welcome_text">Shelter это приложение, которое поможет вам запускать другие приложения в изолированном профиле. Для этого используется функция Android <b>Рабочий профиль</b>.
\n
\nНажмите \"Далее\", чтобы узнать дополнительную информацию о Shelter и выполнить установку.
\n
\nМы рекомендуем вам внимательно прочитать все следующие страницы.</string>
<string name="setup_wizard_failed_text">К сожалению, установить Shelter невозможно.
\n
\nЕсли на вашем устройстве уже был рабочий профиль от предыдущей установки Shelter или от другого приложения, вам придётся удалить этот профиль через «Настройки → Учётная запись», прежде чем Shelter сможет начать работу.
\n
\nИли же, если вы сами не отменили установку, то причина сбоя чаще всего кроется в сильно модифицированной системе или конфликтом между Shelter и другими менеджерами рабочих профилей. К сожалению, мы мало что можем с этим поделать.
\n
\nНажмите \"Далее\", чтобы выйти.</string>
<string name="setup_wizard_action_required_text">Сейчас вы должны увидеть уведомление от Shelter. <b>Нажмите на это уведомление</b>, чтобы завершить процесс установки.
\n
\nЕсли вы не видите уведомление, убедитесь, что ваше устройство не находится в режиме \"Не беспокоить\", и попробуйте открыть панель уведомлений.
\n
\nЧтобы попробовать начать всё сначала, вы можете очистить данные Shelter в настройках приложения.</string>
<string name="setup_wizard_permissions_text">По умолчанию Shelter не запрашивает никаких разрешений для себя. Однако, как только вы продолжите процесс настройки, Shelter попытается установить рабочий профиль и, следовательно, стать <b>менеджером профиля</b>.
\n
\nЭто даст Shelter обширный список прав внутри профиля, сравнимый с правами администратора устройства, хотя и ограниченный профилем. Быть менеджером профиля необходимо для большинства функций Shelter.
\n
\nНекоторые расширенные функции Shelter могут потребовать дополнительных разрешений <b>за пределами</b> рабочего профиля. При необходимости Shelter запросит эти разрешения отдельно, когда вы включите соответствующие функции.</string>
<string name="setup_wizard_compatibility_text">Shelter разрабатывается и тестируется на AOSP-подобных системах Android. Они включают в себя AOSP (Android Open Source Project), Google Android (на устройствах Pixel) и <b>большинство пользовательских ROM с открытым исходным кодом на базе AOSP</b>, таких как LineageOS. Если на вашем устройстве установлена одна из вышеперечисленных систем Android, поздравляем! Shelter скорее всего будет правильно работать на вашем устройстве.
\n
\nНекоторые производители устройств вносят очень серьёзные изменения в кодовую базу Android, что приводит к конфликтам, несовместимости и неожиданному поведению. В некоторые пользовательские ROM также могут вноситься изменения, нарушающие совместимость, но, как правило, это более редкие случаи по сравнению с несовместимостью, вносимой производителем устройства.
\n
\nShelter это всего лишь интерфейс к функции рабочего профиля, предоставляемой системой. Если функция, предоставляемая системой, не работает или реализована нестандартно, <b>Shelter не сможет волшебным образом решить проблему самостоятельно</b>. Если вы используете модифицированную производителем версию Android, про которую известно, что в ней нарушены рабочие профили, <b>вас предупредили</b>. Вы можете продолжить установку в любом случае, но нет никакой гарантии, что Shelter будет работать правильно в этих обстоятельствах.</string>
<string name="payment_stub_description">Заглушка платёжных сервисов (НЕ ИСПОЛЬЗОВАТЬ)</string>
<string name="allow_cross_profile_interaction">Разрешить работу между профилями</string>
<string name="settings_payment_stub_desc">Чтобы получить возможность выбрать платёжное приложение внутри рабочего профиля в Настройки - NFC, включите фальшивый платёжный сервис NFC в основном профиле. Это временное решение ошибки Android, из-за которой невозможно выбрать платёжное приложение внутри рабочего профиля, если в основном профиле таких нет.</string>
<string name="settings_payment_stub">Заглушка платёжных сервисов</string>
</resources> </resources>

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="uninstall_success">Апликација\"%s\" је успешно деинсталирана</string>
<string name="clone_fail_system_app">Није могуће клонирати системске апликације на профил над којим Шелтер нема контролу.</string>
<string name="unsupported_launcher">Није могуће додати пречице у покретач. За више информација контактирајте програмера.</string>
<string name="request_storage_manager">Шелтеру је потребан приступ <b>свим датотекама</b> за Фајл шатл. Омогућите дозволу за <b>ОБЕ</b> (личне/радне) апликације за Шелтер које се приказују у дијалогу након што притиснете „ОК“.</string>
<string name="request_usage_stats">Шелтеру је потребна дозвола за <b>статистику коришћења</b> да ово уради. Омогућите дозволу за <b>ОБЕ</b> апликације за Шелтер које се приказују у дијалогу након што притиснете „Ок“. Ако то не урадите, ова функција неће исправно радити.</string>
<string name="request_system_alert">Шелтер мора да се <b>приказује преко других апликација</b> да би Фајл шатл функционисао исправно. Омогућите дозволу за <b>ОБЕ</b> (личне/радне) апликације за Шелтер које се приказују у дијалогу након што притиснете „ОК“. Ова дозвола се користи за покретање Фајл шатл услуга у позадини.</string>
<string name="setup_wizard_compatibility_text">Шелтер је развијен и тестиран на Андроид дериватима сличним АОСП-у. Ово укључује АОСП (Андроид Опен Сорс Проџект), Гугл Андроид (на Пикселу) и <b>већину прилагођених РОМ-ова отвореног кода заснованих на АОСП-у</b> као што је ЛиниеџОС. Ако Ваш телефон користи један од Андроид деривата наведених изнад, честитамо! Шелтер ће вероватно исправно радити на Вашем уређају.
\n
\nНеки произвођачи уређаја користе веома инвазивна прилагођавања базе Андроид кода, што доводи до сукоба, некомпатибилности и неочекиваног понашања. Неки прилагођени РОМ-ови такође могу да унесу промене које нарушавају компатибилност, али генерално то су ређе појаве у поређењу са некомпатибилностима које је увео произвођач телефона.
\n
\nШелтер је само интерфејс за функцију радног профила коју обезбеђује систем. Ако је функција коју пружа систем покварена или нестандардна, <b>Шелтер не може сам да реши проблем</b>. Ако тренутно користите верзију Андроид-а модификовану од стране добављача за коју је познато да крши радне профиле, <b>добили сте упозорење</b>. У сваком случају можете наставити, али не постоји гаранција да ће се Шелтер исправно понашати у овим околностима.</string>
<string name="payment_stub_description">Лажна услуга за плаћање (НЕ КОРИСТИТЕ)</string>
<string name="first_run_alert_cancel">Здраво</string>
<string name="first_run_alert_continue">Настави</string>
<string name="device_admin_desc">Услуга изолације апликација</string>
<string name="setup_wizard_welcome">Добродошли у Шелтер</string>
<string name="setup_wizard_welcome_text">Шелтер је апликација која Вам помаже да покренете друге апликације у изолованом профилу. То ради коришћењем функције <b>Радни профил</b> Андроида.
\n
\nКликните „Даље“ и пружићемо Вам више информација о Шелтеру и водити Вас кроз процес подешавања.
\n
\nПредлажемо да пажљиво прочитате све следеће странице.</string>
<string name="setup_wizard_permissions">Неколико речи о дозволама</string>
<string name="setup_wizard_compatibility">Компатибилност</string>
<string name="setup_wizard_ready_text">Сада смо спремни да Вам подесимо Шелтер. Ако Ваш уређај користи Андроид 7 или старију верзију, прво се уверите да Ваш уређај <b>није</b> у режиму Не узнемиравај, јер ћете морати да <b>кликнете на обавештење</b> касније да бисте завршили процес подешавања.
\n
\nКада будете спремни, кликните „Даље“ да бисте започели процес подешавања.</string>
<string name="setup_wizard_action_required_text">Сада би требало да видите обавештење од Шелтера. <b>Кликните на то обавештење</b> да бисте завршили процес подешавања.
\n
\nАко не видите обавештење, уверите се да Ваш уређај није у режиму Не узнемиравај и покушајте да повучете центар за обавештења надоле.
\n
\nДа бисте ресетовали Шелтер и почели испочетка, можете да обришете податке Шелтера у подешавањима.</string>
<string name="uninstall_fail_system_app">Није могуће деинсталирати системске апликације на профилу над којим Шелтер нема контролу.</string>
<string name="setup_wizard_ready">Спремни?</string>
<string name="setup_wizard_please_wait">Сачекајте…</string>
<string name="setup_wizard_failed">Подешавање није успело</string>
<string name="setup_wizard_action_required">Потребна радња</string>
<string name="finish_provision_desc">Честитамо! На један клик сте од завршетка подешавања Шелтера.</string>
<string name="service_title">Шелтер услуга</string>
<string name="service_desc">Шелтер сада ради …</string>
<string name="service_auto_freeze_now">Замрзни сада</string>
<string name="app_installing">Инсталирање...</string>
<string name="fragment_profile_main">Главни</string>
<string name="fragment_profile_work">Шелтер</string>
<string name="list_item_disabled">[Замрзнуто] %s</string>
<string name="batch_operation">Групна операција</string>
<string name="clone_to_work_profile">Клонирај у Шелтер (радни профил)</string>
<string name="clone_to_main_profile">Клонирај у главни профил</string>
<string name="uninstall_app">Деинсталирај</string>
<string name="freeze_app">Замрзни</string>
<string name="unfreeze_app">Одмрзни</string>
<string name="launch">Покрени</string>
<string name="unfreeze_and_launch">Одмрзни и покрени</string>
<string name="allow_cross_profile_widgets">Дозволи виџете у главном профилу</string>
<string name="allow_cross_profile_interaction">Дозволи међупрофилну интеракцију</string>
<string name="search">Претрага</string>
<string name="create_freeze_all_shortcut">Направи пречицу за групно замрзавање</string>
<string name="freeze_all_shortcut">Замрзни</string>
<string name="install_app_to_profile">Инсталирај АПК у Шелтер</string>
<string name="documents_ui">Отворите УИ докумената</string>
<string name="settings_payment_stub">Лажна услуга за плаћање</string>
<string name="settings">Подешавања</string>
<string name="settings_interaction">Интеракција</string>
<string name="settings_block_contacts_searching">Блокирајте претрагу контаката</string>
<string name="settings_block_contacts_searching_desc">Забрани приступ са главног профила контактима унутар радног профила.</string>
<string name="settings_auto_freeze_service_desc">Када је екран закључан, аутоматски замрзни апликације покренуте са „Одмрзни и покрени пречица“.</string>
<string name="settings_services">Услуге</string>
<string name="settings_auto_freeze_service">Услуга аутоматског замрзавања</string>
<string name="settings_auto_freeze_delay">Одгађање аутоматског замрзавања</string>
<string name="settings_dont_freeze_foreground">Прескочи апликације у првом плану</string>
<string name="settings_dont_freeze_foreground_desc">НЕМОЈТЕ да замрзавате апликације у првом плану (са видљивом активношћу) када закључате екран. Ово може бити корисно за апликације као што су музички плејери, али ћете након тога морати ручно да их замрзнете преко „Пречица за групно замрзавање“.</string>
<string name="settings_about">О апликацији</string>
<string name="settings_version">Верзија</string>
<string name="settings_source_code">Изворни код</string>
<string name="settings_translate">Превод</string>
<string name="settings_bug_report">Пријава грешке / Праћење проблема</string>
<string name="provision_finished">Подешавање Шелтера је завршено. Сада поново покрећемо Шелтер. Ако се Шелтер није покренуо аутоматски, можете га поново покренути из покретача.</string>
<string name="msg_device_unsupported">Дозвола је одбијена или уређај није подржан</string>
<string name="work_profile_not_found">Радни профил није пронађен. Поново покрените апликацију да бисте поново обезбедили профил.</string>
<string name="work_profile_provision_failed">Није могуће обезбеђивање радног профила. Можете покушати поново тако што ћете поново покренути Шелтер.</string>
<string name="work_mode_disabled">Изгледа да сте онемогућили радни режим док сте покретали Шелтер. Ако сте га сада омогућили, покрените Шелтер поново.</string>
<string name="clone_success">Апликација \"%s\" је успешно клонирана</string>
<string name="freeze_success">Апликација \"%s\" је успешно замрзнута</string>
<string name="unfreeze_success">Апликација \"%s\" је успешно одмрзнута</string>
<string name="app_context_menu_title">Операције за %s</string>
<string name="freeze_all_success">Све апликације на листи „Аутоматско замрзавање“ су успешно замрзнуте.</string>
<string name="shortcut_create_success">Пречица направљена на вашем покретачу.</string>
<string name="notifications_important">Шелтер важно</string>
<string name="launch_app_fail">Није могуће покренути апликацију %s јер нема ГУИ.</string>
<string name="continue_anyway">Свеједно настави</string>
<string name="miui_cannot_clone">Клонирање несистемских апликација на други профил тренутно није могуће на МИУИ. Клонирајте продавницу апликација Вашег система (нпр. <b>Плеј Стор</b>) у други профил и затим инсталирајте апликације одатле.</string>
<string name="device_admin_explanation">Шелтер мора да постане администратор уређаја да би обављао своје изолационе задатке.</string>
<string name="finish_provision_title">Кликните овде да завршите подешавање Шелтера</string>
<string name="service_auto_freeze_title">Аутоматско замрзавање је на чекању</string>
<string name="service_auto_freeze_desc">Шелтер ће аутоматски замрзнути апликације покренуте из „Одмрзни и покрени“ приликом следећег закључавања екрана.</string>
<string name="create_unfreeze_shortcut">Направите пречицу за одмрзавање и/или покретање</string>
<string name="auto_freeze">Аутоматско замрзавање</string>
<string name="freeze_all">Групно замрзавање</string>
<string name="install_app_to_profile_success">Инсталација апликације је завршена у радном профилу.</string>
<string name="show_all">Прикажи све апликације</string>
<string name="show_all_warning">Манипулисање апликацијама које су скривене са листе може да изазове грешке и разне врсте неочекиваног понашања. Међутим, ова функција може бити корисна када неисправни РОМ-ови добављача не омогућавају све неопходне системске апликације у радном профилу подразумевано. Настављате на своју одговорност.</string>
<string name="settings_cross_profile_file_chooser">Фајл шатл</string>
<string name="setup_wizard_please_wait_text">Покушавамо да иницијализујемо радни профил и подесимо Шелтер на Вашем уређају.</string>
<string name="setup_wizard_failed_text">Са жаљењем Вас обавештавамо да нисмо били у могућности да Вам подесимо Шелтер.
\n
\nАко је Ваш уређај већ имао радни профил, било из претходне инсталације Шелтера или из друге апликације, мораћете да уклоните тај профил у Подешавања -&gt; Налог пре него што Шелтер може да настави.
\n
\nУ супротном, ако нисте ручно отказали подешавање, разлог за неуспех је најчешће због јако модификованог система или сукоба између Шелтера и других менаџера радног профила. Нажалост, не можемо много да урадимо по том питању.
\n
\nКликните „Даље“ да бисте изашли.</string>
<string name="setup_wizard_permissions_text">Подразумевано, Шелтер неће тражити никакве појединачне дозволе. Међутим, када наставите са процесом подешавања, Шелтер ће покушати да подеси радни профил и тако постати <b>менаџер</b> наведеног профила.
\n
\nОво ће Шелтеру дати опсежну листу дозвола унутар профила, упоредиву са оном администратора уређаја, иако ограничена на профил. Бити менаџер профила је неопходно за већину функционалности Шелтера.
\n
\nНеке напредне функције Шелтера ће можда захтевати више дозвола <b>ван</b> радног профила. Када је потребно, Шелтер ће тражити те дозволе засебно када омогућите одговарајуће функције.</string>
<string name="settings_cross_profile_file_chooser_desc">Када је омогућено, моћи ћете да разгледате / прегледате / бирате / копирате датотеке у Шелтеру са главног профила и обрнуто, САМО преко УИ докумената (названих Датотеке или Документи на вашем покретачу) или апликација са подршком УИ докумената (оне добијају само привремени приступ датотекама које одаберете у УИ докумената), док се даље одржава изолација система датотека.</string>
<string name="settings_payment_stub_desc">Омогућите лажну НФЦ услугу плаћања у главном профилу, тако да опција бесконтактног плаћања у оквиру Подешавања - НФЦ постане омогућена да Вам дозволи да изаберете апликацију за плаћање унутар радног профила. Ово функционише око Андроид грешке која онемогућава одабир апликације за плаћање унутар радног профила ако ниједна није доступна у главном профилу.</string>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="service_auto_freeze_now">Frys Nu</string>
<string name="app_installing">Installerar...</string>
<string name="settings_dont_freeze_foreground">Hoppa över förgrundsappar</string>
<string name="settings_block_contacts_searching_desc">Neka åtkomst från primära profilen till kontakter i arbetsprofilen.</string>
<string name="show_all_warning">Att manipulera appar som är dolda från listan kan orsaka krascher och flera möjliga oväntade beteenden. Den här funktionen kan dock vara användbar när leverantörsanpassade ROM:er inte aktiverar alla nödvändiga systemappar i arbetsprofilen som standard. Om du väljer att fortsätta gör du det på egen hand.</string>
<string name="setup_wizard_welcome">Välkommen till Shelter</string>
<string name="settings_block_contacts_searching">Blockera kontaktsökning</string>
<string name="first_run_alert_cancel">Hej då</string>
<string name="first_run_alert_continue">Fortsätt</string>
<string name="settings_auto_freeze_service_desc">När skärmen är låst, frys automatiskt appar som startas från \"Tina upp &amp; Starta\"-genvägen.</string>
<string name="settings_auto_freeze_delay">Fördröjning av automatisk frysning</string>
<string name="settings_dont_freeze_foreground_desc">Frys INTE förgrundsappar (med synlig aktivitet) när skärmen låsas. Detta kan vara användbart för appar som musikspelare, men du måste frysa dem manuellt genom \"Batch Freeze\"-genvägen efteråt.</string>
<string name="settings_about">Om</string>
<string name="settings_version">Version</string>
<string name="settings_source_code">Källkod</string>
<string name="clone_success">Applikationen \"%s\" klonades framgångsrikt</string>
<string name="uninstall_success">Applikationen \"%s\" avinstallerades framgångsrikt</string>
<string name="freeze_success">Applikationen \"%s\" har frysts framgångsrikt</string>
<string name="unfreeze_success">Applikationen \"%s\" tinades upp framgångsrikt</string>
<string name="freeze_all_success">Alla appar i listan \"Automatisk frysning\" har frysts.</string>
<string name="unsupported_launcher">Det går inte att lägga till genvägar till din launcher. Kontakta utvecklaren för mer information.</string>
<string name="shortcut_create_success">Genväg skapad på din launcher.</string>
<string name="launch_app_fail">Det går inte att starta appen %s eftersom den har inte något GUI.</string>
<string name="miui_cannot_clone">Att klona icke-systemappar till en annan profil är för närvarande inte möjligt på MIUI. Vänligen klona ditt systems appbutik (t.ex. <b>Play Butik, FDroid</b>) till den andra profilen och installera sedan appar därifrån.</string>
<string name="fragment_profile_main">Primär</string>
<string name="continue_anyway">Fortsätt ändå</string>
<string name="fragment_profile_work">Shelter</string>
<string name="uninstall_fail_system_app">Det går inte att avinstallera systemappar i en profil som Shelter inte har kontroll över.</string>
<string name="device_admin_desc">App-isoleringstjänst</string>
<string name="device_admin_explanation">Shelter behöver bli enhetsadministratör för att kunna utföra sina isoleringsuppgifter.</string>
<string name="notifications_important">Viktigt om Shelter</string>
<string name="finish_provision_title">Klicka här för att slutföra installationen av Shelter</string>
<string name="service_title">Shelter-tjänst</string>
<string name="service_desc">Shelter är nu igång…</string>
<string name="setup_wizard_welcome_text">Shelter är en applikation som kan hjälpa dig att köra andra applikationer i en isolerad profil. Den gör det genom att använda funktionen <b>Arbetsprofil</b> i Android.
\n
\nKlicka på \"Nästa\" så ger vi dig mer information om Shelter och guidar dig genom installationsprocessen.
\n
\nVi föreslår att du läser igenom alla följande sidor noggrant.</string>
<string name="batch_operation">Batch operation</string>
<string name="clone_to_main_profile">Klona till Primär Profil</string>
<string name="uninstall_app">Avinstallera</string>
<string name="freeze_app">Frysa</string>
<string name="unfreeze_app">Tina upp</string>
<string name="launch">Starta</string>
<string name="create_unfreeze_shortcut">Skapa \"Tina upp och/eller Starta\"-genväg</string>
<string name="unfreeze_and_launch">Tina upp och Starta</string>
<string name="allow_cross_profile_widgets">Tillåt widgetar i primära profilen</string>
<string name="search">Sök</string>
<string name="auto_freeze">Frysa automatiskt</string>
<string name="freeze_all">Batchfrysa</string>
<string name="create_freeze_all_shortcut">Skapa \"Batchfrysa\"-genväg</string>
<string name="freeze_all_shortcut">Frysa</string>
<string name="install_app_to_profile">Installera APK i Shelter</string>
<string name="install_app_to_profile_success">Applikationsinstallation avslutad i arbetsprofilen.</string>
<string name="show_all">Visa alla appar</string>
<string name="documents_ui">Öppna \"Documents UI\"</string>
<string name="settings">Inställningar</string>
<string name="settings_interaction">Interaktion</string>
<string name="settings_cross_profile_file_chooser">File Shuttle</string>
<string name="settings_translate">Översätt</string>
<string name="setup_wizard_ready_text">Vi är nu redo att sätta upp Shelter åt dig. Se först till att din enhet <b>inte</b> är i \"Stör ej\"-läge, eftersom du kommer att behöva<b>klicka på en avisering</b> senare för att slutföra installationsprocessen.
\n
\nNär du är redo, klicka på \"Nästa\" för att påbörja installationsprocessen.</string>
<string name="setup_wizard_compatibility">Kompatibilitet</string>
<string name="settings_services">Tjänster</string>
<string name="settings_bug_report">Buggrapport / Problemspårare</string>
<string name="msg_device_unsupported">Behörighet nekas eller enhet som inte stöds</string>
<string name="provision_finished">Installationen av Shelter är klar. Nu startar Shelter om. Om Shelter inte startade om automatiskt kan du göra det från din launcher.</string>
<string name="settings_cross_profile_file_chooser_desc">När det är aktiverat kommer du att kunna bläddra / visa / välja / kopiera filer i Shelter från huvudprofilen och vice versa, ENDAST via funktionen \"Documents UI\" (som heter Files eller Documents på din launcher) eller via appar med \"Documents UI\"-stöd (de får bara tillfällig åtkomst till filer du väljer i Documents UI), medan filsystemets isolering fortsätter att gälla.</string>
<string name="setup_wizard_permissions">Några ord om behörigheter</string>
<string name="work_profile_not_found">Det gick inte att hitta arbetsprofilen. Starta om appen för att omregistrera profilen.</string>
<string name="work_profile_provision_failed">Det går inte att tillhandahålla arbetsprofil. Du kan försöka igen genom att starta om Shelter.</string>
<string name="work_mode_disabled">Det verkar som att arbetsprofilen var inaktiverad när Shelter startades. Om du nu har aktiverat det, starta om Shelter.</string>
<string name="clone_fail_system_app">Det går inte att klona systemappar till en profil som Shelter inte har kontroll över.</string>
<string name="setup_wizard_ready">Redo?</string>
<string name="setup_wizard_please_wait">Vänta…</string>
<string name="setup_wizard_please_wait_text">Vi försöker initiera Work Profile och konfigurera Shelter på din enhet.</string>
<string name="setup_wizard_failed">Konfigurationen misslyckades</string>
<string name="setup_wizard_action_required">Åtgärd krävs</string>
<string name="settings_auto_freeze_service">Automatisk frystjänst</string>
<string name="app_context_menu_title">Operationer för %s</string>
<string name="setup_wizard_action_required_text">Du bör nu se en avisering från Shelter. <b>Klicka på det aviseringen</b> för att slutföra installationsprocessen.
\n
\nOm du inte ser aviseringen, se till att din enhet inte är i \"Stör ej\"-läge och försök dra ner meddelandecentret.
\n
\nFör att återställa Shelter och börja om kan du rensa Shelters data i Inställningar.</string>
<string name="setup_wizard_failed_text">Tyvärr kunde vi inte konfigurera Shelter åt dig.
\n
\nOm din enhet redan hade en arbetsprofil konfigurerad, antingen från en tidigare installation av Shelter eller från en annan applikation, måste du ta bort den profilen i Inställningar -&gt; Konto innan Shelter kan fortsätta.
\n
\nAnnars, om du inte avbröt installationen manuellt, beror orsaken till felet oftast på ett kraftigt modifierat system eller en konflikt mellan Shelter och andra appar som hanterar arbetsprofilen. Tyvärr finns det inte mycket vi kan göra åt detta.
\n
\nKlicka på \"Nästa\" för att avsluta.</string>
<string name="setup_wizard_permissions_text">Som standard kommer Shelter inte att be om några individuella behörigheter. Men när du väl har gått vidare med installationsprocessen kommer Shelter att försöka skapa en arbetsprofil och blir därför <b>profilhanterare</b> för profilen.
\n
\nDetta kommer att ge Shelter en omfattande lista med behörigheter i profilen, jämförbar med de för en enhetsadministratör, även om detta är begränsat till profilen. Att vara profilhanterare är nödvändigt för de flesta av Shelters funktionalitet.
\n
\nVissa avancerade funktioner i Shelter kan kräva fler behörigheter <b>utanför</b> arbetsprofilen. När det behövs kommer Shelter att be om dessa behörigheter separat när du aktiverar motsvarande funktioner.</string>
<string name="setup_wizard_compatibility_text">Shelter är utvecklad och testad på AOSP-liknande Android-derivat. Detta inkluderar AOSP (Android Open Source Project), Google Android (på Pixel/enheter) och <b>de flesta AOSP-baserade “custom ROMs” med öppen källkod,</b> som LineageOS. Om din smartphone kör en av Android-derivaten som anges ovan, grattis! Shelter kommer förmodligen att fungera korrekt på din enhet.
\n
\nVissa enhetsleverantörer introducerar mycket invasiva anpassningar i Android-kodbasen, vilket resulterar i konflikter, inkompatibilitet och oväntat beteende. Vissa “custom ROMs” kan också införa kompatibilitetsbrytande förändringar, men i allmänhet är dessa sällsynta jämfört med telefonleverantörsintroducerade inkompatibiliteter.
\n
\nShelter är bara ett gränssnitt till funktionen \"Arbetsprofil\" som tillhandahålls av Android-systemet. Om funktionen som tillhandahålls av systemet är trasig eller icke-standard, kan <b>Shelter inte magiskt lösa problemet på egen hand</b>. Om du för närvarande använder en leverantörsmodifierad Android-version som är känd för att bryta arbetsprofilsfunktionen, <b>har du blivit varnad</b>. Du kan fortsätta ändå, men det finns ingen garanti för att Shelter ska bete sig korrekt under dessa omständigheter.</string>
<string name="request_usage_stats">Shelter behöver <b>Användningsstatistik</b>-tillstånd för att göra detta. Vänligen aktivera behörigheten för <b>BÅDA TVÅ</b> Shelter-appar som visas i dialogrutan efter att du tryckt på \"OK\". Om du inte gör det kommer den här funktionen inte att fungera korrekt.</string>
<string name="finish_provision_desc">Grattis! Du är ett klick från att slutföra installationen av Shelter.</string>
<string name="request_storage_manager">Shelter behöver åtkomst till <b>Alla filer</b> för File Shuttle. Vänligen aktivera behörigheten för <b>BÅDA TVÅ </b> Shelter-appar som visas i dialogrutan efter att du tryckt på \"OK\".</string>
<string name="service_auto_freeze_title">I väntan på automatisk frysning</string>
<string name="service_auto_freeze_desc">Shelter kommer att automatiskt frysa appar som startas från \"Tina upp &amp; Starta\" vid nästa skärmlåshändelse.</string>
<string name="list_item_disabled">[Frusen] %s</string>
<string name="clone_to_work_profile">Klona till Shelter (arbetsprofil)</string>
<string name="request_system_alert">Shelter måste <b>Rita över andra appar</b> för att File Shuttle ska fungera korrekt. Vänligen aktivera behörigheten för <b>BÅDA TVÅ </b> Shelter-appar som visas i dialogrutan efter att du tryckt på \"OK\". Denna behörighet används för att kunna starta File Shuttle-tjänster i bakgrunden.</string>
</resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="first_run_alert">நீங்கள் இப்பொழுது ஷெல்டர் ஆப் செட் பண்ண போகிறீர்கள்
\n
\nஇந்த ஆப் உங்கள் போனில் உள்ள <b>வொர்க் ப்ரோஃபைல்</b> வசதியை பயன்படுத்தி மத்த ஆப்களை ஐசலேட் பண்ணும்</string>
</resources>

View file

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="setup_wizard_welcome">షెల్టర్‌కు స్వాగతం</string>
<string name="first_run_alert_continue">కొనసాగించు</string>
<string name="device_admin_desc">యాప్ ఐసోలేషన్ సర్వీస్</string>
<string name="device_admin_explanation">షెల్టర్ దాని ఐసోలేషన్ విధులను నిర్వహించడానికి డివైస్ అడ్మిన్ గా మారాలి.</string>
<string name="launch_app_fail">యాప్ %sని ప్రారంభించలేరు, ఎందుకంటే దానికి GUI లేదు.</string>
<string name="settings_dont_freeze_foreground_desc">మీ స్క్రీన్‌ను లాక్ చేయడం సమయంలో ముందంజ యాప్‌లను (కనిపించే కార్యకలాపం ఉన్న) ఫ్రిజ్ చేయకండి. ఇది సంగీత ప్లేయర్‌ల వంటి యాప్‌లకు ఉపయోగకరంగా ఉండవచ్చు, కానీ తర్వాత \"బ్యాచ్ ఫ్రిజ్ షార్ట్‌కట్\" ద్వారా వాటిని చేతితో ఫ్రిజ్ చేయాలి.</string>
<string name="settings_cross_profile_file_chooser">ఫైల్ షట్ల్</string>
<string name="app_installing">ఇన్‌స్టాల్ చేయబడుతోంది...</string>
<string name="msg_device_unsupported">అనుమతి నిరాకరించబడింది లేదా మద్దతు పొందని పరికరం</string>
<string name="settings_translate">అనువాదం</string>
<string name="setup_wizard_please_wait">దయచేసి వేచి ఉండండి…</string>
<string name="list_item_disabled">[ఫ్రోజెన్] %s</string>
<string name="setup_wizard_ready_text">మేము ఇప్పుడు మీ కోసం షెల్టర్‌ని సెటప్ చేయడానికి సిద్ధంగా ఉన్నాము. మీ పరికరం Android 7 లేదా అంతకంటే తక్కువగా నడుస్తోంటే, మొదట మీ పరికరం \"Do Not Disturb\" మోడ్‌లో లేదని నిర్ధారించుకోండి, ఎందుకంటే మీరు సెటప్ ప్రక్రియను పూర్తి చేయడానికి తర్వాత ఒక నోటిఫికేషన్‌పై క్లిక్ చేయాలి.
\n
\nమీరు సిద్ధంగా ఉన్నప్పుడు, సెటప్ ప్రక్రియ ప్రారంభించడానికి \"తదుపరి\"పై క్లిక్ చేయండి.</string>
<string name="settings_block_contacts_searching_desc">కార్య ప్రొఫైల్‌లోని సంప్రదింపులకు ప్రధాన ప్రొఫైల్ నుండి యాక్సెస్‌ను తిరస్కరించండి.</string>
<string name="payment_stub_description">చెల్లింపు సేవ స్టబ్ (ఉపయోగించవద్దు)</string>
<string name="setup_wizard_welcome_text">\"షెల్టర్\" అనేది ఇతర యాప్‌లను వేరుప్రొఫైల్‌లో నడపడంలో మీకు సహాయం చేసే యాప్. ఇది ఆండ్రాయిడ్‌లోని <b>వర్క్ ప్రొఫైల్</b> ఫీచర్‌ను ఉపయోగించడం ద్వారా పని చేస్తుంది.
\n
\n\"తదుపరి\"ను క్లిక్ చేయండి, మేము మీకు షెల్టర్ గురించి మరిన్ని వివరాలు అందించాము మరియు సెటప్ ప్రక్రియలో మిమ్మల్ని మార్గనిర్దేశం చేస్తాము.
\n
\nక్రిది పేజీలన్నీ జాగ్రత్తగా చదవాలని మేము సిఫార్సు చేస్తాము.</string>
<string name="settings_interaction">ఇంటరాక్షన్</string>
<string name="finish_provision_desc">అభినందనలు! షెల్టర్‌ని సెటప్ చేయడం పూర్తి చేయడానికి మీరు ఒక్క క్లిక్ దూరంలో ఉన్నారు.</string>
<string name="show_all_warning">జాబితాలోని దాచిన యాప్‌లను మానిప్యులేట్ చేయడం వల్ల క్రాష్‌లు మరియు వివిధ రకాల అనూహ్య ప్రవర్తనలు కలిగించవచ్చు. అయితే, ఫాల్టీ విక్రేత-కస్టమైజ్డ్ ROMలు వర్క్ ప్రొఫైల్‌లో అన్ని అవసరమైన సిస్టమ్ యాప్లను డిఫాల్ట్‌గా ఎనేబుల్ చేయని సమయంలో ఈ ఫీచర్ ఉపయోగకరంగా ఉండవచ్చు. మీరు కొనసాగితే, మీరు మీ స్వంతంగా ఉంటారు.</string>
<string name="settings_block_contacts_searching">సంప్రదింపుల అన్వేషణను అడ్డుకోండి</string>
<string name="settings_cross_profile_file_chooser_desc">ఇది ఎనేబుల్ చేసినప్పుడు, మీరు షెల్టర్‌లో ఫైల్‌లను బ్రౌజ్ / వీక్షించడానికి / ఎంచుకోవడానికి / కాపీ చేయడానికి ప్రధాన ప్రొఫైల్ నుండి మరియు పునాదిగా, డాక్యుమెంట్స్ UI (మీ లాంచర్‌లో ఫైల్‌లు లేదా డాక్యుమెంట్స్ అని పిలవబడుతుంది) లేదా డాక్యుమెంట్స్ UI మద్దతు ఉన్న అనువర్తనాలను మాత్రమే ఉపయోగించి చేసుకోగలరు (అవి డాక్యుమెంట్స్ UIలో మీరు ఎంచుకున్న ఫైల్‌లకు తాత్కాలిక యాక్సెస్ పొందుతాయి), అయితే ఫైల్ సిస్టమ్ ఆర్థికంగా ఇన్సొలేషన్‌ను ఉంచుతుంది.</string>
<string name="provision_finished">షెల్టర్ సెటప్ పూర్తి. ఇప్పుడు షెల్టర్‌ను పునఃప్రారంభించటం జరుగుతోంది. షెల్టర్ ఆటోమేటిక్‌గా ప్రారంభమైతే, మీ లాంచర్ నుండి మళ్లీ ప్రారంభించవచ్చు.</string>
<string name="settings_payment_stub_desc">ప్రధాన ప్రొఫైల్‌లో ఒక జట్టుపై NFC చెల్లింపు సేవను ఎనేబుల్ చేయండి, తద్వారా సెట్టింగ్‌లలో - NFC క్రింద ఉన్న నిర్లక్ష్య చెల్లింపుల ఎంపిక ఎనేబుల్ అవుతుంది, ఇది మీకు వర్క్ ప్రొఫైల్‌లో చెల్లింపు అనువర్తనాన్ని ఎంచుకోవడానికి అనుమతిస్తుంది. ఇది ప్రధాన ప్రొఫైల్‌లో అందుబాటులో లేదు అంటే వర్క్ ప్రొఫైల్‌లో చెల్లింపు అనువర్తనాన్ని ఎంచుకోవడం అసాధ్యమైన ఆండ్రాయిడ్ బగ్‌ను చుట్టుకుంటుంది.</string>
<string name="freeze_all">బ్యాచ్ ఫ్రీజ్</string>
<string name="notifications_important">షెల్టర్ ముఖ్యమైనది</string>
<string name="freeze_success">అనువర్తనం \"%s\" విజయవంతంగా ఫ్రిజ్ చేయబడింది</string>
<string name="request_system_alert">షెల్టర్‌కు ఫైల్ షటిల్ సరిగ్గా పనిచేయడానికి <b>ఇతర యాప్‌లపై డ్రా చేయడం</b> అవసరం. \"ఓకే\" బటన్‌ను నొక్కిన తర్వాత డైలాగ్‌లో చూపించిన రెండు (వ్యక్తిగత / వర్క్) షెల్టర్ యాప్‌లకు ఈ అనుమతిని ఎనేబుల్ చేయండి. ఈ అనుమతి ఫైల్ షటిల్ సేవలను బ్యాక్‌గ్రౌండ్‌లో ప్రారంభించడానికి ఉపయోగించబడుతుంది.</string>
<string name="settings_patreon_url" translatable="false"/>
<string name="setup_wizard_action_required_text">మీరు ఇప్పుడు షెల్టర్ నుండి ఒక నోటిఫికేషన్‌ను చూడాలి. <b>దయచేసి ఆ నోటిఫికేషన్‌ను నొక్కండి</b> సెటప్ ప్రక్రియను ముగించడానికి.
\n
\nమీరు నోటిఫికేషన్‌ను చూడకపోతే, మీ పరికరం \"డో నాట్ డిస్టర్బ్\" మోడ్‌లో లేదు అని నిర్ధారించుకోండి మరియు నోటిఫికేషన్ సెంటర్‌ను కిందకి పుల్లండి.
\n
\nషెల్టర్ను రీసెట్ చేసి మళ్లీ ప్రారంభించడానికి, సెటింగ్స్‌లో షెల్టర్ యొక్క డేటాను క్లియర్ చేయవచ్చు.</string>
<string name="create_freeze_all_shortcut">బ్యాచ్ ఫ్రీజ్ సత్వరం సృష్టించండి</string>
<string name="clone_to_work_profile">షెల్టర్ (వర్క్ ప్రొఫైల్)కి క్లోన్ చేయండి</string>
<string name="allow_cross_profile_widgets">ప్రధాన ప్రొఫైల్‌లో విజెట్‌లను అనుమతించండి</string>
<string name="freeze_all_success">\"ఆటో ఫ్రిజ్\" జాబితాలోని అన్ని యాప్‌లు విజయవంతంగా ఫ్రిజ్ చేయబడ్డాయి.</string>
<string name="service_auto_freeze_now">ఇప్పుడు ఫ్రీజ్ చేయండి</string>
<string name="settings_bug_report">బగ్ నివేదిక / ఇష్యూ ట్రాకర్</string>
<string name="uninstall_app">అన్‌ఇన్‌స్టాల్ చేయండి</string>
<string name="setup_wizard_action_required"/>
<string name="setup_wizard_compatibility">అనుకూలత</string>
<string name="service_auto_freeze_title">ఆటో-ఫ్రీజ్ పెండింగ్‌లో ఉంది</string>
<string name="allow_cross_profile_interaction">క్రాస్-ప్రొఫైల్ ఇంటరాక్షన్‌ను అనుమతించండి</string>
<string name="settings_about">గురించి</string>
<string name="setup_wizard_failed_text">మేము మీ కోసం షెల్టర్‌ను సెటప్ చేయలేకపోయామని మీకు తెలియజేయడానికి మాకు దురదృష్టం ఉంది.
\n
\nమీ పరికరంలో ఇప్పటికే ఒక వర్క్ ప్రొఫైల్ ఉంటే, అది షెల్టర్ యొక్క గత ఇన్స్టాలేషన్ లేదా మరొక అనువర్తనంలోనూ, షెల్టర్ ముందుకు సాగడానికి ముందు దాన్ని సెటింగ్‌లలో -&gt; ఖాతా ద్వారా తొలగించాలి.
\n
\nలేకపోతే, మీరు సెటప్‌ను చేతితో రద్దు చేయకపోతే, సెటప్ విఫలమైన కారణం సాధారణంగా చాలా మార్పులు చేసిన సిస్టమ్ లేదా షెల్టర్ మరియు ఇతర వర్క్ ప్రొఫైల్ మేనేజర్ల మధ్య సంకర్షణగా ఉంటుంది. దురదృష్టవశాత్తు, దీనిపై మేము చేసేMuch చేయడం లేదు.
\n
\nమీరైతే \"తదుపరి\"పై క్లిక్ చేసి బయటకు వెళ్ళండి.</string>
<string name="miui_cannot_clone">MIUIలో మరో ప్రొఫైలుకు నాన్-సిస్టమ్ యాప్‌లను క్లోన్ చేయడం ప్రస్తుతం సాధ్యం కాదు. దయచేసి మీ సిస్టమ్ యొక్క యాప్ స్టోర్ (ఉదాహరణకు, <b>ప్లే స్టోర్</b>)ని ఇతర ప్రొఫైలుకు క్లోన్ చేసి, అక్కడ నుండి యాప్‌లను ఇన్‌స్టాల్ చేయండి.</string>
<string name="settings_translate_url" translatable="false"/>
<string name="service_title">షెల్టర్ సేవ</string>
<string name="batch_operation">బ్యాచ్ ఆపరేషన్</string>
<string name="unfreeze_and_launch">అన్‌ఫ్రీజ్ చేసి ప్రారంభించండి</string>
<string name="settings_services">సేవలు</string>
<string name="settings_auto_freeze_service">ఆటో ఫ్రిజ్ సేవ</string>
<string name="work_profile_provision_failed">వర్క్ ప్రొఫైల్‌ను అందుబాటులోకి తీసుకోలేకపోతున్నాము. షెల్టర్‌ను పునఃప్రారంభించి మళ్లీ ప్రయత్నించండి.</string>
<string name="service_auto_freeze_desc">షెల్టర్ తదుపరి స్క్రీన్ లాక్ ఈవెంట్‌లో \"అన్‌ఫ్రీజ్ &amp; లాంచ్\" నుండి ప్రారంభించబడిన యాప్‌లను ఆటో-ఫ్రీజ్ చేస్తుంది.</string>
<string name="uninstall_success">అనువర్తనం \"%s\" విజయవంతంగా అన్‌ఇన్‌స్టాల్ చేయబడింది</string>
<string name="unfreeze_app">అన్‌ఫ్రిజ్</string>
<string name="clone_fail_system_app">షెల్టర్ కంట్రోల్ లో లేని ప్రొఫైల్‌కు సిస్టమ్ యాప్‌లను క్లోన్ చేయలేరు.</string>
<string name="setup_wizard_failed">సెటప్ విఫలమైంది</string>
<string name="work_profile_not_found">వర్క్ ప్రొఫైల్ కనుగొనబడలేదు. ప్రొఫైల్‌ను మళ్లీ అందుబాటులోకి తీసుకురావడానికి దయచేసి యాప్‌ను పునఃప్రారంభించండి.</string>
<string name="unfreeze_success">అనువర్తనం \"%s\" విజయవంతంగా అన్‌ఫ్రిజ్ చేయబడింది</string>
<string name="settings_version">వర్షన్</string>
<string name="create_unfreeze_shortcut">అన్‌ఫ్రిజ్ మరియు/లేదా ప్రారంభ Shortcutని సృష్టించు</string>
<string name="request_storage_manager">షెల్టర్‌కు ఫైల్ షటిల్ కోసం <b>అన్ని ఫైళ్లకు</b> ప్రాప్యత అవసరం. \"ఓకే\" బటన్‌ను నొక్కిన తర్వాత డైలాగ్‌లో చూపించిన రెండు (వ్యక్తిగత / వర్క్) షెల్టర్ యాప్‌లకు ఈ అనుమతిని ఎనేబుల్ చేయండి.</string>
<string name="documents_ui">డాక్యుమెంట్స్ UIని తెరువు</string>
<string name="setup_wizard_please_wait_text">మేము మీ పరికరంలో వర్క్ ప్రొఫైల్‌ను ప్రారంభించడానికి మరియు షెల్టర్‌ను సెటప్ చేయడానికి ప్రయత్నిస్తున్నాము.</string>
<string name="launch">ప్రారంభించు</string>
<string name="setup_wizard_permissions_text">డిఫాల్ట్‌గా, షెల్టర్ ఏ వ్యక్తిగత అనుమతులను అడగదు. అయితే, మీరు సెటప్ ప్రక్రియను కొనసాగించిన తర్వాత, షెల్టర్ వర్క్ ప్రొఫైల్‌ను సెటప్ చేయడానికి ప్రయత్నిస్తుంది, అందువల్ల పేర్కొన్న ప్రొఫైల్‌కు <b>ప్రొఫైల్ మేనేజర్</b> గా మారుతుంది.
\n
\nదీని ద్వారా షెల్టర్‌కు ఆ ప్రొఫైల్‌లో పరికర పరిపాలకుడి (డివైస్ అడ్మిన్) అనుమతులకు సమానమైన విస్తృత అనుమతుల జాబితా లభిస్తుంది, అయితే అవి ఆ ప్రొఫైల్‌కు మాత్రమే పరిమితమవుతాయి. షెల్టర్ యొక్క మెజారిటీ ఫీచర్ల కోసం ప్రొఫైల్ మేనేజర్‌గా ఉండటం అవసరం.
\n
\nషెల్టర్ యొక్క కొన్ని అధునాతన ఫీచర్లు వర్క్ ప్రొఫైల్ <b>బయట</b> మరిన్ని అనుమతులను అవసరం కావచ్చు. అవసరమైనప్పుడు, మీరు సంబంధిత ఫీచర్‌లను ప్రారంభించినప్పుడు, షెల్టర్ ఆ అనుమతులను వేరుగా అడుగుతుంది.</string>
<string name="fragment_profile_work">షెల్టర్</string>
<string name="install_app_to_profile">షెల్టర్‌లో APK ఇన్‌స్టాల్ చేయండి</string>
<string name="clone_success">అనువర్తనం \"%s\" విజయవంతంగా క్లోన్ చేయబడింది</string>
<string name="work_mode_disabled">మీరు షెల్టర్‌ను ప్రారంభించే సమయానికి వర్క్ మోడ్‌ను అడ్డించారు అనిపిస్తోంది. మీరు ఇప్పుడు దీన్ని ఎనేబుల్ చేసినట్లయితే, దయచేసి షెల్టర్‌ను మళ్లీ ప్రారంభించండి.</string>
<string name="settings_bug_report_url" translatable="false"/>
<string name="settings_source_code">సోర్స్ కోడ్</string>
<string name="search">శోధించండి</string>
<string name="unsupported_launcher">మీ లాంచర్‌కు షార్ట్‌కట్స్‌ను జోడించలేరు. మరింత సమాచారం కోసం దయచేసి డెవలపర్‌ను సంప్రదించండి.</string>
<string name="auto_freeze">ఆటో ఫ్రీజ్</string>
<string name="service_desc">షెల్టర్ ఇప్పుడు నడుస్తోంది…</string>
<string name="settings_auto_freeze_delay">ఆటో ఫ్రిజ్ ఆలస్యం</string>
<string name="setup_wizard_compatibility_text">షెల్టర్ AOSP లాంటి ఆండ్రాయిడ్ డెరివేటివ్‌లపై అభివృద్ధి చేయబడింది మరియు పరీక్షించబడింది. ఇందులో AOSP (ఆండ్రాయిడ్ ఓపెన్ సోర్స్ ప్రాజెక్ట్), Google Android (Pixelsపై), మరియు <b>LineageOS వంటి AOSP ఆధారిత ఓపెన్ సోర్స్ కస్టమ్ ROMలు</b> ఎక్కువగా ఉన్నాయి. మీ ఫోన్ పై ఉంచిన ఆండ్రాయిడ్ డెరివేటివ్‌లలో ఏదైనా ఉంటే, అభినందనలు! షెల్టర్ మీ పరికరంలో సరిగా పనిచేసే అవకాశం ఉంది.
\n
\nకొతమది పరికర తయారీదారులు ఆండ్రాయిడ్ కోడ్ బేస్‌లో చాలా దూకుడైన అనుకూలీకరణలు ప్రవేశపెడతారు, ఇది సంగర్షణలు, అనుకూలత సమస్యలు మరియు అనూహ్య ప్రవర్తనకు కారణమవుతుంది. కొంతమంది కస్టమ్ ROMలు కూడా అనుకూలతను విచ్ఛిన్నం చేసే మార్పులను ప్రవేశపెట్టవచ్చు, కానీ సాధారణంగా ఇవి ఫోన్ తయారీదారుల మార్పులతో పోలిస్తే చాలా అరుదుగా జరుగుతాయి.
\n
\nషెల్టర్ కేవలం సిస్టమ్ అందించే వర్క్ ప్రొఫైల్ ఫీచర్‌కు ఇన్టర్ఫేస్ మాత్రమే. సిస్టమ్ అందించే ఫీచర్ పనిచేయకపోతే లేదా ప్రామాణికం కాకపోతే, <b>షెల్టర్ స్వతహాగా ఆ సమస్యను పరిష్కరించలేము</b>. మీరు ప్రస్తుతం వర్క్ ప్రొఫైల్‌లను విరమించడానికి ప్రసిద్ధి చెందిన విక్రేత-మార్పుచేసిన ఆండ్రాయిడ్ వర్షన్‌ను ఉపయోగిస్తున్నట్లయితే, <b>మీకు హెచ్చరిక ఇచ్చాము</b>. అయినప్పటికీ మీరు కొనసాగవచ్చు, కానీ ఈ పరిస్థితులలో షెల్టర్ సరైన ప్రవర్తనకాని గ్యారంటీ లేదు.</string>
<string name="finish_provision_title">షెల్టర్‌ని సెటప్ చేయడానికి ఇక్కడ క్లిక్ చేయండి</string>
<string name="request_usage_stats">షెల్టర్‌కు ఇది చేయడానికి <b>ఉపయోగం స్థితులు</b> అనుమతి అవసరం. \"ఓకే\" బటన్‌ను నొక్కిన తర్వాత డైలాగ్‌లో చూపిన రెండు షెల్టర్ యాప్‌లకు ఈ అనుమతిని ఎనేబుల్ చేయండి. అది చేయనట్లయితే, ఈ ఫీచర్ సరిగ్గా పనిచేయదు.</string>
<string name="device_admin_label" translatable="false"/>
<string name="setup_wizard_permissions">అనుమతుల గురించి ఒక మాట</string>
<string name="install_app_to_profile_success">వర్క్ ప్రొఫైల్‌లో అప్లికేషన్ ఇన్‌స్టాలేషన్ పూర్తి చేయబడింది.</string>
<string name="fragment_profile_main">ప్రధాన</string>
<string name="shortcut_create_success">మీ లాంచర్‌పై షార్ట్‌కట్ సృష్టించబడింది.</string>
<string name="settings">సెట్టింగ్స్</string>
<string name="settings_dont_freeze_foreground">ముఖ్యమైన యాప్‌లను తొలగించు</string>
<string name="settings_payment_stub">చెల్లింపు సేవ స్టబ్</string>
<string name="app_context_menu_title">%s కోసం ఆపరేషన్స్</string>
<string name="uninstall_fail_system_app">షెల్టర్ కంట్రోల్ లో లేని ప్రొఫైల్‌లో సిస్టమ్ యాప్‌లను అన్‌ఇన్‌స్టాల్ చేయలేరు.</string>
<string name="continue_anyway">ఏదైనా కొనసాగించండి</string>
<string name="app_name" translatable="false"/>
<string name="freeze_app">ఫ్రిజ్</string>
<string name="first_run_alert_cancel">వీడ్కోలు</string>
<string name="setup_wizard_ready">సిద్ధంగా ఉన్నారా?</string>
<string name="settings_source_code_url" translatable="false"/>
<string name="settings_auto_freeze_service_desc">స్క్రీన్ లాక్ అయినప్పుడు, \"అన్‌ఫ్రిజ్ &amp; లాంచ్ షార్ట్‌కట్\" నుండి ప్రారంభించిన యాప్‌లను ఆటోమేటిక్‌గా ఫ్రిజ్ చేయండి.</string>
<string name="clone_to_main_profile">ప్రధాన ప్రొఫైల్‌కి క్లోన్ చేయండి</string>
<string name="show_all">అన్ని యాప్‌లను చూపించు</string>
<string name="settings_patreon" translatable="false"/>
<string name="freeze_all_shortcut">ఫ్రీజ్ చేయండి</string>
<string name="format_minutes">%d నిమిషాలు</string>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="setup_wizard_compatibility">Uyumluluk</string>
<string name="setup_wizard_permissions">İzinler hakkında</string>
<string name="setup_wizard_action_required">Eylem gerekli</string>
<string name="setup_wizard_ready">Hazır mısınız?</string>
<string name="settings">Ayarlar</string>
<string name="settings_version">Sürüm</string>
<string name="settings_about">Hakkında</string>
<string name="setup_wizard_please_wait">Lütfen bekleyin…</string>
<string name="settings_source_code">Kaynak Kodu</string>
<string name="settings_services">Hizmetler</string>
<string name="setup_wizard_welcome">Shelter\'a hoş geldiniz</string>
<string name="search">Ara</string>
<string name="freeze_all_shortcut">Dondur</string>
<string name="settings_translate">Çeviri</string>
<string name="clone_success">\"%s\" uygulaması başarıyla klonlandı</string>
<string name="uninstall_success">\"%s\" uygulaması başarıyla kaldırıldı</string>
<string name="first_run_alert_continue">Devam et</string>
<string name="first_run_alert_cancel">İptal</string>
<string name="device_admin_desc">Uygulama İzolasyon Hizmeti</string>
<string name="device_admin_explanation">İzolasyon hizmetinin çalışabilmesi için Shelter\'ı Cihaz Yöneticisi yap.</string>
<string name="setup_wizard_failed">Kurulum başarısız</string>
<string name="notifications_important">Shelter (Önemli)</string>
<string name="service_title">Shelter Hizmeti</string>
<string name="service_desc">Shelter şu an çalışıyor…</string>
<string name="uninstall_app">Kaldır</string>
<string name="app_installing">Yükleniyor...</string>
<string name="freeze_app">Dondur</string>
<string name="unfreeze_app">Aktifleştir</string>
<string name="create_unfreeze_shortcut">Aktifleştir ve/veya Çalıştır Kısayolu Oluştur</string>
<string name="unfreeze_and_launch">Aktifleştir ve Çalıştır</string>
<string name="auto_freeze">Otomatik Dondur</string>
<string name="show_all">Tüm Uygulamaları Göster</string>
<string name="launch">Çalıştır</string>
<string name="list_item_disabled">[Dondurulmuş] %s</string>
<string name="show_all_warning">Gizlenmiş uygulamalar üstünde değişikler yaparsanız çökmeler ve beklenmeyen hatalar meydana gelebilir. Ancak bu özellik, üretici tarafından özelleştirilmiş hatalı ROM\'larda iş profili için gerekli tüm sistem uygulamaları etkinleştirilmediğinde işinize yarayabilir. Devam ettiğiniz takdirde sorumluluk size aittir.</string>
<string name="fragment_profile_main">Ana Profil</string>
<string name="fragment_profile_work">İş Profili</string>
<string name="allow_cross_profile_widgets">Ana Profilde Widget\'lara İzin Ver</string>
<string name="clone_to_work_profile">İş profiline klonla</string>
<string name="clone_to_main_profile">Ana profile klonla</string>
<string name="settings_auto_freeze_service">Otomatik Dondurma Hizmeti</string>
<string name="settings_auto_freeze_delay">Otomatik Dondurma Gecikme Süresi</string>
<string name="settings_bug_report">Hata Bildir / Sorun Takibi</string>
<string name="msg_device_unsupported">İzin reddedildi veya cihazınız desteklenmiyor</string>
<string name="freeze_all_success">\"Otomatik Dondur\" listesindeki tüm uygulamalar başarıyla donduruldu.</string>
<string name="launch_app_fail">%s uygulaması grafiksel arayüze sahip olmadığı için açılamadı.</string>
<string name="install_app_to_profile">İş profiline APK dosyası kurun</string>
<string name="batch_operation">Çoklu İşlem</string>
<string name="install_app_to_profile_success">Uygulama iş profiline yüklendi.</string>
<string name="finish_provision_title">Shelter kurulumunu tamamlamak için buraya tıklayın</string>
<string name="settings_interaction">Etkileşim</string>
<string name="documents_ui">Dosya Gezginini aç</string>
<string name="finish_provision_desc">Tebrikler! Shelter kurulumu bitmek üzere.</string>
<string name="service_auto_freeze_now">Şimdi Dondur</string>
<string name="create_freeze_all_shortcut">Çoklu Dondur Kısayolu Oluştur</string>
<string name="freeze_all">Çoklu Dondur</string>
<string name="settings_block_contacts_searching">Rehber Erişimini Engelle</string>
<string name="freeze_success">\"%s\" uygulaması başarıyla donduruldu</string>
<string name="unfreeze_success">\"%s\" uygulaması başarıyla aktifleştirildi</string>
<string name="app_context_menu_title">%s için İşlemler</string>
<string name="shortcut_create_success">Kısayol, ana ekrana eklendi.</string>
<string name="unsupported_launcher">Ana ekran uygulamanıza kısayol eklenemiyor. Detaylı bilgi için lütfen geliştirici ile iletişime geçin.</string>
<string name="continue_anyway">Devam et</string>
<string name="setup_wizard_compatibility_text">Shelter, AOSP gibi Android türevleri için geliştirilmiştir. Bu türevlere AOSP (Android Open Source Project), Google Android (Pixel model cihazlarda) ve LineageOS gibi <b>AOSP-tabanlıık kaynak ROM\'ların çoğu</b> dahildir. Eğer telefonunuzda bu Android türevlerinden biri yüklüyse Shelter büyük ihtimalle sorunsuz bir şekilde çalışacaktır.
\n
\nBazı cihaz üreticilerinin Android\'in temel koduna koyduğu aşırı müdahaleci özelleştirmeler cihazda çakışmalara, uyumsuzluklara ve beklenmeyen hatalara yol açabilir. Bazı özel ROM\'lar da uyumluluğu bozan değişikliklere sahip olabilir ancak bu durum telefon üreticilerinden kaynaklanan hatalara göre daha nadir görülür.
\n
\nShelter, sistemin sağladığı İş Profili özelliği için kullanılabilen bir arayüzden ibarettir. Sistem tarafından sağlanan bu özellik standart dışı ise veya hatalar barındırıyorsa, <b>Shelter bu sorunlara kendi başına çözüm getiremez</b>. İş Profili özelliğini bozduğu bilinen üretici sürümü bir Android kullanıyorsanız <b>bu uyarıyı dikkate almanızı tavsiye ederiz</b>. Shelter, bu koşullar altında düzgün çalışacağını garanti etmez.</string>
<string name="settings_block_contacts_searching_desc">Ana profilin iş profiline bağlı olan rehbere erişimini engelle.</string>
<string name="service_auto_freeze_title">Bekleyen otomatik dondurma</string>
<string name="service_auto_freeze_desc">Ekranınızı kilitlediğinizde \"Aktifleştir &amp; Çalıştır\" seçeneği üzerinden başlatılan uygulamalar otomatik olarak dondurulacaktır.</string>
<string name="settings_cross_profile_file_chooser">Dosya Köprüsü</string>
<string name="settings_auto_freeze_service_desc">Ekranınızı kilitlediğinizde, \"Aktifleştir &amp; Çalıştır\" kısayolu üzerinden başlatılan uygulamalar otomatik olarak dondurulacaktır.</string>
<string name="work_profile_provision_failed">İş profili atanamadı. Tekrar denemek için Shelter\'ı yeniden başlatın.</string>
<string name="miui_cannot_clone">MIUI yüklü cihazlarda sistem dışı uygulamaların klonlanması henüz mümkün değildir. Lütfen sisteminizde yüklü olan uygulama mağazasını (örn. <b>Google Play Store</b>) iş profilinize klonlayın ve sistem dışı uygulamaları bu klon mağaza üzerinden yükleyin.</string>
<string name="clone_fail_system_app">Shelter, yetkisi dışında kalan bir profile sistem uygulamalarını klonlayamaz.</string>
<string name="uninstall_fail_system_app">Shelter, yetkisi dışında kalan bir profilden sistem uygulamalarını kaldıramaz.</string>
<string name="work_profile_not_found">İş profili bulunamadı. İş profilini tekrar atamak için lütfen Shelter\'ı yeniden başlatın.</string>
<string name="setup_wizard_welcome_text">Shelter, Android\'in <b>İş Profili</b> özelliğini kullanarak diğer uygulamaları izole bir profilde çalıştırmanızı sağlayan bir uygulamadır.
\n
\n\"İleri\" seçeneğine tıklarsanız sizi Shelter ve kurulum süreci hakkında detaylı bir şekilde bilgilendireceğiz.
\n
\nTüm bilgileri dikkatlice okumanızı tavsiye ederiz.</string>
<string name="setup_wizard_failed_text">Üzgünüz, Shelter kurulumu başarısız.
\n
\nCihazınızda eski bir Shelter sürümünün veya başka bir uygulamanın oluşturduğu bir İş Profili varsa devam etmek için lütfen bu profili kaldırın (İş Profiline \"Ayarlar -&gt; Hesap\" menüsünden ulaşabilirsiniz).
\n
\nEğer eski bir İş Profiliniz yoksa ve kurulumu iptal etmediyseniz, kurulumun başarısız olmasının sebebi yüksek ihtimalle Shelter ile başka bir İş Profili yöneticisinin çakışması veya sisteminizin büyük ölçüde değiştirilmiş olmasıdır. Shelter bu tip sorunları maalesef kendi başına çözemez.
\n
\nÇıkmak için \"İleri\" seçeneğine tıklayın.</string>
<string name="setup_wizard_permissions_text">Shelter, çalışmak için herhangi bir izne ihityaç duymaz ancak kurulum sürecini başlattığınızda Shelter bir İş Profili oluşturmayı deneyecek ve bu İş Profilinin <b>profil yöneticisi</b> olacaktır.
\n
\nProfil yöneticisi, bir Cihaz Yöneticisi kadar kapsamlı yetkilere sahiptir fakat bu yetkiler sadece yönetilen profil için geçerlidir. Bu yetkiler Shelter\'ın sorunsuz bir şekilde çalışması için gereklidir.
\n
\nShelter, bazı gelişmiş özellikler için iş profili <b>dışında</b> başka izinlere ihtiyaç duyabilir. Bu özellikleri kullandığınız zaman Shelter sizden bu izinleri isteyecektir.</string>
<string name="setup_wizard_ready_text">Kurulum için hazırlık tamamlandı. Eğer cihazınızın Android sürümü 7 veya daha eskiyse devam etmeden önce lütfen cihazınızın Rahatsız Etmeyin modunda <b>olmadığından</b> emin olun çünkü kurulumun son aşamasında <b>bir bildirime tıklamanız</b> gerekiyor.
\n
\nHazır olduğunuzda kurulum sürecini başlatmak için \"İleri\" seçeneğine tıklayın.</string>
<string name="setup_wizard_action_required_text">Shelter tarafından size bir bildirim yollandı. Kurulumu tamamlamak için <b>lütfen bu bildirime tıklayın</b>.
\n
\nEğer bir bildirim gelmediyse, lütfen cihazınızın Rahatsız Etmeyin modunda olmadığından emin olun ve bildirim çekmecenize bakın.
\n
\nKurulum sürecine baştan başlamak isterseniz lütfen uygulama verilerini sıfırlayın ve uygulamayı yeniden başlatın.</string>
<string name="setup_wizard_please_wait_text">İş Profili oluşturuluyor ve Shelter kurulumu yapılıyor.</string>
<string name="settings_dont_freeze_foreground">Önplandaki Uygulamalar Dondurulmasın</string>
<string name="provision_finished">Kurulum tamamlandı. Shelter yeniden başlatılıyor. Eğer otomatik başlatma gerçekleşmezse, lütfen Shelter\'ı ana ekran uygulamanız üzerinden tekrar başlatın.</string>
<string name="settings_dont_freeze_foreground_desc">Ekranınızı kilitlediğinizde önplanda çalışan ve görünür etkinliğe sahip olan uygulamalar dondurulmaz. Bu özellik sayesinde müzik çalar gibi uygulamaları daha rahat bir şekilde kullanabilirsiniz ancak sonrasında bu uygulamaları \"Çoklu Dondurma Kısayolu\" üzerinden dondurmanız gerekir.</string>
<string name="work_mode_disabled">Uygulama başlatılırken İş Profilinin devre dışı bırakıldığı tespit edildi. İş Profilini etkinleştirdiyseniz, değişikliklerin uygulanması için lütfen Shelter\'ı yeniden başlatın.</string>
<string name="settings_cross_profile_file_chooser_desc">Etkinleştirildiğinde iki profil arasında dosya göz atma, görüntüleme, seçme ve kopyalama işlemleri yapılabilir hale gelir. Bu işlemler, dosya sistemi izolasyonunu bozmadan, YALNIZCA Dosya Gezgini (sisteminizde Dosyalar veya Belgeler olarak adlandırılır) veya Dosya Gezgini özelliğine sahip uygulamalar üzerinden yapılır (bu özelliğe sahip uygulamaların seçtiğiniz dosyalara erişimi geçicidir).</string>
<string name="request_storage_manager">Dosya Köprüsü özelliğini kullanmak için Shelter\'ın <b>Tüm Dosyalara</b> erişmesi gerekiyor. Lütfen \"Tamam\" seçeneğine tıkladıktan sonra <b>İKİ SHELTER UYGULAMASINA DA</b> (Kişisel / İş) bu izni verin.</string>
<string name="request_system_alert">Dosya Köprüsü özelliğinin düzgün bir şekilde çalışabilmesi için Shelter\'ın <b>Diğer Uygulamalar Üzerinde Göster</b> iznine ihtiyacı var. Lütfen \"Tamam\" seçeneğine tıkladıktan sonra <b>İKİ SHELTER UYGULAMASINA DA</b> (Kişisel / İş) bu izni verin. Söz konusu izin, Dosya Köprüsü hizmetlerini arkaplanda başlatmak için kullanılır.</string>
<string name="request_usage_stats">Bu özelliği kullanmak için Shelter\'ın <b>Kullanım Erişimi</b> iznine ihtiyacı var. Lütfen \"Tamam\" seçeneğine tıkladıktan sonra <b>İKİ SHELTER UYGULAMASINA DA</b> (Kişisel / İş) bu izni verin, aksi takdirde söz konusu özellik düzgün bir şekilde çalışmayabilir.</string>
</resources>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="device_admin_desc">Сервіс ізоляції додатку</string>
<string name="device_admin_explanation">Shelter має стати адміністратором пристрою, щоб виконувати свої завдання ізоляції.</string>
<string name="first_run_alert_cancel">Закрити</string>
<string name="first_run_alert_continue">Продовжити</string>
<string name="setup_wizard_welcome">Ласкаво просимо до Shelter</string>
<string name="setup_wizard_permissions">Декілька слів про дозволи</string>
<string name="setup_wizard_welcome_text">Shelter - це програма, яка допоможе вам запускати інші програми в ізольованому профілі. Вона використовує функцію <b>Робочий профіль</b> в Android.
\n
\nНатисніть \"Далі\", і ми надамо вам більше інформації про Shelter і проведемо вас через процес налаштування.
\n
\nМи рекомендуємо вам уважно прочитати всі наступні сторінки.</string>
<string name="setup_wizard_please_wait_text">Ми намагаємося ініціалізувати Work Profile та налаштувати Shelter на вашому пристрої.</string>
<string name="fragment_profile_work">Shelter</string>
</resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme.Override" parent="AppTheme.Base">
<item name="android:navigationBarColor">@color/colorNavigationBar</item>
<item name="android:windowLightNavigationBar">true</item>
</style>
</resources>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">@android:color/system_accent1_0</color>
<color name="colorAccent">@android:color/system_accent1_500</color>
<color name="colorAccentSetupWizard">@android:color/system_accent3_500</color>
<color name="colorNavigationBar">@android:color/system_accent1_100</color>
<color name="disabledAppBackground">@android:color/system_accent1_100</color>
<color name="selectedAppBackground">@android:color/system_accent1_50</color>
<color name="selectedAndDisabledAppBackground">@android:color/system_accent1_200</color>
</resources>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="setup_wizard_failed_text">Chúng tôi rất tiếc phải thông báo cho bạn rằng chúng tôi đã không thể thiết lập Shelter cho bạn.
\n
\nNếu thiết bị của bạn đã có một Hồ sơ công việc được tạo từ Shelter hoặc một ứng dụng khác, bạn sẽ phải xoá hồ sơ đó trong Cài đặt -&gt; Tài khoản trước khi Shelter có thể tiếp tục.
\n
\nNgoài ra, nếu bạn đã không huỷ thiết lập theo cách thủ công, thì lý do thất bại thường là do hệ thống bị sửa đổi sâu, hoặc có xung đột giữa Shelter và các trình quản lý Hồ sơ công việc khác. Không may mắn là chúng tôi không thể làm gì nhiều về điều này.
\n
\nNhấn Tiếp để thoát.</string>
<string name="setup_wizard_action_required_text">Bây giờ, bạn rất có thể đang thấy một thông báo từ Shelter. <b>Vui lòng nhấn vào thông báo đó</b> để hoàn thành quá trình thiết lập.
\n
\nNếu bạn không thấy thông báo đó, hãy chắc chắn là thiết bị của bạn đang không ở chế độ Không làm phiền và thử kéo trung tâm thông báo xuống.
\n
\nĐể đặt lại Shelter và bắt đầu lại, bạn có thể xoá dữ liệu của Shelter trong Cài đặt.</string>
<string name="finish_provision_desc">Chúc mừng! Bạn còn một cú nhấn nữa để hoàn tất thiết lập Shelter.</string>
<string name="service_auto_freeze_desc">Shelter sẽ tự động đóng băng các ứng dụng được chạy từ \"Huỷ đóng băng &amp; Chạy\" vào sự kiện khoá màn hình tiếp theo.</string>
<string name="unfreeze_app">Huỷ đóng băng</string>
<string name="allow_cross_profile_widgets">Cho phép tiện ích trong Hồ sơ chính</string>
<string name="install_app_to_profile_success">Đã hoàn thành cài đặt ứng dụng trong hồ sơ công việc.</string>
<string name="show_all_warning">Việc điều khiển các ứng dụng bị ẩn khỏi danh sách có thể sẽ gây ra dừng đột ngột và nhiều hành vi không mong đợi. Tuy nhiên, tính năng này có thể hữu ích khi các bản ROM có lỗi do hãng tuỳ biến không bật tất cả các ứng dụng hệ thống cần thiết trong hồ sơ công việc theo mặc định. Nếu bạn tiếp tục, bạn tự chịu trách nhiệm.</string>
<string name="first_run_alert_continue">Tiếp tục</string>
<string name="device_admin_desc">Dịch vụ cô lập ứng dụng</string>
<string name="device_admin_explanation">Shelter cần trở thành Quản trị viên thiết bị để thực hiện các công việc cô lập của nó.</string>
<string name="setup_wizard_permissions">Một lời về các quyền</string>
<string name="setup_wizard_compatibility">Sự tương thích</string>
<string name="setup_wizard_ready">Sẵn sàng chưa?</string>
<string name="setup_wizard_please_wait">Vui lòng đợi…</string>
<string name="setup_wizard_failed">Thiết lập thất bại</string>
<string name="setup_wizard_action_required">Yêu cầu hành động</string>
<string name="notifications_important">Shelter - Quan trọng</string>
<string name="finish_provision_title">Nhấn vào đây để hoàn tất thiết lập Shelter</string>
<string name="service_title">Dịch vụ Shelter</string>
<string name="service_desc">Shelter hiện đang chạy…</string>
<string name="service_auto_freeze_title">Đang chờ tự động đóng băng</string>
<string name="service_auto_freeze_now">Đóng băng ngay</string>
<string name="app_installing">Đang cài đặt…</string>
<string name="fragment_profile_main">Chính</string>
<string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[Đã đóng băng] %s</string>
<string name="batch_operation">Hoạt động hàng loạt</string>
<string name="clone_to_work_profile">Nhân bản vào Shelter (Hồ sơ công việc)</string>
<string name="clone_to_main_profile">Nhân bản vào Hồ sơ chính</string>
<string name="uninstall_app">Gỡ cài đặt</string>
<string name="freeze_app">Đóng băng</string>
<string name="launch">Chạy</string>
<string name="create_unfreeze_shortcut">Tạo lối tắt Huỷ đóng băng và/hoặc Chạy</string>
<string name="unfreeze_and_launch">Huỷ đóng băng và Chạy</string>
<string name="auto_freeze">Tự động đóng băng</string>
<string name="search">Tìm kiếm</string>
<string name="freeze_all">Đóng băng hàng loạt</string>
<string name="create_freeze_all_shortcut">Tạo lối tắt Đóng băng hàng loạt</string>
<string name="freeze_all_shortcut">Đóng băng</string>
<string name="install_app_to_profile">Cài đặt APK vào Shelter</string>
<string name="show_all">Hiện tất cả ứng dụng</string>
<string name="documents_ui">Mở giao diện Tài liệu</string>
<string name="settings">Cài đặt</string>
<string name="settings_interaction">Tương tác</string>
<string name="first_run_alert_cancel">Tạm biệt</string>
<string name="setup_wizard_welcome">Chào mừng đến Shelter</string>
<string name="setup_wizard_welcome_text">Shelter là một ứng dụng giúp bạn chạy các ứng dụng khác trong một hồ sơ được cô lập. Nó làm vậy bằng cách sử dụng tính năng <b>Hồ sơ công việc</b> của Android.
\n
\nNhấn \"Tiếp\", và chúng tôi sẽ cung cấp cho bạn thêm thông tin về Shelter, và hướng dẫn bạn qua quá trình thiết lập.
\n
\nChúng tôi khuyên bạn đọc tất cả những trang sau đây một cách cẩn thận.</string>
<string name="setup_wizard_permissions_text">Theo mặc định, Shelter sẽ không hỏi bất kỳ quyền riêng biệt nào. Tuy nhiên, khi bạn tiếp tục quá trình thiết lập, Shelter sẽ cố thiết lập một Hồ sơ công việc và do đó trở thành <b>người quản lý hồ sơ</b> của hồ sơ đó.
\n
\nViệc này sẽ cấp cho Shelter một danh sách dài các quyền ở trong hồ sơ, có thể so sánh với một Quản trị viên thiết bị, mặc dù bị giới hạn trong hồ sơ đó. Việc làm người quản lý hồ sơ là cần thiết cho đa số chức năng của Shelter.
\n
\nMột số tính năng nâng cao của Shelter có thể sẽ yêu cầu nhiều quyền hơn <b>ở ngoài</b> Hồ sơ công việc. Khi cần, Shelter sẽ hỏi các quyền đó một cách riêng biệt khi bạn bật các tính năng tương ứng.</string>
<string name="setup_wizard_compatibility_text">Shelter được phát triển và thử nghiệm trên các biến thể Android giống AOSP. Những biến thể này bao gồm AOSP (Android Open Source Project), Google Android (trên các thiết bị Pixel), và <b>đa số các bản ROM tuỳ chỉnh mã nguồn mở dựa trên AOSP</b> như là LineageOS. Nếu điện thoại của bạn đang chạy một trong số những biến thể Android được liệt kê ở trên, thì chúc mừng! Shelter có thể sẽ hoạt động đúng trên thiết bị của bạn.
\n
\nMột số hãng thiết bị giới thiệu những tuỳ biến rất gây xâm hại vào mã nguồn của Android, việc này dẫn đến sự xung đột, không tương thích và hành vi không mong đợi. Một số bản ROM tuỳ chỉnh cũng có thể giới thiệu các thay đổi phá vỡ sự tương thích, nhưng nói chung thì chúng xảy ra hiếm hơn so với những sự không tương thích do hãng điện thoại gây ra.
\n
\nShelter chỉ là một giao diện truy cập tính năng Hồ sơ công việc được hệ thống cung cấp. Nếu tính năng được hệ thống cung cấp bị hỏng hoặc phi tiêu chuẩn, <b>Shelter không thể tự giải quyết vấn đề một cách nhiệm màu</b>. Nếu bạn hiện đang sử dụng một phiên bản Android được hãng sửa đổi được biết là làm hỏng Hồ sơ công việc, <b>bạn đã được cảnh báo</b>. Bạn có thể vẫn tiếp tục, nhưng không có đảm bảo rằng Shelter sẽ hoạt động đúng dưới hoàn cảnh này.</string>
<string name="setup_wizard_ready_text">Chúng tôi bây giờ đã sẵn sàng thiết lập Shelter cho bạn. Trước hết, vui lòng chắc chắn rằng thiết bị của bạn đang <b>không</b> ở chế độ Không làm phiền nếu thiết bị đang chạy Android 7 hoặc thấp hơn, vì bạn sẽ cần phải <b>nhấn vào một thông báo</b> vào lúc sau để hoàn thành quá trình thiết lập.
\n
\nKhi bạn đã sẵn sàng, hãy nhấn vào \"Tiếp\" để bắt đầu quá trình thiết lập.</string>
<string name="setup_wizard_please_wait_text">Chúng tôi đang cố khởi tạo Hồ sơ công việc và thiết lập Shelter trên thiết bị của bạn.</string>
<string name="settings_auto_freeze_delay">Độ trễ tự động đóng băng</string>
<string name="settings_dont_freeze_foreground">Bỏ qua các ứng dụng ở trước</string>
<string name="settings_dont_freeze_foreground_desc">KHÔNG đóng băng các ứng dụng ở trước (có hoạt động có thể nhìn thấy được) khi bạn khoá màn hình. Việc này có thể hữu ích đối với các ứng dụng như trình phát nhạc, nhưng sau đó bạn sẽ cần phải đóng băng chúng theo cách thủ công qua \"Lối tắt Đóng băng hàng loạt\".</string>
<string name="settings_translate">Phiên dịch</string>
<string name="settings_bug_report">Báo cáo lỗi / Trình theo dõi vấn đề</string>
<string name="provision_finished">Thiết lập Shelter hoàn tất. Bây giờ đang khởi động lại Shelter. Nếu Shelter không tự động khởi động, bạn có thể chạy nó lại từ launcher của bạn.</string>
<string name="work_profile_not_found">Không tìm thấy hồ sơ công việc. Vui lòng khởi động lại ứng dụng để quản lý lại hồ sơ.</string>
<string name="work_mode_disabled">Có vẻ như bạn đã tắt Chế độ công việc trong khi đang khởi động Shelter. Nếu bạn đã bật nó ngay bây giờ, vui lòng khởi động lại Shelter.</string>
<string name="freeze_success">Đã đóng băng ứng dụng \"%s\" thành công</string>
<string name="clone_fail_system_app">Không thể nhân bản ứng dụng hệ thống vào một hồ sơ mà Shelter không thể kiểm soát.</string>
<string name="uninstall_fail_system_app">Không thể gỡ cài đặt ứng dụng hệ thống trong một hồ sơ mà Shelter không thể kiểm soát.</string>
<string name="freeze_all_success">Tất cả ứng dụng trong danh sách \"Tự động đóng băng\" đã được đóng băng thành công.</string>
<string name="request_usage_stats">Shelter cần quyền <b>Thống kê sử dụng</b> để làm việc này. Vui lòng bật quyền đó cho <b>CẢ HAI</b> ứng dụng Shelter được hiện trong hộp thoại sau khi bạn nhấn \"Ok\". Tính năng này sẽ không hoạt động đúng nếu bạn không làm vậy.</string>
<string name="settings_cross_profile_file_chooser">Chia sẻ tệp</string>
<string name="settings_cross_profile_file_chooser_desc">Khi được bật, bạn sẽ có thể duyệt / xem / chọn / sao chép các tệp trong Shelter từ hồ sơ chính và ngược lại, CHỈ qua Giao diện Tài liệu (có tên là Tệp hoặc Tài liệu trên launcher của bạn) hoặc các ứng dụng có hỗ trợ Giao diện Tài liệu (chúng chỉ có quyền truy cập tạm thời vào các tệp bạn chọn trong Giao diện Tài liệu), trong khi vẫn giữ sự cô lập hệ thống tệp.</string>
<string name="settings_block_contacts_searching">Chặn tìm kiếm danh bạ</string>
<string name="settings_block_contacts_searching_desc">Từ chối quyền truy cập danh bạ từ hồ sơ chính trong hồ sơ công việc.</string>
<string name="settings_services">Dịch vụ</string>
<string name="settings_auto_freeze_service">Dịch vụ tự động đóng băng</string>
<string name="settings_auto_freeze_service_desc">Khi màn hình bị khoá, tự động đóng băng các ứng dụng được chạy từ \"Lối tắt Huỷ đóng băng &amp; Chạy\".</string>
<string name="settings_about">Giới thiệu</string>
<string name="settings_version">Phiên bản</string>
<string name="settings_source_code">Mã nguồn</string>
<string name="msg_device_unsupported">Quyền bị từ chối hoặc thiết bị không được hỗ trợ</string>
<string name="work_profile_provision_failed">Không thể quản lý hồ sơ công việc. Bạn có thể thử lại bằng cách khởi động lại Shelter.</string>
<string name="clone_success">Đã nhân bản ứng dụng \"%s\" thành công</string>
<string name="uninstall_success">Đã gỡ cài đặt ứng dụng \"%s\" thành công</string>
<string name="unfreeze_success">Đã huỷ đóng băng ứng dụng \"%s\" thành công</string>
<string name="unsupported_launcher">Không thể thêm lối tắt vào launcher. Vui lòng liên hệ với nhà phát triển để biết thêm thông tin.</string>
<string name="app_context_menu_title">Hoạt động cho %s</string>
<string name="shortcut_create_success">Đã tạo lối tắt trên launcher.</string>
<string name="launch_app_fail">Không thể chạy ứng dụng %s vì nó không có giao diện đồ hoạ.</string>
<string name="request_storage_manager">Shelter cần quyền truy cập <b>Tất cả tệp</b> cho Chia sẻ tệp. Vui lòng bật quyền đó cho <b>CẢ HAI</b> ứng dụng Shelter (Cá nhân / Công việc) được hiện trong hộp thoại sau khi bạn nhấn \"Ok\".</string>
<string name="request_system_alert">Shelter cần <b>Hiện trên các ứng dụng khác</b> để Chia sẻ tệp hoạt động đúng. Vui lòng bật quyền đó cho <b>CẢ HAI</b> ứng dụng Shelter (Cá nhân / Công việc) được hiện trong hộp thoại sau khi bạn nhấn \"Ok\". Quyền này được sử dụng để khởi động các dịch vụ Chia sẻ tệp trong nền.</string>
<string name="miui_cannot_clone">Việc nhân bản các ứng dụng không phải hệ thống vào một hồ sơ khác hiện chưa làm được trên MIUI. Vui lòng nhân bản cửa hàng ứng dụng của hệ thống (vd: <b>CH Play</b>) vào hồ sơ khác đó và sau đó là cài đặt các ứng dụng từ đó.</string>
<string name="continue_anyway">Vẫn tiếp tục</string>
</resources>

View file

@ -1,24 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="first_run_alert">您正在使用 Shelter。\n\n这个应用依赖于 Android 的 <b>工作用户</b> 功能来隔离 App。如果你使用的厂商 / 自定义 ROM 破坏了这个功能 (如 MIUI),您应该立即 <b>退出</b> 并且 <b>停止使用</b> 本应用。\n\n如果你选择继续Shelter 将为您初始化工作用户。\n\n如果您是开发者并且希望将 Shelter 带到那些目前不能使用的 ROM 上,欢迎您提交 Pull Request。本应用的开发者对您在不兼容的 ROM 上运行该 App 带来的任何后果 <b>不负任何责任</b></string> <string name="first_run_alert">您正在使用 Shelter。\n\n这个应用依赖于 Android 的 <b>工作用户</b> 功能来隔离 App。如果你使用的厂商 / 自定义 ROM 破坏了这个功能 (如 MIUI),您应该立即 <b>退出</b> 并且 <b>停止使用</b> 本应用。\n\n如果你选择继续Shelter 将为您初始化工作用户。\n\n如果您是开发者并且希望将 Shelter 带到那些目前不能使用的 ROM 上,欢迎您提交 Pull Request。本应用的开发者对您在不兼容的 ROM 上运行该 App 带来的任何后果 <b>不负任何责任</b>\n\n您将需要通过点击通知来完成初始化过程请确保您的设备<b>没有开启</b>免打扰模式。</string>
<string name="first_run_alert_cancel">再见</string> <string name="first_run_alert_cancel">再见</string>
<string name="first_run_alert_continue">继续</string> <string name="first_run_alert_continue">继续</string>
<string name="device_admin_desc">App 隔离服务</string> <string name="device_admin_desc">App 隔离服务</string>
<string name="device_admin_explanation">Shelter 需要成为设备管理员才能正常进行 App 隔离等操作。</string> <string name="device_admin_explanation">Shelter 需要成为设备管理员才能正常进行 App 隔离等操作。</string>
<string name="camera_proxy_activity">选择图片文件</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notifications_important">Shelter 重要通知</string>
<string name="finish_provision_title">点击这里完成 Shelter 初始化</string>
<string name="finish_provision_desc">您距离使用 Shelter 仅有一步之遥。</string>
<string name="service_title">Shelter 服务</string> <string name="service_title">Shelter 服务</string>
<string name="service_desc">Shelter 正在运行 &#8230;</string> <string name="service_desc">Shelter 正在运行 </string>
<string name="service_auto_freeze_title">自动冻结等待中</string> <string name="service_auto_freeze_title">自动冻结等待中</string>
<string name="service_auto_freeze_desc">Shelter 将会在您下次锁屏时自动冻结使用 \"解冻并运行\" 启动的应用</string> <string name="service_auto_freeze_desc">Shelter 将会在您下次锁屏时自动冻结使用 \"解冻并运行\" 启动的应用</string>
<string name="service_auto_freeze_now">立刻冻结</string> <string name="service_auto_freeze_now">立刻冻结</string>
<!-- Main UI --> <!-- Main UI -->
<string name="fragment_profile_main">主用户</string> <string name="fragment_profile_main">主用户</string>
<string name="fragment_profile_work">Shelter</string> <string name="fragment_profile_work">Shelter</string>
<string name="list_item_disabled">[已冻结] %s</string> <string name="list_item_disabled">[已冻结] %s</string>
<string name="batch_operation">批量操作</string> <string name="batch_operation">批量操作</string>
<!-- App Context Menu --> <!-- App Context Menu -->
<string name="search">搜索</string> <string name="search">搜索</string>
<string name="clone_to_work_profile">克隆到 Shelter (工作用户)</string> <string name="clone_to_work_profile">克隆到 Shelter (工作用户)</string>
@ -31,26 +31,23 @@
<string name="unfreeze_and_launch">解冻并运行</string> <string name="unfreeze_and_launch">解冻并运行</string>
<string name="auto_freeze">自动冻结</string> <string name="auto_freeze">自动冻结</string>
<string name="allow_cross_profile_widgets">允许在主用户中创建小工具</string> <string name="allow_cross_profile_widgets">允许在主用户中创建小工具</string>
<!-- Action Bar Options Menu --> <!-- Action Bar Options Menu -->
<string name="freeze_all">批量冻结</string> <string name="freeze_all">批量冻结</string>
<string name="create_freeze_all_shortcut">创建批量冻结快捷方式</string> <string name="create_freeze_all_shortcut">创建批量冻结快捷方式</string>
<string name="freeze_all_shortcut">冻结</string> <string name="freeze_all_shortcut">冻结</string>
<string name="install_app_to_profile">安装 APK 到 Shelter</string> <string name="install_app_to_profile">安装 APK 到 Shelter</string>
<string name="install_app_to_profile_success">已成功在工作用户内安装 APK</string> <string name="install_app_to_profile_success">已成功在工作用户内安装 APK</string>
<string name="show_all">显示全部应用</string> <string name="show_all">显示全部应用</string>
<string name="show_all_warning">对列表中默认隐藏的应用执行操作可能导致崩溃以及其他各种无法预料的行为。但是当您的手机厂商没有正确在工作用户中开启所有必要的系统组件应用的时候这个功能可以帮助您解决问题。如果您选择继续您确保您了解您在做什么Shelter 无法提供任何保证。</string> <string name="show_all_warning">对列表中默认隐藏的应用执行操作可能导致崩溃以及其他各种无法预料的行为。但是当您的手机厂商没有正确在工作用户中开启所有必要的系统组件应用的时候这个功能可以帮助您解决问题。如果您选择继续您确保您了解您在做什么Shelter 无法提供任何保证。</string>
<string name="documents_ui">打开文件管理器</string>
<!-- Settings Options --> <!-- Settings Options -->
<string name="settings">设置</string> <string name="settings">设置</string>
<string name="settings_interaction">交互</string> <string name="settings_interaction">交互</string>
<string name="settings_cross_profile_file_chooser">文件穿梭</string> <string name="settings_cross_profile_file_chooser">文件穿梭</string>
<string name="settings_cross_profile_file_chooser_desc">打开以后,您将可以且仅可以从系统的 Documents UI (启动器上的名称为 文件 或 下载) 或支持 Documents UI 的 APP 中 浏览 / 查看 / 选择 / 复制 Shelter 内的文件到主用户,反之亦然。这不会影响对文件系统的隔离。即使是支持 Documents UI 的 App 也只能临时获取您选择的文件的访问权限。</string> <string name="settings_cross_profile_file_chooser_desc">打开以后,您将可以且仅可以从系统的 Documents UI (启动器上的名称为 文件 或 下载) 或支持 Documents UI 的 APP 中 浏览 / 查看 / 选择 / 复制 Shelter 内的文件到主用户,反之亦然。这不会影响对文件系统的隔离。即使是支持 Documents UI 的 App 也只能临时获取您选择的文件的访问权限。</string>
<string name="settings_camera_proxy">图片选择器伪装为相机</string>
<string name="settings_camera_proxy_desc">向其他 App 提供一个伪装的相机 App允许您从 Documents UI (包括 "文件穿梭" 功能) 选择任意文件作为 "拍摄结果"。这将使您能够在任何支持调用系统相机的 App 中选择来自 "文件穿梭" 的文件,无论 App 本身是否支持 Documents UI。</string>
<string name="settings_services">服务</string> <string name="settings_services">服务</string>
<string name="settings_auto_freeze_service">自动冻结服务</string> <string name="settings_auto_freeze_service">自动冻结服务</string>
<string name="settings_auto_freeze_service_desc">在您锁屏时,自动冻结您通过 \"解冻并运行\" 启动的应用</string> <string name="settings_auto_freeze_service_desc">在您锁屏时,自动冻结您通过 \"解冻并运行\" 启动的应用</string>
<string name="settings_auto_freeze_delay">冻结延时</string> <string name="settings_auto_freeze_delay">冻结延时</string>
<string name="settings_dont_freeze_foreground">跳过前台应用</string> <string name="settings_dont_freeze_foreground">跳过前台应用</string>
<string name="settings_dont_freeze_foreground_desc">在您锁屏的时候,不要冻结前台应用 (锁屏时仍有可见窗口的应用)。这主要用于音乐播放器等 App但您将需要在使用完成后手动使用 \"批量冻结\" 快捷方式冻结它们。</string> <string name="settings_dont_freeze_foreground_desc">在您锁屏的时候,不要冻结前台应用 (锁屏时仍有可见窗口的应用)。这主要用于音乐播放器等 App但您将需要在使用完成后手动使用 \"批量冻结\" 快捷方式冻结它们。</string>
@ -58,29 +55,71 @@
<string name="settings_version">版本</string> <string name="settings_version">版本</string>
<string name="settings_source_code">源代码</string> <string name="settings_source_code">源代码</string>
<string name="settings_bug_report">Bug 报告</string> <string name="settings_bug_report">Bug 报告</string>
<!-- Toast Long Texts --> <!-- Toast Long Texts -->
<string name="device_admin_toast">Shelter 必须拥有设备管理员权限以正常工作,请再试一次</string> <string name="device_admin_toast">Shelter 必须拥有设备管理员权限以正常工作,请再试一次</string>
<string name="provision_still_pending">正在为您准备 Shelter, 请稍候 &#8230;</string> <string name="provision_still_pending">正在为您准备 Shelter, 请稍候 </string>
<string name="provision_finished">Shelter 已初始化完成,正在启动 Shelter。如果 Shelter 没有自动启动,请您从启动器手动启动它</string> <string name="provision_finished">Shelter 已初始化完成,正在启动 Shelter。如果 Shelter 没有自动启动,请您从启动器手动启动它</string>
<string name="msg_device_unsupported">权限不足 / 设备不兼容</string> <string name="msg_device_unsupported">权限不足 / 设备不兼容</string>
<string name="work_profile_not_found">工作用户不可用,请重新启动 Shelter 以重新初始化</string> <string name="work_profile_not_found">工作用户不可用,请重新启动 Shelter 以重新初始化</string>
<string name="work_profile_provision_failed">无法创建工作用户,您可以重启 Shelter 并再试一次</string> <string name="work_profile_provision_failed">无法创建工作用户,您可以重启 Shelter 并再试一次</string>
<string name="work_mode_disabled">工作模式 (Work Mode) 已被您关闭,请开启后再启动 Shelter</string> <string name="work_mode_disabled">工作模式 (Work Mode) 已被您关闭,请开启后再启动 Shelter</string>
<string name="clone_success">应用 \"%s\" 克隆成功</string> <string name="clone_success">应用 \"%s\" 克隆成功</string>
<string name="uninstall_success">应用 \"%s\" 卸载成功</string> <string name="uninstall_success">应用 \"%s\" 卸载成功</string>
<string name="freeze_success">应用 \"%s\" 冻结成功</string> <string name="freeze_success">应用 \"%s\" 冻结成功</string>
<string name="unfreeze_success">应用 \"%s\" 解冻成功</string> <string name="unfreeze_success">应用 \"%s\" 解冻成功</string>
<string name="clone_fail_system_app">无法将系统应用克隆到 Shelter 无权管理的用户下</string> <string name="clone_fail_system_app">无法将系统应用克隆到 Shelter 无权管理的用户下</string>
<string name="uninstall_fail_system_app">无法在 Shelter 无权管理的用户下卸载系统应用</string> <string name="uninstall_fail_system_app">无法在 Shelter 无权管理的用户中卸载系统应用。</string>
<string name="unsupported_launcher">无法在您的启动器上添加快捷方式,请联系开发者</string> <string name="unsupported_launcher">无法在您的启动器上添加快捷方式,请联系开发者</string>
<string name="app_context_menu_title">%s 可用操作</string> <string name="app_context_menu_title">%s 可用操作</string>
<string name="freeze_all_success">所有在 \"自动冻结\" 列表中的应用都已经冻结成功</string> <string name="freeze_all_success">所有在 \"自动冻结\" 列表中的应用都已经冻结成功。</string>
<string name="shortcut_create_success">快捷方式已创建</string> <string name="shortcut_create_success">快捷方式已创建。</string>
<string name="request_usage_stats">Shelter 需要 <b>使用情况数据</b> 来做这件事。请在按 \"确定\" 后出现的窗口中,对 <b>两个</b> Shelter <b></b> 打开此权限。如果没有全部打开,该功能将无法正确运作。</string> <string name="request_usage_stats">Shelter 需要 <b>使用情况数据</b> 来做这件事。请在按 \"确定\" 后出现的窗口中,对 <b>两个</b> Shelter都打开此权限。如果没有全部打开该功能将无法正确运作。</string>
<string name="launch_app_fail">无法启动没有用户界面的应用 %s</string> <string name="launch_app_fail">无法启动没有用户界面的应用 %s。</string>
<!-- MIUI --> <!-- MIUI -->
<string name="miui_cannot_clone">目前无法在 MIUI 上克隆非系统应用。请先克隆您的系统应用商店 (如 <b>Play Store</b>) 然后从克隆的应用商店中安装应用</string> <string name="miui_cannot_clone">目前无法在 MIUI 上克隆非系统应用。请先克隆您的系统应用商店 (如 <b>Play Store</b>) 然后从克隆的应用商店中安装应用</string>
<string name="continue_anyway">无视并继续</string> <string name="continue_anyway">无视并继续</string>
<string name="app_installing">正在安装……</string>
<string name="request_storage_manager">File Shuttle 需要访问 <b>全部文件</b> 的权限。请在接下来的对话框中对 <b>两个 Shelter</b> (工作用户内 / 外) 都启用该权限。</string>
<string name="request_system_alert">File Shuttle 需要 <b>悬浮窗</b> 权限才能在 Shelter 不在运行时正常启动。请在接下来的对话框中对 <b>两个 Shelter</b> (工作用户内 / 外) 都打开该权限。</string>
<string name="settings_translate">翻译</string>
<string name="settings_block_contacts_searching">阻止访问联系人</string>
<string name="settings_block_contacts_searching_desc">阻止主用户中的应用访问工作用户的联系人资料。</string>
<string name="setup_wizard_welcome">欢迎来到 Shelter</string>
<string name="setup_wizard_permissions">关于权限的说明</string>
<string name="setup_wizard_please_wait">请稍等…</string>
<string name="setup_wizard_please_wait_text">我们正在尝试初始化工作档案并在您的设备上设置 Shelter。</string>
<string name="setup_wizard_failed">安装失败</string>
<string name="setup_wizard_action_required">需要采取的行动</string>
<string name="setup_wizard_ready_text">我们现在已准备好为您设置 Shelter。如果您的设备运行的是 Android 7 或更低版本,请首先确保您的设备是 <b> 不是 </b> 请勿打扰模式,因为您需要 <b> 点击通知 </b> 稍后完成设置过程。
\n
\n准备好后单击“下一步”开始设置过程。</string>
<string name="setup_wizard_compatibility">兼容性</string>
<string name="setup_wizard_ready">准备好?</string>
<string name="setup_wizard_permissions_text">默认情况下Shelter不会要求任何个人权限。然而一旦你继续进行设置过程Shelter将尝试设置一个工作档案并成为此档案的<b>档案管理员</b>
\n
\n这将授予Shelter在配置文件内的大量权限与设备管理员的权限相当尽管只限于配置文件内。为了实现Shelter的大部分功能成为档案管理员是必要的。
\n
\nShelter 的一些高级功能可能需要更多权限<b>外部</b>工作资料。当需要时Shelter将在你启用相应的功能时单独要求这些权限。</string>
<string name="setup_wizard_failed_text">我们很遗憾地通知您我们无法为您设置Shelter。
\n
\n如果您的设备已经有工作配置文件无论是之前安装的Shelter所创建或者其他应用程序创建您都必须在设置 -&gt; 帐户中删除该配置文件,然后 Shelter 才能继续。
\n
\n如果您没有手动取消设置那么失败的最常见原因是系统被大量修改或者 Shelter 与其他工作配置文件管理器之间存在冲突。 不幸的是,我们对此无能为力。
\n
\n单击下一步退出。</string>
<string name="setup_wizard_compatibility_text">Shelter是在类似AOSP的安卓衍生品上开发和测试的。这包括AOSP安卓开源项目谷歌安卓在Pixels上以及<b>大多数基于AOSP的开源定制ROM</b>如LineageOS。如果你的手机正在运行上面列出的安卓衍生品之一那么恭喜你Shelter可能会正常工作。
\n
\nShelter可能会在你的设备上正确工作。 一些设备供应商在安卓代码库中引入了非常具有侵略性的定制导致冲突、不兼容和意外行为。一些定制的ROM也会引入破坏兼容性的变化但一般来说与手机供应商引入的不兼容问题相比这些情况更少发生。
\n
\nSheler只是一个进入系统所提供的工作档案功能的接口。如果系统提供的功能是坏的或不标准的<b>Shelter不可能自己神奇地解决这个问题</b>。如果你目前使用的是供应商修改过的Android版本而该版本已知会破坏工作档案<b>你已经被警告了</b>。你可以继续进行但不能保证Shelter在这些情况下的行为是正常的。</string>
<string name="setup_wizard_welcome_text">Shelter 是一个帮助你在独立的配置文件中运行其他 App 的应用程序。它基于 Android 的<b>工作档案</b>功能实现。
\n
\n点击 \"下一步\",我们将向你提供更多关于 Shelter 的信息,并带领你完成设置。
\n
\n我们建议你仔细阅读以下所有的页面。</string>
<string name="setup_wizard_action_required_text">您现在应该会看到来自 Shelter 的通知。 <b> 请点击该通知 </b> 完成设置过程。
\n
\n如果您没有看到通知请确保您的设备未处于“请勿打扰”模式并尝试下拉通知中心。
\n
\n要重置 Shelter 并重新开始,您可以在设置中清除 Shelter 的数据。</string>
</resources> </resources>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_services">服務</string>
<string name="settings_auto_freeze_service">自動凍結服務</string>
<string name="settings_auto_freeze_service_desc">在您鎖屏時,自動凍結您通過 \"解凍並運行\" 啓動的應用。</string>
<string name="settings_auto_freeze_delay">凍結延時</string>
<string name="settings_about">關於</string>
<string name="settings_version">版本</string>
<string name="settings_source_code">源代碼</string>
<string name="settings_translate">翻譯</string>
<string name="settings_bug_report">Bug 報告</string>
<string name="device_admin_toast">您必須授予「裝置管理員」權限才能使 Shelter 正常工作。請重試。</string>
<string name="provision_still_pending">我們正在爲您準備 Shelter 帳戶,請稍候……</string>
<string name="msg_device_unsupported">權限不足 / 設備不兼容</string>
<string name="work_profile_not_found">工作用戶不可用,請重新啓動 Shelter 以重新初始化。</string>
<string name="work_profile_provision_failed">無法創建工作用戶,您可以重啓 Shelter 並再試一次。</string>
<string name="uninstall_success">應用 \"%s\" 卸載成功</string>
<string name="clone_success">應用 \"%s\" 克隆成功</string>
<string name="freeze_success">應用 \"%s\" 凍結成功</string>
<string name="unfreeze_success">應用 \"%s\" 解凍成功</string>
<string name="clone_fail_system_app">無法將系統應用克隆到 Shelter 無權管理的用戶下。</string>
<string name="uninstall_fail_system_app">無法在 Shelter 無權管理的用戶中卸載系統應用。</string>
<string name="app_context_menu_title">%s 可用操作</string>
<string name="freeze_all_success">所有在 \"自動凍結\" 列表中的應用都已經凍結成功。</string>
<string name="launch_app_fail">無法啓動沒有用戶界面的應用 %s。</string>
<string name="miui_cannot_clone">目前無法在 MIUI 上克隆非系統應用。請先克隆您的系統應用商店 (如 <b>Play Store</b>) 然後從克隆的應用商店中安裝應用。</string>
<string name="continue_anyway">無視並繼續</string>
<string name="show_all_warning">對列表中默認隱藏的應用執行操作可能導致崩潰以及其他各種無法預料的行爲。但是當您的手機廠商沒有正確在工作用戶中開啓所有必要的系統組件應用的時候這個功能可以幫助您解決問題。如果您選擇繼續您確保您瞭解您在做什麼Shelter 無法提供任何保證。</string>
<string name="provision_finished">Shelter 已初始化完成,正在啓動 Shelter。如果 Shelter 沒有自動啓動,請您從啓動器手動啓動它。</string>
<string name="settings_dont_freeze_foreground">跳過前臺應用</string>
<string name="first_run_alert">您即將開始設定 Shelter。
\n
\n此應用程式基於 Android 的 <b>工作資料夾</b> 功能以隔離應用程式。如果您正在使用的廠商/客製化 ROM 破壞了此功能(如 MIUI您應該立即 <b>退出</b><b>不要</b> 使用此應用程式。
\n
\n如果您選擇繼續Shelter 將爲您創建工作資料夾。
\n
\n如果您是開發者並希望使 Shelter 在 MIUI 等不相容的 ROM 上工作,歡迎提交 pull request。如果您的裝置在運行不相容的 ROM 時損毀,開發者將 <b>不承擔任何責任</b>
\n
\n您將在完成設定後收到一則通知請確定您的裝置 <b>不在</b> 勿擾模式中。</string>
<string name="settings_cross_profile_file_chooser_desc">打開以後,您將可以且僅可以從系統的 Documents UI (啓動器上的名稱爲 文件 或 下載) 或支持 Documents UI 的 APP 中 瀏覽 / 查看 / 選擇 / 複製 Shelter 內的文件到主用戶,反之亦然。這不會影響對文件系統的隔離。即使是支持 Documents UI 的 App 也只能臨時獲取您選擇的文件的訪問權限。</string>
<string name="settings_dont_freeze_foreground_desc">在您鎖屏的時候,不要凍結前臺應用 (鎖屏時仍有可見窗口的應用)。這主要用於音樂播放器等 App但您將需要在使用完成後手動使用 \"批量凍結\" 快捷方式凍結它們。</string>
<string name="work_mode_disabled">工作模式 (Work Mode) 已被您關閉,請開啓後再啓動 Shelter。</string>
<string name="shortcut_create_success">快捷方式已創建。</string>
<string name="request_usage_stats">Shelter 需要 <b>使用情況數據</b> 來做這件事。請在按 \"確定\" 後出現的窗口中,對 <b>兩個</b> Shelter都打開此權限。如果沒有全部打開該功能將無法正確運作。</string>
<string name="request_storage_manager">File Shuttle 需要訪問 <b>全部文件</b> 的權限。請在接下來的對話框中對 <b>兩個 Shelter</b> (工作用戶內 / 外) 都啓用該權限。</string>
<string name="request_system_alert">File Shuttle 需要 <b>懸浮窗</b> 權限才能在 Shelter 不在運行時正常啓動。請在接下來的對話框中對 <b>兩個 Shelter</b> (工作用戶內 / 外) 都打開該權限。</string>
<string name="batch_operation">批量操作</string>
<string name="clone_to_work_profile">克隆到 Shelter (工作用戶)</string>
<string name="unsupported_launcher">無法在您的啓動器上添加快捷方式,請聯繫開發者。</string>
<string name="first_run_alert_cancel">再見</string>
<string name="first_run_alert_continue">繼續</string>
<string name="device_admin_desc">App 隔離服務</string>
<string name="device_admin_explanation">Shelter 需要成爲設備管理員才能正常進行 App 隔離等操作。</string>
<string name="finish_provision_title">點擊這裏完成 Shelter 初始化</string>
<string name="finish_provision_desc">您距離使用 Shelter 僅有一步之遙。</string>
<string name="service_title">Shelter 服務</string>
<string name="service_desc">Shelter 正在運行 …</string>
<string name="service_auto_freeze_title">自動凍結等待中</string>
<string name="service_auto_freeze_now">立刻凍結</string>
<string name="app_installing">正在安裝……</string>
<string name="fragment_profile_main">主用戶</string>
<string name="list_item_disabled">[已凍結] %s</string>
<string name="service_auto_freeze_desc">Shelter 將會在您下次鎖屏時自動凍結使用 \"解凍並運行\" 啓動的應用。</string>
<string name="fragment_profile_work">Shelter</string>
<string name="notifications_important">Shelter 重要通知</string>
<string name="clone_to_main_profile">克隆到主用戶</string>
<string name="uninstall_app">卸載</string>
<string name="freeze_app">凍結</string>
<string name="unfreeze_app">解除凍結</string>
<string name="launch">運行</string>
<string name="create_unfreeze_shortcut">創建解凍並運行快捷方式</string>
<string name="unfreeze_and_launch">解凍並運行</string>
<string name="auto_freeze">自動凍結</string>
<string name="allow_cross_profile_widgets">允許在主用戶中創建小工具</string>
<string name="search">搜索</string>
<string name="freeze_all">批量凍結</string>
<string name="freeze_all_shortcut">凍結</string>
<string name="install_app_to_profile">安裝 APK 到 Shelter</string>
<string name="install_app_to_profile_success">已成功在工作用戶內安裝 APK。</string>
<string name="show_all">顯示全部應用</string>
<string name="documents_ui">打開文件管理器</string>
<string name="settings">設置</string>
<string name="settings_interaction">交互</string>
<string name="settings_cross_profile_file_chooser">文件穿梭</string>
<string name="create_freeze_all_shortcut">創建批量凍結快捷方式</string>
<string name="settings_block_contacts_searching">阻止訪問聯繫人</string>
<string name="settings_block_contacts_searching_desc">阻止主用戶中的應用訪問工作用戶的聯繫人資料。</string>
<string name="setup_wizard_welcome">歡迎來到 Shelter</string>
<string name="setup_wizard_welcome_text">Shelter 是一個幫助你在獨立的配置文件中運行其他 App 的應用程序。它基於 Android 的<b>工作檔案</b>功能實現。
\n
\n點擊 \"下一步\",我們將向你提供更多關於 Shelter 的信息,並帶領你完成設置。
\n
\n我們建議你仔細閱讀以下所有的頁面。</string>
<string name="setup_wizard_permissions_text">默認情況下Shelter不會要求任何個人權限。然而一旦你繼續進行設置過程Shelter將嘗試設置一個工作檔案併成爲此檔案的<b>檔案管理員</b>
\n
\n這將授予Shelter在配置文件內的大量權限與設備管理員的權限相當儘管只限於配置文件內。爲了實現Shelter的大部分功能成爲檔案管理員是必要的。
\n
\nShelter 的一些高級功能可能需要更多權限<b>外部</b>工作資料。當需要時Shelter將在你啓用相應的功能時單獨要求這些權限。</string>
<string name="setup_wizard_compatibility_text">Shelter是在類似AOSP的安卓衍生品上開發和測試的。這包括AOSP安卓開源項目谷歌安卓在Pixels上以及<b>大多數基於AOSP的開源定製ROM</b>如LineageOS。如果你的手機正在運行上面列出的安卓衍生品之一那麼恭喜你Shelter可能會正常工作。
\n
\nShelter可能會在你的設備上正確工作。 一些設備供應商在安卓代碼庫中引入了非常具有侵略性的定製導致衝突、不兼容和意外行爲。一些定製的ROM也會引入破壞兼容性的變化但一般來說與手機供應商引入的不兼容問題相比這些情況更少發生。
\n
\nSheler只是一個進入系統所提供的工作檔案功能的接口。如果系統提供的功能是壞的或不標準的<b>Shelter不可能自己神奇地解決這個問題</b>。如果你目前使用的是供應商修改過的Android版本而該版本已知會破壞工作檔案<b>你已經被警告了</b>。你可以繼續進行但不能保證Shelter在這些情況下的行爲是正常的。</string>
<string name="setup_wizard_action_required_text">您現在應該會看到來自 Shelter 的通知。 <b> 請點擊該通知 </b> 完成設置過程。
\n
\n如果您沒有看到通知請確保您的設備未處於“請勿打擾”模式並嘗試下拉通知中心。
\n
\n要重置 Shelter 並重新開始,您可以在設置中清除 Shelter 的數據。</string>
<string name="setup_wizard_permissions">關於權限的說明</string>
<string name="setup_wizard_compatibility">兼容性</string>
<string name="setup_wizard_failed">安裝失敗</string>
<string name="setup_wizard_please_wait_text">我們正在嘗試初始化工作檔案並在您的設備上設置 Shelter。</string>
<string name="setup_wizard_please_wait">請稍等…</string>
<string name="setup_wizard_ready">準備好?</string>
<string name="setup_wizard_ready_text">我們現在已準備好爲您設置 Shelter。如果您的設備運行的是 Android 7 或更低版本,請首先確保您的設備是 <b> 不是 </b> 請勿打擾模式,因爲您需要 <b> 點擊通知 </b> 稍後完成設置過程。
\n
\n準備好後單擊“下一步”開始設置過程。</string>
<string name="setup_wizard_failed_text">我們很遺憾地通知您我們無法爲您設置Shelter。
\n
\n如果您的設備已經有工作配置文件無論是之前安裝的Shelter所創建或者其他應用程序創建您都必須在設置 -&gt; 帳戶中刪除該配置文件,然後 Shelter 才能繼續。
\n
\n如果您沒有手動取消設置那麼失敗的最常見原因是系統被大量修改或者 Shelter 與其他工作配置文件管理器之間存在衝突。 不幸的是,我們對此無能爲力。
\n
\n單擊下一步退出。</string>
<string name="setup_wizard_action_required">需要採取的行動</string>
</resources>

View file

@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#FAFAFA</color> <color name="colorPrimary">#F1F9F8</color>
<color name="colorPrimaryDark">#C2C2C2</color>
<color name="colorAccent">#009688</color> <color name="colorAccent">#009688</color>
<color name="black">#333333</color> <color name="colorAccentSetupWizard">#FFC107</color>
<color name="grey">#999999</color> <color name="colorNavigationBar">#E0F2F1</color>
<color name="colorNavigationIconTint">@color/colorAccent</color>
<color name="colorNavigationIconTintSelected">@color/colorTextPrimary</color>
<color name="colorTextPrimary">#333333</color>
<color name="colorTextSecondary">#999999</color>
<color name="disabledAppBackground">#E0F2F1</color> <color name="disabledAppBackground">#E0F2F1</color>
<color name="selectedAppBackground">#EEEEEE</color> <color name="selectedAppBackground">#E1E9E8</color>
<color name="selectedAndDisabledAppBackground">#CEE1E0</color> <color name="selectedAndDisabledAppBackground">#CEE1E0</color>
</resources> </resources>

View file

@ -1,19 +1,38 @@
<resources> <resources>
<string name="app_name" translatable="false">Shelter</string> <string name="app_name" translatable="false">Shelter</string>
<string name="first_run_alert">You are about to set up Shelter.\n\nThis app depends on the <b>Work Profile</b> feature of Android to isolate the apps. If you use a vendor / custom ROM that breaks related features (e.g. MIUI), you should now <b>QUIT</b> and <b>DO NOT</b> use this app.\n\nIf you choose to continue, Shelter will set up Work Profile for you.\n\nIf you are a developer and would like to make Shelter work on those incompatible ROMs like MIUI, pull requests are always welcome. The developer takes <b>ABSOLUTELY NO RESPONSIBILITY</b> if you break your device running an incompatible ROM.</string>
<string name="first_run_alert_cancel">Bye</string> <string name="first_run_alert_cancel">Bye</string>
<string name="first_run_alert_continue">Continue</string> <string name="first_run_alert_continue">Continue</string>
<string name="device_admin_label" translatable="false">Shelter</string> <string name="device_admin_label" translatable="false">Shelter</string>
<string name="device_admin_desc">App Isolation Service</string> <string name="device_admin_desc">App Isolation Service</string>
<string name="device_admin_explanation">Shelter needs to become Device Admin in order to perform its isolation tasks.</string> <string name="device_admin_explanation">Shelter needs to become Device Admin in order to perform its isolation tasks.</string>
<string name="camera_proxy_activity">Choose an Image File</string> <string name="payment_stub_description">Payment Service Stub (DO NOT USE)</string>
<!-- Setup Wizard -->
<string name="setup_wizard_welcome">Welcome to Shelter</string>
<string name="setup_wizard_welcome_text">Shelter is an application to help you run other applications in an isolated profile. It does so by making use of the <b>Work Profile</b> feature of Android.\n\nClick \"Next\", and we will provide you with more information about Shelter, and guide you through the setup process.\n\nWe suggest that you read through all of the following pages carefully.</string>
<string name="setup_wizard_permissions">A word on permissions</string>
<string name="setup_wizard_permissions_text">By default, Shelter will not ask for any individual permissions. However, once you proceed with the setup process, Shelter will try to set up a Work Profile and hence become the <b>profile manager</b> of said profile.\n\nThis will grant Shelter an extensive list of permissions inside the profile, comparable to that of a Device Admin, albeit confined to the profile. Being the profile manager is necessary for most of Shelter\'s functionality.\n\nSome advanced features of Shelter may require more permissions <b>outside</b> the Work Profile. When needed, Shelter will ask for those permissions separately when you enable the corresponding features.</string>
<string name="setup_wizard_compatibility">Compatibility</string>
<string name="setup_wizard_compatibility_text">Shelter is developed and tested on AOSP-like Android derivatives. This includes AOSP (Android Open Source Project), Google Android (on Pixels), and <b>most AOSP-based open-source custom ROMs</b> such as LineageOS. If your phone is running one of the Android derivatives listed above, then congratulations! Shelter is probably going to work correctly on your device.\n\nSome device vendors introduce very invasive customizations into the Android code base, resulting in conflicts, incompatibility and unexpected behavior. Some custom ROMs can also introduce compatibility-breaking changes, but generally these are rarer occurrences compared to phone vendor-introduced incompatibilities.\n\nShelter is merely an interface into the Work Profile feature provided by the system. If the feature provided by the system is broken or non-standard, <b>Shelter could not magically resolve the issue on its own</b>. If you are currently using a vendor-modified Android version that is known to break Work Profiles, <b>you have been warned</b>. You may proceed anyway, but there is no guarantee that Shelter would behave correctly under these circumstances.</string>
<string name="setup_wizard_ready">Ready?</string>
<string name="setup_wizard_ready_text">We are now ready to set up Shelter for you. If your device is running Android 7 or lower, please first ensure that your device is <b>not</b> in Do Not Disturb mode, because you will need to <b>click on a notification</b> later to finalize the setup process.\n\nWhen you are ready, click on \"Next\" to begin the setup process.</string>
<string name="setup_wizard_please_wait">Please wait…</string>
<string name="setup_wizard_please_wait_text">We are trying to initialize Work Profile and set up Shelter on your device.</string>
<string name="setup_wizard_failed">Setup failed</string>
<string name="setup_wizard_failed_text">We regret to inform you that we were not able to set up Shelter for you.\n\nIf your device already had a Work Profile, either from a previous installation of Shelter or from another application, you will have to remove that profile in Settings -> Account before Shelter can proceed.\n\nOtherwise, if you did not cancel the setup manually, then the reason for the failure is most commonly due to a heavily modified system, or a conflict between Shelter and other Work Profile managers. Unfortunately, there is not much that we could do about this.\n\nClick \"Next\" to exit.</string>
<string name="setup_wizard_action_required">Action required</string>
<string name="setup_wizard_action_required_text">You should now be seeing a notification from Shelter. <b>Please click on that notification</b> to finish the setup process.\n\nIf you do not see the notification, make sure your device is not in Do Not Disturb mode and try pulling down the notification center.\n\nTo reset Shelter and start over, you can clear the data of Shelter in Settings.</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notifications_important">Shelter Important</string>
<string name="finish_provision_title">Click here to finish setting up Shelter</string>
<string name="finish_provision_desc">Congratulations! You are one click away from finishing setting up Shelter.</string>
<string name="service_title">Shelter Service</string> <string name="service_title">Shelter Service</string>
<string name="service_desc">Shelter is now running &#8230;</string> <string name="service_desc">Shelter is now running &#8230;</string>
<string name="service_auto_freeze_title">Auto-freeze pending</string> <string name="service_auto_freeze_title">Auto-freeze pending</string>
<string name="service_auto_freeze_desc">Shelter will auto-freeze apps launched from \"Unfreeze &amp; Launch\" on the next screen lock event.</string> <string name="service_auto_freeze_desc">Shelter will auto-freeze apps launched from \"Unfreeze &amp; Launch\" on the next screen lock event.</string>
<string name="service_auto_freeze_now">Freeze Now</string> <string name="service_auto_freeze_now">Freeze Now</string>
<string name="app_installing">Installing...</string>
<!-- Main UI --> <!-- Main UI -->
<string name="fragment_profile_main">Main</string> <string name="fragment_profile_main">Main</string>
@ -32,6 +51,7 @@
<string name="unfreeze_and_launch">Unfreeze and Launch</string> <string name="unfreeze_and_launch">Unfreeze and Launch</string>
<string name="auto_freeze">Auto Freeze</string> <string name="auto_freeze">Auto Freeze</string>
<string name="allow_cross_profile_widgets">Allow Widgets in Main Profile</string> <string name="allow_cross_profile_widgets">Allow Widgets in Main Profile</string>
<string name="allow_cross_profile_interaction">Allow Cross-Profile Interaction</string>
<!-- Action Bar Options Menu --> <!-- Action Bar Options Menu -->
<string name="search">Search</string> <string name="search">Search</string>
@ -42,14 +62,17 @@
<string name="install_app_to_profile_success">Application installation finished in work profile.</string> <string name="install_app_to_profile_success">Application installation finished in work profile.</string>
<string name="show_all">Show All Apps</string> <string name="show_all">Show All Apps</string>
<string name="show_all_warning">Manipulating apps that are hidden from the list could cause crashes and all sorts of unexpected behavior. However, this feature can be useful when faulty vendor-customized ROMs does not enable all necessary system apps in work profile by default. If you continue, you are on your own.</string> <string name="show_all_warning">Manipulating apps that are hidden from the list could cause crashes and all sorts of unexpected behavior. However, this feature can be useful when faulty vendor-customized ROMs does not enable all necessary system apps in work profile by default. If you continue, you are on your own.</string>
<string name="documents_ui">Open Documents UI</string>
<!-- Settings Options --> <!-- Settings Options -->
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="settings_interaction">Interaction</string> <string name="settings_interaction">Interaction</string>
<string name="settings_cross_profile_file_chooser">File Shuttle</string> <string name="settings_cross_profile_file_chooser">File Shuttle</string>
<string name="settings_cross_profile_file_chooser_desc">When enabled, you\'ll be able to browse / view / pick / copy files in Shelter from main profile and vice-versa, ONLY through Documents UI (named Files or Documents on your launcher) or apps with Documents UI support (they only gain temporary access to files you choose in Documents UI), while still pertaining the filesystem isolation.</string> <string name="settings_cross_profile_file_chooser_desc">When enabled, you\'ll be able to browse / view / pick / copy files in Shelter from main profile and vice-versa, ONLY through Documents UI (named Files or Documents on your launcher) or apps with Documents UI support (they only gain temporary access to files you choose in Documents UI), while still pertaining the filesystem isolation.</string>
<string name="settings_camera_proxy">Image Chooser as Fake Camera</string> <string name="settings_block_contacts_searching">Block Contacts Searching</string>
<string name="settings_camera_proxy_desc">Present a fake camera app to other apps, allowing you to choose an arbitrary image from Documents UI (and File Shuttle if enabled) as the taken picture. This enables File Shuttle for any app that supports invoking other camera apps to take a picture, even if they don\'t support Documents UI natively.</string> <string name="settings_block_contacts_searching_desc">Deny access from main profile to contacts inside work profile.</string>
<string name="settings_payment_stub">Payment Service Stub</string>
<string name="settings_payment_stub_desc">Enable a fake NFC payment service in the main profile, so that the "contactless payments" option under Settings - NFC becomes enabled to allow you to choose a payment app inside the work profile. This works around an Android bug that makes it impossible to select a payment app inside the work profile if none is available in the main profile.</string>
<string name="settings_services">Services</string> <string name="settings_services">Services</string>
<string name="settings_auto_freeze_service">Auto Freeze Service</string> <string name="settings_auto_freeze_service">Auto Freeze Service</string>
<string name="settings_auto_freeze_service_desc">When the screen is locked, automatically freeze apps launched from \"Unfreeze &amp; Launch Shortcut\".</string> <string name="settings_auto_freeze_service_desc">When the screen is locked, automatically freeze apps launched from \"Unfreeze &amp; Launch Shortcut\".</string>
@ -59,15 +82,15 @@
<string name="settings_about">About</string> <string name="settings_about">About</string>
<string name="settings_version">Version</string> <string name="settings_version">Version</string>
<string name="settings_source_code">Source Code</string> <string name="settings_source_code">Source Code</string>
<string name="settings_source_code_url" translatable="false">https://git.angry.im/PeterCxy/Shelter</string> <string name="settings_source_code_url" translatable="false">https://gitea.angry.im/PeterCxy/Shelter</string>
<string name="settings_translate">Translate</string>
<string name="settings_translate_url" translatable="false">https://weblate.typeblog.net/projects/shelter/shelter/</string>
<string name="settings_bug_report">Bug Report / Issue Tracker</string> <string name="settings_bug_report">Bug Report / Issue Tracker</string>
<string name="settings_bug_report_url" translatable="false">https://git.angry.im/PeterCxy/Shelter/issues</string> <string name="settings_bug_report_url" translatable="false">https://lists.sr.ht/~petercxy/shelter</string>
<string name="settings_patreon" translatable="false">Patreon</string> <string name="settings_patreon" translatable="false">Patreon</string>
<string name="settings_patreon_url" translatable="false">https://www.patreon.com/PeterCxy</string> <string name="settings_patreon_url" translatable="false">https://www.patreon.com/PeterCxy</string>
<!-- Toast Long Texts --> <!-- Toast Long Texts -->
<string name="device_admin_toast">You have to grant Device Admin permission for Shelter to work. Please try again.</string>
<string name="provision_still_pending">Please wait while we prepare Shelter profile for you &#8230;</string>
<string name="provision_finished">Shelter setup complete. Now restarting Shelter. If Shelter didn\'t start automatically, you may launch it again from your launcher.</string> <string name="provision_finished">Shelter setup complete. Now restarting Shelter. If Shelter didn\'t start automatically, you may launch it again from your launcher.</string>
<string name="msg_device_unsupported">Permission is denied or Unsupported device</string> <string name="msg_device_unsupported">Permission is denied or Unsupported device</string>
<string name="work_profile_not_found">Work profile not found. Please restart the app to re-provision the profile.</string> <string name="work_profile_not_found">Work profile not found. Please restart the app to re-provision the profile.</string>
@ -78,15 +101,20 @@
<string name="freeze_success">Application \"%s\" frozen successfully</string> <string name="freeze_success">Application \"%s\" frozen successfully</string>
<string name="unfreeze_success">Application \"%s\" unfrozen successfully</string> <string name="unfreeze_success">Application \"%s\" unfrozen successfully</string>
<string name="clone_fail_system_app">Cannot clone system apps to a profile that Shelter has no control of.</string> <string name="clone_fail_system_app">Cannot clone system apps to a profile that Shelter has no control of.</string>
<string name="uninstall_fail_system_app">Cannot uninstall system apps in a profile that Shelter has no control of.</string> <string name="uninstall_fail_system_app">Cannot uninstall system apps in a profile that Shelter has no control of.</string>
<string name="unsupported_launcher">Cannot add shortcuts to your launcher. Please contact the developer for more information.</string> <string name="unsupported_launcher">Cannot add shortcuts to your launcher. Please contact the developer for more information.</string>
<string name="app_context_menu_title">Operations for %s</string> <string name="app_context_menu_title">Operations for %s</string>
<string name="freeze_all_success">All apps in \"Auto Freeze\" list have been frozen successfully.</string> <string name="freeze_all_success">All apps in \"Auto Freeze\" list have been frozen successfully.</string>
<string name="shortcut_create_success">Shortcut created on your launcher.</string> <string name="shortcut_create_success">Shortcut created on your launcher.</string>
<string name="request_usage_stats">Shelter needs <b>Usage Stats</b> permission to do this. Please enable the permission for <b>BOTH OF THE TWO</b> Shelter apps shown in the dialog after you press \"Ok\". Failing to do so will cause this feature to not work properly.</string> <string name="request_usage_stats">Shelter needs <b>Usage Stats</b> permission to do this. Please enable the permission for <b>BOTH OF THE TWO</b> Shelter apps shown in the dialog after you press \"Ok\". Failing to do so will cause this feature to not work properly.</string>
<string name="launch_app_fail">Cannot launch app %s because it has no GUI.</string> <string name="launch_app_fail">Cannot launch app %s because it has no GUI.</string>
<string name="request_storage_manager">Shelter needs access to <b>All Files</b> for File Shuttle. Please enable the permission for <b>BOTH OF THE TWO </b> (Personal / Work) Shelter apps shown in the dialog after you press \"Ok\".</string>
<string name="request_system_alert">Shelter needs to <b>Draw over Other Apps</b> in order for File Shuttle to function correctly. Please enable the permission for <b>BOTH OF THE TWO </b> (Personal / Work) Shelter apps shown in the dialog after you press \"Ok\". This permission is used to start File Shuttle services in the background.</string>
<!-- MIUI --> <!-- MIUI -->
<string name="miui_cannot_clone">Cloning non-system apps to another profile is currently not possible on MIUI. Please clone your system\'s app store (e.g. <b>Play Store</b>) into the other profile and then install apps from there.</string> <string name="miui_cannot_clone">Cloning non-system apps to another profile is currently not possible on MIUI. Please clone your system\'s app store (e.g. <b>Play Store</b>) into the other profile and then install apps from there.</string>
<string name="continue_anyway">Continue anyway</string> <string name="continue_anyway">Continue anyway</string>
<!-- Formats -->
<string name="format_minutes">%d min</string>
</resources> </resources>

View file

@ -1,12 +1,42 @@
<resources> <resources>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <style name="AppTheme.Base" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="colorOnPrimary">@color/colorTextPrimary</item>
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:colorBackground">@color/colorPrimary</item>
<item name="android:textColor">@color/colorTextPrimary</item>
<item name="android:textColorSecondary">@color/colorTextSecondary</item>
<item name="android:itemBackground">@color/colorPrimary</item>
<item name="android:listViewStyle">@style/ListViewTheme</item>
<item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
</style>
<style name="AppTheme.Override" parent="AppTheme.Base">
<!-- Empty; override from specific styles -->
</style>
<style name="AppTheme" parent="AppTheme.Override">
<!-- Empty; override from specific styles -->
</style>
<!-- Themes for dialogs and context menus -->
<style name="ListViewTheme" parent="@android:style/Widget.ListView">
<item name="android:background">@color/colorPrimary</item>
</style>
<style name="AlertDialogTheme" parent="Theme.AppCompat.DayNight.Dialog.Alert">
<item name="android:background">@color/colorPrimary</item>
<item name="android:headerBackground">@color/colorPrimary</item>
<item name="android:windowTitleStyle">@style/AlertDialogTitleTextStyle</item>
</style>
<style name="AlertDialogTitleTextStyle" parent="TextAppearance.AppCompat.Title">
<item name="android:background">@color/colorPrimary</item>
</style> </style>
<!-- Theme for ActionBar --> <!-- Theme for ActionBar -->
@ -15,4 +45,13 @@
<item name="android:textColorPrimary">@color/colorAccent</item> <item name="android:textColorPrimary">@color/colorAccent</item>
</style> </style>
<!-- For DummyActivity -->
<style name="Theme.AppCompat.Translucent.NoTitleBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>
</resources> </resources>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/payment_stub_description"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/payment_stub_description"
android:category="payment">
<!-- This is not a real AID -->
<aid-filter android:name="F0010203040506"/>
</aid-group>
</host-apdu-service>

View file

@ -11,9 +11,14 @@
android:summary="@string/settings_cross_profile_file_chooser_desc" /> android:summary="@string/settings_cross_profile_file_chooser_desc" />
<androidx.preference.CheckBoxPreference <androidx.preference.CheckBoxPreference
android:key="settings_camera_proxy" android:key="settings_block_contacts_searching"
android:title="@string/settings_camera_proxy" android:title="@string/settings_block_contacts_searching"
android:summary="@string/settings_camera_proxy_desc" /> android:summary="@string/settings_block_contacts_searching_desc" />
<androidx.preference.CheckBoxPreference
android:key="settings_payment_stub"
android:title="@string/settings_payment_stub"
android:summary="@string/settings_payment_stub_desc" />
</androidx.preference.PreferenceCategory> </androidx.preference.PreferenceCategory>
@ -25,7 +30,7 @@
android:title="@string/settings_auto_freeze_service" android:title="@string/settings_auto_freeze_service"
android:summary="@string/settings_auto_freeze_service_desc" /> android:summary="@string/settings_auto_freeze_service_desc" />
<androidx.preference.Preference <androidx.preference.DropDownPreference
android:dependency="settings_auto_freeze_service" android:dependency="settings_auto_freeze_service"
android:key="settings_auto_freeze_delay" android:key="settings_auto_freeze_delay"
android:title="@string/settings_auto_freeze_delay" /> android:title="@string/settings_auto_freeze_delay" />
@ -50,6 +55,11 @@
android:title="@string/settings_source_code" android:title="@string/settings_source_code"
android:summary="@string/settings_source_code_url" /> android:summary="@string/settings_source_code_url" />
<androidx.preference.Preference
android:key="settings_translate"
android:title="@string/settings_translate"
android:summary="@string/settings_translate_url" />
<androidx.preference.Preference <androidx.preference.Preference
android:key="settings_bug_report" android:key="settings_bug_report"
android:title="@string/settings_bug_report" android:title="@string/settings_bug_report"

69
art/egg_f_monochrome.svg Normal file
View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="c5e7cda2-40db-4fe8-bf88-df9f364d243b"
data-name="EGG"
viewBox="0 0 737.01174 850.35934"
version="1.1"
sodipodi:docname="egg_f_monochrome.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
width="737.01172"
height="850.35931"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.87215581"
inkscape:cx="488.44483"
inkscape:cy="250.52863"
inkscape:window-width="1916"
inkscape:window-height="1026"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="c5e7cda2-40db-4fe8-bf88-df9f364d243b"
showgrid="false" />
<defs
id="defs1">
<style
id="style1">.ffca8004-faa4-460f-9db2-0ce456f4982b{opacity:0.2;}.\34 34927b1-b62e-41a1-85d4-12dc9e893b7e{fill:#efbc47;}.\30 aa0fe2b-2b82-41a2-a160-82ad7d75e0ca,.\32 36ecd15-c982-4eb5-93ac-b08221203b4e,.\34 34927b1-b62e-41a1-85d4-12dc9e893b7e,.\38 d0f6148-f92c-4962-83ab-fd87f0e1ea6b,.d1103f53-cdd8-4e15-b9ef-ecdc9c405dfb{fill-rule:evenodd;}.d1103f53-cdd8-4e15-b9ef-ecdc9c405dfb{fill:#e2cdb3;}.\32 36ecd15-c982-4eb5-93ac-b08221203b4e{fill:#fcf1e3;}.\37 958d8f3-6a5a-4841-ae4a-57eb7ddf450c{fill:#20190a;}.\38 d0f6148-f92c-4962-83ab-fd87f0e1ea6b{fill:#f9f8f4;}.\30 aa0fe2b-2b82-41a2-a160-82ad7d75e0ca{fill:#f9e4c4;}</style>
</defs>
<title
id="title1">egg_f</title>
<path
d="m 171.041,181.0195 -85,77.5898 -5.2129,-6.6367 C 50.5274,317.7463 31.1249,390.5744 28.7168,463.1484 l 28.0039,13.7422 113.3809,-80 28.3496,80 28.3496,-26.6797 56.75,29.3398 56.6895,-56 56.7011,80 56.6895,-53.3613 56.6894,53.3613 85,-106.7207 85,106.7207 28.3223,-26.3574 c -0.1951,-76.3504 -19.7698,-153.5206 -51.416,-222.9551 l -32.6758,30.2325 -85,-77.5801 -56.6992,51.7187 -56.6914,-25.8593 -56.6895,25.8593 -28.3496,-51.7187 -56.6894,51.7187 -56.6914,-25.8593 -28.3497,25.8593 z m 84.0801,130.791 c 15.6569,3e-4 28.3494,19.0369 28.3496,42.5195 -2e-4,23.4827 -12.6927,42.5193 -28.3496,42.5196 -15.6569,-3e-4 -28.3494,-19.0369 -28.3496,-42.5196 1e-4,-9.5818 2.116,-18.4211 5.6816,-25.5312 0,0 0,-0.01 0,-0.01 0.017,-0.034 0.039,-0.063 0.057,-0.098 0.7592,-1.504 1.5817,-2.9311 2.4649,-4.2695 0.01,-0.013 0.016,-0.028 0.025,-0.041 0.9072,-1.3713 1.8781,-2.6457 2.9023,-3.8223 0,0 0,0 0.01,-0.01 4.7732,-5.4808 10.739,-8.7441 17.2148,-8.7442 z m 226.7695,0 c 15.657,3e-4 28.3495,19.0369 28.3497,42.5195 -2e-4,23.4827 -12.6927,42.5193 -28.3497,42.5196 -15.6569,-3e-4 -28.3494,-19.0369 -28.3496,-42.5196 10e-5,-9.5818 2.116,-18.4211 5.6817,-25.5312 0,0 0,-0.01 0,-0.01 0.017,-0.034 0.039,-0.063 0.057,-0.098 5.1759,-10.2541 13.377,-16.8826 22.6132,-16.8828 z"
style="fill:#ffffff;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:8;stroke-dasharray:none"
id="path24" />
<path
d="m 255.1211,311.8105 c -6.4758,1e-4 -12.4416,3.2634 -17.2148,8.7442 2.0607,-2.3603 4.3456,-4.3092 6.7949,-5.7637 0.6364,-0.087 1.2776,-0.1343 1.9199,-0.1406 v -0.029 c 12.625,-10e-5 18.9457,15.2633 10.0195,24.1894 -8.9241,8.9241 -24.1807,2.6076 -24.1875,-10.0117 -3.5656,7.1101 -5.6815,15.9493 -5.6816,25.5312 2e-4,23.4828 12.6926,42.5193 28.3496,42.5196 15.657,-3e-4 28.3494,-19.0368 28.3496,-42.5196 -2e-4,-23.4827 -12.6926,-42.5192 -28.3496,-42.5195 z m -17.2207,8.75 c -1.0242,1.1766 -1.9951,2.451 -2.9023,3.8223 0.9076,-1.3688 1.8766,-2.6469 2.9023,-3.8223 z m -2.9277,3.8633 c -0.8832,1.3384 -1.7057,2.7655 -2.4649,4.2695 0.7585,-1.5023 1.5802,-2.9318 2.4649,-4.2695 z"
style="fill:#20190a"
id="path21" />
<path
d="m 481.8906,311.8105 c -9.2362,2e-4 -17.4373,6.6287 -22.6132,16.8828 3.1149,-6.151 7.3206,-11.0085 12.1933,-13.9023 0.6364,-0.087 1.2776,-0.1343 1.9199,-0.1406 v -0.029 c 12.6251,-10e-5 18.9457,15.2633 10.0196,24.1894 -8.9242,8.9242 -24.1808,2.6077 -24.1875,-10.0117 -3.5657,7.1101 -5.6816,15.9493 -5.6817,25.5312 2e-4,23.4828 12.6927,42.5193 28.3496,42.5196 15.657,-3e-4 28.3495,-19.0368 28.3497,-42.5196 -2e-4,-23.4827 -12.6927,-42.5192 -28.3497,-42.5195 z"
style="fill:#20190a"
id="path20" />
<path
d="m 473.3906,314.6211 v 0.029 c -0.6423,0.01 -1.2835,0.053 -1.9199,0.1406 -4.9,2.91 -9.13,7.8 -12.25,14 0,12.625 15.2633,18.9457 24.1895,10.0195 8.9261,-8.9261 2.6055,-24.1895 -10.0196,-24.1894 z"
style="fill:#f9f8f4;fill-rule:evenodd"
id="path19" />
<path
d="m 246.6211,314.6211 v 0.029 c -0.6423,0.01 -1.2835,0.053 -1.9199,0.1406 -4.9,2.91 -9.14,7.8 -12.25,14 -1e-4,12.625 15.2633,18.9457 24.1894,10.0195 8.9262,-8.9261 2.6055,-24.1895 -10.0195,-24.1894 z"
style="fill:#f9f8f4;fill-rule:evenodd"
id="path18" />
<path
d="M 369.5117,0 C 259.312,0 137.2103,99.4797 64.9004,231.6894 l 21.1406,26.9199 85,-77.5898 28.3496,77.5898 28.3497,-25.8593 56.6914,25.8593 56.6894,-51.7187 28.3496,51.7187 56.6895,-25.8593 56.6914,25.8593 56.6992,-51.7187 85,77.5801 52,-48.1114 C 604.6709,101.8296 481.0015,0 369.5117,0 Z"
style="fill:#1a1a1a;fill-rule:evenodd"
id="path17" />
<path
d="m 595.3203,396.83 -85,106.7207 -56.6894,-53.3613 -56.6895,53.3613 -56.7011,-80 -56.6895,56 -56.75,-29.3398 -28.3496,26.6797 -28.3496,-80 -113.3809,80 -55.8398,-27.4004 c 0,0 -0.8809,18.2494 -0.8809,27.3594 0,235.7497 165.0019,373.5097 368.5117,373.5097 203.5098,0 368.5,-137.76 368.5,-373.5097 0,-8.42 -0.25,-16.8727 -0.75,-25.3594 l -55.9414,52.0605 z"
style="fill:#1a1a1a;fill-rule:evenodd"
id="path16" />
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View file

@ -4,10 +4,10 @@ buildscript {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.3.1' classpath 'com.android.tools.build:gradle:8.6.0'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
@ -18,7 +18,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
} }

BIN
fdroid_custom_repo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

View file

@ -6,7 +6,10 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
android.defaults.buildfeatures.buildconfig=true
android.enableJetifier=true android.enableJetifier=true
android.nonFinalResIds=false
android.nonTransitiveRClass=false
android.useAndroidX=true android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.

View file

@ -1,6 +1,6 @@
#Wed Jan 23 08:32:40 CST 2019 #Sat Mar 13 15:41:46 CST 2021
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip

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