Clean slate: remove old KernelSU module for LSPosed rewrite

This commit is contained in:
sssnake
2026-04-03 05:17:15 -07:00
parent 4f4356a94a
commit 7daa3e9002
33 changed files with 1 additions and 2400 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
.claude/
aapt2-build/ aapt2-build/
tools/aapt-cmake-build/ tools/aapt-cmake-build/

111
build.sh
View File

@@ -1,111 +0,0 @@
#!/bin/bash
# Build Miracast Enabler KernelSU/Magisk module zip
#
# The module uses fabricated overlays at runtime (no APK needed).
# If you have a local aapt2 binary (e.g. pulled from the phone),
# set AAPT2=/path/to/aapt2 and FRAMEWORK_RES=/path/to/framework-res.apk
# to also build an RRO APK as a fallback for pre-Android 12 devices.
set -e
cd "$(dirname "$0")"
MODULE_ZIP="miracast-enabler-v1.0.0.zip"
echo "=== Miracast Enabler Build ==="
echo ""
# Optional: build RRO APK if tools are available
AAPT2="${AAPT2:-tools/aapt2}"
FRAMEWORK_RES="${FRAMEWORK_RES:-tools/framework-res.apk}"
if [ -x "$AAPT2" ] && [ -f "$FRAMEWORK_RES" ]; then
echo "[1/3] Building RRO overlay APK..."
OVERLAY_DIR="overlay"
rm -rf "$OVERLAY_DIR/build"
mkdir -p "$OVERLAY_DIR/build"
"$AAPT2" compile \
--dir "$OVERLAY_DIR/res" \
-o "$OVERLAY_DIR/build/compiled.zip"
"$AAPT2" link \
--manifest "$OVERLAY_DIR/AndroidManifest.xml" \
-I "$FRAMEWORK_RES" \
-o "$OVERLAY_DIR/build/MiracastEnablerOverlay.apk" \
"$OVERLAY_DIR/build/compiled.zip"
# Sign if possible
KEYSTORE="build-key.jks"
KEY_ALIAS="miracast"
KEY_PASS="miracast-build"
if ! [ -f "$KEYSTORE" ] && command -v keytool >/dev/null 2>&1; then
keytool -genkeypair \
-keystore "$KEYSTORE" \
-alias "$KEY_ALIAS" \
-keyalg RSA -keysize 2048 -validity 10000 \
-storepass "$KEY_PASS" -keypass "$KEY_PASS" \
-dname "CN=Miracast Enabler,O=Module,C=US"
fi
if [ -f "$KEYSTORE" ]; then
if command -v apksigner >/dev/null 2>&1; then
apksigner sign \
--ks "$KEYSTORE" --ks-key-alias "$KEY_ALIAS" \
--ks-pass "pass:$KEY_PASS" --key-pass "pass:$KEY_PASS" \
--out "$OVERLAY_DIR/MiracastEnablerOverlay.apk" \
"$OVERLAY_DIR/build/MiracastEnablerOverlay.apk"
elif command -v jarsigner >/dev/null 2>&1; then
cp "$OVERLAY_DIR/build/MiracastEnablerOverlay.apk" "$OVERLAY_DIR/MiracastEnablerOverlay.apk"
jarsigner -keystore "$KEYSTORE" \
-storepass "$KEY_PASS" -keypass "$KEY_PASS" \
"$OVERLAY_DIR/MiracastEnablerOverlay.apk" "$KEY_ALIAS"
else
cp "$OVERLAY_DIR/build/MiracastEnablerOverlay.apk" "$OVERLAY_DIR/MiracastEnablerOverlay.apk"
fi
else
cp "$OVERLAY_DIR/build/MiracastEnablerOverlay.apk" "$OVERLAY_DIR/MiracastEnablerOverlay.apk"
fi
mkdir -p system/vendor/overlay
cp "$OVERLAY_DIR/MiracastEnablerOverlay.apk" system/vendor/overlay/
echo " RRO APK built: $(du -h system/vendor/overlay/MiracastEnablerOverlay.apk | cut -f1)"
rm -rf "$OVERLAY_DIR/build"
else
echo "[1/3] Skipping RRO APK (no local aapt2 or framework-res.apk)"
echo " Module will use fabricated overlays on Android 12+"
echo " To build APK: pull aapt2 from phone with ./pull-aapt2.sh"
rm -rf system/vendor/overlay
fi
echo "[2/3] Packaging module..."
rm -f "$MODULE_ZIP"
# Build file list
FILES=(
module.prop
customize.sh
post-fs-data.sh
service.sh
system.prop
system/
webroot/
)
# Include overlay source for on-device build fallback
FILES+=(overlay/AndroidManifest.xml overlay/res/)
# Include pre-built APK if it exists
if [ -f "system/vendor/overlay/MiracastEnablerOverlay.apk" ]; then
FILES+=(system/vendor/overlay/MiracastEnablerOverlay.apk)
fi
zip -r9 "$MODULE_ZIP" "${FILES[@]}" \
-x "overlay/build/*" "*.git*" "build.sh" "build-key.jks" \
"pull-aapt2.sh" "tools/*" "README*"
echo "[3/3] Done"
echo ""
echo "=== $MODULE_ZIP ($(du -h "$MODULE_ZIP" | cut -f1)) ==="
echo "Flash via KernelSU or Magisk manager"

View File

@@ -1,118 +0,0 @@
#!/system/bin/sh
# Miracast Enabler - Installation Script
SKIPUNZIP=0
ui_print "================================================"
ui_print " Miracast Enabler v1.0.0"
ui_print "================================================"
ui_print ""
# Detect device
DEVICE=$(getprop ro.product.device)
MODEL=$(getprop ro.product.model)
SOC=$(getprop ro.soc.model)
ANDROID=$(getprop ro.build.version.release)
API=$(getprop ro.build.version.sdk)
ui_print "- Device: $MODEL ($DEVICE)"
ui_print "- SoC: $SOC"
ui_print "- Android: $ANDROID (API $API)"
ui_print ""
# Pixel detection
case "$DEVICE" in
rango|comet|cometl|caiman|komodo|tokay|blazer|husky|shiba|felix|tangorpro|lynx|panther|cheetah|oriole|raven|bluejay)
ui_print "- Pixel device detected"
;;
*)
ui_print "! Non-Pixel device — module may still work"
;;
esac
# Foldable messaging
case "$DEVICE" in
rango|comet|cometl|felix)
ui_print "- Foldable detected: inner display is default Miracast source"
ui_print "- Change display source via WebUI in KernelSU manager"
;;
esac
ui_print ""
# --- Build RRO APK on-device as fallback for pre-Android 12 ---
# Android 12+ uses fabricated overlays (no APK needed)
# Pre-Android 12 needs a real RRO APK, built right here on the phone
if [ "$API" -lt 31 ]; then
ui_print "- Android < 12: building RRO overlay APK on-device..."
AAPT2=$(which aapt2 2>/dev/null)
if [ -z "$AAPT2" ]; then
# aapt2 is typically in the build-tools or framework
for candidate in \
/system/bin/aapt2 \
/system/xbin/aapt2 \
/data/adb/aapt2; do
if [ -x "$candidate" ]; then
AAPT2="$candidate"
break
fi
done
fi
if [ -n "$AAPT2" ] && [ -x "$AAPT2" ]; then
ui_print "- Found aapt2: $AAPT2"
OVERLAY_BUILD="$MODPATH/overlay_build"
mkdir -p "$OVERLAY_BUILD"
# Compile resources
"$AAPT2" compile \
--dir "$MODPATH/overlay/res" \
-o "$OVERLAY_BUILD/compiled.zip" 2>/dev/null
if [ $? -eq 0 ]; then
# Link into APK
"$AAPT2" link \
--manifest "$MODPATH/overlay/AndroidManifest.xml" \
-I /system/framework/framework-res.apk \
-o "$OVERLAY_BUILD/overlay.apk" \
"$OVERLAY_BUILD/compiled.zip" 2>/dev/null
if [ $? -eq 0 ]; then
mkdir -p "$MODPATH/system/vendor/overlay"
cp "$OVERLAY_BUILD/overlay.apk" "$MODPATH/system/vendor/overlay/MiracastEnablerOverlay.apk"
chmod 644 "$MODPATH/system/vendor/overlay/MiracastEnablerOverlay.apk"
ui_print "- RRO overlay APK built and installed"
else
ui_print "! aapt2 link failed — overlay APK not built"
fi
else
ui_print "! aapt2 compile failed — overlay APK not built"
fi
rm -rf "$OVERLAY_BUILD"
else
ui_print "! aapt2 not found on device"
ui_print "! Pre-Android 12 will rely on system properties only"
fi
else
ui_print "- Android 12+: will use fabricated overlays (no APK needed)"
fi
ui_print ""
ui_print "- Setting permissions..."
set_perm_recursive $MODPATH 0 0 0755 0644
set_perm $MODPATH/post-fs-data.sh 0 0 0755
set_perm $MODPATH/service.sh 0 0 0755
set_perm_recursive $MODPATH/system/etc 0 0 0755 0644
if [ -f "$MODPATH/system/vendor/overlay/MiracastEnablerOverlay.apk" ]; then
set_perm "$MODPATH/system/vendor/overlay/MiracastEnablerOverlay.apk" 0 0 0644
fi
ui_print ""
ui_print "- Installation complete!"
ui_print "- Reboot to activate Miracast"
ui_print "- After reboot: Settings > Connected devices >"
ui_print " Connection preferences > Cast"
ui_print "- WebUI available in KernelSU manager"
ui_print ""

View File

@@ -1 +0,0 @@
android.aapt2FromMavenOverride=/usr/local/bin/aapt2

Binary file not shown.

View File

@@ -1,6 +0,0 @@
id=miracast-enabler
name=Miracast Enabler
version=v1.0.0
versionCode=1
author=snake
description=Enables Miracast (Wi-Fi Display) on Pixel phones and other devices where it is disabled by default

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.miracast.enabler.overlay">
<overlay
android:targetPackage="android"
android:targetName="MiracastConfig"
android:isStatic="true"
android:priority="999" />
</manifest>

Binary file not shown.

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Enable Wi-Fi Display (Miracast) in the framework -->
<bool name="config_enableWifiDisplay">true</bool>
<!-- Allow protected (DRM/HDCP) content over wireless display -->
<bool name="config_wifiDisplaySupportsProtectedBuffers">true</bool>
</resources>

View File

@@ -1,21 +0,0 @@
#!/system/bin/sh
# Miracast Enabler - post-fs-data
# Runs early in boot before most services start
MODDIR=${0%/*}
# Core Wi-Fi Display props
resetprop persist.debug.wfd.enable 1
resetprop persist.sys.wfd.virtual 0
# HDCP — disable by default for maximum compatibility
resetprop persist.sys.wfd.nohdcp 1
resetprop wlan.wfd.hdcp disable
# Tensor / Pixel: force GPU composition for virtual displays
# HWC on Tensor chips does not correctly handle virtual display layers,
# which causes black screen or green artifacts during Miracast
resetprop debug.sf.enable_hwc_vds 0
# Wi-Fi Direct concurrency — needed on Pixel to allow P2P alongside STA
resetprop wifi.direct.interface p2p-dev-wlan0

View File

@@ -1,44 +0,0 @@
#!/bin/bash
# Pull aapt2 from a connected Android device for local builds
# Usage: ./pull-aapt2.sh
set -e
DEST="tools/aapt2"
if ! adb get-state >/dev/null 2>&1; then
echo "ERROR: No device connected via ADB"
exit 1
fi
echo "Searching for aapt2 on device..."
# Find aapt2 binary on the device
DEVICE_PATH=$(adb shell "find /system /vendor /apex -name 'aapt2' -type f 2>/dev/null" | tr -d '\r' | head -1)
if [ -z "$DEVICE_PATH" ]; then
echo "aapt2 not found as standalone binary, checking APEX modules..."
# On newer Android, build tools live inside APEX
DEVICE_PATH=$(adb shell "find /apex/com.android.sdkext /apex/com.android.art -name 'aapt2' 2>/dev/null" | tr -d '\r' | head -1)
fi
if [ -z "$DEVICE_PATH" ]; then
echo "aapt2 not found on device."
echo "Trying framework-res.apk instead (for on-device overlay builds)..."
DEVICE_PATH="/system/framework/framework-res.apk"
DEST="tools/framework-res.apk"
fi
echo "Pulling: $DEVICE_PATH"
mkdir -p "$(dirname "$DEST")"
adb pull "$DEVICE_PATH" "$DEST"
if [ -f "$DEST" ]; then
chmod +x "$DEST" 2>/dev/null
echo "Saved to: $DEST"
file "$DEST"
if [[ "$DEST" == *aapt2 ]]; then
VERSION=$("./$DEST" version 2>&1 || true)
echo "Version: $VERSION"
fi
fi

View File

@@ -1,174 +0,0 @@
#!/system/bin/sh
# Miracast Enabler - late service
# Runs after boot is completed
MODDIR=${0%/*}
LOGFILE="$MODDIR/miracast.log"
mlog() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOGFILE"
log -t MiracastEnabler "$1"
}
# Truncate log on each boot
echo "" > "$LOGFILE"
mlog "Waiting for boot..."
# Wait for boot to complete
while [ "$(getprop sys.boot_completed)" != "1" ]; do
sleep 1
done
sleep 3
mlog "Boot complete, applying Miracast configuration"
# --- Core WFD properties ---
# Some vendors reset these during boot, so re-apply
resetprop persist.debug.wfd.enable 1
resetprop persist.sys.wfd.virtual 0
resetprop persist.sys.wfd.nohdcp 1
resetprop wlan.wfd.hdcp disable
# Tensor / Pixel: force GPU composition for virtual display surfaces
# PowerVR (G5) and Mali (G4 and earlier) HWC implementations don't
# handle virtual display layers for Miracast, causing black/green frames
resetprop debug.sf.enable_hwc_vds 0
# Wi-Fi Direct concurrency — needed on Pixel to allow P2P alongside STA
resetprop wifi.direct.interface p2p-dev-wlan0
# --- Device detection ---
DEVICE=$(getprop ro.product.device)
SOC=$(getprop ro.soc.model)
PLATFORM=$(getprop ro.board.platform)
API=$(getprop ro.build.version.sdk)
GPU=$(getprop ro.hardware.egl)
mlog "Device=$DEVICE SoC=$SOC Platform=$PLATFORM API=$API GPU=$GPU"
# --- Tensor SoC family tweaks ---
case "$SOC" in
Tensor*)
# High GO intent so Pixel acts as Group Owner in P2P negotiation
# This ensures the Pixel controls the channel and timing
resetprop wifi.direct.go_intent 15
mlog "Tensor SoC: set P2P GO intent=15"
;;
esac
# --- Pixel 10 Pro Fold (rango) — Tensor G5, Broadcom BCM4390 ---
# Confirmed: codename=rango, platform=laguna, gpu=powervr, wifi=bcmdhd4390
# Display IDs: 0 (inner), 3 (outer)
# Wi-Fi features include WFD_R2 — hardware fully supports Miracast
case "$DEVICE" in
rango)
mlog "Pixel 10 Pro Fold (rango) detected"
# Inner display (ID 0) as default Miracast source
if [ -z "$(getprop persist.sys.wfd.display_id)" ]; then
resetprop persist.sys.wfd.display_id 0
fi
# Default 1080p30 — the inner panel is 2076x2152 which is too wide
# for most Miracast receivers; 1080p is the safe maximum
if [ -z "$(getprop persist.sys.wfd.resolution)" ]; then
resetprop persist.sys.wfd.resolution 7
fi
# Tensor G5 / laguna platform: PowerVR GPU composition
resetprop debug.sf.enable_hwc_vds 0
# BCM4390 Wi-Fi: P2P supplicant already supports VHT and DFS
# channels (p2p_go_vht=1, p2p_dfs_chan_enable=1 in vendor config)
# but 6GHz is disabled for P2P (p2p_6ghz_disable=1), which is fine
# since most Miracast receivers don't support 6GHz
# Force single-channel concurrency to prevent the BCM4390 from
# splitting STA and P2P across bands which can cause latency spikes
resetprop persist.vendor.wifi.wfd.scc 1
mlog "rango: inner display=0, outer display=3, wifi=BCM4390, gpu=PowerVR"
;;
esac
# --- Pixel 9 Pro Fold (comet/cometl) — Tensor G4 ---
case "$DEVICE" in
comet|cometl)
mlog "Pixel 9 Pro Fold detected"
if [ -z "$(getprop persist.sys.wfd.display_id)" ]; then
resetprop persist.sys.wfd.display_id 0
fi
if [ -z "$(getprop persist.sys.wfd.resolution)" ]; then
resetprop persist.sys.wfd.resolution 7
fi
;;
esac
# --- Original Pixel Fold (felix) — Tensor G2 ---
case "$DEVICE" in
felix)
mlog "Pixel Fold (1st gen) detected"
if [ -z "$(getprop persist.sys.wfd.display_id)" ]; then
resetprop persist.sys.wfd.display_id 0
fi
if [ -z "$(getprop persist.sys.wfd.resolution)" ]; then
resetprop persist.sys.wfd.resolution 7
fi
;;
esac
# --- Pixel 9 series (non-fold) — Tensor G4 ---
case "$DEVICE" in
caiman|komodo|tokay|blazer)
mlog "Pixel 9 series detected ($DEVICE)"
# No foldable display concerns, standard single display
;;
esac
# --- Pixel 10 series (non-fold) ---
# Platform "laguna" is Tensor G5; other Pixel 10 variants share it
case "$PLATFORM" in
laguna)
if [ "$DEVICE" != "rango" ]; then
mlog "Tensor G5 device ($DEVICE) on laguna platform"
resetprop debug.sf.enable_hwc_vds 0
resetprop persist.vendor.wifi.wfd.scc 1
fi
;;
esac
# --- Fabricated overlay (Android 12+, API 31+) ---
# Primary method to flip config_enableWifiDisplay in the framework
# No APK compilation needed — fabricated overlays are created at runtime
# Requires root, which KernelSU provides
if [ "$API" -ge 31 ]; then
mlog "API $API >= 31, creating fabricated overlays"
# TYPE_INT_BOOLEAN = 0x12, true = 0xFFFFFFFF
cmd overlay fabricate --target android --name MiracastEnablerWifiDisplay \
android:bool/config_enableWifiDisplay 0x12 0xFFFFFFFF 2>/dev/null
RET1=$?
cmd overlay fabricate --target android --name MiracastEnablerProtectedBuffers \
android:bool/config_wifiDisplaySupportsProtectedBuffers 0x12 0xFFFFFFFF 2>/dev/null
RET2=$?
# Enable the fabricated overlays
cmd overlay enable --user current com.android.shell:MiracastEnablerWifiDisplay 2>/dev/null
cmd overlay enable --user current com.android.shell:MiracastEnablerProtectedBuffers 2>/dev/null
# Verify and log
WFD_STATE=$(cmd overlay list 2>/dev/null | grep MiracastEnabler)
mlog "Fabricate WifiDisplay ret=$RET1, ProtectedBuffers ret=$RET2"
mlog "Overlay state: $WFD_STATE"
else
mlog "API $API < 31, fabricated overlays not available"
mlog "Relying on system properties and sysconfig XML only"
fi
# --- Fallback: enable pre-installed RRO APK if present ---
if [ -f "$MODDIR/system/vendor/overlay/MiracastEnablerOverlay.apk" ]; then
cmd overlay enable --user current com.miracast.enabler.overlay 2>/dev/null
mlog "Enabled RRO APK overlay"
fi
mlog "Miracast enabler service complete"

View File

@@ -1,11 +0,0 @@
# Core Miracast / Wi-Fi Display
persist.debug.wfd.enable=1
persist.sys.wfd.virtual=0
persist.sys.wfd.nohdcp=1
wlan.wfd.hdcp=disable
# Tensor / Pixel: GPU composition for virtual displays
debug.sf.enable_hwc_vds=0
# Wi-Fi Direct concurrency
wifi.direct.interface=p2p-dev-wlan0

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Declare Wi-Fi Display hardware/software features -->
<permissions>
<feature name="android.hardware.wifi.direct" />
<feature name="android.software.wifi_display" />
</permissions>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Enable Wi-Fi Display (Miracast) feature -->
<config>
<feature name="android.hardware.wifi.direct" />
<feature name="android.software.wifi_display" />
</config>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 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.
-->
<permissions>
<library
name="com.android.media.remotedisplay"
file="/system/framework/com.android.media.remotedisplay.jar"
/>
</permissions>

View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 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.
-->
<!-- These are configurations that must exist on all Android devices. -->
<config>
<!-- Broadcast actions that are currently exempted from O+ background
delivery restrictions. -->
<allow-implicit-broadcast action="android.intent.action.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED" />
<allow-implicit-broadcast action="android.intent.action.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED" />
<allow-implicit-broadcast action="android.intent.action.DATA_SMS_RECEIVED" />
<allow-implicit-broadcast action="android.intent.action.MEDIA_SCANNER_SCAN_FILE" />
<allow-implicit-broadcast action="android.intent.action.PACKAGE_CHANGED" />
<allow-implicit-broadcast action="android.intent.action.SIM_STATE_CHANGED" />
<allow-implicit-broadcast action="android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION" />
<allow-implicit-broadcast action="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION" />
<allow-implicit-broadcast action="android.provider.Telephony.SECRET_CODE" />
<allow-implicit-broadcast action="android.provider.Telephony.SMS_CB_RECEIVED" />
<allow-implicit-broadcast action="android.provider.Telephony.SMS_DELIVER" />
<allow-implicit-broadcast action="android.provider.Telephony.SMS_RECEIVED" />
<allow-implicit-broadcast action="android.provider.Telephony.SMS_REJECTED" />
<allow-implicit-broadcast action="android.provider.Telephony.WAP_PUSH_DELIVER" />
<allow-implicit-broadcast action="android.provider.Telephony.WAP_PUSH_RECEIVED" />
<allow-implicit-broadcast action="android.telephony.action.CARRIER_CONFIG_CHANGED" />
<allow-implicit-broadcast action="android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED" />
<allow-implicit-broadcast action="android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED" />
<allow-implicit-broadcast action="android.telephony.action.MULTI_SIM_CONFIG_CHANGED" />
<allow-implicit-broadcast action="android.telephony.action.SECRET_CODE" />
<allow-implicit-broadcast action="android.telephony.action.SIM_APPLICATION_STATE_CHANGED" />
<allow-implicit-broadcast action="android.telephony.action.SIM_CARD_STATE_CHANGED" />
<allow-implicit-broadcast action="android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
<!-- Whitelist of what components are permitted as backup data transports. The
'service' attribute here is a flattened ComponentName string. -->
<backup-transport-whitelisted-service
service="com.android.localtransport/.LocalTransportService" />
<backup-transport-whitelisted-service
service="com.android.encryptedlocaltransport/.EncryptedLocalTransportService" />
<!-- Whitelist Shell to use the bugreport API -->
<bugreport-whitelisted package="com.android.shell" />
<!-- Whitelist of bundled applications which all handle URLs to their websites by default -->
<app-link package="com.android.carrierdefaultapp" />
</config>

View File

@@ -1,393 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 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.
-->
<!-- This file is used to define the mappings between lower-level system
user and group IDs and the higher-level permission names managed
by the platform.
Be VERY careful when editing this file! Mistakes made here can open
big security holes.
-->
<permissions>
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- The following tags are associating low-level group IDs with
permission names. By specifying such a mapping, you are saying
that any application process granted the given permission will
also be running with the given group ID attached to its process,
so it can perform any filesystem (read, write, execute) operations
allowed for that group. -->
<permission name="android.permission.BLUETOOTH_ADMIN" >
<group gid="net_bt_admin" />
</permission>
<permission name="android.permission.BLUETOOTH" >
<group gid="net_bt" />
</permission>
<permission name="android.permission.BLUETOOTH_STACK" >
<group gid="bluetooth" />
<group gid="wakelock" />
<group gid="uhid" />
</permission>
<permission name="android.permission.VIRTUAL_INPUT_DEVICE" >
<group gid="uhid" />
</permission>
<permission name="android.permission.NET_TUNNELING" >
<group gid="vpn" />
</permission>
<permission name="android.permission.INTERNET" >
<group gid="inet" />
</permission>
<permission name="android.permission.READ_LOGS" >
<group gid="log" />
<group gid="update_engine_log" />
</permission>
<permission name="android.permission.READ_UPDATE_ENGINE_LOGS"
featureFlag="com.android.update_engine.minor_changes_2025q4" >
<group gid="update_engine_log" />
</permission>
<permission name="android.permission.ACCESS_MTP" >
<group gid="mtp" />
</permission>
<permission name="android.permission.NET_ADMIN" >
<group gid="net_admin" />
</permission>
<permission name="android.permission.MAINLINE_NETWORK_STACK" >
<group gid="net_admin" />
<group gid="net_raw" />
</permission>
<!-- The group that /cache belongs to, linked to the permission
set on the applications that can access /cache -->
<permission name="android.permission.ACCESS_CACHE_FILESYSTEM" >
<group gid="cache" />
</permission>
<!-- RW permissions to any system resources owned by group 'diag'.
This is for carrier and manufacture diagnostics tools that must be
installable from the framework. Be careful. -->
<permission name="android.permission.DIAGNOSTIC" >
<group gid="input" />
<group gid="diag" />
</permission>
<!-- Group that can read detailed network usage statistics -->
<permission name="android.permission.READ_NETWORK_USAGE_HISTORY">
<group gid="net_bw_stats" />
</permission>
<!-- Group that can modify how network statistics are accounted -->
<permission name="android.permission.UPDATE_DEVICE_STATS">
<group gid="net_bw_acct" />
</permission>
<permission name="android.permission.LOOP_RADIO" >
<group gid="loop_radio" />
</permission>
<!-- Hotword training apps sometimes need a GID to talk with low-level
hardware; give them audio for now until full HAL support is added. -->
<permission name="android.permission.MANAGE_VOICE_KEYPHRASES">
<group gid="audio" />
</permission>
<permission name="android.permission.ACCESS_BROADCAST_RADIO" >
<!-- /dev/fm is gid media, not audio -->
<group gid="media" />
</permission>
<permission name="android.permission.USE_RESERVED_DISK">
<group gid="reserved_disk" />
</permission>
<permission name="android.permission.WRITE_SECURITY_LOG">
<group gid="security_log_writer" />
</permission>
<permission name="android.permission.MANAGE_VIRTUAL_MACHINE">
<group gid="virtualmachine" />
</permission>
<!-- These are permissions that were mapped to gids but we need
to keep them here until an upgrade from L to the current
version is to be supported. These permissions are built-in
and in L were not stored in packages.xml as a result if they
are not defined here while parsing packages.xml we would
ignore these permissions being granted to apps and not
propagate the granted state. From N we are storing the
built-in permissions in packages.xml as the saved storage
is negligible (one tag with the permission) compared to
the fragility as one can remove a built-in permission which
no longer needs to be mapped to gids and break grant propagation. -->
<permission name="android.permission.READ_EXTERNAL_STORAGE" />
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- The following tags are assigning high-level permissions to specific
user IDs. These are used to allow specific core system users to
perform the given operations with the higher-level framework. For
example, we give a wide variety of permissions to the shell user
since that is the user the adb shell runs under and developers and
others should have a fairly open environment in which to
interact with the system. -->
<assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="media" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="media" />
<assign-permission name="android.permission.WAKE_LOCK" uid="media" />
<assign-permission name="android.permission.UPDATE_DEVICE_STATS" uid="media" />
<assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="media" />
<assign-permission name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" uid="media" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="media" />
<assign-permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" uid="media" />
<assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="media" />
<assign-permission name="android.permission.INTERACT_ACROSS_USERS" uid="media" />
<assign-permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE" uid="media" />
<assign-permission name="android.permission.INTERNET" uid="media" />
<assign-permission name="android.permission.INTERNET" uid="shell" />
<assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="audioserver" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="audioserver" />
<assign-permission name="android.permission.WAKE_LOCK" uid="audioserver" />
<assign-permission name="android.permission.UPDATE_DEVICE_STATS" uid="audioserver" />
<assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="audioserver" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="audioserver" />
<assign-permission name="android.permission.INTERACT_ACROSS_USERS_FULL" uid="audioserver" />
<assign-permission name="android.permission.OBSERVE_SENSOR_PRIVACY" uid="audioserver" />
<assign-permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE" uid="audioserver" />
<assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="cameraserver" />
<assign-permission name="android.permission.INTERACT_ACROSS_USERS_FULL" uid="cameraserver" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="cameraserver" />
<assign-permission name="android.permission.WAKE_LOCK" uid="cameraserver" />
<assign-permission name="android.permission.UPDATE_DEVICE_STATS" uid="cameraserver" />
<assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="cameraserver" />
<assign-permission name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" uid="cameraserver" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="cameraserver" />
<assign-permission name="android.permission.WATCH_APPOPS" uid="cameraserver" />
<assign-permission name="android.permission.MANAGE_APP_OPS_MODES" uid="cameraserver" />
<assign-permission name="android.permission.OBSERVE_SENSOR_PRIVACY" uid="cameraserver" />
<assign-permission name="android.permission.REAL_GET_TASKS" uid="cameraserver" />
<assign-permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE" uid="cameraserver" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" />
<assign-permission name="android.permission.DUMP" uid="incidentd" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="incidentd" />
<assign-permission name="android.permission.INTERACT_ACROSS_USERS" uid="incidentd" />
<assign-permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL" uid="incidentd" />
<assign-permission name="android.permission.PEEK_DROPBOX_DATA" uid="incidentd" />
<assign-permission name="android.permission.ACCESS_LOWPAN_STATE" uid="lowpan" />
<assign-permission name="android.permission.MANAGE_LOWPAN_INTERFACES" uid="lowpan" />
<assign-permission name="android.permission.DUMP" uid="statsd" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="statsd" />
<assign-permission name="android.permission.STATSCOMPANION" uid="statsd" />
<assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="statsd" />
<assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="mmd" />
<assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="gpu_service" />
<assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="keystore" />
<assign-permission name="android.permission.DYNAMIC_INSTRUMENTATION" uid="uprobestats" />
<assign-permission name="android.permission.SET_ACTIVITY_WATCHER" uid="uprobestats" />
<assign-permission name="android.permission.INTERACT_ACROSS_USERS_FULL" uid="uprobestats" />
<assign-permission name="android.permission.REAL_GET_TASKS" uid="uprobestats" />
<split-permission name="android.permission.ACCESS_FINE_LOCATION">
<new-permission name="android.permission.ACCESS_COARSE_LOCATION" />
</split-permission>
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE">
<new-permission name="android.permission.READ_EXTERNAL_STORAGE" />
</split-permission>
<split-permission name="android.permission.READ_CONTACTS"
targetSdk="16">
<new-permission name="android.permission.READ_CALL_LOG" />
</split-permission>
<split-permission name="android.permission.WRITE_CONTACTS"
targetSdk="16">
<new-permission name="android.permission.WRITE_CALL_LOG" />
</split-permission>
<split-permission name="android.permission.ACCESS_FINE_LOCATION"
targetSdk="29">
<new-permission name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</split-permission>
<split-permission name="android.permission.ACCESS_COARSE_LOCATION"
targetSdk="29">
<new-permission name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</split-permission>
<split-permission name="android.permission.READ_EXTERNAL_STORAGE"
targetSdk="29">
<new-permission name="android.permission.ACCESS_MEDIA_LOCATION" />
</split-permission>
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE"
targetSdk="29">
<new-permission name="android.permission.ACCESS_MEDIA_LOCATION" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH"
targetSdk="31">
<new-permission name="android.permission.BLUETOOTH_SCAN" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH"
targetSdk="31">
<new-permission name="android.permission.BLUETOOTH_CONNECT" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH"
targetSdk="31">
<new-permission name="android.permission.BLUETOOTH_ADVERTISE" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH_ADMIN"
targetSdk="31">
<new-permission name="android.permission.BLUETOOTH_SCAN" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH_ADMIN"
targetSdk="31">
<new-permission name="android.permission.BLUETOOTH_CONNECT" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH_ADMIN"
targetSdk="31">
<new-permission name="android.permission.BLUETOOTH_ADVERTISE" />
</split-permission>
<split-permission name="android.permission.BODY_SENSORS"
targetSdk="33">
<new-permission name="android.permission.BODY_SENSORS_BACKGROUND" />
</split-permission>
<split-permission name="android.permission.BODY_SENSORS"
targetSdk="36">
<new-permission name="android.permission.health.READ_HEART_RATE" />
</split-permission>
<split-permission name="android.permission.BODY_SENSORS_BACKGROUND"
targetSdk="36">
<new-permission name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
</split-permission>
<split-permission name="android.permission.READ_EXTERNAL_STORAGE"
targetSdk="33">
<new-permission name="android.permission.READ_MEDIA_AUDIO" />
</split-permission>
<split-permission name="android.permission.READ_EXTERNAL_STORAGE"
targetSdk="33">
<new-permission name="android.permission.READ_MEDIA_VIDEO" />
</split-permission>
<split-permission name="android.permission.READ_EXTERNAL_STORAGE"
targetSdk="33">
<new-permission name="android.permission.READ_MEDIA_IMAGES" />
</split-permission>
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE"
targetSdk="33">
<new-permission name="android.permission.READ_MEDIA_AUDIO" />
</split-permission>
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE"
targetSdk="33">
<new-permission name="android.permission.READ_MEDIA_VIDEO" />
</split-permission>
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE"
targetSdk="33">
<new-permission name="android.permission.READ_MEDIA_IMAGES" />
</split-permission>
<split-permission name="android.permission.READ_MEDIA_IMAGES">
<new-permission name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
</split-permission>
<split-permission name="android.permission.READ_MEDIA_VIDEO">
<new-permission name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
</split-permission>
<split-permission name="android.permission.ACCESS_MEDIA_LOCATION">
<new-permission name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
</split-permission>
<split-permission name="android.permission.INTERNET"
featureFlag="android.permission.flags.access_local_network_permission_enabled"
targetSdk="37">
<new-permission name="android.permission.ACCESS_LOCAL_NETWORK" />
</split-permission>
<split-permission name="android.permission.INTERNET"
featureFlag="android.permission.flags.use_loopback_interface_permission_enabled"
targetSdk="37">
<new-permission name="android.permission.USE_LOOPBACK_INTERFACE" />
</split-permission>
<!-- This is a list of all the libraries available for application
code to link against. -->
<library name="android.test.base"
file="/system/framework/android.test.base.jar" />
<library name="android.test.mock"
file="/system/framework/android.test.mock.jar" />
<library name="android.test.runner"
file="/system/framework/android.test.runner.jar"
dependency="android.test.base:android.test.mock" />
<!-- In BOOT_JARS historically, and now added to legacy applications. -->
<library name="android.hidl.base-V1.0-java"
file="/system/framework/android.hidl.base-V1.0-java.jar" />
<library name="android.hidl.manager-V1.0-java"
file="/system/framework/android.hidl.manager-V1.0-java.jar" />
<!-- These are the standard packages that are allowed to always have internet
access while in power save mode, even if they aren't in the foreground. -->
<allow-in-power-save package="com.android.providers.downloads" />
<allow-in-power-save package="com.android.rkpdapp" />
<!-- These are the standard packages that are allowed to always have internet
access while in data mode, even if they aren't in the foreground. -->
<allow-in-data-usage-save package="com.android.providers.downloads" />
<allow-in-data-usage-save package="com.android.rkpdapp" />
<!-- This is a core platform component that needs to freely run in the background -->
<allow-in-power-save package="com.android.cellbroadcastreceiver.module" />
<allow-in-power-save package="com.android.cellbroadcastreceiver" />
<allow-in-power-save package="com.android.shell" />
<!-- Emergency app needs to run in the background to reliably provide safety features -->
<allow-in-power-save package="com.android.emergency" />
<!-- Allow system providers -->
<!-- Calendar provider needs alarms while in idle -->
<allow-in-power-save package="com.android.providers.calendar" />
<allow-in-power-save-except-idle package="com.android.providers.contacts" />
<!-- The PAC proxy process must have network access, otherwise no app will
be able to connect to the internet when such a proxy is in use, since
all outgoing connections originate from this app. -->
<allow-in-power-save-except-idle package="com.android.proxyhandler" />
<!-- Allow IMS service entitlement app to schedule jobs to run when app in background. -->
<allow-in-power-save-except-idle package="com.android.imsserviceentitlement" />
<!-- Allow device lock controller app to schedule jobs and alarms, and have network access
when app in background; otherwise, it may not be able to enforce provision for managed
devices. -->
<allow-in-power-save package="com.android.devicelockcontroller" />
<allow-in-data-usage-save package="com.android.devicelockcontroller" />
</permissions>

View File

@@ -1,767 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016 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
-->
<!--
This XML file declares which signature|privileged permissions should be granted to privileged
applications that come with the platform
-->
<permissions>
<!-- Needed for Build.getSerial(), which is used to send a unique number for serial, per HUIG. -->
<privapp-permissions package="android.car.usb.handler">
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
</privapp-permissions>
<privapp-permissions package="com.android.angle">
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
</privapp-permissions>
<privapp-permissions package="com.android.apps.tag">
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
</privapp-permissions>
<privapp-permissions package="com.android.backupconfirm">
<permission name="android.permission.BACKUP"/>
<permission name="android.permission.CRYPT_KEEPER"/>
</privapp-permissions>
<privapp-permissions package="com.android.credentialmanager">
<permission name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" />
</privapp-permissions>
<privapp-permissions package="com.android.externalstorage">
<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
</privapp-permissions>
<privapp-permissions package="com.android.imsserviceentitlement">
<permission name="android.permission.MODIFY_PHONE_STATE" />
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
</privapp-permissions>
<privapp-permissions package="com.android.launcher3">
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
<permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
<permission name="android.permission.READ_REMOTE_TASKS"/>
<permission name="android.permission.REQUEST_TASK_HANDOFF"/>
</privapp-permissions>
<privapp-permissions package="com.android.location.fused">
<permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<permission name="android.permission.UPDATE_DEVICE_STATS"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
</privapp-permissions>
<privapp-permissions package="com.android.managedprovisioning">
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<permission name="android.permission.CHANGE_CONFIGURATION"/>
<permission name="android.permission.CONFIGURE_INTERACT_ACROSS_PROFILES"/>
<permission name="android.permission.CRYPT_KEEPER"/>
<permission name="android.permission.DELETE_PACKAGES"/>
<permission name="android.permission.INSTALL_PACKAGES"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_DEVICE_ADMINS"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MASTER_CLEAR"/>
<permission name="android.permission.NETWORK_MANAGED_PROVISIONING"/>
<permission name="android.permission.PERFORM_CDMA_PROVISIONING"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.SET_TIME"/>
<permission name="android.permission.SET_TIME_ZONE"/>
<permission name="android.permission.SHUTDOWN"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
<permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
<permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/>
<permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.mms.service">
<permission name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"/>
<permission name="android.permission.BIND_CARRIER_SERVICES"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
</privapp-permissions>
<privapp-permissions package="com.android.media.quality">
<permission name="android.permission.OBSERVE_PICTURE_PROFILES"/>
</privapp-permissions>
<privapp-permissions package="com.android.mtp">
<permission name="android.permission.ACCESS_MTP"/>
<permission name="android.permission.MANAGE_USB"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
</privapp-permissions>
<privapp-permissions package="com.android.musicfx">
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
</privapp-permissions>
<privapp-permissions package="com.android.networkrecommendation">
<permission name="android.permission.SCORE_NETWORKS"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
</privapp-permissions>
<privapp-permissions package="com.android.packageinstaller">
<permission name="android.permission.DELETE_PACKAGES"/>
<permission name="android.permission.INSTALL_PACKAGES"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
<permission name="android.permission.PACKAGE_USAGE_STATS"/>
<permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
<permission name="android.permission.RESOLVE_COMPONENT_FOR_UID"/>
</privapp-permissions>
<privapp-permissions package="com.android.phone">
<permission name="android.permission.ACCESS_IMS_CALL_SERVICE"/>
<permission name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"/>
<permission name="android.permission.BIND_CARRIER_SERVICES"/>
<permission name="android.permission.BIND_CELL_BROADCAST_SERVICE"/>
<permission name="android.permission.BIND_DOMAIN_SELECTION_SERVICE"/>
<permission name="android.permission.BIND_IMS_SERVICE"/>
<permission name="android.permission.BIND_SATELLITE_GATEWAY_SERVICE"/>
<permission name="android.permission.BIND_SATELLITE_SERVICE"/>
<permission name="android.permission.BIND_TELEPHONY_DATA_SERVICE"/>
<permission name="android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"/>
<permission name="android.permission.CALL_PRIVILEGED"/>
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<permission name="android.permission.CHANGE_CONFIGURATION"/>
<permission name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"/>
<permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
<permission name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
<permission name="android.permission.DUMP"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.LOCATION_BYPASS"/>
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MANAGE_SUBSCRIPTION_PLANS" />
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.OBSERVE_ROLE_HOLDERS"/>
<permission name="android.permission.PACKAGE_USAGE_STATS"/>
<permission name="android.permission.PERFORM_CDMA_PROVISIONING"/>
<permission name="android.permission.READ_CARRIER_APP_INFO"/>
<permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.READ_PROJECTION_STATE"/>
<permission name="android.permission.READ_SEARCH_INDEXABLES"/>
<permission name="android.permission.REBOOT"/>
<permission name="android.permission.REGISTER_CALL_PROVIDER"/>
<permission name="android.permission.REGISTER_SIM_SUBSCRIPTION"/>
<permission name="android.permission.REGISTER_STATS_PULL_ATOM"/>
<permission name="android.permission.SATELLITE_COMMUNICATION"/>
<permission name="android.permission.SEND_RESPOND_VIA_MESSAGE"/>
<permission name="android.permission.SHUTDOWN"/>
<permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
<permission name="android.permission.STATUS_BAR"/>
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUGGEST_TELEPHONY_TIME_AND_ZONE"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.UPDATE_DEVICE_STATS"/>
<permission name="android.permission.UPDATE_LOCK"/>
<permission name="android.permission.WRITE_APN_SETTINGS"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
<permission name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"/>
<permission name="android.permission.READ_PRECISE_PHONE_STATE"/>
<permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
<permission name="com.android.voicemail.permission.WRITE_VOICEMAIL"/>
<permission name="android.permission.LOG_COMPAT_CHANGE"/>
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG"/>
<permission name="android.permission.UWB_PRIVILEGED"/>
<permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
<permission name="android.permission.UPDATE_CONFIG"/>
<permission name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
<permission name="android.permission.MONITOR_DEFAULT_SMS_PACKAGE"/>
</privapp-permissions>
<privapp-permissions package="com.android.privatespace">
<permission name="android.permission.ACCESS_HIDDEN_PROFILES_FULL"/>
<permission name="android.permission.INTERACT_ACROSS_USERS" />
</privapp-permissions>
<privapp-permissions package="com.android.contactspicker">
<permission name="android.permission.MANAGE_CONTACTS_PICKER_SESSION" />
</privapp-permissions>
<privapp-permissions package="com.android.providers.calendar">
<permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
<permission name="android.permission.INTERACT_ACROSS_USERS" />
<permission name="android.permission.MANAGE_USERS" />
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.LOG_COMPAT_CHANGE" />
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
</privapp-permissions>
<privapp-permissions package="com.android.providers.contacts">
<permission name="android.permission.BIND_DIRECTORY_SEARCH"/>
<permission name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"/>
<permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
<permission name="android.permission.LOG_COMPAT_CHANGE" />
</privapp-permissions>
<privapp-permissions package="com.android.providers.downloads">
<permission name="android.permission.ACCESS_CACHE_FILESYSTEM"/>
<permission name="android.permission.CLEAR_APP_CACHE"/>
<permission name="android.permission.CONNECTIVITY_INTERNAL"/>
<permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.UPDATE_DEVICE_STATS"/>
<permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
</privapp-permissions>
<privapp-permissions package="com.android.providers.telephony">
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<!-- Permissions required for reading and logging compat changes -->
<permission name="android.permission.LOG_COMPAT_CHANGE" />
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
</privapp-permissions>
<privapp-permissions package="com.android.server.security.authenticationpolicy">
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_SECURE_LOCK_DEVICE"/>
<permission name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED"/>
<permission name="android.permission.USE_BIOMETRIC"/>
<permission name="android.permission.USE_BIOMETRIC_INTERNAL"/>
</privapp-permissions>
<privapp-permissions package="com.android.server.telecom">
<permission name="android.permission.BIND_CONNECTION_SERVICE"/>
<permission name="android.permission.BIND_INCALL_SERVICE"/>
<permission name="android.permission.BLUETOOTH_PRIVILEGED"/>
<permission name="android.permission.CALL_PRIVILEGED"/>
<permission name="android.permission.HANDLE_CAR_MODE_CHANGES"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MANAGE_ROLE_HOLDERS"/>
<permission name="android.permission.MODIFY_AUDIO_ROUTING" />
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
<!-- Required so Telecom can check permission for data delivery -->
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"/>
</privapp-permissions>
<privapp-permissions package="com.android.sharedstoragebackup">
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
</privapp-permissions>
<privapp-permissions package="com.android.shell">
<!-- Needed for test only -->
<permission name="android.permission.CAMERA_HEADLESS_SYSTEM_USER"/>
<permission name="android.permission.MANAGE_HEALTH_DATA"/>
<permission name="android.permission.LAUNCH_DEVICE_MANAGER_SETUP"/>
<permission name="android.permission.MODIFY_DAY_NIGHT_MODE"/>
<permission name="android.permission.ACCESS_LOWPAN_STATE"/>
<permission name="android.permission.BACKUP"/>
<permission name="android.permission.ENTER_TRADE_IN_MODE"/>
<permission name="android.permission.GET_DEVICE_LOCK_ENROLLMENT_TYPE"/>
<!-- Needed for GMSCore Location API test only -->
<permission name="android.permission.LOCATION_BYPASS"/>
<!-- Needed for XTS tests only. -->
<permission name="android.permission.READ_LOCATION_BYPASS_ALLOWLIST"/>
<!-- Needed for test only -->
<permission name="android.permission.BATTERY_PREDICTION"/>
<permission name="android.permission.BATTERY_STATS"/>
<permission name="android.permission.ACCESS_FINE_POWER_MONITORS" />
<!-- BLUETOOTH_PRIVILEGED is needed for test only -->
<permission name="android.permission.BLUETOOTH_PRIVILEGED"/>
<permission name="android.permission.BIND_APPWIDGET"/>
<!-- Needed for CTS tests only -->
<permission name="android.permission.OBSERVE_PICTURE_PROFILES"/>
<permission name="android.permission.CHANGE_APP_IDLE_STATE"/>
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<permission name="android.permission.CHANGE_CONFIGURATION"/>
<permission name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST" />
<permission name="android.permission.CHANGE_LOWPAN_STATE"/>
<permission name="android.permission.CHANGE_OVERLAY_PACKAGES"/>
<permission name="android.permission.CLEAR_APP_CACHE"/>
<permission name="android.permission.ACCESS_INSTANT_APPS" />
<permission name="android.permission.CONNECTIVITY_INTERNAL"/>
<permission name="android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS" />
<permission name="android.permission.DELETE_CACHE_FILES"/>
<permission name="android.permission.DELETE_PACKAGES"/>
<permission name="android.permission.DUMP"/>
<permission name="android.permission.CONTROL_UI_TRACING"/>
<permission name="android.permission.ACTIVITY_EMBEDDING"/>
<permission name="android.permission.REQUEST_SYSTEM_MULTITASKING_CONTROLS" />
<permission name="android.permission.FORCE_STOP_PACKAGES"/>
<permission name="android.permission.GET_APP_OPS_STATS"/>
<permission name="android.permission.WATCH_APPOPS"/>
<permission name="android.permission.INSTALL_DYNAMIC_SYSTEM"/>
<permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<permission name="android.permission.INSTALL_PACKAGES"/>
<permission name="android.permission.INSTALL_PACKAGE_UPDATES"/>
<permission name="android.permission.KILL_ALL_BACKGROUND_PROCESSES"/>
<permission name="android.permission.PROVIDE_PRIVATE_COMPUTE_SERVICES"/>
<!-- Needed for test only -->
<permission name="android.permission.LISTEN_FOR_KEY_ACTIVITY" />
<!-- Needed for test only -->
<permission name="android.permission.ACCESS_MTP"/>
<!-- Needed for test only -->
<permission name="android.permission.INTERACT_ACROSS_PROFILES"/>
<!-- Needed for test only -->
<permission name="android.permission.ACCESS_COMPUTER_CONTROL"/>
<!-- Permission required to test onPermissionsChangedListener -->
<permission name="android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS"/>
<!-- Needed for CTS tests only -->
<permission name="android.permission.INJECT_KEY_EVENTS"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.QUERY_USERS"/>
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
<permission name="android.permission.MANAGE_ACCESSIBILITY"/>
<permission name="android.permission.MANAGE_DEVICE_ADMINS"/>
<permission name="android.permission.ACCESS_FPS_COUNTER"/>
<permission name="android.permission.MANAGE_GAME_MODE"/>
<permission name="android.permission.MANAGE_GAME_ACTIVITY" />
<permission name="android.permission.MANAGE_LOW_POWER_STANDBY" />
<permission name="android.permission.SET_LOW_POWER_STANDBY_PORTS" />
<permission name="android.permission.MANAGE_ROLLBACKS"/>
<permission name="android.permission.MANAGE_USB"/>
<!-- Permission required to test Launcher Apps APIs for hidden profiles -->
<permission name="android.permission.ACCESS_HIDDEN_PROFILES_FULL" />
<!-- Needed for tests only -->
<permission name="android.permission.MANAGE_CLOUDSEARCH" />
<permission name="android.permission.MANAGE_WALLPAPER_EFFECTS_GENERATION" />
<permission name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"/>
<permission name="android.permission.MODIFY_DAY_NIGHT_MODE"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<permission name="android.permission.MOVE_PACKAGE"/>
<!-- Needed for test only -->
<permission name="android.permission.RESTART_WIFI_SUBSYSTEM"/>
<permission name="android.permission.OBSERVE_APP_USAGE"/>
<permission name="android.permission.NETWORK_SCAN"/>
<permission name="android.permission.PACKAGE_USAGE_STATS" />
<!-- Needed for test only -->
<permission name="android.permission.PACKET_KEEPALIVE_OFFLOAD" />
<permission name="android.permission.POWER_SAVER" />
<!-- Needed for CTS tests -->
<permission name="android.permission.READ_ACTIVE_EMERGENCY_SESSION"/>
<permission name="android.permission.READ_CARRIER_APP_INFO"/>
<permission name="android.permission.READ_FRAME_BUFFER"/>
<permission name="android.permission.READ_LOWPAN_CREDENTIAL"/>
<!-- Needed for test only -->
<permission name="android.permission.READ_PRECISE_PHONE_STATE" />
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<!-- Permission required for UiModeManager CTS test -->
<permission name="android.permission.READ_PROJECTION_STATE"/>
<permission name="android.permission.READ_WALLPAPER_INTERNAL"/>
<permission name="android.permission.READ_WIFI_CREDENTIAL"/>
<permission name="android.permission.REAL_GET_TASKS"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.REGISTER_CALL_PROVIDER"/>
<permission name="android.permission.REGISTER_CONNECTION_MANAGER"/>
<permission name="android.permission.REGISTER_SIM_SUBSCRIPTION"/>
<permission name="android.permission.RETRIEVE_WINDOW_CONTENT"/>
<permission name="android.permission.SCHEDULE_EXACT_ALARM"/>
<permission name="android.permission.SET_ALWAYS_FINISH"/>
<permission name="android.permission.SET_ANIMATION_SCALE"/>
<permission name="android.permission.SET_DEBUG_APP"/>
<permission name="android.permission.SET_PROCESS_LIMIT"/>
<permission name="android.permission.SET_TIME"/>
<permission name="android.permission.SET_TIME_ZONE"/>
<permission name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
<permission name="android.permission.STATUS_BAR"/>
<permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
<permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND" />
<permission name="android.permission.START_TASKS_FROM_RECENTS" />
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
<permission name="android.permission.SUSPEND_APPS" />
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.UWB_PRIVILEGED"/>
<permission name="android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
<permission name="android.permission.STATUS_BAR_SERVICE"/>
<permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"/>
<permission name="android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS"/>
<permission name="android.permission.MANAGE_WEAK_ESCROW_TOKEN"/>
<permission name="android.permission.SET_WALLPAPER" />
<permission name="android.permission.SET_WALLPAPER_COMPONENT" />
<permission name="android.permission.SET_WALLPAPER_DIM_AMOUNT" />
<permission name="android.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE" />
<!-- Permissions required for Incremental CTS tests -->
<permission name="com.android.permission.USE_INSTALLER_V2"/>
<permission name="android.permission.LOADER_USAGE_STATS"/>
<!-- Permissions required for Package Verifier tests -->
<permission name="android.permission.PACKAGE_VERIFICATION_AGENT" />
<!-- Permission required to test system only camera devices. -->
<permission name="android.permission.SYSTEM_CAMERA" />
<!-- Permission required to test ExplicitHealthCheckServiceImpl. -->
<permission name="android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE"/>
<!-- Permission required for UiModeManager CTS test. -->
<permission name="android.permission.ENTER_CAR_MODE_PRIORITIZED"/>
<!-- Permission required for Telecom car mode CTS tests. -->
<permission name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
<!-- Permission required for Tethering CTS tests. -->
<permission name="android.permission.TETHER_PRIVILEGED"/>
<!-- Permissions required for ganting and logging -->
<permission name="android.permission.LOG_COMPAT_CHANGE" />
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
<permission name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG" />
<permission name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD" />
<!-- Permissions required to test ambient display. -->
<permission name="android.permission.READ_DREAM_STATE" />
<permission name="android.permission.WRITE_DREAM_STATE" />
<!-- Permission required to test lights control APIs. -->
<permission name="android.permission.CONTROL_DEVICE_LIGHTS" />
<!-- Permission required for ShortcutManagerUsageTest CTS test. -->
<permission name="android.permission.ACCESS_SHORTCUTS"/>
<permission name="android.permission.REBOOT"/>
<!-- Permission required for NfcResolverActivity CTS tests. -->
<permission name="android.permission.SHOW_CUSTOMIZED_RESOLVER"/>
<!-- Permission required for access VIBRATOR_STATE. -->
<permission name="android.permission.ACCESS_VIBRATOR_STATE"/>
<!-- Permission required for vendor vibration effects and sessions. -->
<permission name="android.permission.VIBRATE_VENDOR_EFFECTS"/>
<permission name="android.permission.START_VIBRATION_SESSIONS"/>
<!-- Permission required for haptic generator sessions. -->
<permission name="android.permission.USE_VIBRATOR_HAPTIC_GENERATOR"/>
<!-- Permission required for UsageStatsTest CTS test. -->
<permission name="android.permission.MANAGE_NOTIFICATIONS"/>
<!-- Permission required for CompanionDeviceManager CTS test. -->
<permission name="android.permission.COMPANION_APPROVE_WIFI_CONNECTIONS" />
<permission name="android.permission.MANAGE_COMPANION_DEVICES" />
<permission name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" />
<permission name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" />
<permission name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" />
<permission name="android.permission.REQUEST_COMPANION_PROFILE_VIRTUAL_DEVICE" />
<permission name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER" />
<permission name="android.permission.REQUEST_COMPANION_SELF_MANAGED" />
<permission name="android.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE" />
<permission name="android.permission.ACCESS_COMPANION_MESSAGE_PCC" />
<permission name="android.permission.ACCESS_COMPANION_INFO" />
<permission name="android.permission.READ_REMOTE_TASKS" />
<permission name="android.permission.REQUEST_TASK_HANDOFF" />
<permission name="android.permission.READ_HANDOFF_SETTINGS" />
<permission name="android.permission.MODIFY_HANDOFF_SETTINGS" />
<!-- Permission required for testing registering pull atom callbacks. -->
<permission name="android.permission.REGISTER_STATS_PULL_ATOM"/>
<!-- Permission required for testing system audio effect APIs. -->
<permission name="android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS"/>
<!-- Permissions required for CTS test - TunerTest -->
<permission name="android.permission.ACCESS_TV_DESCRAMBLER" />
<permission name="android.permission.ACCESS_TV_SHARED_FILTER" />
<permission name="android.permission.ACCESS_TV_TUNER" />
<permission name="android.permission.TUNER_RESOURCE_ACCESS" />
<!-- Permissions required for CTS test - TVInputManagerTest -->
<permission name="android.permission.ACCESS_TUNED_INFO" />
<permission name="android.permission.TV_INPUT_HARDWARE" />
<permission name="android.permission.TIS_EXTENSION_INTERFACE" />
<permission name="com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS" />
<permission name="com.android.providers.tv.permission.WRITE_EPG_DATA"/>
<!-- Permission required for CTS test - PrivilegedLocationPermissionTest -->
<permission name="android.permission.LOCATION_HARDWARE" />
<!-- Permissions required for GTS test - GtsDialerAudioTestCases -->
<permission name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<!-- Permissions required for CTS test - AdbManagerTest -->
<permission name="android.permission.MANAGE_DEBUGGING" />
<!-- Permissions required for CTS test - TimeManagerTest -->
<permission name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION" />
<permission name="android.permission.SUGGEST_EXTERNAL_TIME" />
<!-- Permissions required for CTS test - android.server.biometrics -->
<permission name="android.permission.USE_BIOMETRIC" />
<permission name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" />
<permission name="android.permission.MANAGE_BIOMETRIC_DIALOG" />
<!-- Permissions required for biometrics CTS tests and AuthenticationPolicyManagerTest-->
<permission name="android.permission.TEST_BIOMETRIC" />
<permission name="android.permission.MANAGE_BIOMETRIC" />
<!-- Permission required for CTS test - AuthenticationPolicyManagerTest -->
<permission name="android.permission.MANAGE_SECURE_LOCK_DEVICE" />
<!-- Permissions required for CTS test - CtsContactsProviderTestCases -->
<permission name="android.contacts.permission.MANAGE_SIM_ACCOUNTS" />
<!-- Permissions required for CTS test - CtsHdmiCecHostTestCases -->
<permission name="android.permission.HDMI_CEC"/>
<!-- Permission required for CTS test - MediaPlayerTest -->
<permission name="android.permission.BIND_IMS_SERVICE" />
<!-- Permission needed for CTS test - WifiManagerTest -->
<permission name="android.permission.WIFI_ACCESS_COEX_UNSAFE_CHANNELS" />
<permission name="android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS" />
<permission name="android.permission.NEARBY_WIFI_DEVICES" />
<permission name="android.permission.MANAGE_WIFI_INTERFACES" />
<permission name="android.permission.OVERRIDE_WIFI_CONFIG" />
<permission name="android.permission.WIFI_SET_DEVICE_MOBILITY_STATE" />
<!-- Permission needed for CTS test - ConcurrencyTest#testP2pExternalApprover
P2P external approver API sets require MANAGE_WIFI_NETWORK_SELECTION permission. -->
<permission name="android.permission.MANAGE_WIFI_NETWORK_SELECTION" />
<!-- Permission needed for CTS test - ConcurrencyTest#testP2pSetWfdInfo -->
<permission name="android.permission.CONFIGURE_WIFI_DISPLAY" />
<!-- Permission required for CTS test - CtsThreadNetworkTestCases -->
<permission name="android.permission.THREAD_NETWORK_PRIVILEGED"/>
<!-- Permission required for CTS test CarrierMessagingServiceWrapperTest -->
<permission name="android.permission.BIND_CARRIER_SERVICES"/>
<!-- Permission required for CTS test - MusicRecognitionManagerTest -->
<permission name="android.permission.MANAGE_MUSIC_RECOGNITION" />
<!-- Permission required for CTS test - CallLogTest -->
<permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
<permission name="android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS"/>
<permission name="android.permission.MODIFY_QUIET_MODE" />
<!-- Permission required for GTS test - GtsAssistIntentTestCases -->
<permission name="android.permission.MANAGE_SOUND_TRIGGER" />
<permission name="android.permission.CAPTURE_AUDIO_HOTWORD" />
<!-- Permission required for CTS test - CtsRebootReadinessTestCases -->
<permission name="android.permission.SIGNAL_REBOOT_READINESS" />
<!-- Permission required for CTS test - PeopleManagerTest -->
<permission name="android.permission.READ_PEOPLE_DATA" />
<!-- Permission required for CTS test - UiTranslationManagerTest -->
<permission name="android.permission.MANAGE_UI_TRANSLATION" />
<!-- Permission required for CTS test - ClipboardManagerTest -->
<permission name="android.permission.SET_CLIP_SOURCE" />
<!-- Permission required for CTS test - FontManagerTest -->
<permission name="android.permission.UPDATE_FONTS" />
<!-- Permission required for hotword detection service CTS tests -->
<permission name="android.permission.MANAGE_HOTWORD_DETECTION" />
<permission name="android.permission.BIND_HOTWORD_DETECTION_SERVICE" />
<permission name="android.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE" />
<permission name="android.permission.MANAGE_APP_HIBERNATION"/>
<permission name="android.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO" />
<!-- Permission required for CTS test - ResourceObserverNativeTest -->
<permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" />
<!-- Permission required for CTS test - MediaCodecResourceTest -->
<permission name="android.permission.MEDIA_RESOURCE_OVERRIDE_PID" />
<!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
<permission name="android.permission.SCHEDULE_PRIORITIZED_ALARM" />
<!-- Permission required for CTS test - SystemMediaRouter2Test -->
<permission name="android.permission.MEDIA_CONTENT_CONTROL"/>
<permission name="android.permission.MODIFY_AUDIO_ROUTING"/>
<permission name="android.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED"/>
<!-- Permission required for CTS test - MediaSessionTest -->
<permission name="android.permission.OVERRIDE_MEDIA_SESSION_OWNER"/>
<!-- Permission required for CTS test - CallAudioInterceptionTest -->
<permission name="android.permission.CALL_AUDIO_INTERCEPTION"/>
<!-- Permission required for CTS test - CtsAttributionSourceTestCases -->
<permission name="android.permission.RENOUNCE_PERMISSIONS" />
<permission name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
<permission name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" />
<permission name="android.permission.READ_LOGS" />
<permission name="android.permission.BRIGHTNESS_SLIDER_USAGE" />
<permission name="android.permission.ACCESS_AMBIENT_LIGHT_STATS" />
<permission name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS" />
<permission name="android.permission.GET_TOP_ACTIVITY_INFO" />
<permission name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER" />
<permission name="android.permission.SET_MEDIA_KEY_LISTENER" />
<permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
<!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
<permission name="android.permission.UPDATE_DEVICE_STATS" />
<!-- Permission required for GTS test - PendingSystemUpdateTest -->
<permission name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE" />
<!-- Permission required for GTS test - GtsAssistIntentTestCases -->
<permission name="android.permission.MANAGE_VOICE_KEYPHRASES" />
<!-- Permission required for test - CellBroadcastComplianceTest -->
<permission name="com.android.cellbroadcastservice.FULL_ACCESS_CELL_BROADCAST_HISTORY" />
<!-- Permission required for ATS test - CarDevicePolicyManagerTest -->
<permission name="android.permission.LOCK_DEVICE" />
<!-- Permissions required for CTS test - CtsSafetyCenterTestCases -->
<permission name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
<permission name="android.permission.READ_SAFETY_CENTER_STATUS" />
<permission name="android.permission.MANAGE_SAFETY_CENTER" />
<!-- Permission required for CTS test - CtsTelephonyTestCases -->
<permission name="android.permission.BIND_TELECOM_CONNECTION_SERVICE" />
<permission name="android.permission.ACCESS_LAST_KNOWN_CELL_ID" />
<!-- Permission required for CTS test - CtsAppTestCases -->
<permission name="android.permission.CAPTURE_MEDIA_OUTPUT" />
<permission name="android.permission.CAPTURE_TUNER_AUDIO_INPUT" />
<permission name="android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT" />
<permission name="android.permission.MODIFY_CELL_BROADCASTS" />
<!-- Permission required for CTS test - CtsBroadcastRadioTestCases -->
<permission name="android.permission.ACCESS_BROADCAST_RADIO"/>
<!-- Permission required for CTS test - CtsAmbientContextServiceTestCases -->
<permission name="android.permission.ACCESS_AMBIENT_CONTEXT_EVENT"/>
<!-- Permission required for CTS test - CtsWearableSensingServiceTestCases -->
<permission name="android.permission.MANAGE_WEARABLE_SENSING_SERVICE"/>
<!-- Permission required for CTS test - OnDeviceIntelligenceManagerTest -->
<permission name="android.permission.USE_ON_DEVICE_INTELLIGENCE" />
<!-- Permission required for CTS test - CtsTelephonyProviderTestCases -->
<permission name="android.permission.WRITE_APN_SETTINGS"/>
<!-- Permission required for GTS test - GtsStatsdHostTestCases -->
<permission name="android.permission.READ_RESTRICTED_STATS"/>
<!-- Permission required for CTS test -->
<permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE"/>
<!-- Permission required for CTS test - CtsVoiceInteractionTestCases -->
<permission name="android.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER"/>
<!-- Permission required for CTS test - SatelliteManagerTest -->
<permission name="android.permission.SATELLITE_COMMUNICATION"/>
<!-- Permission required for GTS test - GtsAttestationVerificationDeviceSideTestCases -->
<permission name="android.permission.USE_ATTESTATION_VERIFICATION_SERVICE" />
<!-- Permission required for GTS test - GtsCredentialsTestCases -->
<permission name="android.permission.LAUNCH_CREDENTIAL_SELECTOR"/>
<!-- Permission required for CTS test IntentRedirectionTest -->
<permission name="android.permission.QUERY_CLONED_APPS"/>
<permission name="android.permission.GET_BINDING_UID_IMPORTANCE"/>
<!-- Permission required for CTS test CtsNotificationTestCases -->
<permission name="android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS" />
<permission name="android.permission.HIDE_STATUS_BAR_NOTIFICATION" />
<permission name="android.permission.POST_BRIDGED_NOTIFICATIONS" />
<!-- Permission required for BinaryTransparencyService shell API and host test -->
<permission name="android.permission.GET_BACKGROUND_INSTALLED_PACKAGES" />
<permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
<!-- Permissions required for CTS test - CtsContactKeysProviderPrivilegedApp -->
<permission name="android.permission.WRITE_VERIFICATION_STATE_E2EE_CONTACT_KEYS"/>
<!-- Permission required for CTS test BlockedNumberContractTest -->
<permission name="android.permission.WRITE_BLOCKED_NUMBERS" />
<permission name="android.permission.READ_BLOCKED_NUMBERS" />
<!-- Permission required for CTS test - PackageManagerTest -->
<permission name="android.permission.DOMAIN_VERIFICATION_AGENT"/>
<permission name="android.permission.DEVELOPER_VERIFICATION_AGENT"/>
<!-- Permission required for CTS test CtsInputTestCases -->
<permission name="android.permission.OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW" />
<!-- Permission required for CTS test - PackageManagerShellCommandInstallTest -->
<permission name="android.permission.EMERGENCY_INSTALL_PACKAGES" />
<!-- Permission required for Cts test - CtsSettingsTestCases -->
<permission name="android.permission.PREPARE_FACTORY_RESET" />
<!-- Permission required for CTS test - FileIntegrityManagerTest -->
<permission name="android.permission.SETUP_FSVERITY" />
<!-- Permissions required for CTS test - AppFunctionManagerTest -->
<permission name="android.permission.EXECUTE_APP_FUNCTIONS" />
<!-- Permission required for CTS test - CtsNfcTestCases -->
<permission name="android.permission.NFC_SET_CONTROLLER_ALWAYS_ON" />
<!-- Permission required for CTS test - CtsAppTestCases -->
<permission name="android.permission.KILL_UID" />
<!-- Permission required for CTS test - AdvancedProtectionManagerTest -->
<permission name="android.permission.MANAGE_ADVANCED_PROTECTION_MODE" />
<permission name="android.permission.QUERY_ADVANCED_PROTECTION_MODE" />
<!-- Permissions required for CTS test - SettingsPreferenceServiceClientTest -->
<permission name="android.permission.READ_SYSTEM_PREFERENCES" />
<permission name="android.permission.WRITE_SYSTEM_PREFERENCES" />
<!-- Permission required for CTS test - IntrusionDetectionManagerTest -->
<permission name="android.permission.READ_INTRUSION_DETECTION_STATE" />
<permission name="android.permission.MANAGE_INTRUSION_DETECTION_STATE" />
<!-- Permission required for CTS test - KeyguardLockedStateApiTest -->
<permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" />
<!-- Permission required for CTS test - CtsContentProviderMultiUserTest -->
<permission name="android.permission.RESOLVE_COMPONENT_FOR_UID"/>
<!-- Permission required for CTS test - MediaQualityTest -->
<permission name="android.permission.MANAGE_GLOBAL_PICTURE_QUALITY_SERVICE"/>
<permission name="android.permission.MANAGE_GLOBAL_SOUND_QUALITY_SERVICE"/>
<permission name="android.permission.READ_COLOR_ZONES"/>
<!-- Permission required for CTS test - CtsTextClassifierTestCases -->
<permission name="android.permission.ACCESS_TEXT_CLASSIFIER_BY_TYPE"/>
<!-- Permission required for CTS test - CtsSecurityTestCases -->
<permission name="android.permission.MANAGE_DEVICE_POLICY_MTE"/>
<!-- Permission required for integration test - InputTest -->
<permission name="android.permission.LISTEN_FOR_KEY_ACTIVITY"/>
<permission name="android.permission.OBSERVE_ROLE_HOLDERS"/>
<!-- Permission required for CTS test - CtsRoleTestCases -->
<permission name="android.permission.GET_ROLE_HOLDERS"/>
<!-- Permission required for CTS test - CtsAnomalyDetectorTests -->
<permission name="android.permission.CONFIGURE_ANOMALY_DETECTOR"/>
<!-- Permission required for CTS test - CtsNpuManagerTestCases -->
<permission name="android.permission.ACCESS_NPU_MODEL_MANAGER_API"/>
<!-- Permission required for CTS test - CtsProviderUiTestCases -->
<permission name="android.permission.MANAGE_DOCUMENTS"/>
<!-- Permission required for CTS test - StatusBarManagerTest -->
<permission name="android.permission.SHOW_POWER_MENU_PRIVILEGED" />
<!-- Permission required for Health Connect CTS tests -->
<permission name="android.permission.PROVIDE_HEALTH_CONNECT_DEVICE_DATA" />
</privapp-permissions>
<privapp-permissions package="com.android.soundpicker">
<permission name="android.permission.INTERACT_ACROSS_USERS" />
</privapp-permissions>
<privapp-permissions package="com.android.providers.tv">
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
</privapp-permissions>
<privapp-permissions package="com.android.tv">
<permission name="android.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE"/>
<permission name="android.permission.DVB_DEVICE"/>
<permission name="android.permission.GLOBAL_SEARCH"/>
<permission name="android.permission.HDMI_CEC"/>
<permission name="android.permission.MODIFY_PARENTAL_CONTROLS"/>
<permission name="android.permission.READ_CONTENT_RATING_SYSTEMS"/>
<permission name="com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA"/>
<permission name="com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS"/>
</privapp-permissions>
<privapp-permissions package="com.android.vpndialogs">
<permission name="android.permission.CONTROL_VPN"/>
</privapp-permissions>
<privapp-permissions package="com.android.wallpaper.livepicker">
<permission name="android.permission.SET_WALLPAPER_COMPONENT"/>
<permission name="android.permission.BIND_WALLPAPER"/>
</privapp-permissions>
<privapp-permissions package="com.android.wallpaper">
<permission name="android.permission.SET_WALLPAPER_COMPONENT"/>
<permission name="android.permission.BIND_WALLPAPER"/>
<permission name="android.permission.CUSTOMIZE_SYSTEM_UI"/>
<permission name="android.permission.SET_WALLPAPER_DIM_AMOUNT"/>
</privapp-permissions>
<privapp-permissions package="com.android.dynsystem">
<permission name="android.permission.REBOOT"/>
<permission name="android.permission.MANAGE_DYNAMIC_SYSTEM"/>
<permission name="android.permission.READ_OEM_UNLOCK_STATE"/>
</privapp-permissions>
<privapp-permissions package="com.android.settings">
<permission name="android.permission.INSTALL_DYNAMIC_SYSTEM"/>
<permission name="android.permission.BIND_CELL_BROADCAST_SERVICE"/>
<permission name="android.permission.MANAGE_SAFETY_CENTER" />
<permission name="android.permission.READ_SAFETY_CENTER_STATUS" />
<permission name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
<permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
</privapp-permissions>
<privapp-permissions package="com.android.bips">
<permission name="android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON"/>
</privapp-permissions>
<privapp-permissions package="com.android.calllogbackup">
<permission name="com.android.voicemail.permission.READ_VOICEMAIL"/>
</privapp-permissions>
<privapp-permissions package="com.android.devicediagnostics">
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.BATTERY_STATS"/>
<permission name="android.permission.ENTER_TRADE_IN_MODE"/>
</privapp-permissions>
<privapp-permissions package="com.android.wm.shell">
<permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" />
</privapp-permissions>
<privapp-permissions package="com.android.crossdevicesync">
<permission name="android.permission.INTERACT_ACROSS_USERS" />
<permission name="android.permission.MANAGE_USERS" />
</privapp-permissions>
</permissions>

Binary file not shown.

Binary file not shown.

View File

@@ -1,643 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Miracast Enabler</title>
<style>
:root {
--bg: #121212;
--surface: #1e1e1e;
--surface2: #2a2a2a;
--primary: #bb86fc;
--primary-dim: #9965d6;
--on-surface: #e0e0e0;
--on-surface-dim: #888;
--success: #4caf50;
--warning: #ff9800;
--error: #f44336;
--radius: 12px;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: var(--bg);
color: var(--on-surface);
min-height: 100vh;
padding: 16px;
-webkit-font-smoothing: antialiased;
}
.header {
text-align: center;
padding: 24px 0 16px;
}
.header h1 {
font-size: 22px;
font-weight: 600;
color: var(--primary);
}
.header .version {
font-size: 12px;
color: var(--on-surface-dim);
margin-top: 4px;
}
.status-banner {
display: flex;
align-items: center;
gap: 10px;
padding: 14px 16px;
border-radius: var(--radius);
margin-bottom: 20px;
font-size: 14px;
font-weight: 500;
}
.status-banner.active {
background: rgba(76, 175, 80, 0.15);
color: var(--success);
}
.status-banner.inactive {
background: rgba(244, 67, 54, 0.15);
color: var(--error);
}
.status-banner.loading {
background: rgba(255, 152, 0, 0.15);
color: var(--warning);
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: currentColor;
flex-shrink: 0;
}
.card {
background: var(--surface);
border-radius: var(--radius);
padding: 16px;
margin-bottom: 12px;
}
.card-title {
font-size: 13px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--primary);
margin-bottom: 12px;
}
.setting-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 0;
border-bottom: 1px solid var(--surface2);
}
.setting-row:last-child { border-bottom: none; }
.setting-label {
font-size: 15px;
font-weight: 500;
}
.setting-desc {
font-size: 12px;
color: var(--on-surface-dim);
margin-top: 2px;
}
.toggle {
position: relative;
width: 48px;
height: 26px;
flex-shrink: 0;
}
.toggle input {
opacity: 0;
width: 0;
height: 0;
}
.toggle .slider {
position: absolute;
inset: 0;
background: var(--surface2);
border-radius: 13px;
cursor: pointer;
transition: background 0.2s;
}
.toggle .slider::before {
content: "";
position: absolute;
width: 20px;
height: 20px;
left: 3px;
bottom: 3px;
background: var(--on-surface-dim);
border-radius: 50%;
transition: transform 0.2s, background 0.2s;
}
.toggle input:checked + .slider {
background: var(--primary-dim);
}
.toggle input:checked + .slider::before {
transform: translateX(22px);
background: var(--primary);
}
select.setting-select {
background: var(--surface2);
color: var(--on-surface);
border: none;
border-radius: 8px;
padding: 8px 12px;
font-size: 14px;
outline: none;
cursor: pointer;
flex-shrink: 0;
}
.info-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.info-item {
background: var(--surface2);
border-radius: 8px;
padding: 10px 12px;
}
.info-item .label {
font-size: 11px;
color: var(--on-surface-dim);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.info-item .value {
font-size: 14px;
font-weight: 500;
margin-top: 2px;
word-break: break-all;
}
.log-area {
background: var(--surface2);
border-radius: 8px;
padding: 12px;
font-family: "Cascadia Code", "Fira Code", monospace;
font-size: 12px;
line-height: 1.6;
max-height: 200px;
overflow-y: auto;
color: var(--on-surface-dim);
white-space: pre-wrap;
word-break: break-all;
}
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 10px 20px;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: opacity 0.2s;
width: 100%;
margin-top: 8px;
}
.btn:active { opacity: 0.7; }
.btn-primary {
background: var(--primary);
color: #000;
}
.btn-secondary {
background: var(--surface2);
color: var(--on-surface);
}
</style>
</head>
<body>
<div class="header">
<h1>Miracast Enabler</h1>
<div class="version">v1.0.0</div>
</div>
<div id="statusBanner" class="status-banner loading">
<div class="status-dot"></div>
<span id="statusText">Reading device state...</span>
</div>
<!-- Core Toggles -->
<div class="card">
<div class="card-title">Miracast</div>
<div class="setting-row">
<div>
<div class="setting-label">Wi-Fi Display</div>
<div class="setting-desc">Master toggle for Miracast</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleWfd" onchange="setProp('persist.debug.wfd.enable', this.checked ? '1' : '0')">
<span class="slider"></span>
</label>
</div>
<div class="setting-row">
<div>
<div class="setting-label">Disable HDCP</div>
<div class="setting-desc">Skip DRM handshake (fixes many receivers)</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleHdcp" onchange="setProp('persist.sys.wfd.nohdcp', this.checked ? '1' : '0')">
<span class="slider"></span>
</label>
</div>
<div class="setting-row">
<div>
<div class="setting-label">Virtual Display</div>
<div class="setting-desc">Use virtual display instead of overlay</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleVirtual" onchange="setProp('persist.sys.wfd.virtual', this.checked ? '1' : '0')">
<span class="slider"></span>
</label>
</div>
</div>
<!-- Resolution & Codec -->
<div class="card">
<div class="card-title">Quality</div>
<div class="setting-row">
<div>
<div class="setting-label">Max Resolution</div>
<div class="setting-desc">Caps output resolution for stability</div>
</div>
<select class="setting-select" id="selectResolution" onchange="setProp('persist.sys.wfd.resolution', this.value)">
<option value="0">Auto</option>
<option value="7">1920x1080 (30Hz)</option>
<option value="28">1920x1080 (60Hz)</option>
<option value="6">1280x720 (30Hz)</option>
<option value="27">1280x720 (60Hz)</option>
<option value="5">800x480 (30Hz)</option>
</select>
</div>
<div class="setting-row">
<div>
<div class="setting-label">WLAN HDCP</div>
<div class="setting-desc">Wi-Fi level HDCP control</div>
</div>
<select class="setting-select" id="selectWlanHdcp" onchange="setProp('wlan.wfd.hdcp', this.value)">
<option value="disable">Disabled</option>
<option value="enable">Enabled</option>
</select>
</div>
</div>
<!-- Pixel-Specific -->
<div class="card">
<div class="card-title">Pixel / Tensor Tweaks</div>
<div class="setting-row">
<div>
<div class="setting-label">Force P2P Concurrency</div>
<div class="setting-desc">Allow Wi-Fi Direct alongside station mode</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleP2p" onchange="setProp('wifi.direct.interface', this.checked ? 'p2p-dev-wlan0' : '')">
<span class="slider"></span>
</label>
</div>
<div class="setting-row">
<div>
<div class="setting-label">Force Display Composition</div>
<div class="setting-desc">Use GPU composition for wireless display</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleComposition" onchange="setProp('debug.sf.enable_hwc_vds', this.checked ? '0' : '1')">
<span class="slider"></span>
</label>
</div>
<div class="setting-row">
<div>
<div class="setting-label">Fold Display Source</div>
<div class="setting-desc">Which display to mirror on foldables</div>
</div>
<select class="setting-select" id="selectFoldDisplay" onchange="setFoldDisplay(this.value)">
<option value="default">Active Display</option>
<option value="inner">Inner Display</option>
<option value="outer">Outer Display</option>
</select>
</div>
</div>
<!-- Framework Overlay -->
<div class="card">
<div class="card-title">Framework Overlay</div>
<div class="setting-row">
<div>
<div class="setting-label">config_enableWifiDisplay</div>
<div class="setting-desc">Framework feature flag (fabricated overlay)</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleOverlayWfd" onchange="setFabricatedOverlay('MiracastEnablerWifiDisplay', 'config_enableWifiDisplay', this.checked)">
<span class="slider"></span>
</label>
</div>
<div class="setting-row">
<div>
<div class="setting-label">config_wifiDisplaySupportsProtectedBuffers</div>
<div class="setting-desc">Allow DRM content over wireless display</div>
</div>
<label class="toggle">
<input type="checkbox" id="toggleOverlayProtected" onchange="setFabricatedOverlay('MiracastEnablerProtectedBuffers', 'config_wifiDisplaySupportsProtectedBuffers', this.checked)">
<span class="slider"></span>
</label>
</div>
<div class="setting-row">
<div>
<div class="setting-label">Overlay Status</div>
<div class="setting-desc" id="overlayStatusDesc">Checking...</div>
</div>
<button class="btn btn-secondary" style="width:auto;margin:0;padding:6px 14px" onclick="reapplyOverlays()">Re-apply</button>
</div>
</div>
<!-- Device Info -->
<div class="card">
<div class="card-title">Device Info</div>
<div class="info-grid">
<div class="info-item">
<div class="label">Device</div>
<div class="value" id="infoDevice"></div>
</div>
<div class="info-item">
<div class="label">SoC</div>
<div class="value" id="infoSoc"></div>
</div>
<div class="info-item">
<div class="label">Android</div>
<div class="value" id="infoAndroid"></div>
</div>
<div class="info-item">
<div class="label">Wi-Fi Chip</div>
<div class="value" id="infoWifi"></div>
</div>
</div>
</div>
<!-- Log -->
<div class="card">
<div class="card-title">Log</div>
<div class="log-area" id="logArea">Initializing...</div>
<div style="display:flex;gap:8px">
<button class="btn btn-secondary" style="flex:1" onclick="refreshAll()">Refresh Status</button>
<button class="btn btn-secondary" style="flex:1" onclick="showModuleLog()">Module Log</button>
</div>
</div>
<script>
// KernelSU WebUI shell execution wrapper
function exec(cmd) {
return new Promise((resolve, reject) => {
const callbackName = 'exec_cb_' + Date.now() + '_' + Math.random().toString(36).slice(2);
window[callbackName] = (errno, stdout, stderr) => {
delete window[callbackName];
resolve({ errno, stdout: stdout || '', stderr: stderr || '' });
};
try {
ksu.exec(cmd, '{}', callbackName);
} catch (e) {
delete window[callbackName];
reject(e);
}
});
}
function log(msg) {
const area = document.getElementById('logArea');
const ts = new Date().toLocaleTimeString('en-US', { hour12: false });
area.textContent += '\n[' + ts + '] ' + msg;
area.scrollTop = area.scrollHeight;
}
async function getprop(name) {
try {
const r = await exec('getprop ' + name);
return r.stdout.trim();
} catch (e) {
return '';
}
}
async function setProp(name, value) {
log('Setting ' + name + '=' + value);
try {
// resetprop for runtime, setprop for persistence where applicable
await exec('resetprop ' + name + ' ' + JSON.stringify(value));
log('OK: ' + name + ' = ' + value);
updateStatus();
} catch (e) {
log('ERROR setting ' + name + ': ' + e.message);
}
}
async function setFabricatedOverlay(name, resource, enabled) {
log('Setting fabricated overlay: ' + name + ' = ' + enabled);
try {
if (enabled) {
// 0x12 = TYPE_INT_BOOLEAN, 0xFFFFFFFF = true
await exec('cmd overlay fabricate --target android --name ' + name +
' android:bool/' + resource + ' 0x12 0xFFFFFFFF');
await exec('cmd overlay enable --user current com.android.shell:' + name);
} else {
await exec('cmd overlay disable --user current com.android.shell:' + name);
}
log('OK: ' + name + ' = ' + (enabled ? 'enabled' : 'disabled'));
await checkOverlayStatus();
} catch (e) {
log('ERROR: ' + e.message);
}
}
async function reapplyOverlays() {
log('Re-applying all fabricated overlays...');
try {
await exec('cmd overlay fabricate --target android --name MiracastEnablerWifiDisplay android:bool/config_enableWifiDisplay 0x12 0xFFFFFFFF');
await exec('cmd overlay fabricate --target android --name MiracastEnablerProtectedBuffers android:bool/config_wifiDisplaySupportsProtectedBuffers 0x12 0xFFFFFFFF');
await exec('cmd overlay enable --user current com.android.shell:MiracastEnablerWifiDisplay');
await exec('cmd overlay enable --user current com.android.shell:MiracastEnablerProtectedBuffers');
log('OK: overlays re-applied');
await checkOverlayStatus();
} catch (e) {
log('ERROR: ' + e.message);
}
}
async function checkOverlayStatus() {
try {
const r = await exec('cmd overlay list | grep -i miracast');
const lines = r.stdout.trim();
const desc = document.getElementById('overlayStatusDesc');
const wfdToggle = document.getElementById('toggleOverlayWfd');
const protToggle = document.getElementById('toggleOverlayProtected');
if (lines) {
desc.textContent = lines.replace(/\n/g, ' | ');
// [x] = enabled, [ ] = disabled
wfdToggle.checked = lines.includes('[x] com.android.shell:MiracastEnablerWifiDisplay');
protToggle.checked = lines.includes('[x] com.android.shell:MiracastEnablerProtectedBuffers');
} else {
desc.textContent = 'No fabricated overlays found (will be created on next boot)';
wfdToggle.checked = false;
protToggle.checked = false;
}
} catch (e) {
document.getElementById('overlayStatusDesc').textContent = 'Error checking overlay status';
}
}
async function showModuleLog() {
try {
const r = await exec('cat /data/adb/modules/miracast-enabler/miracast.log 2>/dev/null || echo "No log file found"');
const area = document.getElementById('logArea');
area.textContent = '=== Module Boot Log ===\n' + r.stdout;
area.scrollTop = area.scrollHeight;
} catch (e) {
log('Could not read module log');
}
}
async function setFoldDisplay(mode) {
log('Setting fold display source: ' + mode);
try {
// Display IDs vary by device:
// rango (Pixel 10 Pro Fold): inner=0, outer=3
// comet (Pixel 9 Pro Fold): inner=0, outer=1
// felix (Pixel Fold 1): inner=0, outer=1
// We read the actual device to pick the right outer ID
const device = await getprop('ro.product.device');
const outerDisplayId = (device === 'rango') ? '3' : '1';
if (mode === 'inner') {
await exec('resetprop persist.sys.wfd.display_id 0');
} else if (mode === 'outer') {
await exec('resetprop persist.sys.wfd.display_id ' + outerDisplayId);
} else {
await exec('resetprop --delete persist.sys.wfd.display_id');
}
log('OK: fold display = ' + mode + (mode === 'outer' ? ' (ID ' + outerDisplayId + ')' : ''));
} catch (e) {
log('ERROR: ' + e.message);
}
}
async function updateStatus() {
const wfd = await getprop('persist.debug.wfd.enable');
const banner = document.getElementById('statusBanner');
const text = document.getElementById('statusText');
if (wfd === '1') {
banner.className = 'status-banner active';
text.textContent = 'Miracast enabled';
} else {
banner.className = 'status-banner inactive';
text.textContent = 'Miracast disabled';
}
}
async function loadCurrentValues() {
const props = {
'persist.debug.wfd.enable': 'toggleWfd',
'persist.sys.wfd.nohdcp': 'toggleHdcp',
'persist.sys.wfd.virtual': 'toggleVirtual',
};
for (const [prop, id] of Object.entries(props)) {
const val = await getprop(prop);
document.getElementById(id).checked = (val === '1');
}
// P2P concurrency
const p2pIface = await getprop('wifi.direct.interface');
document.getElementById('toggleP2p').checked = (p2pIface === 'p2p-dev-wlan0');
// HWC virtual display — note: toggle is inverted (checked = force GPU = hwc_vds=0)
const hwcVds = await getprop('debug.sf.enable_hwc_vds');
document.getElementById('toggleComposition').checked = (hwcVds === '0');
// Resolution
const res = await getprop('persist.sys.wfd.resolution');
if (res) {
document.getElementById('selectResolution').value = res;
}
// WLAN HDCP
const wlanHdcp = await getprop('wlan.wfd.hdcp');
if (wlanHdcp) {
document.getElementById('selectWlanHdcp').value = wlanHdcp;
}
// Fold display
const displayId = await getprop('persist.sys.wfd.display_id');
if (displayId === '0') {
document.getElementById('selectFoldDisplay').value = 'inner';
} else if (displayId === '1') {
document.getElementById('selectFoldDisplay').value = 'outer';
}
}
async function loadDeviceInfo() {
const device = await getprop('ro.product.model');
const soc = await getprop('ro.soc.model');
const android = await getprop('ro.build.version.release');
document.getElementById('infoDevice').textContent = device || 'Unknown';
document.getElementById('infoSoc').textContent = soc || 'Unknown';
document.getElementById('infoAndroid').textContent = android || 'Unknown';
// Detect Wi-Fi chip from loaded kernel modules
try {
const r = await exec('ls /sys/module/ | grep -iE "^(bcmdhd|qca|wcn|wlan|ath|mt76|iwl)" | head -1');
const chip = r.stdout.trim();
document.getElementById('infoWifi').textContent = chip || 'Unknown';
} catch (e) {
document.getElementById('infoWifi').textContent = 'Unknown';
}
}
async function refreshAll() {
log('Refreshing...');
await loadCurrentValues();
await updateStatus();
await loadDeviceInfo();
await checkOverlayStatus();
log('Refresh complete');
}
// Init
(async function init() {
try {
await refreshAll();
log('Ready');
} catch (e) {
log('Init error: ' + e.message);
document.getElementById('statusBanner').className = 'status-banner loading';
document.getElementById('statusText').textContent = 'Error reading device state';
}
})();
</script>
</body>
</html>