Remove Bluetooth from multiplayer

Multiplayer now runs over Wi-Fi (LAN) only.

- Delete BluetoothTransport and drop it from LobbyController's transport
  list, leaving LanTransport as the sole transport.
- Drop TransportKind.BLUETOOTH and the now-unused RFCOMM_UUID constant.
- Remove the BLUETOOTH/BLUETOOTH_ADMIN/BLUETOOTH_CONNECT permissions and
  the android.hardware.bluetooth feature from the manifest, along with
  the runtime permission request in MainActivity and the
  requestBluetoothPermissions hook on AppEnv.
- Update lobby copy so an empty transport list and an empty host list
  talk about Wi-Fi rather than pairing, and refresh the comments and
  README sections that described two transports.

The transport abstraction itself is kept: everything after the handshake
was already transport independent, so adding another one later needs no
changes above LanTransport.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01YEsqYAMJKUJoM7UAavm169
This commit is contained in:
Claude
2026-08-06 21:38:35 +00:00
parent e17272b909
commit 43394b8d45
12 changed files with 29 additions and 260 deletions
+2 -21
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- OTA updates from GitHub Releases, plus LAN play over TCP sockets. -->
<uses-permission android:name="android.permission.INTERNET" />
@@ -10,25 +9,7 @@
<!-- Lets the app hand a downloaded APK to the system installer. -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- Bluetooth. Android 12 (API 31) replaced the catch-all BLUETOOTH
permission with explicit ones, so the legacy pair is capped below 31
and BLUETOOTH_CONNECT is requested at runtime above it.
Only CONNECT is declared because the transport talks exclusively to
devices that are already paired: it enumerates bonded devices and
opens an RFCOMM socket, neither of which is a scan. Adding discovery
of unpaired devices later would mean declaring BLUETOOTH_SCAN here
(and, below API 31, both ACCESS_FINE_LOCATION and
ACCESS_COARSE_LOCATION, which Android requires together). -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"
tools:targetApi="s" />
<!-- Both radios are optional: the app is fully playable against AI without them. -->
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
<!-- The radio is optional: the app is fully playable against AI without it. -->
<uses-feature android:name="android.hardware.wifi" android:required="false" />
<application