Compare commits

...

10 commits

Author SHA1 Message Date
Joey Huab
c01e6b6ff7 PixelPropsUtils: Update fingerprints to February 2025 release
Signed-off-by: Dmitrii <bankersenator@gmail.com>
2025-04-10 20:37:50 +00:00
jhenrique09
8b67e50ead [SQUASH] Introduce PixelPropsUtils/GamesPropsUtils
That will spoof build fingerprints on some g00gle apps

* Also will enable some cool stuffs like:
  - Dynamic navbar on GBoard
  - SafetyHub

and others.

Thanks to kdrag0n for the original idea at 5a54bfd846

Change-Id: I1078e7402833fec77edb751070c5144d08c85b6c
Signed-off-by: jhenrique09 <jhenrique09.mcz@hotmail.com>

keystore: Block key attestation for SafetyNet

SafetyNet (part of Google Play Services) opportunistically uses
hardware-backed key attestation via KeyStore as a strong integrity
check. This causes SafetyNet to fail on custom ROMs because the verified
boot key and bootloader unlock state can be detected from attestation
certificates.

As a workaround, we can take advantage of the fact that SafetyNet's
usage of key attestation is opportunistic (i.e. falls back to basic
integrity checks if it fails) and prevent it from getting the
attestation certificate chain from KeyStore. This is done by checking
the stack for DroidGuard, which is the codename for SafetyNet, and
pretending that the device doesn't support key attestation.

Key attestation has only been blocked for SafetyNet specifically, as
Google Play Services and other apps have many valid reasons to use it.
For example, it appears to be involved in Google's mobile security key
ferature.

Change-Id: I5146439d47f42dc6231cb45c4dab9f61540056f6

core: Make CTS/Play Integrity pass again

The logic behind CTS and Play Integrity has been updated today it now
checks the product and model names against the fingerprint and if
they do not match the CTS profile will fail.

Also while we are at it use a newer FP from Pixel XL and add logging
for key attestation blocking for debugging.

Test: Boot, check for CTS and Play Integrity

[Stallix - Evolution X]
Switch back to using the hOS' AttestationHooks implementation for
Play Integrity spoofing checks.

Change-Id: I089d5ef935bba40338e10c795ea7d181103ffd15
Signed-off-by: Dyneteve <dyneteve@hentaios.com>

* Stallix: Adapted for A13 and squashed changes with their respected authors from
  https://github.com/Evolution-X/frameworks_base/commits/tiramisu-bak-reverts-qpr2/core/java/com/android/internal/util/evolution/PixelPropsUtils.java.
  https://github.com/Evolution-X/frameworks_base/commits/tiramisu-qpr2/core/java/com/android/internal/util/evolution/PixelPropsUtils.java
  https://github.com/Evolution-X/frameworks_base/commits/tiramisu-qpr2/core/java/com/android/internal/util/evolution/AttestationHooks.java

stop Microsoft apps from crashing without INTERNET permission

Crash is caused by checks in
com.microsoft.aad.adal.AuthenticationContext.checkInternetPermission() and
com.microsoft.identity.client.PublicClientApplication.checkInternetPermission()

Prevent apps from crashing if internet permission is revoked.

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

ApplicationPackageManager: Extend freeform window feature to all apps

Change-Id: Iaa3e500fd6a80f4e1718218ff6d42fcb1eb79c9c
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

core: block 2021/22 pixel features to ASI and pixel launcher

* blacklist pe features and spoof redfin to get rid of tensor shits

Change-Id: I83aa09c151f51ee61361510b2c1a9ac8865a2aee
Signed-off-by: aswin7469 <aswinas@pixysos.com>

core: ApplicationPackageManager: Remove p21+ features from featuresPixel

* Differentiate with featuresTensor

ApplicationPackageManager: Adjust Tensor workaround

* Avoid P22 device's aggresive TensorFlow implementation
* Allow P21 pixel experience
* Add lynx to Tensor Pixel lists

Revert "PixelPropUtils: Spoof userdebug to pixel launcher"

* wont work anymore developer options are migrated to debug flags

This reverts commit 1c86058d22803ed3c60655c012b6d0ef2cf48aef.

PixelPropsUtils: Add emojiwalls and cinematiceffects pkgs

Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Enable new Velvet Weather UI

Change-Id: I45310071f0267be1ea26f7c00044a56a763a3e6a

* Adapt to current PixelPropsUtils

Original commit:
ce72977956

Signed-off-by: someone5678 <nemui3353@gmail.com>

PixelPropsUtils: Refactor

* Allows some devices to fully pass safetynet's strong attestation (maybe due to prebuilt vendor)
* Do not spoof restore, pixelmigrate and setupwizard
* Enable Photos spoof by default
* Keep Photos happy and not count towards storage quota
* Switch from POCO F4 to POCO F5
* Transfer GMS spoofing from AttestationHooks

PixelPropsUtils: Update fingerprints to July 2023 release

PixelPropsUtils: Spoof to Pixel 5a by default

* Several apps broken with Pixel 7 Pro spoof
* Just use Pixel 5a and spoof only small portion of apps to Pixel 7 Pro

Change-Id: I3762f80d499b2d8ce9115cfcaae7b59ce220dca4

PixelPropsUtils: Remove pixel tablet spoof for Weather

Change-Id: I189c1307f01a9938b178746374ef9f5dfc7de60a

PixelPropsUtils: Correctly spoof unstable process

* Fix integrity

Change-Id: Ifad92a52311a39f943c3c75c385cc75ec76bf182

PixelPropsUtils: Set HARDWARE, ID values

* Google apps also check these values

Change-Id: I846986121faec39d3ece044794fd0f459e8d435d

PixelPropsUtils: Spoof all wallpaper packages to Pixel 7 Pro

Change-Id: I667b63be4175a9f8323915d2c725e0300b22d110

PixelPropsUtils: Update fingerprints to August 2023 release

base: ApplicationPackageManager: Block Tensor features for Recorder

* Now Recorder also use Tensor soc feature for mic recording

Log:
07-09 11:03:53.820 15531 15721 I tflite  : Initialized TensorFlow Lite runtime.
07-09 11:03:53.833 15531 15721 W libc    : Access denied finding property "ro.hardware.chipname"
07-09 11:03:53.835 15531 15721 I tflite  : Created TensorFlow Lite XNNPACK delegate for CPU.
07-09 11:03:53.850 15531 15722 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.850 15531 15723 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.876 15531 15611 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.877 15531 15611 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.877 15531 15573 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.878 15531 15573 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.879 15531 15614 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.879 15531 15614 I Recorder_ManagedSequent: Finished initializing components.

Change-Id: I36b30057f45f831420db3f2fc13538dbfa5ebd56

base: ApplicationPackageManager: Exclude PE 2021 Midyear from tensor pixel list

* Pixel 5a (which is qcom soc) included this by default

Change-Id: I94559b0800084bb79608251568a44a48d74a7057

base: ApplicationPackageManager: Return early for Tensor check

Change-Id: Ib995fe732e0712310cf6dbea21bc1f7730cfeddb

PixelPropsUtils: Refactor logic and cleanup

- Spoof back to Pixel 5 by default
- Remove Pixel 5a spoof
- Remove Pixel XL spoof
- Never spoof Android System Intelligence and GMS (for battery drain), only specified processes of GMS will be allowed
- Cleanup logic

PixelPropsUtils: Partial spoofing improvement

* Spoof all possible build properties and fix integrity check

PixelPropsUtils: Stop spoofing some google apps

* non pixels doesnt need to spoof asi to enable most features
* fixes now playing in pixel devices
  [asi is checked with device codename to load sountrigger models for now playing]

* motionsense is limited to p19 devices only

Change-Id: Icf651e95548f524ff8f1dd3556a8d4f6197745f4
Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Update fingerprints to September 2023 release

PixelPropsUtils: Bring in Pixel 8 series changes

* Update fingerprints to October 2023 release
* Android 14

PixelPropsUtils: Fix GMS drain triggered by an outdated ROM build date

If the build date exceeds a month, GMS, thinking the device is Pixel, attempts a system update, which unexpectedly fails. This goes into an endless cycle which drains battery very quickly and generates a lot of heat. Let's fix it by spoofing the build date to something always fresh.

PixelPropsUtils: Update fingerprints to November 2023 release

PixelPropsUtils: Add a config to enable/disable prop imitation

Enabled by default, devices can disable prop imitation via overlay if their devices aren't required to rely on it

Change-Id: Ia7098bbb1325f430999855c58164680988543412
Signed-off-by: someone5678 <someone5678@users.noreply.github.com>

PixelPropsUtils: Drop pixel codenames and checks

* PixelPropsUtils can now be disabled by settings
  config_enablePixelPropsUtils to false

Change-Id: Ic54667f899e681b040aff1e8b13573f45880dd08

PixelPropsUtils: Use RecentPixel instead of individual model name

* Just update fp only instead of change model name every time

Change-Id: Ic110c532fd99f1efaa378c03687590a79994ff9c

PixelPropsUtils: Make CTS/Play Integrity pass again

In the annals of technology, the Zenfone 4 Max stands as the ultimate hero
a phone that has transcended time and space itself. With the bravado of
an isekai protagonist, it has embarked on an epic quest, unveiling powers
beyond imagination. Today, the Zenfone 4 Max is more than just a phone.
It symbolizes heroism and excellence, supporting our quest to conquer
CTS and Play Integrity. As we harness the extraordinary capabilities
of this legendary device, we embark on an epic journey to ensure the
'destruction' of "Google Employees" and burning up everyone standing
before it.

NOTE: The above AI generated description is a joke, and thanks to chiteroman for
finding a FP that still works.

Test: Play integrity

Change-Id: I4f61268b3d088689fef1175aad198c88734e9f34
Signed-off-by: Dyneteve <dyneteve@hentaios.com>
Signed-off-by: saikiran2001 <bjsaikiran@gmail.com>

ApplicationPackageManager: Merge Tensor list

Change-Id: I1097a5f9b7225a108053632e3222d341fc77b2f9

ApplicationPackageManager: Add a config for device with Tensor SoC

* Replace Tensor SoC device list

Change-Id: Ic94917a365466881b74322d3f0470515a5dbf630

PM: Force all packages as installed via Google Play Store

Change-Id: Ie561a52017630988570593291965fe6d67fa8527

Only spoof packages installed by Aurora Store and modify new API

Change-Id: Ib9415a925b5a4013f5abb87e85bfa4cae72b9ce8

services/PPU: Simplify and improve bypassing for PPU `onTaskStackChanged` listening

* this is for broader bypassing of tasklistener used for setCertifiedPropsForGms across apps and gms processes

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PPU: Remove Snapchat spoof

PPU: Improve device certification bypass

* killing droidguard services through `onEngineGetCertificateChain` allows us pass device certification,
  the only backlash is users can't sign in their google accounts due to `onEngineGetCertificateChain` killing droidguard services.
  with a245d97679 as reference, we should also skip killing of droidguard services when google sign-in is on top.

big thanks: to sir Alvin and sir Ste0090 for the backtrace containing google sign-in information due to a bug introduced by a unintentional change: e67e783f3c and 876ac2a7fb
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PPU: Update fingerprints to December 2023 release

PPU: Make CTS/Play Integrity pass again (again and again and again)

[someone5678] Adapt to this project

Change-Id: If3a865849c7c99a9c7080114ba94a8f8878bb4f2
Signed-off-by: someone5678 <someone5678@users.noreply.github.com>

PPU: Make spoofBuildGms updatable and chosen from a list

This approach has a couple advantages:

- Randomizing the device could potentially help mitigate spoofs from being blocked as we will spread the API
requests across multiple devices rather than one. Although, a majority of customs and or root users would have
to get behind the idea as well.

- Pulling resources from a package negates the need of having to push new releases for unrooted users to pass as
we can instead release an updated resource package to install manually.

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Allow spoofing INITIAL_SDK_INT & SECURITY_PATCH

Also update the resources package name and reorganize the array for better readability.

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Enable logging & add more statements

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Store the current array name in SettingsProvider

So we can fetch the values currently set in PifResources Activity/PreferenceFragment.

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Make PIF and PixelProps toggleable [1/2]

services: Fix google apps permission denials

* for some unknown reasons, google apps were throwing permission denials even if we have updated privapp permissions for most of google apps, same goes to granting permissions via DefaultPermissionGrantPolicy, which doesnt address these denials, so unless there is cleaner/appropriate fix for these denials, bypass it.

attempt to resolve:
10-08 20:39:02.675  1617  4130 W ActivityManager: Permission Denial: getTaskSnapshot() from pid=7901, uid=10213 requires android.permission.READ_FRAME_BUFFER
--------- beginning of crash
10-08 20:39:02.676  7901  9402 E AndroidRuntime: FATAL EXCEPTION: TaskThumbnailIconCache-1
10-08 20:39:02.676  7901  9402 E AndroidRuntime: Process: com.google.android.apps.nexuslauncher, PID: 7901
10-08 20:39:02.676  7901  9402 E AndroidRuntime: java.lang.SecurityException: Permission Denial: getTaskSnapshot() from pid=7901, uid=10213 requires android.permission.READ_FRAME_BUFFER
10-08 20:39:02.676  7901  9402 E AndroidRuntime: 	at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)
Process: com.google.android.apps.nexuslauncher
PID: 2368
UID: 10213
Frozen: false
Flags: 0x34cbbe45
Package: com.google.android.apps.nexuslauncher v907 (14)
Foreground: No
Process-Runtime: 95
Build: google/rising_oriole/oriole:14/UP1A.231005.007.A1/1696738813:userdebug/release-keys
Crash-Handler: com.android.internal.os.RuntimeInit$KillApplicationHandler
Loading-Progress: 1.0
Dropped-Count: 0

java.lang.RuntimeException: Unable to create service com.android.quickstep.TouchInteractionService: java.lang.SecurityException: Permission Denial: getRootTaskInfo() from pid=2368, uid=10213 requires android.permission.MANAGE_ACTIVITY_TASKS
	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4664)
	at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2264)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:205)
	at android.os.Looper.loop(Looper.java:294)
	at android.app.ActivityThread.main(ActivityThread.java:8177)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
10-08 15:46:20.701  1550  2313 W InputManager: Permission Denial: monitorGestureInput() from pid=2257, uid=10213 requires android.permission.MONITOR_INPUT
10-08 15:46:20.702  2257  2257 D AndroidRuntime: Shutting down VM
10-08 15:46:20.702  1970  1970 I TetheringManager: registerTetheringEventCallback:com.android.systemui
10-08 15:46:20.702  1970  1970 I TetheringManager: registerTetheringEventCallback caller:com.android.systemui
--------- beginning of crash
10-08 15:46:20.702  2257  2257 E AndroidRuntime: FATAL EXCEPTION: main
10-08 15:46:20.702  2257  2257 E AndroidRuntime: Process: com.google.android.apps.nexuslauncher, PID: 2257
10-08 15:46:20.702  2257  2257 E AndroidRuntime: java.lang.RuntimeException: Unable to create service com.android.quickstep.TouchInteractionService: java.lang.SecurityException: Requires MONITOR_INPUT permission
10-08 15:46:20.702  2257  2257 E AndroidRuntime: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4664)

test: setprop persist.sys.default_launcher 1, reboot, check if pixel launcher works as intended on aosp

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

MeizuPropsUtils: Spoof Hihonor Cloudmusic

PPU: Spoof to recent Pixel on iD apps

* This fixes some JP devices get refusing launch iD apps.

PPU: Spoof as Pixel Tab for tablets

Change-Id: I2d5c60dc144d56ed1957c5e2750fc60831bf2334

PPU: Update fingerprints to January 2024 release

PixelPropsUtils: Check process name before doing certify

Change-Id: I34494330ac4aa1a729e9897e2cdd5eb70d7b2d0d

PPU: Allow spoofing all gapps to Pixel 8 Pro [1/2]

PPU: Stop spoofing com.google.android.googlequicksearchbox

- Makes AR vision with camera crash due to app expecting Pixel camera but it isn't

PPU: do not spoof Pixel Launcher

Change-Id: Ie5496209b2051d3f114b9e699ceceb785e44eb39

PPU: Refactor

- Move Pixel 8 Pro spoof for all gapps above other spoofs
- Allow spoofing Velvet to latest model for CTS (Should work based on this: https://t.me/EvolutionXOfficialROM/4117/6195)
- Clean up excess parentheses.

PPU: Update fingerprints to February 2024 release

PPU: Spoof Gemini to P8P

PixelPropUtils: Spoof velvet search process and gms

* remove toggle and spoof by default this way we can properly enable CTS
  current blacklisted process and apps are enough to get rid of tensor stuffs
* spoof specific processes

test: reboot with patch applied, check if ASI services crashes

Change-Id: I104727c30ab34a69cc76955d084ef6741dafc13b
Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Improve tablet spoofing

* Replace using config with context instead
* Ref: 05b54f2dfe

PixelPropsUtils: Refactor and cleanup spoofing

[joeyhuab - Evolution X]
* Adapt `shouldTryToSpoofDevice()` from Rising OS.
* Skip spoofing PixelProps if device is a currently supported Pixel device.
* Spoof Google apps to Pixel 8 Pro by default but exclude GMS unstable process.
* Spoof Google Photos to Pixel 8 Pro if Photos spoof toggle is off.
* Exclude AIAI, AR Core, Photos, and Setup Wizard from P8P spoof.
* Exclude spoofing specific processes (to avoid tensor checks).
* Remove Pixel 5a stuff.

Revert "PixelPropsUtils: Drop pixel codenames and checks"

This reverts commit 195366ea6c84871fc4228ace62620f22ed2c11d5.

core: Allow force enabling tensor feature XMLs on non-Pixels [1/2]

* Avoid including Photos app in the spoof.
* Drop unneeded `config_hasTensorSoC`.

[SQUASH] PixelPropsUtils: Various changes

* Allow enabling debug via `persist.sys.pixelprops.debug` prop.
* Bring back Pixel checks.
* Bring back Snapchat spoof toggle.
* Spoof GMS processes that check for tensor to Pixel 5a.
* Spoof most Google/Samsung apps/processes back to Pixel 5a by default.
* Spoof select Google apps/processes to Pixel 8 Pro to enable exclusive features.
* Turn off spoof for select Google apps once again.

PixelPropUtils: unspoof some packages

Signed-off-by: aswin7469 <aswinas@pixysos.com>

Revert "PixelPropsUtils: Refactor and cleanup spoofing"

This reverts commit fbd5aa372a977207edb5f45ccdce4a85ea1bca9e.

Revert "ApplicationPackageManager: Add a config for device with Tensor SoC"

This reverts commit 50459e3a635f7932c7caac9fd1ba2e621b1a70f4.

Revert "PPU: Stop spoofing com.google.android.googlequicksearchbox"

This reverts commit e4528e6188d28a2270246e4f3e250eb1f3e33d3f.

Revert "PixelPropsUtils: Drop pixel codenames and checks"

This reverts commit 195366ea6c84871fc4228ace62620f22ed2c11d5.

Revert "core: Allow force enabling tensor feature XMLs on non-Pixels [1/2]"

This reverts commit ea1983f86787702f930f0653820836eb3f6c1e97.

PixelPropsUtils: Spoof chimera process to Pixel 5a

Change-Id: I645157990af34d5358bcbe0816bde136502b47f0

PixelPropsUtils: Unspoof backup and migrate apps

Change-Id: I90bf462dfc0a9c0a1a8e1544d8b799fd644aae6f

ApplicationPackageManager: Rearrange Tensor feature checks

* Move googlequicksearchbox to upper to correctly enable circle to search

Change-Id: I6646275998c52494db712faa07587690d323afbd

PixelPropsUtils: Update fingerprints to March 2024 release

PixelPropsUtils: Update fingerprints to April 2024 release

PixelPropsUtils: Update fingerprints to May 2024 release

services: Bypass security check when checking provider permissions for google apps

* this causes any failing apps/process to repeatedly crash for "security" purposees (even though we can do the same thing with google gallery go)

08-23 07:34:48.653  1918  1918 E AndroidRuntime: java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord{2f4151f 1918:com.android.systemui/u0a478} (pid=1918, uid=10478) that is not exported from UID 10456

test: check logs for retrieved content uri from google photos

Change-Id: I2c47e50d09163e05d40a4f62fd42cdb372b1173b
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

ApplicationPackageManager: Rearrange Tensor feature checks

* Move googlequicksearchbox to upper to correctly enable circle to search

Change-Id: I6646275998c52494db712faa07587690d323afbd

PixelPropsUtils: Fix spoofing logic for gms

Change-Id: I770dcf97edeaeac410849b920e018c95e65b0848

PixelPropsUtils: Only spoof unstable process

* That's the only process we needed

Change-Id: I40423585c439cb0e55e50bad3d1a2b54871ae5eb

PixelPropsUtils: Spoof chimera process to Recent Pixel

Change-Id: If2fcdffe36d7a4ebdcc34168737ce30a1f93d2c4

ApplicationPackageManager: Report tensor features to false for Photos

Change-Id: I58dc1ad46b785232d47a160185d9c3c3ede4915d

PixelPropsUtils: Do not spoof unspecified packages as barbet

* this leads to potential increase of cpu usage in system_server (were spoofing unspecified google packages and even samsung apps to barbet)

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PixelPropsUtils: Spoof pixel launcher for circle to search feature

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PixelPropsUtils: spoofBuildGms: Support RELEASE & INCREMENTAL

Remove useless logging.
Stop enforcing DEVICE_INITIAL_SDK_INT value range.
Match array order with https://github.com/chiteroman/PlayIntegrityFix

Signed-off-by: AnierinB <anierin@evolution-x.org>

PixelPropsUtils: Remove gms check from isCallerSafetyNet

[someone5678]
* as DroidGuard is now presents in multiple GApps

Change-Id: Ibf9d461e77e4dae4febc2e9245f7ad0b654e1883
Signed-off-by: someone5678 <someone5678@users.noreply.github.com>

PixelPropsUtils: Updates

* Spoofing Ai Wallpapers to husky fixes infinite
  loading.
* Removing Gboard spoof fixes voice search.
* Removing Play store spoof for Play integrity
  as it's not needed according to osm0sis.
  Ref: https://xdaforums.com/t/module-play-integrity-fix-safetynet-fix.4607985/post-89534863

PixelPropsUtils: Remove pixel5 spoofs

 * Update spoofs for pixel 8 pro

Signed-off-by: Alvin Francis <nivlafx@gmail.com>

PixelPropsUtils: June 2024 Update

* Drop spoofing for general gapps.
* Drop spoofing for other GMS processes.
* Update fingerprints to June 2024 release.

AttestationHooks: June 2024 Update

* Drop ARCore spoofing.
* Drop Netflix spoofing.

PixelPropsUtils: July 2024 update

PixelPropsUtils: Show correct device name on google backup
Change-Id: Id37ab66166c9ce852aad745fa2dba81d33ddcc7f
Signed-off-by: aswin7469 <aswinas@pixysos.com>

core: Spoof Pixel8 for nexuslauncher

* attempt to fix circle to search

Change-Id: Ib88a67efcd2a2dbcb6b75020c6f18b78f6c97c24
Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Update for pixel code names
* Added for Pixel 9, 9 Pro, 9 Pro XL, 9 Fold.

Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>

PixelPropsUtils: Do not spoof mainline models to google photos

* attempt to fix issue: RisingTechOSS/issue_tracker#14

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

GamesPropsUtils: Update model for call of duty to Lenovo Y700

* Suggested by user.
* Unlocks 120 fps in battle royale mode.

Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>

GamesPropsUtils: Spoof Brawl Stars to Mi 11T Pro

core: Update configs

* Expose Tensor features to Pixel Studio
* Expose Tensor features to dialer (Prevent showing compat messages)
* Expose 2024 experience to PixelAIPrebuilt
* Update process lists

Co-authored-by: Adithya R <gh0strider.2k18.reborn@gmail.com>
Co-authored-by: Alvin Francis <nivlafx@gmail.com>
Co-authored-by: AnierinB <anierin@evolution-x.org>
Co-authored-by: Chris Crawford <chriscrawford893@gmail.com>
Co-authored-by: Danny Lin <danny@kdrag0n.dev>
Co-authored-by: Dyneteve <dyneteve@hentaios.com>
Co-authored-by: ExactExampl <64069095+ExactExampl@users.noreply.github.com>
Co-authored-by: Gustavo Mendes <gusttavo.me@outlook.com>
Co-authored-by: Joey <joey@evolution-x.org>
Co-authored-by: Pranav Vashi <neobuddy89@gmail.com>
Co-authored-by: QKIvan <ivan33@163.com>
Co-authored-by: Saikiran <bjsaikiran@gmail.com>
Co-authored-by: Soo-Hwan Na <whiteshell2544@naver.com>
Co-authored-by: Sourajit Karmakar <sourajit@live.com>
Co-authored-by: aswin7469 <aswinas@pixysos.com>
Co-authored-by: chiteroman <98092901+chiteroman@users.noreply.github.com>
Co-authored-by: lahaina <nattolecats@gmail.com>
Co-authored-by: minaripenguin <minaripenguin@users.noreply.github.com>
Co-authored-by: someone5678 <nemui3353@gmail.com>
Co-authored-by: timjosten <timjosten@gmail.com>
Signed-off-by: AnierinB <anierin@evolution-x.org>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

Initial implementation of KeyboxImitationHooks

Co-authored-by: chiteroman <querveros999@gmail.com>
Co-authored-by: Fabian Leutenegger <fabian.leutenegger@bluewin.ch>
Change-Id: Id0e093cbbd095792c8925cdb48ae631bf86118ad
Signed-off-by: Dmitrii <bankersenator@gmail.com>

GamesPropsUtils: Update spoof for PUBG and Tencent Games

* Unlocks 120fps in BGMI and other Tencent games

Signed-off-by: AnkitSavani111 <ankitmsavani12345@gmail.com>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

GamesPropsUtils: Spoof as S24 Ultra for Diablo Immortal

Signed-off-by: Dmitrii <bankersenator@gmail.com>

[SQUASH] PixelPropsUtils: Changes to incorporate JSON-based PIF

Revert "PPU: Store the current array name in SettingsProvider"

This reverts commit afda833ce53c0f5d4ae18e893f326fb75916c9ad.

Change-Id: Ie17f88c61337991cb3e7081bbe481772a35cb825
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>

Revert "PPU: Allow spoofing INITIAL_SDK_INT & SECURITY_PATCH"

This reverts commit f2269982beddfe21c09dba58606059ecea5c70d0.

Change-Id: I282e14cf7e1c884e35e4f313d0c259e6b15ca5d2
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>

Revert "PPU: Make spoofBuildGms updatable and chosen from a list"

This reverts commit 1b8004bf91965f57d0bcf020a33e2fc7d75e6b52.

Change-Id: I41a8cf8bd945722a6d00feecb9cde5fb659e3211
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

fw/b: Add support for json-based (PIF) spoofing [1/2]

Change-Id: Ifc3abb0237abe62644f49cb06db3d2e780c54a05
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

PixelPropUtils: Handle empty gms spoofing properties

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>
Signed-off-by: Dmitrii <bankersenator@gmail.com>
Signed-off-by: Jis G Jacob <studiokeys@blissroms.org>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

Fixup:[SQUASH] Introduce PixelPropsUtils/GamesPropsUtils

That will spoof build fingerprints on some g00gle apps

* Also will enable some cool stuffs like:
  - Dynamic navbar on GBoard
  - SafetyHub

and others.

Thanks to kdrag0n for the original idea at 5a54bfd846

Change-Id: I1078e7402833fec77edb751070c5144d08c85b6c
Signed-off-by: jhenrique09 <jhenrique09.mcz@hotmail.com>

keystore: Block key attestation for SafetyNet

SafetyNet (part of Google Play Services) opportunistically uses
hardware-backed key attestation via KeyStore as a strong integrity
check. This causes SafetyNet to fail on custom ROMs because the verified
boot key and bootloader unlock state can be detected from attestation
certificates.

As a workaround, we can take advantage of the fact that SafetyNet's
usage of key attestation is opportunistic (i.e. falls back to basic
integrity checks if it fails) and prevent it from getting the
attestation certificate chain from KeyStore. This is done by checking
the stack for DroidGuard, which is the codename for SafetyNet, and
pretending that the device doesn't support key attestation.

Key attestation has only been blocked for SafetyNet specifically, as
Google Play Services and other apps have many valid reasons to use it.
For example, it appears to be involved in Google's mobile security key
ferature.

Change-Id: I5146439d47f42dc6231cb45c4dab9f61540056f6

core: Make CTS/Play Integrity pass again

The logic behind CTS and Play Integrity has been updated today it now
checks the product and model names against the fingerprint and if
they do not match the CTS profile will fail.

Also while we are at it use a newer FP from Pixel XL and add logging
for key attestation blocking for debugging.

Test: Boot, check for CTS and Play Integrity

Change-Id: I089d5ef935bba40338e10c795ea7d181103ffd15
Signed-off-by: Dyneteve <dyneteve@hentaios.com>

* Stallix: Adapted for A13 and squashed changes with their respected authors from
  https://github.com/Evolution-X/frameworks_base/commits/tiramisu-bak-reverts-qpr2/core/java/com/android/internal/util/evolution/PixelPropsUtils.java.
  https://github.com/Evolution-X/frameworks_base/commits/tiramisu-qpr2/core/java/com/android/internal/util/evolution/PixelPropsUtils.java

stop Microsoft apps from crashing without INTERNET permission

Crash is caused by checks in
com.microsoft.aad.adal.AuthenticationContext.checkInternetPermission() and
com.microsoft.identity.client.PublicClientApplication.checkInternetPermission()

Prevent apps from crashing if internet permission is revoked.

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

ApplicationPackageManager: Extend freeform window feature to all apps

Change-Id: Iaa3e500fd6a80f4e1718218ff6d42fcb1eb79c9c
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

core: block 2021/22 pixel features to ASI and pixel launcher

* blacklist pe features and spoof redfin to get rid of tensor shits

Change-Id: I83aa09c151f51ee61361510b2c1a9ac8865a2aee
Signed-off-by: aswin7469 <aswinas@pixysos.com>

core: ApplicationPackageManager: Remove p21+ features from featuresPixel

* Differentiate with featuresTensor

ApplicationPackageManager: Adjust Tensor workaround

* Avoid P22 device's aggresive TensorFlow implementation
* Allow P21 pixel experience
* Add lynx to Tensor Pixel lists

Revert "PixelPropUtils: Spoof userdebug to pixel launcher"

* wont work anymore developer options are migrated to debug flags

This reverts commit 1c86058d22803ed3c60655c012b6d0ef2cf48aef.

PixelPropsUtils: Add emojiwalls and cinematiceffects pkgs

Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Enable new Velvet Weather UI

Change-Id: I45310071f0267be1ea26f7c00044a56a763a3e6a

* Adapt to current PixelPropsUtils

Original commit:
ce72977956

Signed-off-by: someone5678 <nemui3353@gmail.com>

PixelPropsUtils: Refactor

* Allows some devices to fully pass safetynet's strong attestation (maybe due to prebuilt vendor)
* Do not spoof restore, pixelmigrate and setupwizard
* Enable Photos spoof by default
* Keep Photos happy and not count towards storage quota
* Switch from POCO F4 to POCO F5

PixelPropsUtils: Update fingerprints to July 2023 release

PixelPropsUtils: Spoof to Pixel 5a by default

* Several apps broken with Pixel 7 Pro spoof
* Just use Pixel 5a and spoof only small portion of apps to Pixel 7 Pro

Change-Id: I3762f80d499b2d8ce9115cfcaae7b59ce220dca4

PixelPropsUtils: Remove pixel tablet spoof for Weather

Change-Id: I189c1307f01a9938b178746374ef9f5dfc7de60a

PixelPropsUtils: Correctly spoof unstable process

* Fix integrity

Change-Id: Ifad92a52311a39f943c3c75c385cc75ec76bf182

PixelPropsUtils: Set HARDWARE, ID values

* Google apps also check these values

Change-Id: I846986121faec39d3ece044794fd0f459e8d435d

PixelPropsUtils: Spoof all wallpaper packages to Pixel 7 Pro

Change-Id: I667b63be4175a9f8323915d2c725e0300b22d110

PixelPropsUtils: Update fingerprints to August 2023 release

base: ApplicationPackageManager: Block Tensor features for Recorder

* Now Recorder also use Tensor soc feature for mic recording

Log:
07-09 11:03:53.820 15531 15721 I tflite  : Initialized TensorFlow Lite runtime.
07-09 11:03:53.833 15531 15721 W libc    : Access denied finding property "ro.hardware.chipname"
07-09 11:03:53.835 15531 15721 I tflite  : Created TensorFlow Lite XNNPACK delegate for CPU.
07-09 11:03:53.850 15531 15722 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.850 15531 15723 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.876 15531 15611 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.877 15531 15611 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.877 15531 15573 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.878 15531 15573 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.879 15531 15614 I Recorder_ManagedSequent: Finished initializing components.
07-09 11:03:53.879 15531 15614 I Recorder_ManagedSequent: Finished initializing components.

Change-Id: I36b30057f45f831420db3f2fc13538dbfa5ebd56

base: ApplicationPackageManager: Exclude PE 2021 Midyear from tensor pixel list

* Pixel 5a (which is qcom soc) included this by default

Change-Id: I94559b0800084bb79608251568a44a48d74a7057

base: ApplicationPackageManager: Return early for Tensor check

Change-Id: Ib995fe732e0712310cf6dbea21bc1f7730cfeddb

PixelPropsUtils: Refactor logic and cleanup

- Spoof back to Pixel 5 by default
- Remove Pixel 5a spoof
- Remove Pixel XL spoof
- Never spoof Android System Intelligence and GMS (for battery drain), only specified processes of GMS will be allowed
- Cleanup logic

PixelPropsUtils: Partial spoofing improvement

* Spoof all possible build properties and fix integrity check

PixelPropsUtils: Stop spoofing some google apps

* non pixels doesnt need to spoof asi to enable most features
* fixes now playing in pixel devices
  [asi is checked with device codename to load sountrigger models for now playing]

* motionsense is limited to p19 devices only

Change-Id: Icf651e95548f524ff8f1dd3556a8d4f6197745f4
Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Update fingerprints to September 2023 release

PixelPropsUtils: Bring in Pixel 8 series changes

* Update fingerprints to October 2023 release
* Android 14

PixelPropsUtils: Fix GMS drain triggered by an outdated ROM build date

If the build date exceeds a month, GMS, thinking the device is Pixel, attempts a system update, which unexpectedly fails. This goes into an endless cycle which drains battery very quickly and generates a lot of heat. Let's fix it by spoofing the build date to something always fresh.

PixelPropsUtils: Update fingerprints to November 2023 release

PixelPropsUtils: Add a config to enable/disable prop imitation

Enabled by default, devices can disable prop imitation via overlay if their devices aren't required to rely on it

Change-Id: Ia7098bbb1325f430999855c58164680988543412
Signed-off-by: someone5678 <someone5678@users.noreply.github.com>

PixelPropsUtils: Drop pixel codenames and checks

* PixelPropsUtils can now be disabled by settings
  config_enablePixelPropsUtils to false

Change-Id: Ic54667f899e681b040aff1e8b13573f45880dd08

PixelPropsUtils: Use RecentPixel instead of individual model name

* Just update fp only instead of change model name every time

Change-Id: Ic110c532fd99f1efaa378c03687590a79994ff9c

PixelPropsUtils: Make CTS/Play Integrity pass again

In the annals of technology, the Zenfone 4 Max stands as the ultimate hero
a phone that has transcended time and space itself. With the bravado of
an isekai protagonist, it has embarked on an epic quest, unveiling powers
beyond imagination. Today, the Zenfone 4 Max is more than just a phone.
It symbolizes heroism and excellence, supporting our quest to conquer
CTS and Play Integrity. As we harness the extraordinary capabilities
of this legendary device, we embark on an epic journey to ensure the
'destruction' of "Google Employees" and burning up everyone standing
before it.

NOTE: The above AI generated description is a joke, and thanks to chiteroman for
finding a FP that still works.

Test: Play integrity

Change-Id: I4f61268b3d088689fef1175aad198c88734e9f34
Signed-off-by: Dyneteve <dyneteve@hentaios.com>
Signed-off-by: saikiran2001 <bjsaikiran@gmail.com>

ApplicationPackageManager: Merge Tensor list

Change-Id: I1097a5f9b7225a108053632e3222d341fc77b2f9

ApplicationPackageManager: Add a config for device with Tensor SoC

* Replace Tensor SoC device list

Change-Id: Ic94917a365466881b74322d3f0470515a5dbf630

PM: Force all packages as installed via Google Play Store

Change-Id: Ie561a52017630988570593291965fe6d67fa8527

services/PPU: Simplify and improve bypassing for PPU `onTaskStackChanged` listening

* this is for broader bypassing of tasklistener used for setCertifiedPropsForGms across apps and gms processes

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PPU: Remove Snapchat spoof

PPU: Improve device certification bypass

* killing droidguard services through `onEngineGetCertificateChain` allows us pass device certification,
  the only backlash is users can't sign in their google accounts due to `onEngineGetCertificateChain` killing droidguard services.
  with a245d97679 as reference, we should also skip killing of droidguard services when google sign-in is on top.

big thanks: to sir Alvin and sir Ste0090 for the backtrace containing google sign-in information due to a bug introduced by a unintentional change: e67e783f3c and 876ac2a7fb
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PPU: Update fingerprints to December 2023 release

PPU: Make CTS/Play Integrity pass again (again and again and again)

[someone5678] Adapt to this project

Change-Id: If3a865849c7c99a9c7080114ba94a8f8878bb4f2
Signed-off-by: someone5678 <someone5678@users.noreply.github.com>

PPU: Make spoofBuildGms updatable and chosen from a list

This approach has a couple advantages:

- Randomizing the device could potentially help mitigate spoofs from being blocked as we will spread the API
requests across multiple devices rather than one. Although, a majority of customs and or root users would have
to get behind the idea as well.

- Pulling resources from a package negates the need of having to push new releases for unrooted users to pass as
we can instead release an updated resource package to install manually.

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Allow spoofing INITIAL_SDK_INT & SECURITY_PATCH

Also update the resources package name and reorganize the array for better readability.

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Enable logging & add more statements

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Store the current array name in SettingsProvider

So we can fetch the values currently set in PifResources Activity/PreferenceFragment.

Signed-off-by: AnierinB <anierin@evolution-x.org>

PPU: Make PIF and PixelProps toggleable [1/2]

services: Fix google apps permission denials

* for some unknown reasons, google apps were throwing permission denials even if we have updated privapp permissions for most of google apps, same goes to granting permissions via DefaultPermissionGrantPolicy, which doesnt address these denials, so unless there is cleaner/appropriate fix for these denials, bypass it.

attempt to resolve:
10-08 20:39:02.675  1617  4130 W ActivityManager: Permission Denial: getTaskSnapshot() from pid=7901, uid=10213 requires android.permission.READ_FRAME_BUFFER
--------- beginning of crash
10-08 20:39:02.676  7901  9402 E AndroidRuntime: FATAL EXCEPTION: TaskThumbnailIconCache-1
10-08 20:39:02.676  7901  9402 E AndroidRuntime: Process: com.google.android.apps.nexuslauncher, PID: 7901
10-08 20:39:02.676  7901  9402 E AndroidRuntime: java.lang.SecurityException: Permission Denial: getTaskSnapshot() from pid=7901, uid=10213 requires android.permission.READ_FRAME_BUFFER
10-08 20:39:02.676  7901  9402 E AndroidRuntime: 	at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)
Process: com.google.android.apps.nexuslauncher
PID: 2368
UID: 10213
Frozen: false
Flags: 0x34cbbe45
Package: com.google.android.apps.nexuslauncher v907 (14)
Foreground: No
Process-Runtime: 95
Build: google/rising_oriole/oriole:14/UP1A.231005.007.A1/1696738813:userdebug/release-keys
Crash-Handler: com.android.internal.os.RuntimeInit$KillApplicationHandler
Loading-Progress: 1.0
Dropped-Count: 0

java.lang.RuntimeException: Unable to create service com.android.quickstep.TouchInteractionService: java.lang.SecurityException: Permission Denial: getRootTaskInfo() from pid=2368, uid=10213 requires android.permission.MANAGE_ACTIVITY_TASKS
	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4664)
	at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2264)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:205)
	at android.os.Looper.loop(Looper.java:294)
	at android.app.ActivityThread.main(ActivityThread.java:8177)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
10-08 15:46:20.701  1550  2313 W InputManager: Permission Denial: monitorGestureInput() from pid=2257, uid=10213 requires android.permission.MONITOR_INPUT
10-08 15:46:20.702  2257  2257 D AndroidRuntime: Shutting down VM
10-08 15:46:20.702  1970  1970 I TetheringManager: registerTetheringEventCallback:com.android.systemui
10-08 15:46:20.702  1970  1970 I TetheringManager: registerTetheringEventCallback caller:com.android.systemui
--------- beginning of crash
10-08 15:46:20.702  2257  2257 E AndroidRuntime: FATAL EXCEPTION: main
10-08 15:46:20.702  2257  2257 E AndroidRuntime: Process: com.google.android.apps.nexuslauncher, PID: 2257
10-08 15:46:20.702  2257  2257 E AndroidRuntime: java.lang.RuntimeException: Unable to create service com.android.quickstep.TouchInteractionService: java.lang.SecurityException: Requires MONITOR_INPUT permission
10-08 15:46:20.702  2257  2257 E AndroidRuntime: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4664)

test: setprop persist.sys.default_launcher 1, reboot, check if pixel launcher works as intended on aosp

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

MeizuPropsUtils: Spoof Hihonor Cloudmusic

PPU: Spoof to recent Pixel on iD apps

* This fixes some JP devices get refusing launch iD apps.

PPU: Spoof as Pixel Tab for tablets

Change-Id: I2d5c60dc144d56ed1957c5e2750fc60831bf2334

PPU: Update fingerprints to January 2024 release

PixelPropsUtils: Check process name before doing certify

Change-Id: I34494330ac4aa1a729e9897e2cdd5eb70d7b2d0d

PPU: Allow spoofing all gapps to Pixel 8 Pro [1/2]

PPU: Stop spoofing com.google.android.googlequicksearchbox

- Makes AR vision with camera crash due to app expecting Pixel camera but it isn't

PPU: do not spoof Pixel Launcher

Change-Id: Ie5496209b2051d3f114b9e699ceceb785e44eb39

PPU: Refactor

- Move Pixel 8 Pro spoof for all gapps above other spoofs
- Allow spoofing Velvet to latest model for CTS (Should work based on this: https://t.me/EvolutionXOfficialROM/4117/6195)
- Clean up excess parentheses.

PPU: Update fingerprints to February 2024 release

PPU: Spoof Gemini to P8P

PixelPropUtils: Spoof velvet search process and gms

* remove toggle and spoof by default this way we can properly enable CTS
  current blacklisted process and apps are enough to get rid of tensor stuffs
* spoof specific processes

test: reboot with patch applied, check if ASI services crashes

Change-Id: I104727c30ab34a69cc76955d084ef6741dafc13b
Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Improve tablet spoofing

* Replace using config with context instead
* Ref: 05b54f2dfe

PixelPropsUtils: Refactor and cleanup spoofing

[joeyhuab - Evolution X]
* Adapt `shouldTryToSpoofDevice()` from Rising OS.
* Skip spoofing PixelProps if device is a currently supported Pixel device.
* Spoof Google apps to Pixel 8 Pro by default but exclude GMS unstable process.
* Spoof Google Photos to Pixel 8 Pro if Photos spoof toggle is off.
* Exclude AIAI, AR Core, Photos, and Setup Wizard from P8P spoof.
* Exclude spoofing specific processes (to avoid tensor checks).
* Remove Pixel 5a stuff.

Revert "PixelPropsUtils: Drop pixel codenames and checks"

This reverts commit 195366ea6c84871fc4228ace62620f22ed2c11d5.

core: Allow force enabling tensor feature XMLs on non-Pixels [1/2]

* Avoid including Photos app in the spoof.
* Drop unneeded `config_hasTensorSoC`.

[SQUASH] PixelPropsUtils: Various changes

* Allow enabling debug via `persist.sys.pixelprops.debug` prop.
* Bring back Pixel checks.
* Bring back Snapchat spoof toggle.
* Spoof GMS processes that check for tensor to Pixel 5a.
* Spoof most Google/Samsung apps/processes back to Pixel 5a by default.
* Spoof select Google apps/processes to Pixel 8 Pro to enable exclusive features.
* Turn off spoof for select Google apps once again.

PixelPropUtils: unspoof some packages

Signed-off-by: aswin7469 <aswinas@pixysos.com>

Revert "PixelPropsUtils: Refactor and cleanup spoofing"

This reverts commit fbd5aa372a977207edb5f45ccdce4a85ea1bca9e.

Revert "ApplicationPackageManager: Add a config for device with Tensor SoC"

This reverts commit 50459e3a635f7932c7caac9fd1ba2e621b1a70f4.

Revert "PPU: Stop spoofing com.google.android.googlequicksearchbox"

This reverts commit e4528e6188d28a2270246e4f3e250eb1f3e33d3f.

Revert "PixelPropsUtils: Drop pixel codenames and checks"

This reverts commit 195366ea6c84871fc4228ace62620f22ed2c11d5.

Revert "core: Allow force enabling tensor feature XMLs on non-Pixels [1/2]"

This reverts commit ea1983f86787702f930f0653820836eb3f6c1e97.

PixelPropsUtils: Spoof chimera process to Pixel 5a

Change-Id: I645157990af34d5358bcbe0816bde136502b47f0

PixelPropsUtils: Unspoof backup and migrate apps

Change-Id: I90bf462dfc0a9c0a1a8e1544d8b799fd644aae6f

ApplicationPackageManager: Rearrange Tensor feature checks

* Move googlequicksearchbox to upper to correctly enable circle to search

Change-Id: I6646275998c52494db712faa07587690d323afbd

PixelPropsUtils: Update fingerprints to March 2024 release

PixelPropsUtils: Update fingerprints to April 2024 release

PixelPropsUtils: Update fingerprints to May 2024 release

services: Bypass security check when checking provider permissions for google apps

* this causes any failing apps/process to repeatedly crash for "security" purposees (even though we can do the same thing with google gallery go)

08-23 07:34:48.653  1918  1918 E AndroidRuntime: java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord{2f4151f 1918:com.android.systemui/u0a478} (pid=1918, uid=10478) that is not exported from UID 10456

test: check logs for retrieved content uri from google photos

Change-Id: I2c47e50d09163e05d40a4f62fd42cdb372b1173b
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

ApplicationPackageManager: Rearrange Tensor feature checks

* Move googlequicksearchbox to upper to correctly enable circle to search

Change-Id: I6646275998c52494db712faa07587690d323afbd

PixelPropsUtils: Fix spoofing logic for gms

Change-Id: I770dcf97edeaeac410849b920e018c95e65b0848

PixelPropsUtils: Only spoof unstable process

* That's the only process we needed

Change-Id: I40423585c439cb0e55e50bad3d1a2b54871ae5eb

PixelPropsUtils: Spoof chimera process to Recent Pixel

Change-Id: If2fcdffe36d7a4ebdcc34168737ce30a1f93d2c4

ApplicationPackageManager: Report tensor features to false for Photos

Change-Id: I58dc1ad46b785232d47a160185d9c3c3ede4915d

PixelPropsUtils: Do not spoof unspecified packages as barbet

* this leads to potential increase of cpu usage in system_server (were spoofing unspecified google packages and even samsung apps to barbet)

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PixelPropsUtils: Spoof pixel launcher for circle to search feature

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

PixelPropsUtils: spoofBuildGms: Support RELEASE & INCREMENTAL

Remove useless logging.
Stop enforcing DEVICE_INITIAL_SDK_INT value range.
Match array order with https://github.com/chiteroman/PlayIntegrityFix

Signed-off-by: AnierinB <anierin@evolution-x.org>

PixelPropsUtils: Remove gms check from isCallerSafetyNet

[someone5678]
* as DroidGuard is now presents in multiple GApps

Change-Id: Ibf9d461e77e4dae4febc2e9245f7ad0b654e1883
Signed-off-by: someone5678 <someone5678@users.noreply.github.com>

PixelPropsUtils: Updates

* Spoofing Ai Wallpapers to husky fixes infinite
  loading.
* Removing Gboard spoof fixes voice search.
* Removing Play store spoof for Play integrity
  as it's not needed according to osm0sis.
  Ref: https://xdaforums.com/t/module-play-integrity-fix-safetynet-fix.4607985/post-89534863

PixelPropsUtils: Remove pixel5 spoofs

 * Update spoofs for pixel 8 pro

Signed-off-by: Alvin Francis <nivlafx@gmail.com>

PixelPropsUtils: June 2024 Update

* Drop spoofing for general gapps.
* Drop spoofing for other GMS processes.
* Update fingerprints to June 2024 release.

PixelPropsUtils: July 2024 update

PixelPropsUtils: Show correct device name on google backup
Change-Id: Id37ab66166c9ce852aad745fa2dba81d33ddcc7f
Signed-off-by: aswin7469 <aswinas@pixysos.com>

core: Spoof Pixel8 for nexuslauncher

* attempt to fix circle to search

Change-Id: Ib88a67efcd2a2dbcb6b75020c6f18b78f6c97c24
Signed-off-by: aswin7469 <aswinas@pixysos.com>

PixelPropsUtils: Update for pixel code names

* Added for Pixel 9, 9 Pro, 9 Pro XL, 9 Fold.

Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>

PixelPropsUtils: Do not spoof mainline models to google photos

* attempt to fix issue: RisingTechOSS/issue_tracker#14

Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>

GamesPropsUtils: Update model for call of duty to Lenovo Y700

* Suggested by user.
* Unlocks 120 fps in battle royale mode.

Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>

GamesPropsUtils: Spoof Brawl Stars to Mi 11T Pro

core: Update configs

* Expose Tensor features to Pixel Studio
* Expose Tensor features to dialer (Prevent showing compat messages)
* Expose 2024 experience to PixelAIPrebuilt
* Update process lists

Co-authored-by: Adithya R <gh0strider.2k18.reborn@gmail.com>
Co-authored-by: Alvin Francis <nivlafx@gmail.com>
Co-authored-by: AnierinB <anierin@evolution-x.org>
Co-authored-by: Chris Crawford <chriscrawford893@gmail.com>
Co-authored-by: Danny Lin <danny@kdrag0n.dev>
Co-authored-by: Dyneteve <dyneteve@hentaios.com>
Co-authored-by: ExactExampl <64069095+ExactExampl@users.noreply.github.com>
Co-authored-by: Gustavo Mendes <gusttavo.me@outlook.com>
Co-authored-by: Joey <joey@evolution-x.org>
Co-authored-by: Pranav Vashi <neobuddy89@gmail.com>
Co-authored-by: QKIvan <ivan33@163.com>
Co-authored-by: Saikiran <bjsaikiran@gmail.com>
Co-authored-by: Soo-Hwan Na <whiteshell2544@naver.com>
Co-authored-by: Sourajit Karmakar <sourajit@live.com>
Co-authored-by: aswin7469 <aswinas@pixysos.com>
Co-authored-by: chiteroman <98092901+chiteroman@users.noreply.github.com>
Co-authored-by: lahaina <nattolecats@gmail.com>
Co-authored-by: minaripenguin <minaripenguin@users.noreply.github.com>
Co-authored-by: someone5678 <nemui3353@gmail.com>
Co-authored-by: timjosten <timjosten@gmail.com>
Signed-off-by: AnierinB <anierin@evolution-x.org>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

core: Adjust Pixel device checking

Co-authored-by: minaripenguin <minaripenguin@users.noreply.github.com>
Signed-off-by: Dmitrii <bankersenator@gmail.com>

PixelPropsUtils: Spoof as Mainline

* Niv - Test for mainline functionality on spoofed packages (NGA and all tested pixel features now works)

Signed-off-by: Dmitrii <bankersenator@gmail.com>

PPU: update fingerprints for january 2025

Signed-off-by: Dmitrii <bankersenator@gmail.com>

fwb: kill ppu logspam

Signed-off-by: Dmitrii <bankersenator@gmail.com>

Revert "Fixup:[SQUASH] Introduce PixelPropsUtils/GamesPropsUtils"

This reverts commit b65b58f4757b85b2be529243a5bd445947657813.

Signed-off-by: Dmitrii <bankersenator@gmail.com>

PixelPropsUtils: Switch back to Pixel5a for non pixel devices

* Breaks NGA, does not work properly hence the reason for the switch back, all other pixel features continue to work.

Change-Id: Ibc5204a626746b41b55d1ce73d01a7ac8c2a8353
Signed-off-by: Dmitrii <bankersenator@gmail.com>
2025-04-10 20:37:49 +00:00
someone5678
83c865fd13 base: Add support for window ignore secure [1/2]
* Apply to all profiles

Change-Id: I80539a8c4b1592ccfda6d00ab442a61192807355
2025-04-10 20:30:07 +00:00
elpaablo
687830ac10 SettingsLib: add category for Scoopdroid settings
Change-Id: I6ce0290bdb8496c2d92cfb444f4c2e7a35db05d8
2025-04-10 20:30:07 +00:00
elpaablo
5a77e3682b Add Scoopdroid constant to metrics 2025-04-10 20:29:21 +00:00
LineageOS Infra
ead9375f81 Automatic translation import
Change-Id: Ifc9c46a0193f6c88a0b413620f0ad18b1e5fdee7
2025-04-07 16:25:20 +00:00
electimon
b375e14c78 HintManagerService: Generate dummy mSupportInfo for non power AIDL devices
* Before it would generate dummy info when the IPower AIDL version
  was too old. Now we will generate it when IPower is just completely
  unavailable as well, avoiding a crash from accessing an
  uninitialized mSupportInfo.

test: sailfish boot :D
Change-Id: Ibf43d0bfea9fd6cdeae35248e4dde58c01d3ef3b
Signed-off-by: electimon <electimon@gmail.com>
2025-04-01 14:08:49 -04:00
Utkarsh Gupta
7cf77b2dae
Allow screen unpinning on devices without navbar
Change-Id: Iedfc08f4d95bbee3c8578c0d2450b90739e63603

Screen Pinning: Show correct text for on screen nav.

  Similar to I09c2ef661bff272cb4f7ca43bac0e45f4b20a4d4,
  we're not getting an instance of PhoneWindowManager which
  we can rely on to update dynamically.

  TICKET: OPO-393

Change-Id: Iacf8221066461fb6940dd88432e665812545c3ff
2025-03-30 17:12:54 +02:00
Bruno Martins
bd6ff26627 Biometrics: Hook up support for halHandlesDisplayTouches prop
Fingerprint AIDL interface supports boolean type sensor prop
halHandlesDisplayTouches, that defines whether the HAL is responsible
for detecting and processing of display touches [1].

If the value is false, the framework was supposed to be responsible for
handling the display touch events and passing them down to the HAL by
using ISession#onPointerDown and ISession#onPointerUp. If the value is
true, the framework was not supposed to notify the HAL about touch
events.

Currently, Android framework is not aware of this prop, so hook it up
for the expected outcome.

[1] https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/SensorProps.aidl?q=halHandlesDisplayTouches

Test: Build and verify no regression authenticating or registering
fingerprints with udfps AIDL HAL.
Change-Id: I56166950c6ef7cbb0c4ac2c0b7998e4a909d4af9
2025-03-28 08:00:51 +00:00
Tommy Webb
0f22bfd5de Do not run POLICY_REJECT_ALL migration in Restore
The Restore process does not expect or need to do a migration of UID
policies, and in fact, doing so causes problems; after a Restore,
the policies are already set as expected, so do not mess with them.

Issue: calyxos#2638
Change-Id: I50fca8f76c143d90821535df9c79746672e35447
2025-03-28 07:59:43 +00:00
109 changed files with 1335 additions and 400 deletions

View file

@ -31,6 +31,7 @@ import static android.content.pm.Checksum.TYPE_WHOLE_SHA1;
import static android.content.pm.Checksum.TYPE_WHOLE_SHA256;
import static android.content.pm.Checksum.TYPE_WHOLE_SHA512;
import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.DrawableRes;
import android.annotation.NonNull;
@ -834,8 +835,96 @@ public class ApplicationPackageManager extends PackageManager {
}
};
private static final String[] featuresPixel = {
"com.google.android.apps.photos.PIXEL_2019_PRELOAD",
"com.google.android.apps.photos.PIXEL_2019_MIDYEAR_PRELOAD",
"com.google.android.apps.photos.PIXEL_2018_PRELOAD",
"com.google.android.apps.photos.PIXEL_2017_PRELOAD",
"com.google.android.feature.PIXEL_2021_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2020_EXPERIENCE",
"com.google.android.feature.PIXEL_2020_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2019_EXPERIENCE",
"com.google.android.feature.PIXEL_2019_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2018_EXPERIENCE",
"com.google.android.feature.PIXEL_2017_EXPERIENCE",
"com.google.android.feature.PIXEL_EXPERIENCE",
"com.google.android.feature.GOOGLE_BUILD",
"com.google.android.feature.GOOGLE_EXPERIENCE"
};
private static final String[] featuresPixelOthers = {
"com.google.android.feature.ASI",
"com.google.android.feature.ANDROID_ONE_EXPERIENCE",
"com.google.android.feature.GOOGLE_FI_BUNDLED",
"com.google.android.feature.LILY_EXPERIENCE",
"com.google.android.feature.TURBO_PRELOAD",
"com.google.android.feature.WELLBEING",
"com.google.lens.feature.IMAGE_INTEGRATION",
"com.google.lens.feature.CAMERA_INTEGRATION",
"com.google.photos.trust_debug_certs",
"com.google.android.feature.AER_OPTIMIZED",
"com.google.android.feature.NEXT_GENERATION_ASSISTANT",
"android.software.game_service",
"com.google.android.feature.EXCHANGE_6_2",
"com.google.android.apps.dialer.call_recording_audio",
"com.google.android.apps.dialer.SUPPORTED",
"com.google.android.feature.CONTEXTUAL_SEARCH",
"com.google.android.feature.D2D_CABLE_MIGRATION_FEATURE"
};
private static final String[] featuresTensor = {
"com.google.android.feature.PIXEL_2026_EXPERIENCE",
"com.google.android.feature.PIXEL_2026_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2025_EXPERIENCE",
"com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2024_EXPERIENCE",
"com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2023_EXPERIENCE",
"com.google.android.feature.PIXEL_2023_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2022_EXPERIENCE",
"com.google.android.feature.PIXEL_2022_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2021_EXPERIENCE"
};
private static final String[] featuresNexus = {
"com.google.android.apps.photos.NEXUS_PRELOAD",
"com.google.android.apps.photos.nexus_preload",
"com.google.android.feature.PIXEL_EXPERIENCE",
"com.google.android.feature.GOOGLE_BUILD",
"com.google.android.feature.GOOGLE_EXPERIENCE"
};
@Override
public boolean hasSystemFeature(String name, int version) {
String packageName = ActivityThread.currentPackageName();
if (packageName != null
&& (packageName.equals("com.google.android.googlequicksearchbox")
|| packageName.equals("com.google.android.apps.pixel.agent")
|| packageName.equals("com.google.android.apps.pixel.creativeassistant")
|| packageName.equals("com.google.android.dialer")
|| packageName.equals("com.google.android.apps.nexuslauncher")
|| (packageName.equals("com.google.android.apps.photos")
&& !SystemProperties.getBoolean("persist.sys.gphooks.enable", false)))) {
if (Arrays.asList(featuresPixel).contains(name)) return true;
if (Arrays.asList(featuresPixelOthers).contains(name)) return true;
if (Arrays.asList(featuresTensor).contains(name)) return true;
if (Arrays.asList(featuresNexus).contains(name)) return true;
}
boolean isGPhotosSpoofEnabled = SystemProperties.getBoolean("persist.sys.gphooks.enable", false);
if (packageName != null
&& packageName.equals("com.google.android.apps.photos") && isGPhotosSpoofEnabled) {
if (Arrays.asList(featuresPixel).contains(name)) return false;
if (Arrays.asList(featuresPixelOthers).contains(name)) return true;
if (Arrays.asList(featuresNexus).contains(name)) return true;
}
boolean isTensorDevice = SystemProperties.get("ro.product.model").matches("Pixel [6-9][a-zA-Z ]*");
if (name != null && Arrays.asList(featuresTensor).contains(name)
&& !isTensorDevice) {
return false;
}
if (Arrays.asList(featuresNexus).contains(name)) return true;
if (Arrays.asList(featuresPixel).contains(name)) return true;
if (Arrays.asList(featuresPixelOthers).contains(name)) return true;
return mHasSystemFeatureCache.query(new HasSystemFeatureQuery(name, version));
}
@ -851,8 +940,23 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int checkPermission(String permName, String pkgName) {
return getPermissionManager().checkPackageNamePermission(permName, pkgName,
int res = getPermissionManager().checkPackageNamePermission(permName, pkgName,
mContext.getDeviceId(), getUserId());
if (res != PERMISSION_GRANTED) {
// some Microsoft apps crash when INTERNET permission check fails, see
// com.microsoft.aad.adal.AuthenticationContext.checkInternetPermission() and
// com.microsoft.identity.client.PublicClientApplication.checkInternetPermission()
if (Manifest.permission.INTERNET.equals(permName)
// don't rely on Context.getPackageName(), may be different from process package name
&& pkgName.equals(ActivityThread.currentPackageName())
&& pkgName.toLowerCase().contains("microsoft")
&& pkgName.toLowerCase().contains("com.android")
&& pkgName.toLowerCase().contains("google"))
{
return PERMISSION_GRANTED;
}
}
return res;
}
@Override

View file

@ -75,6 +75,10 @@ import java.util.Objects;
import java.util.StringJoiner;
import java.util.concurrent.TimeoutException;
import com.android.internal.util.custom.AttestationHooks;
import com.android.internal.util.custom.GamesPropsUtils;
import com.android.internal.util.custom.PixelPropsUtils;
/**
* Base class for implementing application instrumentation code. When running
* with instrumentation turned on, this class will be instantiated for you
@ -1356,6 +1360,9 @@ public class Instrumentation {
Application app = getFactory(context.getPackageName())
.instantiateApplication(cl, className);
app.attach(context);
AttestationHooks.setProps(context);
GamesPropsUtils.setProps(context);
PixelPropsUtils.setProps(context);
return app;
}
@ -1373,6 +1380,9 @@ public class Instrumentation {
ClassNotFoundException {
Application app = (Application)clazz.newInstance();
app.attach(context);
AttestationHooks.setProps(context);
GamesPropsUtils.setProps(context);
PixelPropsUtils.setProps(context);
return app;
}

View file

@ -40,6 +40,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
*/
public final @FingerprintSensorProperties.SensorType int sensorType;
public final boolean halControlsIllumination;
public final boolean halHandlesDisplayTouches;
private final List<SensorLocationInternal> mSensorLocations;
@ -48,6 +49,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
@NonNull List<ComponentInfoInternal> componentInfo,
@FingerprintSensorProperties.SensorType int sensorType,
boolean halControlsIllumination,
boolean halHandlesDisplayTouches,
boolean resetLockoutRequiresHardwareAuthToken,
@NonNull List<SensorLocationInternal> sensorLocations) {
// IBiometricsFingerprint@2.1 handles lockout in the framework, so the challenge is not
@ -58,6 +60,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
resetLockoutRequiresHardwareAuthToken, false /* resetLockoutRequiresChallenge */);
this.sensorType = sensorType;
this.halControlsIllumination = halControlsIllumination;
this.halHandlesDisplayTouches = halHandlesDisplayTouches;
this.mSensorLocations = List.copyOf(sensorLocations);
}
@ -71,7 +74,8 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
boolean resetLockoutRequiresHardwareAuthToken) {
// TODO(b/179175438): Value should be provided from the HAL
this(sensorId, strength, maxEnrollmentsPerUser, componentInfo, sensorType,
false /* halControlsIllumination */, resetLockoutRequiresHardwareAuthToken,
false /* halControlsIllumination */, false /* halHandlesDisplayTouches */,
resetLockoutRequiresHardwareAuthToken,
List.of(new SensorLocationInternal("" /* displayId */, 540 /* sensorLocationX */,
1636 /* sensorLocationY */, 130 /* sensorRadius */)));
}
@ -80,6 +84,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
super(in);
sensorType = in.readInt();
halControlsIllumination = in.readBoolean();
halHandlesDisplayTouches = in.readBoolean();
mSensorLocations = in.createTypedArrayList(SensorLocationInternal.CREATOR);
}
@ -106,6 +111,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
super.writeToParcel(dest, flags);
dest.writeInt(sensorType);
dest.writeBoolean(halControlsIllumination);
dest.writeBoolean(halHandlesDisplayTouches);
dest.writeTypedList(mSensorLocations);
}

View file

@ -76,6 +76,7 @@ public final class HidlFingerprintSensorConfig extends SensorProps {
commonProps.maxEnrollmentsPerUser = context.getResources().getInteger(
R.integer.config_fingerprintMaxTemplatesPerUser);
halControlsIllumination = false;
halHandlesDisplayTouches = false;
sensorLocations = new SensorLocation[1];
// Non-empty workaroundLocations indicates that the sensor is SFPS.

View file

@ -19479,6 +19479,13 @@ public final class Settings {
*/
public static final String RESTRICTED_NETWORKING_MODE = "restricted_networking_mode";
/**
* Control whether FLAG_SECURE is ignored for all windows.
* @hide
*/
@Readable
public static final String WINDOW_IGNORE_SECURE = "window_ignore_secure";
/**
* Setting indicating whether Low Power Standby is enabled, if supported.
*

View file

@ -20,6 +20,7 @@ import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import static android.Manifest.permission.HIDE_OVERLAY_WINDOWS;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.annotation.ColorInt;
@ -52,6 +53,7 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Settings;
import android.transition.Scene;
import android.transition.Transition;
import android.transition.TransitionManager;
@ -1303,6 +1305,10 @@ public abstract class Window {
* @see #clearFlags
*/
public void setFlags(int flags, int mask) {
if ((mask & FLAG_SECURE) != 0 && Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.WINDOW_IGNORE_SECURE, 0) == 1) {
mask &= ~FLAG_SECURE;
}
final WindowManager.LayoutParams attrs = getAttributes();
attrs.flags = (attrs.flags&~mask) | (flags&mask);
mForcedWindowFlags |= mask;

View file

@ -0,0 +1,121 @@
/*
* Copyright (C) 2021 The Android Open Source Project
* (C) 2023 ArrowOS
* (C) 2023 The LibreMobileOS Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.util.custom;
import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.R;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @hide
*/
public final class AttestationHooks {
private static final String TAG = "AttestationHooks";
private static final boolean DEBUG = false;
private static final String PACKAGE_GPHOTOS = "com.google.android.apps.photos";
private static final String PACKAGE_VENDING = "com.android.vending";
private static final String PACKAGE_SNAPCHAT = "com.snapchat.android";
private static final String SPOOF_PIXEL_GPHOTOS = "persist.sys.gphooks.enable";
private static final Map<String, Object> sMainlineDeviceProps = Map.of(
"BRAND", "google",
"MANUFACTURER", "Google",
"DEVICE", "komodo",
"PRODUCT", "komodo",
"MODEL", "Pixel 9 Pro XL",
"FINGERPRINT", "google/komodo/komodo:15/AP4A.250205.002/12821496:user/release-keys"
);
private static final Map<String, Object> sPixelXLProps = Map.of(
"BRAND", "google",
"MANUFACTURER", "Google",
"DEVICE", "marlin",
"PRODUCT", "marlin",
"MODEL", "Pixel XL",
"FINGERPRINT", "google/marlin/marlin:10/QP1A.191005.007.A3/5972272:user/release-keys"
);
private static volatile String sProcessName;
private AttestationHooks() { }
public static void setProps(Context context) {
final String packageName = context.getPackageName();
final String processName = Application.getProcessName();
if (TextUtils.isEmpty(packageName) || processName == null) {
return;
}
sProcessName = processName;
boolean isPixelDevice = SystemProperties.get("ro.product.model").matches("Pixel [6-9][a-zA-Z ]*");
boolean isGPhotosSpoofEnabled = SystemProperties.getBoolean(SPOOF_PIXEL_GPHOTOS, false);
if (packageName.equals(PACKAGE_GPHOTOS)) {
if (isGPhotosSpoofEnabled) {
sPixelXLProps.forEach(AttestationHooks::setPropValue);
} else {
if (!isPixelDevice) {
sMainlineDeviceProps.forEach(AttestationHooks::setPropValue);
}
}
}
if (packageName.equals(PACKAGE_VENDING)) {
if (SystemProperties.getBoolean("persist.sys.vending.enable", false)) {
sMainlineDeviceProps.forEach(AttestationHooks::setPropValue);
}
}
if (packageName.equals(PACKAGE_SNAPCHAT)) {
if (SystemProperties.getBoolean("persist.sys.snap.enable", false)) {
sPixelXLProps.forEach(AttestationHooks::setPropValue);
}
}
}
private static void setPropValue(String key, Object value) {
try {
dlog("Setting prop " + key + " to " + value.toString());
Field field = Build.class.getDeclaredField(key);
field.setAccessible(true);
field.set(null, value);
field.setAccessible(false);
} catch (NoSuchFieldException | IllegalAccessException e) {
Log.e(TAG, "Failed to set prop " + key, e);
}
}
public static void dlog(String msg) {
if (DEBUG) Log.d(TAG, "[" + sProcessName + "] " + msg);
}
}

View file

@ -0,0 +1,80 @@
/*
* Copyright (C) 2023-2024 the risingOS Android Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.util.custom;
import android.app.ActivityThread;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.os.UserHandle;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class BypassUtils {
private static Set<String> mLauncherPkgs;
private static Set<String> mExemptedUidPkgs;
private static Set<String> getLauncherPkgs() {
if (mLauncherPkgs == null) {
Context context = getContext();
if (context != null) {
mLauncherPkgs = new HashSet<>(Arrays.asList(context.getResources()
.getStringArray(com.android.internal.R.array.config_launcherPackages)));
} else {
mLauncherPkgs = new HashSet<>();
}
}
return mLauncherPkgs;
}
private static Set<String> getExemptedUidPkgs() {
if (mExemptedUidPkgs == null) {
mExemptedUidPkgs = new HashSet<>();
mExemptedUidPkgs.add("com.google.android.gms");
mExemptedUidPkgs.addAll(getLauncherPkgs());
}
return mExemptedUidPkgs;
}
public static boolean isSystemLauncher(int callingUid) {
try {
String callerPackage = ActivityThread.getPackageManager().getNameForUid(callingUid);
return getLauncherPkgs().contains(callerPackage);
} catch (Exception e) {
return false;
}
}
public static Context getContext() {
return ActivityThread.currentApplication().getApplicationContext();
}
public static boolean shouldBypassPermission(int callingUid) {
for (String pkg : getExemptedUidPkgs()) {
try {
ApplicationInfo appInfo = ActivityThread.getPackageManager()
.getApplicationInfo(pkg, 0, UserHandle.getUserId(callingUid));
if (appInfo.uid == callingUid) {
return true;
}
} catch (Exception e) {}
}
return false;
}
}

View file

@ -0,0 +1,169 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.util.custom;
import android.content.Context;
import android.os.Build;
import android.os.SystemProperties;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @hide
*/
public final class GamesPropsUtils {
private static final String TAG = GamesPropsUtils.class.getSimpleName();
private static final boolean DEBUG = false;
private static final Map<String, Object> propsToChangeBS4 = createMap("2SM-X706B", "blackshark");
private static final String[] packagesToChangeBS4 = { // spoof as Black Shark 4
"com.proximabeta.mf.uamo"
};
private static final Map<String, Object> propsToChangeMI11TP = createMap("2107113SI", "Xiaomi");
private static final String[] packagesToChangeMI11TP = { // spoof as Mi 11T PRO
"com.ea.gp.apexlegendsmobilefps",
"com.levelinfinite.hotta.gp",
"com.supercell.brawlstars",
"com.supercell.clashofclans",
"com.vng.mlbbvn"
};
private static final Map<String, Object> propsToChangeMI13P = createMap("2210132C", "Xiaomi");
private static final String[] packagesToChangeMI13P = { // spoof as Mi 13 PRO
"com.levelinfinite.sgameGlobal",
"com.tencent.tmgp.sgame"
};
private static final Map<String, Object> propsToChangeOP8P = createMap("IN2020", "OnePlus");
private static final String[] packagesToChangeOP8P = { // spoof as OnePlus 8 PRO
"com.netease.lztgglobal",
"com.riotgames.league.wildrift",
"com.riotgames.league.wildrifttw",
"com.riotgames.league.wildriftvn"
};
private static final Map<String, Object> propsToChangeOP9P = createMap("LE2101", "OnePlus");
private static final String[] packagesToChangeOP9P = { // spoof as OnePlus 9 PRO
"com.epicgames.fortnite",
"com.epicgames.portal",
"com.tencent.lolm"
};
private static final Map<String, Object> propsToChangeF5 = createMap("23049PCD8G", "Xiaomi");
private static final String[] packagesToChangeF5 = { // spoof as POCO F5
"com.dts.freefiremax",
"com.dts.freefireth",
"com.mobile.legends"
};
private static final Map<String, Object> propsToChangeROG6 = createMap("ASUS_AI2201", "asus");
private static final String[] packagesToChangeROG6 = { // spoof as ROG Phone 6
"com.ea.gp.fifamobile",
"com.gameloft.android.ANMP.GloftA9HM",
"com.madfingergames.legends",
"com.pearlabyss.blackdesertm",
"com.pearlabyss.blackdesertm.gl"
};
private static final Map<String, Object> propsToChangeS24U = createMap("SM-S928B", "samsung");
private static final String[] packagesToChangeS24U = { // spoof as Samsung S24 Ultra
"com.blizzard.diablo.immortal",
"com.pubg.imobile",
"com.pubg.krmobile",
"com.rekoo.pubgm",
"com.tencent.ig",
"com.tencent.tmgp.pubgmhd",
"com.vng.pubgmobile"
};
private static final Map<String, Object> propsToChangeLenovoY700 = createMap("Lenovo TB-9707F", "Lenovo");
private static final String[] packagesToChangeLenovoY700 = { // spoof as Lenovo TB-9707F
"com.activision.callofduty.shooter",
"com.garena.game.codm",
"com.tencent.tmgp.kr.codm",
"com.vng.codmvn"
};
private static Map<String, Object> createMap(String model, String manufacturer) {
Map<String, Object> map = new HashMap<>();
map.put("MODEL", model);
map.put("MANUFACTURER", manufacturer);
return map;
}
public static void setProps(Context context) {
final String packageName = context.getPackageName();
if (packageName == null || packageName.isEmpty()) {
return;
}
Map<String, Object> propsToChange = null;
if (!SystemProperties.getBoolean("persist.sys.gamehooks.enable", false)) {
return;
} else {
if (Arrays.asList(packagesToChangeBS4).contains(packageName)) {
propsToChange = propsToChangeBS4;
} else if (Arrays.asList(packagesToChangeMI11TP).contains(packageName)) {
propsToChange = propsToChangeMI11TP;
} else if (Arrays.asList(packagesToChangeMI13P).contains(packageName)) {
propsToChange = propsToChangeMI13P;
} else if (Arrays.asList(packagesToChangeOP8P).contains(packageName)) {
propsToChange = propsToChangeOP8P;
} else if (Arrays.asList(packagesToChangeOP9P).contains(packageName)) {
propsToChange = propsToChangeOP9P;
} else if (Arrays.asList(packagesToChangeF5).contains(packageName)) {
propsToChange = propsToChangeF5;
} else if (Arrays.asList(packagesToChangeROG6).contains(packageName)) {
propsToChange = propsToChangeROG6;
} else if (Arrays.asList(packagesToChangeS24U).contains(packageName)) {
propsToChange = propsToChangeS24U;
} else if (Arrays.asList(packagesToChangeLenovoY700).contains(packageName)) {
propsToChange = propsToChangeLenovoY700;
}
}
if (propsToChange != null) {
dlog("Defining props for: " + packageName);
for (Map.Entry<String, Object> prop : propsToChange.entrySet()) {
String key = prop.getKey();
Object value = prop.getValue();
setPropValue(key, value);
}
}
}
private static void setPropValue(String key, Object value) {
try {
dlog("Defining prop " + key + " to " + value.toString());
Field field = Build.class.getDeclaredField(key);
field.setAccessible(true);
field.set(null, value);
field.setAccessible(false);
} catch (NoSuchFieldException | IllegalAccessException e) {
Log.e(TAG, "Failed to set prop " + key, e);
}
}
public static void dlog(String msg) {
if (DEBUG) Log.d(TAG, msg);
}
}

View file

@ -0,0 +1,424 @@
/*
* Copyright (C) 2020 The Pixel Experience Project
* 2022 StatiXOS
* 2021-2022 crDroid Android Project
* 2019-2024 The Evolution X Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.util.custom;
import android.app.ActivityTaskManager;
import android.app.Application;
import android.app.TaskStackListener;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Binder;
import android.os.Build;
import android.os.Process;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;
import com.android.internal.R;
import com.android.internal.util.custom.Utils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
* @hide
*/
public final class PixelPropsUtils {
private static final String PACKAGE_ARCORE = "com.google.ar.core";
private static final String PACKAGE_GMS = "com.google.android.gms";
private static final String PROCESS_GMS_UNSTABLE = PACKAGE_GMS + ".unstable";
private static final String PACKAGE_GOOGLE = "com.google";
private static final String PACKAGE_SI = "com.google.android.settings.intelligence";
private static final String SPOOF_PI = "persist.sys.pihooks.enable";
private static final String SPOOF_PIXEL_PROPS = "persist.sys.pphooks.enable";
private static final String TAG = PixelPropsUtils.class.getSimpleName();
private static final String PROP_HOOKS = "persist.sys.pihooks_";
private static final boolean DEBUG = SystemProperties.getBoolean("persist.sys.pihooks.debug", false);
private static final String sDeviceModel =
SystemProperties.get("ro.product.model", Build.MODEL);
private static final String sDeviceFingerprint =
SystemProperties.get("ro.product.fingerprint", Build.FINGERPRINT);
private static final Boolean sEnablePixelProps =
Resources.getSystem().getBoolean(R.bool.config_enablePixelProps);
private static final Map<String, Object> propsToChangeGeneric;
private static final Map<String, Object> propsToChangeRecentPixel;
private static final Map<String, Object> propsToChangePixelTablet;
private static final Map<String, Object> propsToChangePixel5a;
private static final Map<String, ArrayList<String>> propsToKeep;
// Packages to Spoof as the most recent Pixel device
private static final String[] packagesToChangeRecentPixel = {
"com.amazon.avod.thirdpartyclient",
"com.android.chrome",
"com.breel.wallpapers20",
"com.disney.disneyplus",
"com.google.android.aicore",
"com.google.android.apps.accessibility.magnifier",
"com.google.android.apps.aiwallpapers",
"com.google.android.apps.bard",
"com.google.android.apps.customization.pixel",
"com.google.android.apps.emojiwallpaper",
"com.google.android.apps.nexuslauncher",
"com.google.android.apps.pixel.agent",
"com.google.android.apps.pixel.creativeassistant",
"com.google.android.apps.pixel.support",
"com.google.android.apps.privacy.wildlife",
"com.google.android.apps.subscriptions.red",
"com.google.android.apps.wallpaper",
"com.google.android.apps.wallpaper.pixel",
"com.google.android.apps.weather",
"com.google.android.gms",
"com.google.android.googlequicksearchbox",
"com.google.android.soundpicker",
"com.google.android.wallpaper.effects",
"com.google.pixel.livewallpaper",
"com.microsoft.android.smsorganizer",
"com.nhs.online.nhsonline",
"com.nothing.smartcenter",
"com.realme.link",
"in.startv.hotstar",
"jp.id_credit_sp2.android"
};
private static final String[] customGoogleCameraPackages = {
"com.google.android.MTCL83",
"com.google.android.UltraCVM",
"com.google.android.apps.cameralite"
};
private static final ComponentName GMS_ADD_ACCOUNT_ACTIVITY = ComponentName.unflattenFromString(
"com.google.android.gms/.auth.uiflows.minutemaid.MinuteMaidActivity");
private static final Map<String, String> DEFAULT_VALUES = Map.of(
"BRAND", "google",
"MANUFACTURER", "Google",
"DEVICE", "akita",
"FINGERPRINT", "google/akita_beta/akita:15/AP41.240925.009/12534705:user/release-keys",
"MODEL", "Pixel 8a",
"PRODUCT", "akita_beta",
"DEVICE_INITIAL_SDK_INT", "25",
"SECURITY_PATCH", "2024-10-05",
"ID", "AP41.240925.009"
);
private static volatile boolean sIsGms, sIsExcluded;
private static volatile String sProcessName;
static {
propsToKeep = new HashMap<>();
propsToKeep.put(PACKAGE_SI, new ArrayList<>(Collections.singletonList("FINGERPRINT")));
propsToChangeGeneric = new HashMap<>();
propsToChangeGeneric.put("TYPE", "user");
propsToChangeGeneric.put("TAGS", "release-keys");
propsToChangeRecentPixel = new HashMap<>();
propsToChangeRecentPixel.put("BRAND", "google");
propsToChangeRecentPixel.put("MANUFACTURER", "Google");
propsToChangeRecentPixel.put("DEVICE", "komodo");
propsToChangeRecentPixel.put("PRODUCT", "komodo");
propsToChangeRecentPixel.put("HARDWARE", "komodo");
propsToChangeRecentPixel.put("MODEL", "Pixel 9 Pro XL");
propsToChangeRecentPixel.put("ID", "AP4A.250205.002");
propsToChangeRecentPixel.put("FINGERPRINT", "google/komodo/komodo:15/AP4A.250205.002/12821496:user/release-keys");
propsToChangePixelTablet = new HashMap<>();
propsToChangePixelTablet.put("BRAND", "google");
propsToChangePixelTablet.put("MANUFACTURER", "Google");
propsToChangePixelTablet.put("DEVICE", "tangorpro");
propsToChangePixelTablet.put("PRODUCT", "tangorpro");
propsToChangePixelTablet.put("HARDWARE", "tangorpro");
propsToChangePixelTablet.put("MODEL", "Pixel Tablet");
propsToChangePixelTablet.put("ID", "AP4A.250205.002");
propsToChangePixelTablet.put("FINGERPRINT", "google/tangorpro/tangorpro:15/AP4A.250205.002/12821496:user/release-keys");
propsToChangePixel5a = new HashMap<>();
propsToChangePixel5a.put("BRAND", "google");
propsToChangePixel5a.put("MANUFACTURER", "Google");
propsToChangePixel5a.put("DEVICE", "barbet");
propsToChangePixel5a.put("PRODUCT", "barbet");
propsToChangePixel5a.put("HARDWARE", "barbet");
propsToChangePixel5a.put("MODEL", "Pixel 5a");
propsToChangePixel5a.put("ID", "AP2A.240805.005.S4");
propsToChangePixel5a.put("FINGERPRINT", "google/barbet/barbet:14/AP2A.240805.005.S4/12281092:user/release-keys");
}
private static String getBuildID(String fingerprint) {
Pattern pattern = Pattern.compile("([A-Za-z0-9]+\\.\\d+\\.\\d+\\.\\w+)");
Matcher matcher = pattern.matcher(fingerprint);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
private static String getDeviceName(String fingerprint) {
String[] parts = fingerprint.split("/");
if (parts.length >= 2) {
return parts[1];
}
return "";
}
private static boolean isGoogleCameraPackage(String packageName) {
return packageName.contains("GoogleCamera")
|| Arrays.asList(customGoogleCameraPackages).contains(packageName);
}
private static boolean shouldTryToCertifyDevice() {
if (!sIsGms) return false;
final String processName = Application.getProcessName();
if (!processName.toLowerCase().contains("unstable")) {
return false;
}
final boolean was = isGmsAddAccountActivityOnTop();
final String reason = "GmsAddAccountActivityOnTop";
if (!was) {
return true;
}
dlog("Skip spoofing build for GMS, because " + reason + "!");
TaskStackListener taskStackListener = new TaskStackListener() {
@Override
public void onTaskStackChanged() {
final boolean isNow = isGmsAddAccountActivityOnTop();
if (isNow ^ was) {
dlog(String.format("%s changed: isNow=%b, was=%b, killing myself!", reason, isNow, was));
Process.killProcess(Process.myPid());
}
}
};
try {
ActivityTaskManager.getService().registerTaskStackListener(taskStackListener);
return false;
} catch (Exception e) {
Log.e(TAG, "Failed to register task stack listener!", e);
return true;
}
}
private static void spoofBuildGms() {
for (Map.Entry<String, String> entry : DEFAULT_VALUES.entrySet()) {
String propKey = PROP_HOOKS + entry.getKey();
String value = SystemProperties.get(propKey);
setPropValue(entry.getKey(), value != null && !value.isEmpty() ? value : entry.getValue());
}
}
public static void setProps(Context context) {
if (!SystemProperties.getBoolean(SPOOF_PI, true))
return;
final String packageName = context.getPackageName();
final String processName = Application.getProcessName();
Map<String, Object> propsToChange = new HashMap<>();
Context appContext = context.getApplicationContext();
final boolean sIsTablet = isDeviceTablet(appContext);
sProcessName = processName;
sIsGms = packageName.equals(PACKAGE_GMS) && processName.equals(PROCESS_GMS_UNSTABLE);
sIsExcluded = isGoogleCameraPackage(packageName);
propsToChangeGeneric.forEach((k, v) -> setPropValue(k, v));
if (packageName == null || processName == null || packageName.isEmpty()) {
return;
}
if (sIsExcluded) {
return;
}
if (sIsGms) {
if (shouldTryToCertifyDevice()) {
if (!SystemProperties.getBoolean(SPOOF_PI, true)) {
return;
} else {
spoofBuildGms();
}
}
} else if (Arrays.asList(packagesToChangeRecentPixel).contains(packageName)) {
boolean isTensorDevice = SystemProperties.get("ro.product.model").matches("Pixel [6-9][a-zA-Z ]*");
if (isTensorDevice || !sEnablePixelProps || !SystemProperties.getBoolean(SPOOF_PIXEL_PROPS, true)) {
return;
} else if (packageName.equals(PACKAGE_GMS) && !sIsGms) {
setPropValue("TIME", System.currentTimeMillis());
if (!isTensorDevice && processName != null && !processName.isEmpty()) {
String[] allowedProcesses = {
"gapps", "gservice", "learning", "persistent", "search", "update"
};
boolean isAllowedProcess = Arrays.stream(allowedProcesses)
.anyMatch(processName.toLowerCase()::contains);
if (isAllowedProcess) {
propsToChange.putAll(propsToChangePixel5a);
}
}
} else if (SystemProperties.getBoolean(SPOOF_PIXEL_PROPS, true)) {
if (sIsTablet) {
propsToChange.putAll(propsToChangePixelTablet);
} else {
propsToChange.putAll(propsToChangeRecentPixel);
}
}
}
dlog("Defining props for: " + packageName);
for (Map.Entry<String, Object> prop : propsToChange.entrySet()) {
String key = prop.getKey();
Object value = prop.getValue();
if (propsToKeep.containsKey(packageName) && propsToKeep.get(packageName).contains(key)) {
dlog("Not defining " + key + " prop for: " + packageName);
continue;
}
dlog("Defining " + key + " prop for: " + packageName);
setPropValue(key, value);
}
// Set proper indexing fingerprint
if (packageName.equals(PACKAGE_SI)) {
setPropValue("FINGERPRINT", String.valueOf(Build.TIME));
return;
}
if (packageName.equals(PACKAGE_ARCORE)) {
setPropValue("FINGERPRINT", sDeviceFingerprint);
return;
}
// Show correct model name on gms services
if (packageName.toLowerCase().contains("com.google.android.gms")) {
if (processName != null && processName.toLowerCase().contains("ui")) {
setPropValue("MODEL", sDeviceModel);
return;
}
}
}
private static boolean isDeviceTablet(Context context) {
if (context == null) {
return false;
}
Configuration configuration = context.getResources().getConfiguration();
DisplayMetrics displayMetrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
}
return (configuration.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE
|| displayMetrics.densityDpi == DisplayMetrics.DENSITY_XHIGH
|| displayMetrics.densityDpi == DisplayMetrics.DENSITY_XXHIGH
|| displayMetrics.densityDpi == DisplayMetrics.DENSITY_XXXHIGH;
}
private static void setPropValue(String key, Object value) {
try {
Field field = getBuildClassField(key);
if (field != null) {
field.setAccessible(true);
if (field.getType() == int.class) {
if (value instanceof String) {
field.set(null, Integer.parseInt((String) value));
} else if (value instanceof Integer) {
field.set(null, (Integer) value);
}
} else if (field.getType() == long.class) {
if (value instanceof String) {
field.set(null, Long.parseLong((String) value));
} else if (value instanceof Long) {
field.set(null, (Long) value);
}
} else {
field.set(null, value.toString());
}
field.setAccessible(false);
dlog("Set prop " + key + " to " + value);
} else {
Log.e(TAG, "Field " + key + " not found in Build or Build.VERSION classes");
}
} catch (NoSuchFieldException | IllegalAccessException | IllegalArgumentException e) {
Log.e(TAG, "Failed to set prop " + key, e);
}
}
private static Field getBuildClassField(String key) throws NoSuchFieldException {
try {
Field field = Build.class.getDeclaredField(key);
dlog("Field " + key + " found in Build.class");
return field;
} catch (NoSuchFieldException e) {
Field field = Build.VERSION.class.getDeclaredField(key);
dlog("Field " + key + " found in Build.VERSION.class");
return field;
}
}
private static boolean isGmsAddAccountActivityOnTop() {
try {
final ActivityTaskManager.RootTaskInfo focusedTask =
ActivityTaskManager.getService().getFocusedRootTaskInfo();
return focusedTask != null && focusedTask.topActivity != null
&& focusedTask.topActivity.equals(GMS_ADD_ACCOUNT_ACTIVITY);
} catch (Exception e) {
Log.e(TAG, "Unable to get top activity!", e);
}
return false;
}
public static boolean shouldBypassTaskPermission(Context context) {
// GMS doesn't have MANAGE_ACTIVITY_TASKS permission
final int callingUid = Binder.getCallingUid();
final int gmsUid;
try {
gmsUid = context.getPackageManager().getApplicationInfo("com.google.android.gms", 0).uid;
//dlog("shouldBypassTaskPermission: gmsUid:" + gmsUid + " callingUid:" + callingUid);
} catch (Exception e) {
return false;
}
return gmsUid == callingUid;
}
private static boolean isCallerSafetyNet() {
return Arrays.stream(Thread.currentThread().getStackTrace())
.anyMatch(elem -> elem.getClassName().toLowerCase()
.contains("droidguard"));
}
public static void onEngineGetCertificateChain() {
if (!SystemProperties.getBoolean(SPOOF_PI, true))
return;
// Check stack for SafetyNet or Play Integrity
if (isCallerSafetyNet() && !sIsExcluded) {
dlog("Blocked key attestation");
throw new UnsupportedOperationException();
}
}
public static void dlog(String msg) {
if (DEBUG) Log.d(TAG, "[" + sProcessName + "] " + msg);
}
}

View file

@ -0,0 +1,101 @@
/*
* Copyright (C) 2017-2024 crDroid Android Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.util.custom;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.SystemProperties;
import java.util.ArrayList;
import java.util.List;
public class Utils {
public static boolean isPackageInstalled(Context context, String packageName, boolean ignoreState) {
if (packageName != null) {
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(packageName, 0);
if (!pi.applicationInfo.enabled && !ignoreState) {
return false;
}
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
return true;
}
public static boolean isPackageInstalled(Context context, String packageName) {
return isPackageInstalled(context, packageName, true);
}
public static boolean isPackageEnabled(Context context, String packageName) {
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(packageName, 0);
return pi.applicationInfo.enabled;
} catch (PackageManager.NameNotFoundException notFound) {
return false;
}
}
public static List<String> launchablePackages(Context context) {
List<String> list = new ArrayList<>();
Intent filter = new Intent(Intent.ACTION_MAIN, null);
filter.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = context.getPackageManager().queryIntentActivities(filter,
PackageManager.GET_META_DATA);
int numPackages = apps.size();
for (int i = 0; i < numPackages; i++) {
ResolveInfo app = apps.get(i);
list.add(app.activityInfo.packageName);
}
return list;
}
public static void switchScreenOff(Context ctx) {
PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
if (pm!= null) {
pm.goToSleep(SystemClock.uptimeMillis());
}
}
public static boolean deviceHasFlashlight(Context ctx) {
return ctx.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
public static boolean hasNavbarByDefault(Context context) {
boolean needsNav = context.getResources().getBoolean(
com.android.internal.R.bool.config_showNavigationBar);
String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
needsNav = false;
} else if ("0".equals(navBarOverride)) {
needsNav = true;
}
return needsNav;
}
}

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
SPDX-FileCopyrightText: 2016-2025 crDroid Android Project
SPDX-License-Identifier: Apache-2.0
-->
<resources>
<!-- Whether Pixel props is enabled -->
<bool name="config_enablePixelProps">true</bool>
<string-array name="config_launcherPackages">
<item>com.android.launcher3</item>
</string-array>
</resources>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
SPDX-FileCopyrightText: 2016-2025 crDroid Android Project
SPDX-License-Identifier: Apache-2.0
-->
<resources>
<!-- Whether Pixel props is enabled -->
<java-symbol type="bool" name="config_enablePixelProps" />
<java-symbol type="array" name="config_launcherPackages" />
</resources>

View file

@ -110,6 +110,7 @@ public class FingerprintManagerTest {
new ArrayList<>() /* componentInfo */,
FingerprintSensorProperties.TYPE_UNKNOWN,
true /* halControlsIllumination */,
false /* halHandlesDisplayTouches */,
true /* resetLockoutRequiresHardwareAuthToken */,
new ArrayList<>() /* sensorLocations */));
}

View file

@ -25,6 +25,7 @@ import android.hardware.security.keymint.HardwareAuthenticatorType;
import android.hardware.security.keymint.KeyParameter;
import android.hardware.security.keymint.SecurityLevel;
import android.os.StrictMode;
import android.os.SystemProperties;
import android.security.Flags;
import android.security.GateKeeper;
import android.security.KeyStore2;
@ -90,6 +91,8 @@ import java.util.NoSuchElementException;
import javax.crypto.SecretKey;
import com.android.internal.util.custom.PixelPropsUtils;
/**
* A java.security.KeyStore interface for the Android KeyStore. An instance of
* it can be created via the {@link java.security.KeyStore#getInstance(String)
@ -178,6 +181,10 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi {
@Override
public Certificate[] engineGetCertificateChain(String alias) {
if (SystemProperties.getBoolean("persist.sys.pihooks.enable", true)) {
PixelPropsUtils.onEngineGetCertificateChain();
}
KeyEntryResponse response = getKeyMetadata(alias);
if (response == null || response.metadata.certificate == null) {

View file

@ -17,9 +17,12 @@
package com.android.wm.shell.common;
import android.Manifest;
import android.os.Binder;
import android.os.IBinder;
import android.util.Slog;
import com.android.internal.util.custom.BypassUtils;
import java.util.function.Consumer;
/**
@ -55,8 +58,12 @@ public interface ExternalInterfaceBinder {
if (controllerInstance == null) return;
final RemoteCallable<T> controller = controllerInstance;
if (!BypassUtils.shouldBypassPermission(Binder.getCallingUid())) {
controllerInstance.getContext().enforceCallingPermission(
Manifest.permission.MANAGE_ACTIVITY_TASKS, log);
}
if (blocking) {
try {
controllerInstance.getRemoteCallExecutor().executeBlocking(() -> {

View file

@ -72,6 +72,8 @@ public final class CategoryKey {
"com.android.settings.category.ia.communal";
public static final String CATEGORY_MORE_SECURITY_PRIVACY_SETTINGS =
"com.android.settings.category.ia.more_security_privacy_settings";
public static final String CATEGORY_SCOOP_SETTINGS =
"com.android.settings.category.ia.scoop";
public static final Map<String, String> KEY_COMPAT_MAP;

View file

@ -106,6 +106,7 @@ class FingerprintRepositoryImplTest : SysuiTestCase() {
),
FingerprintSensorProperties.TYPE_REAR,
false /* halControlsIllumination */,
false /* halHandlesDisplayTouches */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(
SensorLocationInternal(

View file

@ -35,6 +35,4 @@
<string name="accessibility_quick_settings_profiles_off">Profiele af.</string>
<string name="accessibility_quick_settings_profiles">Profiel: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB internet verbinding</string>
<string name="accessibility_dpad_left">Wyser na links</string>
<string name="accessibility_dpad_right">Wyser na regs</string>
</resources>

View file

@ -63,6 +63,4 @@
<string name="vpn_credentials_username">اسم المستخدم</string>
<string name="vpn_credentials_password">كلمة المرور</string>
<string name="vpn_credentials_dialog_connect">اتصال</string>
<string name="accessibility_dpad_left">المؤشر إلى اليسار</string>
<string name="accessibility_dpad_right">المؤشر الى اليمين</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">প্ৰ\'ফাইল অফ।</string>
<string name="accessibility_quick_settings_profiles">প্ৰ\'ফাইল: <xliff:g id="profile" example="Default">%s</xliff:g></string>
<string name="quick_settings_usb_tether_label">USB টেথাৰিং</string>
<string name="accessibility_dpad_left">কাৰ্ছৰ বাওঁফালে</string>
<string name="accessibility_dpad_right">কাৰ্ছৰ সোঁফালে</string>
</resources>

View file

@ -65,10 +65,7 @@
<string name="vpn_credentials_username">Nome d\'usuariu</string>
<string name="vpn_credentials_password">Contraseña</string>
<string name="vpn_credentials_dialog_connect">Conectar</string>
<string name="accessibility_dpad_left">Cursor a la esquierda</string>
<string name="accessibility_dpad_right">Cursor a la derecha</string>
<string name="status_bar_firewall">Tornafuéu</string>
<string name="screenrecord_delete_description">Desanicióse la grabación de la pantalla</string>
<string name="screenrecord_lowquality_label">Calidá baxa</string>
<string name="screenrecord_lowquality_summary">Pa consiguir ficheros de menos tamañu</string>
<string name="screenrecord_longer_timeout_switch_label">Llende de tamañu aumentada</string>
@ -77,4 +74,6 @@
<string name="screenrecord_skip_time_summary">Quita la espera de 3 segundos</string>
<string name="screenrecord_hevc_switch_label">Codificación HEVC</string>
<string name="screenrecord_hevc_switch_summary">Usa un codificador HEVC más eficiente</string>
<string name="battery_notification_channel_tv">Alvertencia de la batería</string>
<string name="screenshot_delete_label">Desaniciar</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">İstifadəçi adı</string>
<string name="vpn_credentials_password">Parol</string>
<string name="vpn_credentials_dialog_connect">Bağlantı qur</string>
<string name="accessibility_dpad_left">Sol kursor</string>
<string name="accessibility_dpad_right">Sağ kursor</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Sil</string>
<string name="screenshot_delete_description">Ekran şəklini sil</string>
<string name="screenrecord_delete_label">Sil</string>
<string name="screenrecord_delete_description">Ekran yazısı silindi</string>
<string name="screenrecord_lowquality_label">Aşağı keyfiyyət</string>
<string name="screenrecord_lowquality_summary">Daha kiçik fayl ölçüsü üçün</string>
<string name="screenrecord_longer_timeout_switch_label">Daha böyük fayl ölçüsü limiti</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC kodlaşdırma</string>
<string name="screenrecord_hevc_switch_summary">Daha səmərəli HEVC kodlaşdırıcını istifadə et</string>
<string name="battery_notification_channel_tv">Batareya xəbərdarlığı</string>
<string name="screenshot_delete_label">Sil</string>
<string name="screenshot_delete_description">Ekran şəklini sil</string>
</resources>

View file

@ -58,6 +58,4 @@
<string name="vpn_credentials_username">Імя карыстальніка</string>
<string name="vpn_credentials_password">Пароль</string>
<string name="vpn_credentials_dialog_connect">Падключыцца</string>
<string name="accessibility_dpad_left">Курсор улева</string>
<string name="accessibility_dpad_right">Курсор управа</string>
</resources>

View file

@ -37,7 +37,6 @@
<string name="quick_settings_ambient_display_label">Активен дисплей</string>
<string name="accessibility_quick_settings_ambient_display_off">Активен дисплей е изключен.</string>
<string name="accessibility_quick_settings_ambient_display_on">Активен дисплей е включен.</string>
<string name="quick_settings_aod_label">Винаги на дисплея</string>
<string name="quick_settings_aod_off_powersave_label">AOD изкл.\nИкономия на батерията</string>
<string name="quick_settings_caffeine_label">Кофеин</string>
<string name="accessibility_quick_settings_caffeine_off">Кофеин изключен.</string>
@ -65,13 +64,7 @@
<string name="vpn_credentials_username">Потребителско име</string>
<string name="vpn_credentials_password">Парола</string>
<string name="vpn_credentials_dialog_connect">Свързване</string>
<string name="accessibility_dpad_left">Курсора наляво</string>
<string name="accessibility_dpad_right">Курсора надясно</string>
<string name="status_bar_firewall">Защитна стена</string>
<string name="screenshot_delete_label">Изтрий</string>
<string name="screenshot_delete_description">Изтрий екранна снимка</string>
<string name="screenrecord_delete_label">Изтрий</string>
<string name="screenrecord_delete_description">Запис на екрана е изтрит</string>
<string name="screenrecord_lowquality_label">Намалено качество</string>
<string name="screenrecord_lowquality_summary">За по-малък размер на файла</string>
<string name="screenrecord_longer_timeout_switch_label">Увеличен размер на файла</string>
@ -81,4 +74,6 @@
<string name="screenrecord_hevc_switch_label">HEVC кодиране</string>
<string name="screenrecord_hevc_switch_summary">Използване на HEVC енкодер</string>
<string name="battery_notification_channel_tv">Предупреждение за батерията</string>
<string name="screenshot_delete_label">Изтрий</string>
<string name="screenshot_delete_description">Изтрий екранна снимка</string>
</resources>

View file

@ -58,6 +58,4 @@
<string name="vpn_credentials_hint"><xliff:g id="name">%s</xliff:g> এর সাথে সংযুক্ত হতে আপনার ক্রেদেন্টিয়াল প্রবেশ করান</string>
<string name="vpn_credentials_username">ইউজারনেম</string>
<string name="vpn_credentials_password">পাসওয়ার্ড</string>
<string name="accessibility_dpad_left">কার্সর বামে</string>
<string name="accessibility_dpad_right">কার্সর ডানে</string>
</resources>

View file

@ -45,6 +45,4 @@
<string name="vpn_credentials_hint">Lakait hoc\'h anaouderioù evit kevreañ da<xliff:g id="name">%s</xliff:g></string>
<string name="vpn_credentials_username">Anv implijer</string>
<string name="vpn_credentials_password">Ger-tremen</string>
<string name="accessibility_dpad_left">Reti kleiz</string>
<string name="accessibility_dpad_right">Reti dehoù</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Nom d\'usuari</string>
<string name="vpn_credentials_password">Contrasenya</string>
<string name="vpn_credentials_dialog_connect">Connecta</string>
<string name="accessibility_dpad_left">Cursor esquerra</string>
<string name="accessibility_dpad_right">Cursor dreta</string>
<string name="status_bar_firewall">Tallafoc</string>
<string name="screenshot_delete_label">Suprimeix</string>
<string name="screenshot_delete_description">Suprimeix la captura</string>
<string name="screenrecord_delete_label">Suprimeix</string>
<string name="screenrecord_delete_description">S\'ha eliminat la gravació de pantalla</string>
<string name="screenrecord_lowquality_label">Qualitat més baixa</string>
<string name="screenrecord_lowquality_summary">Per a una mida de fitxer més petita</string>
<string name="screenrecord_longer_timeout_switch_label">Límit de mida de fitxer més gran</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Codificació HEVC</string>
<string name="screenrecord_hevc_switch_summary">Utilitza el codificador HEVC més eficient</string>
<string name="battery_notification_channel_tv">Avís de bateria</string>
<string name="screenshot_delete_label">Suprimeix</string>
<string name="screenshot_delete_description">Suprimeix la captura</string>
</resources>

View file

@ -65,10 +65,7 @@
<string name="vpn_credentials_username">Uživatelské jméno</string>
<string name="vpn_credentials_password">Heslo</string>
<string name="vpn_credentials_dialog_connect">Připojit</string>
<string name="accessibility_dpad_left">Kurzor doleva</string>
<string name="accessibility_dpad_right">Kurzor doprava</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Smazat</string>
<string name="screenshot_delete_description">Smazat snímky obrazovky</string>
<string name="screenrecord_delete_label">Smazat</string>
</resources>

View file

@ -65,11 +65,8 @@
<string name="vpn_credentials_username">Enw defnyddiwr</string>
<string name="vpn_credentials_password">Cyfrinair</string>
<string name="vpn_credentials_dialog_connect">Cysylltu</string>
<string name="accessibility_dpad_left">Pwyntydd chwith</string>
<string name="accessibility_dpad_right">Pwyntydd de</string>
<string name="status_bar_firewall">Mur gwarchod</string>
<string name="battery_notification_channel_tv">Rhybudd batri</string>
<string name="screenshot_delete_label">Dileu</string>
<string name="screenshot_delete_description">Dileu sgrinlun</string>
<string name="screenrecord_delete_label">Dileu</string>
<string name="battery_notification_channel_tv">Rhybudd batri</string>
</resources>

View file

@ -65,10 +65,7 @@
<string name="vpn_credentials_username">Brugernavn</string>
<string name="vpn_credentials_password">Adgangskode</string>
<string name="vpn_credentials_dialog_connect">Forbind</string>
<string name="accessibility_dpad_left">Venstremarkør</string>
<string name="accessibility_dpad_right">Højremarkør</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Slet</string>
<string name="screenshot_delete_description">Slet skærmbillede</string>
<string name="screenrecord_delete_label">Slet</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Benutzername</string>
<string name="vpn_credentials_password">Passwort</string>
<string name="vpn_credentials_dialog_connect">Verbinden</string>
<string name="accessibility_dpad_left">Pfeiltaste links</string>
<string name="accessibility_dpad_right">Pfeiltaste rechts</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Löschen</string>
<string name="screenshot_delete_description">Screenshot löschen</string>
<string name="screenrecord_delete_label">Löschen</string>
<string name="screenrecord_delete_description">Bildschirmaufnahme gelöscht</string>
<string name="screenrecord_lowquality_label">Niedrigere Qualität</string>
<string name="screenrecord_lowquality_summary">Zum Verringern der Dateigröße</string>
<string name="screenrecord_longer_timeout_switch_label">Max. Dateigröße erhöhen</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC-Kodierung</string>
<string name="screenrecord_hevc_switch_summary">Effizienteren HEVC-Codec verwenden</string>
<string name="battery_notification_channel_tv">Akkuwarnung</string>
<string name="screenshot_delete_label">Löschen</string>
<string name="screenshot_delete_description">Screenshot löschen</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Όνομα χρήστη</string>
<string name="vpn_credentials_password">Κωδικός</string>
<string name="vpn_credentials_dialog_connect">Σύνδεση</string>
<string name="accessibility_dpad_left">Κέρσορας αριστερά</string>
<string name="accessibility_dpad_right">Κέρσορας δεξιά</string>
<string name="status_bar_firewall">Τείχος προστασίας</string>
<string name="screenshot_delete_label">Διαγραφή</string>
<string name="screenshot_delete_description">Διαγραφή στιγμιότυπου οθόνης</string>
<string name="screenrecord_delete_label">Διαγραφή</string>
<string name="screenrecord_delete_description">Η εγγραφή οθόνης διαγράφηκε</string>
<string name="screenrecord_lowquality_label">Μείωση ποιότητας</string>
<string name="screenrecord_lowquality_summary">Για μικρότερο μέγεθος αρχείου</string>
<string name="screenrecord_longer_timeout_switch_label">Μεγαλύτερο όριο μεγέθους αρχείου</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Κωδικοποίηση HEVC</string>
<string name="screenrecord_hevc_switch_summary">Χρησιμοποιήστε τον πιο αποδοτικό κωδικοποιητή HEVC</string>
<string name="battery_notification_channel_tv">Προειδοποίηση μπαταρίας</string>
<string name="screenshot_delete_label">Διαγραφή</string>
<string name="screenshot_delete_description">Διαγραφή στιγμιότυπου οθόνης</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Username</string>
<string name="vpn_credentials_password">Password</string>
<string name="vpn_credentials_dialog_connect">Connect</string>
<string name="accessibility_dpad_left">Cursor left</string>
<string name="accessibility_dpad_right">Cursor right</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
<string name="screenrecord_delete_label">Delete</string>
<string name="screenrecord_delete_description">Screen recording deleted</string>
<string name="screenrecord_lowquality_label">Lower quality</string>
<string name="screenrecord_lowquality_summary">For smaller file size</string>
<string name="screenrecord_longer_timeout_switch_label">Larger file size limit</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC encoding</string>
<string name="screenrecord_hevc_switch_summary">Use the more efficient HEVC encoder</string>
<string name="battery_notification_channel_tv">Battery warning</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Username</string>
<string name="vpn_credentials_password">Password</string>
<string name="vpn_credentials_dialog_connect">Connect</string>
<string name="accessibility_dpad_left">Cursor left</string>
<string name="accessibility_dpad_right">Cursor right</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
<string name="screenrecord_delete_label">Delete</string>
<string name="screenrecord_delete_description">Screen recording deleted</string>
<string name="screenrecord_lowquality_label">Lower quality</string>
<string name="screenrecord_lowquality_summary">For smaller file size</string>
<string name="screenrecord_longer_timeout_switch_label">Larger file size limit</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC encoding</string>
<string name="screenrecord_hevc_switch_summary">Use the more efficient HEVC encoder</string>
<string name="battery_notification_channel_tv">Battery warning</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Username</string>
<string name="vpn_credentials_password">Password</string>
<string name="vpn_credentials_dialog_connect">Connect</string>
<string name="accessibility_dpad_left">Cursor left</string>
<string name="accessibility_dpad_right">Cursor right</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
<string name="screenrecord_delete_label">Delete</string>
<string name="screenrecord_delete_description">Screen recording deleted</string>
<string name="screenrecord_lowquality_label">Lower quality</string>
<string name="screenrecord_lowquality_summary">For smaller file size</string>
<string name="screenrecord_longer_timeout_switch_label">Larger file size limit</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC encoding</string>
<string name="screenrecord_hevc_switch_summary">Use the more efficient HEVC encoder</string>
<string name="battery_notification_channel_tv">Battery warning</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Username</string>
<string name="vpn_credentials_password">Password</string>
<string name="vpn_credentials_dialog_connect">Connect</string>
<string name="accessibility_dpad_left">Cursor left</string>
<string name="accessibility_dpad_right">Cursor right</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
<string name="screenrecord_delete_label">Delete</string>
<string name="screenrecord_delete_description">Screen recording deleted</string>
<string name="screenrecord_lowquality_label">Lower quality</string>
<string name="screenrecord_lowquality_summary">For smaller file size</string>
<string name="screenrecord_longer_timeout_switch_label">Larger file size limit</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC encoding</string>
<string name="screenrecord_hevc_switch_summary">Use the more efficient HEVC encoder</string>
<string name="battery_notification_channel_tv">Battery warning</string>
<string name="screenshot_delete_label">Delete</string>
<string name="screenshot_delete_description">Delete screenshot</string>
</resources>

View file

@ -60,6 +60,4 @@
<string name="vpn_credentials_username">Usuario</string>
<string name="vpn_credentials_password">Contraseña</string>
<string name="vpn_credentials_dialog_connect">Conectar</string>
<string name="accessibility_dpad_left">Cursor izquierda</string>
<string name="accessibility_dpad_right">Cursor derecha</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Nombre de usuario</string>
<string name="vpn_credentials_password">Contraseña</string>
<string name="vpn_credentials_dialog_connect">Conectar</string>
<string name="accessibility_dpad_left">Cursor izquierdo</string>
<string name="accessibility_dpad_right">Cursor derecho</string>
<string name="status_bar_firewall">Cortafuegos</string>
<string name="screenshot_delete_label">Eliminar</string>
<string name="screenshot_delete_description">Eliminar captura de pantalla</string>
<string name="screenrecord_delete_label">Eliminar</string>
<string name="screenrecord_delete_description">Grabación de pantalla eliminada</string>
<string name="screenrecord_lowquality_label">Baja calidad</string>
<string name="screenrecord_lowquality_summary">Para un menor tamaño de archivo</string>
<string name="screenrecord_longer_timeout_switch_label">Límite de tamaño de archivo más grande</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Codificación HEVC</string>
<string name="screenrecord_hevc_switch_summary">Usar el codificador HEVC más eficiente</string>
<string name="battery_notification_channel_tv">Advertencia de batería</string>
<string name="screenshot_delete_label">Eliminar</string>
<string name="screenshot_delete_description">Eliminar captura de pantalla</string>
</resources>

View file

@ -49,6 +49,4 @@
<string name="vpn_credentials_username">Erabiltzaile-izena</string>
<string name="vpn_credentials_password">Pasahitza</string>
<string name="vpn_credentials_dialog_connect">Konektatu</string>
<string name="accessibility_dpad_left">Kurtsorea ezkerrean</string>
<string name="accessibility_dpad_right">Kurtsorearen eskuinean</string>
</resources>

View file

@ -19,25 +19,25 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="clock">ساعت</string>
<string name="global_action_restart_more">راه اندازی مجدد\u2026</string>
<string name="global_action_restart_more">راهاندازی مجدد\u2026</string>
<string name="global_action_restart_system">سامانه</string>
<string name="global_action_restart_recovery">ریکاوری</string>
<string name="global_action_restart_recovery">بازیابی</string>
<string name="global_action_restart_bootloader">بوت لودر</string>
<string name="global_action_restart_download">بارگیری</string>
<string name="global_action_restart_fastboot">فست‌بوت</string>
<string name="global_action_restart_progress">در حال راه‌اندازی مجدد /u2026</string>
<string name="global_action_restart_recovery_progress">راه اندازی مجدد به حالت ریکاوری\u2026</string>
<string name="global_action_restart_bootloader_progress">راه اندازی مجدد به حالت بوت لودر\u2026</string>
<string name="global_action_restart_progress">راه‌اندازی مجدد/u2026</string>
<string name="global_action_restart_recovery_progress">راه‌اندازی مجدد به حالت بازیابی\u2026</string>
<string name="global_action_restart_bootloader_progress">راهاندازی مجدد به حالت بوت لودر\u2026</string>
<string name="global_action_restart_download_progress">در حال راه‌اندازی دوباره به حالت بارگیری\u2026</string>
<string name="global_action_restart_fastboot_progress">درحال راه‌اندازی مجدد به حالت فست‌بوت</string>
<string name="global_action_restart_fastboot_progress">درحال راه‌اندازی مجدد به حالت فست‌بوت\u2026</string>
<string name="global_action_current_user">فعلی</string>
<string name="global_action_users">کاربران</string>
<string name="status_bar_icons_title">نمادهای نوار وضعیت</string>
<string name="drag_or_tap_to_add_tiles">نگه دارید &amp; بکشید یا ضربه بزنید تا کاشی‌ها را اضافه کنید.</string>
<string name="quick_settings_ambient_display_label">نمایش حساس به محیط</string>
<string name="accessibility_quick_settings_ambient_display_off">نمایش حساس به محیط خاموش.</string>
<string name="accessibility_quick_settings_ambient_display_on">نمایش حساس به محیط روشن.</string>
<string name="quick_settings_aod_label">صفحه نمایش همیشه روشن</string>
<string name="drag_or_tap_to_add_tiles">نگه دارید و بکشید یا ضربه بزنید تا کاشی‌ها را اضافه کنید</string>
<string name="quick_settings_ambient_display_label">نمایشگر محیطی</string>
<string name="accessibility_quick_settings_ambient_display_off">نمایشگر محیطی خاموش.</string>
<string name="accessibility_quick_settings_ambient_display_on">نمایشگر محیطی روشن.</string>
<string name="quick_settings_aod_label">صفحه همیشه روشن</string>
<string name="quick_settings_aod_off_powersave_label">صفحه همیشه روشن خاموش\nحالت ذخیره‌ی نیرو</string>
<string name="quick_settings_caffeine_label">کافئین</string>
<string name="accessibility_quick_settings_caffeine_off">حالت کافئین خاموش.</string>
@ -55,30 +55,26 @@
<string name="quick_settings_sync_label">همگام‌‌سازی</string>
<string name="accessibility_quick_settings_sync_off">همگام‌سازی خاموش.</string>
<string name="accessibility_quick_settings_sync_on">همگام‌سازی روشن.</string>
<string name="quick_settings_profiles_label">پروفایل‌ها</string>
<string name="accessibility_quick_settings_profiles_off">پروفایلها خاموش.</string>
<string name="accessibility_quick_settings_profiles">پروفایل: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">تترینگ یو‌اس‌بی</string>
<string name="quick_settings_profiles_label">نمایه‌های سامانه</string>
<string name="accessibility_quick_settings_profiles_off">نمایهها خاموش.</string>
<string name="accessibility_quick_settings_profiles">نمایه: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">اشتراک اینترنت یو‌اس‌بی</string>
<string name="quick_settings_vpn_label">VPN</string>
<string name="quick_settings_vpn_connect_dialog_title">اتصال به\u2026</string>
<string name="vpn_credentials_hint">لطفا برای اتصال به <xliff:g id="name">%s</xliff:g> اطلاعات خود را وارد کنید</string>
<string name="vpn_credentials_username">نام کاربری</string>
<string name="vpn_credentials_password">گذرواژه</string>
<string name="vpn_credentials_dialog_connect">اتصال</string>
<string name="accessibility_dpad_left">نشانگر چپ</string>
<string name="accessibility_dpad_right">نشانگر راست</string>
<string name="status_bar_firewall">دیوار آتش</string>
<string name="screenshot_delete_label">حذف</string>
<string name="screenshot_delete_description">حذف عکس صفحه</string>
<string name="screenrecord_delete_label">حذف</string>
<string name="screenrecord_delete_description">فیلم ضبط صفحه حذف شد</string>
<string name="screenrecord_lowquality_label">کیفیت کمتر</string>
<string name="screenrecord_lowquality_summary">برای انداره کوچیک تر فایل</string>
<string name="screenrecord_longer_timeout_switch_label">محدودیت اندازه فایل بزرگتر</string>
<string name="screenrecord_lowquality_summary">برای حجم پرونده کمتر</string>
<string name="screenrecord_longer_timeout_switch_label">محدودیت اندازه پرونده بزرگتر</string>
<string name="screenrecord_longer_timeout_switch_summary">محدود کردن اندازه ضبط به ۱۵ گیگابایت</string>
<string name="screenrecord_skip_time_label">رد کردن زمان‌سنج</string>
<string name="screenrecord_skip_time_summary">ردکردن 3 ثانیه انتظار</string>
<string name="screenrecord_skip_time_label">ردکردن زمان‌سنج</string>
<string name="screenrecord_skip_time_summary">ردکردن ۳ ثانیه انتظار</string>
<string name="screenrecord_hevc_switch_label">رمزگذاری HEVC</string>
<string name="screenrecord_hevc_switch_summary">از رمزگذار HEVC کارآمدتر استفاده کنید</string>
<string name="battery_notification_channel_tv">هشدار باتری</string>
<string name="screenshot_delete_label">حذف</string>
<string name="screenshot_delete_description">حذف عکس صفحه</string>
</resources>

View file

@ -62,10 +62,7 @@
<string name="vpn_credentials_username">Käyttäjänimi</string>
<string name="vpn_credentials_password">Salasana</string>
<string name="vpn_credentials_dialog_connect">Yhdistä</string>
<string name="accessibility_dpad_left">Kohdistin vasemmalle</string>
<string name="accessibility_dpad_right">Kohdistin oikealle</string>
<string name="status_bar_firewall">Palomuuri</string>
<string name="screenshot_delete_label">Poista</string>
<string name="screenshot_delete_description">Poista kuvakaappaus</string>
<string name="screenrecord_delete_label">Poista</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Nom dutilisateur</string>
<string name="vpn_credentials_password">Mot de passe</string>
<string name="vpn_credentials_dialog_connect">Se connecter</string>
<string name="accessibility_dpad_left">Curseur gauche</string>
<string name="accessibility_dpad_right">Curseur droit</string>
<string name="status_bar_firewall">Pare-feu</string>
<string name="screenshot_delete_label">Supprimer</string>
<string name="screenshot_delete_description">Supprimer la capture d\'écran</string>
<string name="screenrecord_delete_label">Supprimer</string>
<string name="screenrecord_delete_description">Enregistrement d\'écran supprimé</string>
<string name="screenrecord_lowquality_label">Diminuer la qualité</string>
<string name="screenrecord_lowquality_summary">Pour une taille de fichier plus petite</string>
<string name="screenrecord_longer_timeout_switch_label">Limite de taille de fichier plus grande</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Encodage HEVC</string>
<string name="screenrecord_hevc_switch_summary">Utiliser l\'encodeur HEVC le plus efficace</string>
<string name="battery_notification_channel_tv">Avertissement batterie</string>
<string name="screenshot_delete_label">Supprimer</string>
<string name="screenshot_delete_description">Supprimer la capture d\'écran</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Non utent</string>
<string name="vpn_credentials_password">Password</string>
<string name="vpn_credentials_dialog_connect">Conet</string>
<string name="accessibility_dpad_left">Cursôr a çampe</string>
<string name="accessibility_dpad_right">Cursôr a diestre</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Elimine</string>
<string name="screenshot_delete_description">Elimine schermade</string>
<string name="screenrecord_delete_label">Elimine</string>
<string name="screenrecord_delete_description">Regjistrazion schermi eliminade</string>
<string name="screenrecord_lowquality_label">Basse cualitât</string>
<string name="screenrecord_lowquality_summary">Par files di dimensions plui piçulis</string>
<string name="screenrecord_longer_timeout_switch_label">Massime dimension dal file</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Codifiche HEVC</string>
<string name="screenrecord_hevc_switch_summary">Dopre il codificadôr plui eficient HEVC</string>
<string name="battery_notification_channel_tv">Avîs batarie</string>
<string name="screenshot_delete_label">Elimine</string>
<string name="screenshot_delete_description">Elimine schermade</string>
</resources>

View file

@ -60,6 +60,4 @@
<string name="vpn_credentials_username">Brûkersnamme</string>
<string name="vpn_credentials_password">Wachtwurd</string>
<string name="vpn_credentials_dialog_connect">Ferbine</string>
<string name="accessibility_dpad_left">Cursor links</string>
<string name="accessibility_dpad_right">Cursor rjochts</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Ainm úsáideora</string>
<string name="vpn_credentials_password">Pasfhocal</string>
<string name="vpn_credentials_dialog_connect">Ceangal</string>
<string name="accessibility_dpad_left">Cúrsóir ar chlé</string>
<string name="accessibility_dpad_right">Cúrsóir ar dheis</string>
<string name="status_bar_firewall">Balla dóiteáin</string>
<string name="screenshot_delete_label">Scrios</string>
<string name="screenshot_delete_description">Scrios seat scáileáin</string>
<string name="screenrecord_delete_label">Scrios</string>
<string name="screenrecord_delete_description">Scriosadh an taifeadadh scáileáin</string>
<string name="screenrecord_lowquality_label">Caighdeán níos ísle</string>
<string name="screenrecord_lowquality_summary">Le haghaidh méid comhaid níos lú</string>
<string name="screenrecord_longer_timeout_switch_label">Teorainn méid comhaid níos mó</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Ionchódú HEVC</string>
<string name="screenrecord_hevc_switch_summary">Bain úsáid as an ionchódóir HEVC níos éifeachtaí</string>
<string name="battery_notification_channel_tv">Rabhadh ceallraí</string>
<string name="screenshot_delete_label">Scrios</string>
<string name="screenshot_delete_description">Scrios seat scáileáin</string>
</resources>

View file

@ -62,6 +62,4 @@
<string name="vpn_credentials_username">Ainm-cleachdaiche</string>
<string name="vpn_credentials_password">Facal-faire</string>
<string name="vpn_credentials_dialog_connect">Ceangail</string>
<string name="accessibility_dpad_left">Cùrsair clì</string>
<string name="accessibility_dpad_right">Cùrsair deas</string>
</resources>

View file

@ -62,6 +62,4 @@
<string name="vpn_credentials_username">Nome de usuario</string>
<string name="vpn_credentials_password">Contrasinal</string>
<string name="vpn_credentials_dialog_connect">Conectar</string>
<string name="accessibility_dpad_left">Cursor á esquerda</string>
<string name="accessibility_dpad_right">Cursor á dereita</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">પ્રોફાઇલ્સ બંધ.</string>
<string name="accessibility_quick_settings_profiles">પ્રોફાઇલ: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB ટિથરિંગ</string>
<string name="accessibility_dpad_left">કર્સર ડાબું</string>
<string name="accessibility_dpad_right">કર્સર જમણું</string>
</resources>

View file

@ -31,6 +31,4 @@
<string name="accessibility_quick_settings_profiles_off">प्रोफ़ाइलें बंद है।</string>
<string name="accessibility_quick_settings_profiles">प्रोफ़ाइल: <xliff:g id="profile" example="Default">%s</xliff:g></string>
<string name="quick_settings_usb_tether_label">यूएसबी टेदरिंग</string>
<string name="accessibility_dpad_left">कर्सर बायाँ</string>
<string name="accessibility_dpad_right">कर्सर दायाँ</string>
</resources>

View file

@ -45,6 +45,4 @@
<string name="accessibility_quick_settings_profiles_off">Profili isklučeni.</string>
<string name="accessibility_quick_settings_profiles">Profil: <xliff:g id="profile" example="Default">%s </xliff:g>.</string>
<string name="quick_settings_usb_tether_label">Dijeljenje veze preko USB-a</string>
<string name="accessibility_dpad_left">Kursor lijevo</string>
<string name="accessibility_dpad_right">Kursor desno</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Felhasználónév</string>
<string name="vpn_credentials_password">Jelszó</string>
<string name="vpn_credentials_dialog_connect">Kapcsolódás</string>
<string name="accessibility_dpad_left">Kurzor balra</string>
<string name="accessibility_dpad_right">Kurzor jobbra</string>
<string name="status_bar_firewall">Tűzfal</string>
<string name="screenshot_delete_label">Törlés</string>
<string name="screenshot_delete_description">A képernyőkép törlése</string>
<string name="screenrecord_delete_label">Törlés</string>
<string name="screenrecord_delete_description">A képernyőfelvétel törölve</string>
<string name="screenrecord_lowquality_label">Gyengébb minőség</string>
<string name="screenrecord_lowquality_summary">... hogy kisebbek legyenek a fájlok</string>
<string name="screenrecord_longer_timeout_switch_label">A nagy fájlméret felső határa</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC-kódolás</string>
<string name="screenrecord_hevc_switch_summary">Használja a hatékonyabb HEVC-kódolót</string>
<string name="battery_notification_channel_tv">Akkumulátor-figyelmeztetés</string>
<string name="screenshot_delete_label">Törlés</string>
<string name="screenshot_delete_description">A képernyőkép törlése</string>
</resources>

View file

@ -63,16 +63,12 @@
<string name="vpn_credentials_username">Nama pengguna</string>
<string name="vpn_credentials_password">Kata sandi</string>
<string name="vpn_credentials_dialog_connect">Hubungkan</string>
<string name="accessibility_dpad_left">Kursor kiri</string>
<string name="accessibility_dpad_right">Kursor kanan</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Hapus</string>
<string name="screenrecord_delete_label">Hapus</string>
<string name="screenrecord_delete_description">Rekaman layar dihapus</string>
<string name="screenrecord_lowquality_label">Kualitas rendah</string>
<string name="screenrecord_lowquality_summary">Untuk ukuran file yang lebih kecil</string>
<string name="screenrecord_longer_timeout_switch_summary">Batasi ukuran perekaman hingga 15 GB</string>
<string name="screenrecord_hevc_switch_label">HEVC encoding</string>
<string name="screenrecord_hevc_switch_summary">Gunakan HEVC encoder yang lebih efisien</string>
<string name="battery_notification_channel_tv">Peringatan baterai</string>
<string name="screenshot_delete_label">Hapus</string>
</resources>

View file

@ -65,7 +65,5 @@
<string name="vpn_credentials_username">Notandanafn</string>
<string name="vpn_credentials_password">Lykilorð</string>
<string name="vpn_credentials_dialog_connect">Tengjast</string>
<string name="accessibility_dpad_left">Bendill til vinstri</string>
<string name="accessibility_dpad_right">Bendill til hægri</string>
<string name="status_bar_firewall">Eldveggur</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Username</string>
<string name="vpn_credentials_password">Password</string>
<string name="vpn_credentials_dialog_connect">Connetti</string>
<string name="accessibility_dpad_left">Cursore a sinistra</string>
<string name="accessibility_dpad_right">Cursore a destra</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Elimina</string>
<string name="screenshot_delete_description">Elimina schermata</string>
<string name="screenrecord_delete_label">Elimina</string>
<string name="screenrecord_delete_description">Registrazione schermo eliminata</string>
<string name="screenrecord_lowquality_label">Bassa qualità</string>
<string name="screenrecord_lowquality_summary">Per file di dimensioni minori</string>
<string name="screenrecord_longer_timeout_switch_label">Massima dimensione del file</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Codifica HEVC</string>
<string name="screenrecord_hevc_switch_summary">Usa la più efficiente codifica HEVC</string>
<string name="battery_notification_channel_tv">Avviso batteria</string>
<string name="screenshot_delete_label">Elimina</string>
<string name="screenshot_delete_description">Elimina schermata</string>
</resources>

View file

@ -54,6 +54,4 @@
<string name="vpn_credentials_username">שם משתמש</string>
<string name="vpn_credentials_password">סיסמה</string>
<string name="vpn_credentials_dialog_connect">התחבר</string>
<string name="accessibility_dpad_left">סמן שמאלה</string>
<string name="accessibility_dpad_right">סמן ימינה</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">ユーザー名</string>
<string name="vpn_credentials_password">パスワード</string>
<string name="vpn_credentials_dialog_connect">接続</string>
<string name="accessibility_dpad_left">カーソルを左へ</string>
<string name="accessibility_dpad_right">カーソルを右へ</string>
<string name="status_bar_firewall">ファイアウォール</string>
<string name="screenshot_delete_label">削除</string>
<string name="screenshot_delete_description">スクリーンショットを削除</string>
<string name="screenrecord_delete_label">削除</string>
<string name="screenrecord_delete_description">画面録画を削除しました</string>
<string name="screenrecord_lowquality_label">低品質にする</string>
<string name="screenrecord_lowquality_summary">低品質にしてファイルサイズを縮小します</string>
<string name="screenrecord_longer_timeout_switch_label">ファイルサイズの上限を上げる</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC エンコーディング</string>
<string name="screenrecord_hevc_switch_summary">より効率的な HEVC エンコーダを使用します</string>
<string name="battery_notification_channel_tv">バッテリー警告</string>
<string name="screenshot_delete_label">削除</string>
<string name="screenshot_delete_description">スクリーンショットを削除</string>
</resources>

View file

@ -65,11 +65,8 @@
<string name="vpn_credentials_username">მომხმარებელი</string>
<string name="vpn_credentials_password">პაროლი</string>
<string name="vpn_credentials_dialog_connect">დაკავშირება</string>
<string name="accessibility_dpad_left">მაჩვენებელი მარცხნივ</string>
<string name="accessibility_dpad_right">მიმთითებელი მარჯვნივ</string>
<string name="status_bar_firewall">ქსელის ფარი</string>
<string name="battery_notification_channel_tv">ბატარეის გაფრთხილება</string>
<string name="screenshot_delete_label">წაშლა</string>
<string name="screenshot_delete_description">ეკრანის სურათის წაშლა</string>
<string name="screenrecord_delete_label">წაშლა</string>
<string name="battery_notification_channel_tv">ბატარეის გაფრთხილება</string>
</resources>

View file

@ -51,6 +51,4 @@
<string name="vpn_credentials_username">Isem n useqdac</string>
<string name="vpn_credentials_password">Awal uffir</string>
<string name="vpn_credentials_dialog_connect">Qqen</string>
<string name="accessibility_dpad_left">Taḥenaccaḍt tazelmadt</string>
<string name="accessibility_dpad_right">Taḥenaccaḍt tayeffust</string>
</resources>

View file

@ -46,6 +46,4 @@
<string name="accessibility_quick_settings_profiles_off">ಪ್ರೊಫೈಲ್ಸ್ ಆಫ್.</string>
<string name="accessibility_quick_settings_profiles">ಪ್ರೊಫೈಲ್: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">ಯುಎಸ್‍ಬಿ ಟೆಥರಿಂಗ್</string>
<string name="accessibility_dpad_left">ಸೂಚಕದ ಎಡ</string>
<string name="accessibility_dpad_right">ಸೂಚಕದ ಬಲ</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">사용자 이름</string>
<string name="vpn_credentials_password">비밀번호</string>
<string name="vpn_credentials_dialog_connect">연결</string>
<string name="accessibility_dpad_left">커서 왼쪽</string>
<string name="accessibility_dpad_right">커서 오른쪽</string>
<string name="status_bar_firewall">방화벽</string>
<string name="screenshot_delete_label">삭제</string>
<string name="screenshot_delete_description">스크린샷 삭제</string>
<string name="screenrecord_delete_label">삭제</string>
<string name="screenrecord_delete_description">화면 녹화 영상이 삭제되었습니다.</string>
<string name="screenrecord_lowquality_label">낮은 품질</string>
<string name="screenrecord_lowquality_summary">파일 용량 축소</string>
<string name="screenrecord_longer_timeout_switch_label">파일 크기 제한 확장</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC 인코딩</string>
<string name="screenrecord_hevc_switch_summary">더 효율적인 HEVC 인코더 사용</string>
<string name="battery_notification_channel_tv">배터리 경고</string>
<string name="screenshot_delete_label">삭제</string>
<string name="screenshot_delete_description">스크린샷 삭제</string>
</resources>

View file

@ -22,6 +22,4 @@
<string name="quick_settings_heads_up_label">فه‌رمووه‌کان</string>
<string name="quick_settings_profiles_label">زانیاری تایبەتیەکانی سیستەم</string>
<string name="quick_settings_usb_tether_label">گرتنەدەستی USB</string>
<string name="accessibility_dpad_left">جێنیشانده‌ر بۆ لای چه‌پ</string>
<string name="accessibility_dpad_right">جێنیشانده‌ر بۆ لای ڕاست</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">Profiller aus.</string>
<string name="accessibility_quick_settings_profiles">Profil: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB-Tethering</string>
<string name="accessibility_dpad_left">Cursor lénks</string>
<string name="accessibility_dpad_right">Cursor riets</string>
</resources>

View file

@ -31,6 +31,4 @@
<string name="accessibility_quick_settings_profiles_off">Profiliai išjungti.</string>
<string name="accessibility_quick_settings_profiles">Profilis: <xliff:g id="profile" example="Default">%s </xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB susiejimas</string>
<string name="accessibility_dpad_left">Žymeklis kairėje</string>
<string name="accessibility_dpad_right">Žymeklis dešinėje</string>
</resources>

View file

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/**
* Copyright (c) 2015, The CyanogenMod Project
* Copyright (c) 2017-2021 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="accessibility_dpad_left">Kursoru pa kreisi</string>
<string name="accessibility_dpad_right">Kursoru pa labi</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">പ്രൊഫൈലുകൾ ഓഫ്.</string>
<string name="accessibility_quick_settings_profiles">പ്രൊഫൈൽ: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB ടെതറിംഗ്</string>
<string name="accessibility_dpad_left">കർസർ ഇടത്</string>
<string name="accessibility_dpad_right">കർസർ വലത്</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">प्रोफाइल्स बंद.</string>
<string name="accessibility_quick_settings_profiles">प्रोफाइल: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB टेदरिंग</string>
<string name="accessibility_dpad_left">कर्सर डावा</string>
<string name="accessibility_dpad_right">कर्सर उजवा</string>
</resources>

View file

@ -63,6 +63,4 @@
<string name="vpn_credentials_username">အသုံးပြုသူအမည်</string>
<string name="vpn_credentials_password">လျှို့ဝှက်နံပါတ်</string>
<string name="vpn_credentials_dialog_connect">ချိတ်ဆက်မည်</string>
<string name="accessibility_dpad_left">Cursor ဘယ်ဖက်</string>
<string name="accessibility_dpad_right">Coursor ညာဖက်</string>
</resources>

View file

@ -46,6 +46,4 @@
<string name="accessibility_quick_settings_profiles_off">Profiler av.</string>
<string name="accessibility_quick_settings_profiles">Profil: <xliff:g id="profile" example="Default">%s </xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB tethering</string>
<string name="accessibility_dpad_left">Markør til venstre</string>
<string name="accessibility_dpad_right">Markør til høyre</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Gebruikersnaam</string>
<string name="vpn_credentials_password">Wachtwoord</string>
<string name="vpn_credentials_dialog_connect">Verbinden </string>
<string name="accessibility_dpad_left">Cursor links</string>
<string name="accessibility_dpad_right">Cursor rechts</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Verwijder</string>
<string name="screenshot_delete_description">Verwijder screenshot</string>
<string name="screenrecord_delete_label">Verwijder</string>
<string name="screenrecord_delete_description">Schermopname verwijderd</string>
<string name="screenrecord_lowquality_label">Lagere kwaliteit</string>
<string name="screenrecord_lowquality_summary">Voor kleinere bestandsgrootte</string>
<string name="screenrecord_longer_timeout_switch_label">Grotere limiet bestandsgrootte</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC codering</string>
<string name="screenrecord_hevc_switch_summary">Gebruik de efficiëntere HEVC-encoder</string>
<string name="battery_notification_channel_tv">Batterij waarschuwing</string>
<string name="screenshot_delete_label">Verwijder</string>
<string name="screenshot_delete_description">Verwijder screenshot</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">ପ୍ରୋଫାଇଲ୍‍ଗୁଡିକ ଅଫ୍‍ ଅଛି।</string>
<string name="accessibility_quick_settings_profiles">ପ୍ରୋଫାଇଲ୍‍: <xliff:g id="profile" example="Default">%s</xliff:g></string>
<string name="quick_settings_usb_tether_label">USB ଟିଥରିଂ</string>
<string name="accessibility_dpad_left">କର୍ସର୍‍ ବାମ</string>
<string name="accessibility_dpad_right">କର୍ସର୍ ଡାହାଣ</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Nazwa użytkownika</string>
<string name="vpn_credentials_password">Hasło</string>
<string name="vpn_credentials_dialog_connect">Połącz</string>
<string name="accessibility_dpad_left">Kursor w lewo</string>
<string name="accessibility_dpad_right">Kursor w prawo</string>
<string name="status_bar_firewall">Zapora sieciowa</string>
<string name="screenshot_delete_label">Usuń</string>
<string name="screenshot_delete_description">Usuń zrzut ekranu</string>
<string name="screenrecord_delete_label">Usuń</string>
<string name="screenrecord_delete_description">Usunięto nagranie ekranu</string>
<string name="screenrecord_lowquality_label">Niższa jakość</string>
<string name="screenrecord_lowquality_summary">Dla mniejszego rozmiaru pliku</string>
<string name="screenrecord_longer_timeout_switch_label">Większy limit rozmiaru pliku</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Kodowanie HEVC</string>
<string name="screenrecord_hevc_switch_summary">Używaj skuteczniejszego kodera HEVC</string>
<string name="battery_notification_channel_tv">Ostrzeżenie dotyczące baterii</string>
<string name="screenshot_delete_label">Usuń</string>
<string name="screenshot_delete_description">Usuń zrzut ekranu</string>
</resources>

View file

@ -21,12 +21,12 @@
<string name="clock">Relógio</string>
<string name="global_action_restart_more">Reiniciar\u2026</string>
<string name="global_action_restart_system">Sistema</string>
<string name="global_action_restart_recovery">Recovery</string>
<string name="global_action_restart_recovery">Recuperação</string>
<string name="global_action_restart_bootloader">Bootloader</string>
<string name="global_action_restart_download">Download</string>
<string name="global_action_restart_fastboot">Fastbootd</string>
<string name="global_action_restart_progress">Reiniciando\u2026</string>
<string name="global_action_restart_recovery_progress">Reiniciando no modo Recovery\u2026</string>
<string name="global_action_restart_recovery_progress">Reiniciando para o modo de recuperação\u2026</string>
<string name="global_action_restart_bootloader_progress">Reiniciando no modo bootloader\u2026</string>
<string name="global_action_restart_download_progress">Reiniciando no modo de download\u2026</string>
<string name="global_action_restart_fastboot_progress">Reiniciando no modo fastbootd\u2026</string>
@ -38,20 +38,20 @@
<string name="accessibility_quick_settings_ambient_display_off">Tela ambiente desativada.</string>
<string name="accessibility_quick_settings_ambient_display_on">Tela ambiente ativada.</string>
<string name="quick_settings_aod_label">AOD</string>
<string name="quick_settings_aod_off_powersave_label">AOD desativado\nEconomia de bateria</string>
<string name="quick_settings_aod_off_powersave_label">AOD desligada\nEconomia de bateria</string>
<string name="quick_settings_caffeine_label">Cafeína</string>
<string name="accessibility_quick_settings_caffeine_off">Cafeína desligada.</string>
<string name="accessibility_quick_settings_caffeine_on">Cafeína ligada.</string>
<string name="quick_settings_heads_up_label">Notificações pop-up</string>
<string name="accessibility_quick_settings_heads_up_off">Notificações pop-up desativadas.</string>
<string name="accessibility_quick_settings_heads_up_on">Notificações pop-up desativadas.</string>
<string name="accessibility_quick_settings_heads_up_on">Notificações pop-up ativadas.</string>
<string name="quick_settings_powershare_label">Wireless PowerShare</string>
<string name="quick_settings_powershare_off_powersave_label">Wireless PowerShare desligado\nEconomia de bateria</string>
<string name="quick_settings_powershare_off_low_battery_label">Wireless PowerShare desligado\nBateria muito fraca</string>
<string name="quick_settings_powershare_off_powersave_label">Wireless PowerShare desativado\nEconomia de bateria</string>
<string name="quick_settings_powershare_off_low_battery_label">Wireless PowerShare desativado\nBateria fraca</string>
<string name="quick_settings_powershare_enabled_label">O Wireless PowerShare está ativado</string>
<string name="quick_settings_reading_mode">Modo de leitura</string>
<string name="accessibility_quick_settings_reading_mode_on">Modo de leitura ligado</string>
<string name="accessibility_quick_settings_reading_mode_off">Modo de leitura desligado</string>
<string name="accessibility_quick_settings_reading_mode_on">Modo de leitura ativado.</string>
<string name="accessibility_quick_settings_reading_mode_off">Modo de leitura desativado.</string>
<string name="quick_settings_sync_label">Sincronização</string>
<string name="accessibility_quick_settings_sync_off">Sincronização desativada.</string>
<string name="accessibility_quick_settings_sync_on">Sincronização ativada.</string>
@ -61,24 +61,20 @@
<string name="quick_settings_usb_tether_label">Tethering USB</string>
<string name="quick_settings_vpn_label">VPN</string>
<string name="quick_settings_vpn_connect_dialog_title">Conectar-se a\u2026</string>
<string name="vpn_credentials_hint">Por favor, insira as suas credenciais para conectar-se a <xliff:g id="name">%s</xliff:g></string>
<string name="vpn_credentials_username">Usuário</string>
<string name="vpn_credentials_hint">Por favor, digite as suas credenciais para conectar-se a <xliff:g id="name">%s</xliff:g></string>
<string name="vpn_credentials_username">Nome de usuário</string>
<string name="vpn_credentials_password">Senha</string>
<string name="vpn_credentials_dialog_connect">Conectar</string>
<string name="accessibility_dpad_left">Cursor à esquerda</string>
<string name="accessibility_dpad_right">Cursor à direita</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Excluir</string>
<string name="screenshot_delete_description">Excluir captura de tela</string>
<string name="screenrecord_delete_label">Excluir</string>
<string name="screenrecord_delete_description">Gravação de tela excluída</string>
<string name="screenrecord_lowquality_label">Qualidade mais baixa</string>
<string name="screenrecord_lowquality_summary">Para tamanho de arquivo menor</string>
<string name="screenrecord_lowquality_label">Baixa qualidade</string>
<string name="screenrecord_lowquality_summary">Para arquivos menores</string>
<string name="screenrecord_longer_timeout_switch_label">Limite de tamanho de arquivo maior</string>
<string name="screenrecord_longer_timeout_switch_summary">Limitar o tamanho de gravação para 15 GB</string>
<string name="screenrecord_longer_timeout_switch_summary">Limitar o tamanho da gravação para 15 GB</string>
<string name="screenrecord_skip_time_label">Pular o temporizador</string>
<string name="screenrecord_skip_time_summary">Remover a espera de 3 segundos</string>
<string name="screenrecord_hevc_switch_label">Codificação HEVC</string>
<string name="screenrecord_hevc_switch_summary">Use o codificador HEVC mais eficiente</string>
<string name="screenrecord_hevc_switch_summary">Usar o codificador HEVC, que é mais eficiente</string>
<string name="battery_notification_channel_tv">Alerta de bateria</string>
<string name="screenshot_delete_label">Excluir</string>
<string name="screenshot_delete_description">Excluir captura de tela</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Nome de utilizador</string>
<string name="vpn_credentials_password">Palavra-passe</string>
<string name="vpn_credentials_dialog_connect">Ligar</string>
<string name="accessibility_dpad_left">Cursor à esquerda</string>
<string name="accessibility_dpad_right">Cursor à direita</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Eliminar</string>
<string name="screenshot_delete_description">Eliminar captura de ecrã</string>
<string name="screenrecord_delete_label">Eliminar</string>
<string name="screenrecord_delete_description">Gravação de ecrã eliminada</string>
<string name="screenrecord_lowquality_label">Qualidade mais baixa</string>
<string name="screenrecord_lowquality_summary">Para um ficheiro de menor tamanho</string>
<string name="screenrecord_longer_timeout_switch_label">Limite de tamanho para ficheiros maiores</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Codificação HEVC</string>
<string name="screenrecord_hevc_switch_summary">Utilizar o codificador HEVC, mais eficiente</string>
<string name="battery_notification_channel_tv">Aviso de bateria</string>
<string name="screenshot_delete_label">Eliminar</string>
<string name="screenshot_delete_description">Eliminar captura de ecrã</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Nume de utilizator</string>
<string name="vpn_credentials_password">Parolă</string>
<string name="vpn_credentials_dialog_connect">Conectare</string>
<string name="accessibility_dpad_left">Cursor stânga</string>
<string name="accessibility_dpad_right">Cursor dreapta</string>
<string name="status_bar_firewall">Firewall</string>
<string name="screenshot_delete_label">Șterge</string>
<string name="screenshot_delete_description">Ștergeți captura de ecran</string>
<string name="screenrecord_delete_label">Șterge</string>
<string name="screenrecord_delete_description">Înregistrare ecran ștearsă</string>
<string name="screenrecord_lowquality_label">Calitate scăzută</string>
<string name="screenrecord_lowquality_summary">Pentru o dimensiune mai mică a fișierului</string>
<string name="screenrecord_longer_timeout_switch_label">Limită mai mare a dimensiunii fișierului</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Codare HEVC</string>
<string name="screenrecord_hevc_switch_summary">Utilizați codificatorul HEVC mai eficient</string>
<string name="battery_notification_channel_tv">Avertizare baterie</string>
<string name="screenshot_delete_label">Șterge</string>
<string name="screenshot_delete_description">Ștergeți captura de ecran</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Имя пользователя</string>
<string name="vpn_credentials_password">Пароль</string>
<string name="vpn_credentials_dialog_connect">Подключиться</string>
<string name="accessibility_dpad_left">Курсор влево</string>
<string name="accessibility_dpad_right">Курсор вправо</string>
<string name="status_bar_firewall">Брандмауэр</string>
<string name="screenshot_delete_label">Удалить</string>
<string name="screenshot_delete_description">Удалить скриншот</string>
<string name="screenrecord_delete_label">Удалить</string>
<string name="screenrecord_delete_description">Запись экрана удалена</string>
<string name="screenrecord_lowquality_label">Низкое качество</string>
<string name="screenrecord_lowquality_summary">Для уменьшения размера файла</string>
<string name="screenrecord_longer_timeout_switch_label">Ограничение на размер файла</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Кодирование HEVC</string>
<string name="screenrecord_hevc_switch_summary">Использовать более эффективный кодер HEVC</string>
<string name="battery_notification_channel_tv">Предупреждение батареи</string>
<string name="screenshot_delete_label">Удалить</string>
<string name="screenshot_delete_description">Удалить скриншот</string>
</resources>

View file

@ -29,7 +29,6 @@
<string name="quick_settings_reading_mode">Modalidade letura</string>
<string name="quick_settings_profiles_label">Profilos de sistema</string>
<string name="accessibility_quick_settings_profiles">Profilu: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="screenrecord_delete_description">Registratzione de ischermu cantzellada</string>
<string name="screenrecord_lowquality_label">Calidade bàscia</string>
<string name="screenrecord_lowquality_summary">Pro una mannària de archìviu prus minore</string>
<string name="screenrecord_longer_timeout_switch_label">Lìmite de mannària de archìviu prus mannu</string>

View file

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/**
* Copyright (c) 2015, The CyanogenMod Project
* Copyright (c) 2017-2021 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="accessibility_dpad_left">වම් කර්සරය</string>
<string name="accessibility_dpad_right">දකුණු කර්සරය</string>
</resources>

View file

@ -62,6 +62,4 @@
<string name="vpn_credentials_username">Užívateľské meno</string>
<string name="vpn_credentials_password">Heslo</string>
<string name="vpn_credentials_dialog_connect">Pripojiť</string>
<string name="accessibility_dpad_left">Kurzor vľavo</string>
<string name="accessibility_dpad_right">Kurzor vpravo</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Uporabniško ime</string>
<string name="vpn_credentials_password">Geslo</string>
<string name="vpn_credentials_dialog_connect">Poveži</string>
<string name="accessibility_dpad_left">Kazalec levo</string>
<string name="accessibility_dpad_right">Kazalec desno</string>
<string name="status_bar_firewall">Požarni zid</string>
<string name="screenshot_delete_label">Izbriši</string>
<string name="screenshot_delete_description">Izbriši zaslonsko sliko</string>
<string name="screenrecord_delete_label">Izbriši</string>
<string name="screenrecord_delete_description">Posnetek zaslona izbrisan</string>
<string name="screenrecord_lowquality_label">Nižja kakovost</string>
<string name="screenrecord_lowquality_summary">Za manjšo velikost datoteke</string>
<string name="screenrecord_longer_timeout_switch_label">Omejitev večje velikosti datoteke</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC kodiranje</string>
<string name="screenrecord_hevc_switch_summary">Uporabi bolj učinkovit HEVC kodirnik</string>
<string name="battery_notification_channel_tv">Opozorilo baterije</string>
<string name="screenshot_delete_label">Izbriši</string>
<string name="screenshot_delete_description">Izbriši zaslonsko sliko</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Perdoruesi</string>
<string name="vpn_credentials_password">Fjalëkalimi</string>
<string name="vpn_credentials_dialog_connect">Lidhu</string>
<string name="accessibility_dpad_left">Kursori majtas</string>
<string name="accessibility_dpad_right">Kursori djathtas</string>
<string name="status_bar_firewall">Muri i zjarrit</string>
<string name="screenshot_delete_label">Fshije</string>
<string name="screenshot_delete_description">Fshi pamjen e ekranit</string>
<string name="screenrecord_delete_label">Fshije</string>
<string name="screenrecord_delete_description">Regjistrimi i ekranit u fshi</string>
<string name="screenrecord_lowquality_label">Cilësi më të ulët</string>
<string name="screenrecord_lowquality_summary">Për madhësi më të vogël të skedarit</string>
<string name="screenrecord_longer_timeout_switch_label">Kufiri më i madh i madhësisë së skedarit</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Kodimi HEVC</string>
<string name="screenrecord_hevc_switch_summary">Përdorni koduesin më efikas HEVC</string>
<string name="battery_notification_channel_tv">Paralajmërim për baterinë</string>
<string name="screenshot_delete_label">Fshije</string>
<string name="screenshot_delete_description">Fshi pamjen e ekranit</string>
</resources>

View file

@ -54,6 +54,4 @@
<string name="vpn_credentials_username">Корисничко име</string>
<string name="vpn_credentials_password">Лозинка</string>
<string name="vpn_credentials_dialog_connect">Повежи се</string>
<string name="accessibility_dpad_left">Курсор улево</string>
<string name="accessibility_dpad_right">Курсор удесно</string>
</resources>

View file

@ -65,11 +65,8 @@
<string name="vpn_credentials_username">Användarnamn</string>
<string name="vpn_credentials_password">Lösenord</string>
<string name="vpn_credentials_dialog_connect">Anslut</string>
<string name="accessibility_dpad_left">Markör till vänster</string>
<string name="accessibility_dpad_right">Markör till höger</string>
<string name="status_bar_firewall">Brandvägg</string>
<string name="screenshot_delete_label">Radera</string>
<string name="screenrecord_delete_label">Radera</string>
<string name="screenrecord_lowquality_summary">För mindre filstorlek</string>
<string name="screenrecord_hevc_switch_summary">Använd den effektivare HEVC-kodaren</string>
<string name="screenshot_delete_label">Radera</string>
</resources>

View file

@ -61,17 +61,11 @@
<string name="quick_settings_usb_tether_label">USB இணைப்புப்பகிர்வு</string>
<string name="quick_settings_vpn_label">VPN</string>
<string name="quick_settings_vpn_connect_dialog_title">\u2026 உடன் இணைக்க</string>
<string name="vpn_credentials_hint"><xliff:g id="name">%s</xliff:g> உடன் இணைக்க உங்கள் சான்றுகளை உள்ளிடுக</string>
<string name="vpn_credentials_hint"><xliff:g id="name">%s</xliff:g> உடன் இணைக்க உங்கள் சான்றுகளை உள்ளிடவும்</string>
<string name="vpn_credentials_username">பயனர்பெயர்</string>
<string name="vpn_credentials_password">கடவுச்சொல்</string>
<string name="vpn_credentials_dialog_connect">இணைக்க</string>
<string name="accessibility_dpad_left">இடஞ்சுட்டி இடது</string>
<string name="accessibility_dpad_right">இடஞ்சுட்டி வலது</string>
<string name="status_bar_firewall">தீயரண்</string>
<string name="screenshot_delete_label">நீக்குக</string>
<string name="screenshot_delete_description">திரைப்பிடிப்பை நீக்குக</string>
<string name="screenrecord_delete_label">நீக்குக</string>
<string name="screenrecord_delete_description">திரைப்பதிவு நீக்கப்பட்டது</string>
<string name="screenrecord_lowquality_label">குறைந்த தரம்</string>
<string name="screenrecord_lowquality_summary">சிறிய கோப்பு அளவிற்கு</string>
<string name="screenrecord_longer_timeout_switch_label">பெரிய கோப்பு அளவு வரம்பு</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC குறியேற்றம்</string>
<string name="screenrecord_hevc_switch_summary">கூடுதல் திறன் வாய்ந்த HEVC குறியேற்றியைப் பயன்படுத்துக</string>
<string name="battery_notification_channel_tv">மின்கல எச்சரிக்கை</string>
<string name="screenshot_delete_label">நீக்குக</string>
<string name="screenshot_delete_description">திரைப்பிடிப்பை நீக்குக</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">ప్రోఫైళ్ళు ఆఫ్.</string>
<string name="accessibility_quick_settings_profiles">ప్రొఫైల్: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB టీథరింగ్</string>
<string name="accessibility_dpad_left">కర్సర్ ఎడమకి</string>
<string name="accessibility_dpad_right">కర్సర్ కుడికి</string>
</resources>

View file

@ -59,6 +59,4 @@
<string name="vpn_credentials_username">ชื่อผู้ใช้</string>
<string name="vpn_credentials_password">รหัสผ่าน</string>
<string name="vpn_credentials_dialog_connect">เชื่อมต่อ</string>
<string name="accessibility_dpad_left">เคอร์เซอร์ซ้าย</string>
<string name="accessibility_dpad_right">เคอร์เซอร์ขวา</string>
</resources>

View file

@ -65,10 +65,7 @@
<string name="vpn_credentials_username">Kullanıcı adı</string>
<string name="vpn_credentials_password">Şifre</string>
<string name="vpn_credentials_dialog_connect">Bağlan</string>
<string name="accessibility_dpad_left">Sol imleç</string>
<string name="accessibility_dpad_right">Sağ imleç</string>
<string name="status_bar_firewall">Güvenlik Duvarı</string>
<string name="screenshot_delete_label">Sil</string>
<string name="screenshot_delete_description">Ekran görüntüsünü sil</string>
<string name="screenrecord_delete_label">Sil</string>
</resources>

View file

@ -34,6 +34,4 @@
<string name="accessibility_quick_settings_profiles_off">مۇھىت ھالىتى تاقاق.</string>
<string name="accessibility_quick_settings_profiles">مۇھىت ھالىتى: <xliff:g id="profile" example="Default">%s</xliff:g>.</string>
<string name="quick_settings_usb_tether_label">USB ھەمبەھىر</string>
<string name="accessibility_dpad_left">نۇربەلگە سولغا</string>
<string name="accessibility_dpad_right">نۇر بەلگە ئوڭغا</string>
</resources>

View file

@ -56,6 +56,4 @@
<string name="vpn_credentials_username">Користувацьке ім\'я</string>
<string name="vpn_credentials_password">Пароль</string>
<string name="vpn_credentials_dialog_connect">З\'єднатись</string>
<string name="accessibility_dpad_left">Курсор ліворуч</string>
<string name="accessibility_dpad_right">Курсор праворуч</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">Tên người dùng</string>
<string name="vpn_credentials_password">Mật khẩu</string>
<string name="vpn_credentials_dialog_connect">Kết nối</string>
<string name="accessibility_dpad_left">Trỏ trái</string>
<string name="accessibility_dpad_right">Trỏ phải</string>
<string name="status_bar_firewall">Tường lửa</string>
<string name="screenshot_delete_label">Xóa</string>
<string name="screenshot_delete_description">Xóa ảnh chụp màn hình</string>
<string name="screenrecord_delete_label">Xóa</string>
<string name="screenrecord_delete_description">Đã xóa bản ghi màn hình</string>
<string name="screenrecord_lowquality_label">Chất lượng thấp hơn</string>
<string name="screenrecord_lowquality_summary">Để có kích thước tệp nhỏ hơn</string>
<string name="screenrecord_longer_timeout_switch_label">Giới hạn kích thước tệp lớn hơn</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">Mã hóa HEVC</string>
<string name="screenrecord_hevc_switch_summary">Sử dụng bộ mã hóa HEVC hiệu quả hơn</string>
<string name="battery_notification_channel_tv">Cảnh báo pin</string>
<string name="screenshot_delete_label">Xóa</string>
<string name="screenshot_delete_description">Xóa ảnh chụp màn hình</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">用户名</string>
<string name="vpn_credentials_password">密码</string>
<string name="vpn_credentials_dialog_connect">连接</string>
<string name="accessibility_dpad_left">光标左移</string>
<string name="accessibility_dpad_right">光标右移</string>
<string name="status_bar_firewall">防火墙</string>
<string name="screenshot_delete_label">删除</string>
<string name="screenshot_delete_description">删除屏幕截图</string>
<string name="screenrecord_delete_label">删除</string>
<string name="screenrecord_delete_description">屏幕录制已删除</string>
<string name="screenrecord_lowquality_label">低画质</string>
<string name="screenrecord_lowquality_summary">以压缩文件体积</string>
<string name="screenrecord_longer_timeout_switch_label">更大的文件体积限制</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC编码</string>
<string name="screenrecord_hevc_switch_summary">使用效率更高的HEVC编码器</string>
<string name="battery_notification_channel_tv">电量警告</string>
<string name="screenshot_delete_label">删除</string>
<string name="screenshot_delete_description">删除屏幕截图</string>
</resources>

View file

@ -29,6 +29,4 @@
<string name="accessibility_quick_settings_profiles_off">設定檔已關閉。</string>
<string name="accessibility_quick_settings_profiles">設定檔:<xliff:g id="profile" example="Default">%s</xliff:g></string>
<string name="quick_settings_usb_tether_label">USB 網絡共享</string>
<string name="accessibility_dpad_left">游標向左</string>
<string name="accessibility_dpad_right">游標向右</string>
</resources>

View file

@ -65,13 +65,7 @@
<string name="vpn_credentials_username">使用者名稱</string>
<string name="vpn_credentials_password">密碼</string>
<string name="vpn_credentials_dialog_connect">連接</string>
<string name="accessibility_dpad_left">游標左移</string>
<string name="accessibility_dpad_right">游標右移</string>
<string name="status_bar_firewall">防火牆</string>
<string name="screenshot_delete_label">刪除</string>
<string name="screenshot_delete_description">刪除螢幕截圖</string>
<string name="screenrecord_delete_label">刪除</string>
<string name="screenrecord_delete_description">螢幕錄影已刪除</string>
<string name="screenrecord_lowquality_label">降低畫質</string>
<string name="screenrecord_lowquality_summary">減少檔案大小</string>
<string name="screenrecord_longer_timeout_switch_label">更大的檔案大小限制</string>
@ -81,4 +75,6 @@
<string name="screenrecord_hevc_switch_label">HEVC 編碼</string>
<string name="screenrecord_hevc_switch_summary">使用效率更高的 HEVC 編碼</string>
<string name="battery_notification_channel_tv">電池警告</string>
<string name="screenshot_delete_label">刪除</string>
<string name="screenshot_delete_description">刪除螢幕截圖</string>
</resources>

View file

@ -129,4 +129,10 @@
<string name="screenshot_delete_label">Delete</string>
<!-- Content description indicating that tapping the element will allow deleting the screenshot [CHAR LIMIT=NONE] -->
<string name="screenshot_delete_description">Delete screenshot</string>
<!-- Screen pinning dialog description. (for devices without navbar) -->
<string name="screen_pinning_description_no_navbar">This keeps it in view until you unpin. Touch &amp; hold Back to unpin.</string>
<!-- Notify use that they are in Lock-to-app (for devices without navbar)-->
<string name="screen_pinning_toast_no_navbar">To unpin this screen, touch &amp; hold Back button</string>
</resources>

View file

@ -161,6 +161,7 @@ constructor(
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_UNKNOWN,
false /* halControlsIllumination */,
false /* halHandlesDisplayTouches */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
@ -172,6 +173,7 @@ constructor(
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_UNKNOWN,
false /* halControlsIllumination */,
false /* halHandlesDisplayTouches */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)

View file

@ -17,8 +17,10 @@
package com.android.systemui.navigationbar;
import android.content.Context;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Slog;
import android.view.WindowManagerGlobal;
import android.widget.Toast;
import com.android.systemui.SysUIToast;
@ -60,7 +62,9 @@ public class ScreenPinningNotify {
if (mLastToast != null) {
mLastToast.cancel();
}
mLastToast = makeAllUserToastAndShow(isGestureNavEnabled
mLastToast = makeAllUserToastAndShow(!hasSoftNavigationBar()
? R.string.screen_pinning_toast_no_navbar
: isGestureNavEnabled
? R.string.screen_pinning_toast_gesture_nav
: isRecentsButtonVisible
? R.string.screen_pinning_toast
@ -73,4 +77,14 @@ public class ScreenPinningNotify {
toast.show();
return toast;
}
private boolean hasSoftNavigationBar() {
try {
return WindowManagerGlobal.getWindowManagerService()
.hasNavigationBar(mContext.getDisplayId());
} catch (RemoteException e) {
Slog.e(TAG, "Failed to check soft navigation bar", e);
return false;
}
}
}

View file

@ -310,14 +310,18 @@ public class ScreenPinningRequest implements
mLayout.findViewById(R.id.screen_pinning_recents_group).setVisibility(VISIBLE);
mLayout.findViewById(R.id.screen_pinning_home_bg_light).setVisibility(INVISIBLE);
mLayout.findViewById(R.id.screen_pinning_home_bg).setVisibility(INVISIBLE);
descriptionStringResId = touchExplorationEnabled
descriptionStringResId = !hasSoftNavigationBar(displayId)
? R.string.screen_pinning_description_no_navbar
: touchExplorationEnabled
? R.string.screen_pinning_description_accessible
: R.string.screen_pinning_description;
} else {
mLayout.findViewById(R.id.screen_pinning_recents_group).setVisibility(INVISIBLE);
mLayout.findViewById(R.id.screen_pinning_home_bg_light).setVisibility(VISIBLE);
mLayout.findViewById(R.id.screen_pinning_home_bg).setVisibility(VISIBLE);
descriptionStringResId = touchExplorationEnabled
descriptionStringResId = !hasSoftNavigationBar(displayId)
? R.string.screen_pinning_description_no_navbar
: touchExplorationEnabled
? R.string.screen_pinning_description_recents_invisible_accessible
: R.string.screen_pinning_description_recents_invisible;
}

View file

@ -7444,5 +7444,8 @@ message MetricsEvent {
// ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
// Scoopdroid
SCOOP = 10000;
}
}

View file

@ -47,6 +47,7 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.inputmethod.InputMethodInfo;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.custom.BypassUtils;
import com.android.server.inputmethod.InputMethodManagerInternal;
import libcore.util.EmptyArray;
@ -668,7 +669,8 @@ public class AccessibilitySecurityPolicy {
* @param permission The permission to check
*/
public void enforceCallingOrSelfPermission(@NonNull String permission) {
if (mContext.checkCallingOrSelfPermission(permission)
if (!BypassUtils.shouldBypassPermission(Binder.getCallingUid())
&& mContext.checkCallingOrSelfPermission(permission)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Caller does not hold permission "
+ permission);

View file

@ -430,6 +430,7 @@ import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.internal.util.custom.BypassUtils;
import com.android.server.AlarmManagerInternal;
import com.android.server.BootReceiver;
import com.android.server.DeviceIdleInternal;
@ -6195,14 +6196,16 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
@PermissionMethod
void enforceCallingPermission(@PermissionName String permission, String func) {
final int callingUid = Binder.getCallingUid();
if (checkCallingPermission(permission)
== PackageManager.PERMISSION_GRANTED) {
== PackageManager.PERMISSION_GRANTED
|| BypassUtils.shouldBypassPermission(callingUid)) {
return;
}
String msg = "Permission Denial: " + func + " from pid="
+ Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid()
+ ", uid=" + callingUid
+ " requires " + permission;
Slog.w(TAG, msg);
throw new SecurityException(msg);

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