mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-13 03:51:10 +00:00
227 lines
12 KiB
XML
227 lines
12 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
<!-- Session logs go to Downloads so a failed run can be handed over as one folder. -->
|
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
<!-- Store download progress and "installed" / "failed" notices (Android 13+). -->
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
<!-- The session keeps running while the app is not on screen: a foreground service holds the
|
|
process at perceptible priority, and a high-performance WiFi lock keeps a backgrounded
|
|
download from being throttled to nothing by the radio's power-save. -->
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
|
<!-- Optional Wi-Fi discovery: requested only from Steam settings after an explanation. -->
|
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
|
<uses-permission android:name="android.permission.VIBRATE" />
|
|
<!-- Ends background processes of another app that holds the Steam login. GameHub starts
|
|
itself with the phone via boot receivers and signs this client out seconds after every
|
|
login; a normal permission, and it cannot touch anything in the foreground. -->
|
|
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
|
|
<!-- The microphone for the Linux session, only when the user turns it on: the DirectAudio
|
|
relay helper opens the input stream under this uid, and PulseAudio exposes it to the
|
|
Steam client as DirectAudioMic. -->
|
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
<!-- Installs DroidDeck's own updates (Updates page) over itself, after the user allows it. -->
|
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
<!-- A paired Steam Controller, read over Bluetooth LE out of lizard mode (SteamControllerBle). -->
|
|
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
|
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
|
|
|
<uses-feature android:name="android.hardware.vulkan.version" android:version="0x401000" android:required="true" />
|
|
<uses-feature android:name="android.hardware.gamepad" android:required="false" />
|
|
|
|
<application
|
|
android:name=".App"
|
|
android:localeConfig="@xml/locales_config"
|
|
android:allowBackup="false"
|
|
android:icon="@mipmap/ic_launcher"
|
|
android:label="@string/app_name"
|
|
android:theme="@style/AppTheme"
|
|
android:hardwareAccelerated="true"
|
|
android:largeHeap="true"
|
|
android:extractNativeLibs="true"
|
|
android:requestLegacyExternalStorage="true"
|
|
android:appCategory="game"
|
|
android:isGame="true">
|
|
|
|
<!-- A game, to the OS: Android 12+ routes the category through GameManager and the OEM
|
|
performance frameworks (Game Booster, Game Turbo, Game Space) key off it. Without it
|
|
a regular flagship runs the session under its "app" power profile - a conservative
|
|
governor and GPU DVFS - which is why the same chipset feels slower here than in a
|
|
gaming phone whose mode is on for everything. The config says what the OS may do. -->
|
|
<meta-data android:name="android.game_mode_config" android:resource="@xml/game_mode_config" />
|
|
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:exported="true"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:configChanges="keyboard|keyboardHidden|navigation">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
<data android:scheme="droiddeck" android:host="game" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.CREATE_SHORTCUT" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="com.droiddeck.launcher.LAUNCH_GAME" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<!-- Android owns the Home key. This small translucent Home handler routes the resulting
|
|
Home launch either back into a running Steam session or to the regular front end.
|
|
Off until the user turns on "Use as a Home screen" (Setup): while it is disabled the
|
|
app is not a Home app at all - not offered, not in the "choose Home" list. -->
|
|
<activity
|
|
android:name=".HomeActivity"
|
|
android:enabled="false"
|
|
android:exported="true"
|
|
android:excludeFromRecents="true"
|
|
android:noHistory="true"
|
|
android:taskAffinity="${applicationId}.home"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:theme="@android:style/Theme.Translucent.NoTitleBar">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.HOME" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<!--
|
|
A session keeps a Surface, a compositor thread and a proot tree alive; a configuration
|
|
change must not tear that down and rebuild it, so the activity handles them itself.
|
|
Landscape only: gamescope is told one output size when it starts.
|
|
|
|
Resizable, deliberately: a foldable opening or closing changes the window, and the
|
|
compositor re-fits the picture with bars. Declared non-resizable, the system keeps a
|
|
fixed-shape window instead and STRETCHES it onto the other panel - the app never sees a
|
|
size change, so nothing it does can help.
|
|
-->
|
|
<activity
|
|
android:name=".input.ControllerEditorActivity"
|
|
android:exported="false"
|
|
android:theme="@style/SessionTheme"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:resizeableActivity="true"
|
|
android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|keyboard|keyboardHidden|navigation|uiMode|density" />
|
|
|
|
<activity
|
|
android:name=".files.FileManagerActivity"
|
|
android:exported="false"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:theme="@style/AppTheme" />
|
|
|
|
<activity
|
|
android:name=".files.FilePickerActivity"
|
|
android:exported="false"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:theme="@style/AppTheme" />
|
|
|
|
<!-- A store's own sign-in page (GOG, Epic Games, Amazon Games) in a WebView. -->
|
|
<activity
|
|
android:name=".stores.StoreLoginActivity"
|
|
android:exported="false"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:theme="@style/AppTheme" />
|
|
|
|
<activity
|
|
android:name=".agent.AgentStartActivity"
|
|
android:exported="true"
|
|
android:excludeFromRecents="true"
|
|
android:noHistory="true"
|
|
android:permission="android.permission.DUMP"
|
|
android:theme="@style/SessionTheme" />
|
|
|
|
<activity
|
|
android:name=".SessionActivity"
|
|
android:exported="false"
|
|
android:supportsPictureInPicture="true"
|
|
android:launchMode="singleTask"
|
|
android:theme="@style/SessionTheme"
|
|
android:preferMinimalPostProcessing="true"
|
|
android:screenOrientation="sensorLandscape"
|
|
android:resizeableActivity="true"
|
|
android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|keyboard|keyboardHidden|navigation|uiMode|density" />
|
|
|
|
<!--
|
|
Owns the session - gamescope, the Steam client, audio - so it survives the activity
|
|
going away. Without it Android demotes the process as soon as the last visible
|
|
activity goes, and the low-memory killer reaps the guest: leaving Big Picture to
|
|
answer a message would come back to a dead Steam and a half-finished download.
|
|
-->
|
|
<service
|
|
android:name=".session.SessionService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="specialUse"
|
|
android:stopWithTask="false">
|
|
<property
|
|
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
|
android:value="Runs the user's Linux game session (compositor, Steam client, audio) while the app is not on screen" />
|
|
</service>
|
|
<!-- Holds the process in the foreground while the Linux runtime downloads and unpacks. -->
|
|
<service
|
|
android:name=".runtime.RuntimeInstallService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="dataSync" />
|
|
<service
|
|
android:name=".core.WirelessAdbPairingService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="specialUse">
|
|
<property
|
|
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
|
android:value="Waits for the wireless debugging pairing code the user enters from the notification" />
|
|
</service>
|
|
<!-- Keeps the process alive while a store (GOG, Epic, Amazon) game downloads. -->
|
|
<service
|
|
android:name=".stores.download.StoreDownloadService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="dataSync" />
|
|
<!-- Hands a zipped session folder to the share sheet; nothing else is exposed. -->
|
|
<provider
|
|
android:name="androidx.core.content.FileProvider"
|
|
android:authorities="${applicationId}.logs"
|
|
android:exported="false"
|
|
android:grantUriPermissions="true">
|
|
<meta-data
|
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
android:resource="@xml/log_share_paths" />
|
|
</provider>
|
|
<!-- The app's data folder in Android's file picker ("Open from" > DroidDeck). Only the
|
|
system's documents UI may bind it; apps get a file only when the user picks it. -->
|
|
<provider
|
|
android:name=".files.AppFilesProvider"
|
|
android:authorities="${applicationId}.documents"
|
|
android:exported="true"
|
|
android:grantUriPermissions="true"
|
|
android:permission="android.permission.MANAGE_DOCUMENTS">
|
|
<intent-filter>
|
|
<action android:name="android.content.action.DOCUMENTS_PROVIDER" />
|
|
</intent-filter>
|
|
</provider>
|
|
<provider
|
|
android:name=".agent.AgentBridgeProvider"
|
|
android:authorities="${applicationId}.agent"
|
|
android:exported="true"
|
|
android:permission="android.permission.DUMP"
|
|
android:grantUriPermissions="false" />
|
|
</application>
|
|
</manifest>
|