Skip to content

Commit e80d1f7

Browse files
committed
Merge branch 'companion-remote'
# Conflicts: # lib/i18n/strings.g.dart
2 parents 0fd365a + 451cf8a commit e80d1f7

37 files changed

+4128
-162
lines changed

android/app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
<!-- Internet access permissions -->
44
<uses-permission android:name="android.permission.INTERNET"/>
55

6+
<!-- Camera permission for QR code scanning (companion remote pairing) -->
7+
<uses-permission android:name="android.permission.CAMERA"/>
8+
69
<!-- PIP Permissions -->
710
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
811
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>

ios/Flutter/AppFrameworkInfo.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@
2121
<key>CFBundleVersion</key>
2222
<string>1.0</string>
2323
<key>MinimumOSVersion</key>
24-
<string>13.0</string>
24+
<string>15.5</string>
2525
</dict>
2626
</plist>

ios/Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Uncomment this line to define a global platform for your project
2-
platform :ios, '14.0'
2+
platform :ios, '15.5'
33

44
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
55
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

ios/Podfile.lock

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,64 @@ PODS:
66
- file_picker (0.0.1):
77
- Flutter
88
- Flutter (1.0.0)
9+
- GoogleDataTransport (10.1.0):
10+
- nanopb (~> 3.30910.0)
11+
- PromisesObjC (~> 2.4)
12+
- GoogleMLKit/BarcodeScanning (7.0.0):
13+
- GoogleMLKit/MLKitCore
14+
- MLKitBarcodeScanning (~> 6.0.0)
15+
- GoogleMLKit/MLKitCore (7.0.0):
16+
- MLKitCommon (~> 12.0.0)
17+
- GoogleToolboxForMac/Defines (4.2.1)
18+
- GoogleToolboxForMac/Logger (4.2.1):
19+
- GoogleToolboxForMac/Defines (= 4.2.1)
20+
- "GoogleToolboxForMac/NSData+zlib (4.2.1)":
21+
- GoogleToolboxForMac/Defines (= 4.2.1)
22+
- GoogleUtilities/Environment (8.1.0):
23+
- GoogleUtilities/Privacy
24+
- GoogleUtilities/Logger (8.1.0):
25+
- GoogleUtilities/Environment
26+
- GoogleUtilities/Privacy
27+
- GoogleUtilities/Privacy (8.1.0)
28+
- GoogleUtilities/UserDefaults (8.1.0):
29+
- GoogleUtilities/Logger
30+
- GoogleUtilities/Privacy
31+
- GTMSessionFetcher/Core (3.5.0)
932
- in_app_review (2.0.0):
1033
- Flutter
34+
- MLImage (1.0.0-beta6)
35+
- MLKitBarcodeScanning (6.0.0):
36+
- MLKitCommon (~> 12.0)
37+
- MLKitVision (~> 8.0)
38+
- MLKitCommon (12.0.0):
39+
- GoogleDataTransport (~> 10.0)
40+
- GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1)
41+
- "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)"
42+
- GoogleUtilities/Logger (~> 8.0)
43+
- GoogleUtilities/UserDefaults (~> 8.0)
44+
- GTMSessionFetcher/Core (< 4.0, >= 3.3.2)
45+
- MLKitVision (8.0.0):
46+
- GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1)
47+
- "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)"
48+
- GTMSessionFetcher/Core (< 4.0, >= 3.3.2)
49+
- MLImage (= 1.0.0-beta6)
50+
- MLKitCommon (~> 12.0)
51+
- mobile_scanner (6.0.2):
52+
- Flutter
53+
- GoogleMLKit/BarcodeScanning (~> 7.0.0)
54+
- nanopb (3.30910.0):
55+
- nanopb/decode (= 3.30910.0)
56+
- nanopb/encode (= 3.30910.0)
57+
- nanopb/decode (3.30910.0)
58+
- nanopb/encode (3.30910.0)
1159
- os_media_controls (0.0.1):
1260
- Flutter
1361
- package_info_plus (0.4.5):
1462
- Flutter
1563
- path_provider_foundation (0.0.1):
1664
- Flutter
1765
- FlutterMacOS
66+
- PromisesObjC (2.4.0)
1867
- shared_preferences_foundation (0.0.1):
1968
- Flutter
2069
- FlutterMacOS
@@ -61,6 +110,7 @@ DEPENDENCIES:
61110
- file_picker (from `.symlinks/plugins/file_picker/ios`)
62111
- Flutter (from `Flutter`)
63112
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
113+
- mobile_scanner (from `.symlinks/plugins/mobile_scanner/ios`)
64114
- os_media_controls (from `.symlinks/plugins/os_media_controls/ios`)
65115
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
66116
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
@@ -74,6 +124,17 @@ DEPENDENCIES:
74124

75125
SPEC REPOS:
76126
trunk:
127+
- GoogleDataTransport
128+
- GoogleMLKit
129+
- GoogleToolboxForMac
130+
- GoogleUtilities
131+
- GTMSessionFetcher
132+
- MLImage
133+
- MLKitBarcodeScanning
134+
- MLKitCommon
135+
- MLKitVision
136+
- nanopb
137+
- PromisesObjC
77138
- sqlite3
78139

79140
EXTERNAL SOURCES:
@@ -87,6 +148,8 @@ EXTERNAL SOURCES:
87148
:path: Flutter
88149
in_app_review:
89150
:path: ".symlinks/plugins/in_app_review/ios"
151+
mobile_scanner:
152+
:path: ".symlinks/plugins/mobile_scanner/ios"
90153
os_media_controls:
91154
:path: ".symlinks/plugins/os_media_controls/ios"
92155
package_info_plus:
@@ -113,10 +176,22 @@ SPEC CHECKSUMS:
113176
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
114177
file_picker: 8fc6fe5e42585a217d44d22f79ec046cb8d81140
115178
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
179+
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
180+
GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318
181+
GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8
182+
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
183+
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
116184
in_app_review: 7dd1ea365263f834b8464673f9df72c80c17c937
185+
MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56
186+
MLKitBarcodeScanning: 0a3064da0a7f49ac24ceb3cb46a5bc67496facd2
187+
MLKitCommon: 07c2c33ae5640e5380beaaa6e4b9c249a205542d
188+
MLKitVision: 45e79d68845a2de77e2dd4d7f07947f0ed157b0e
189+
mobile_scanner: af8f71879eaba2bbcb4d86c6a462c3c0e7f23036
190+
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
117191
os_media_controls: 86dceab6245a5325af90fc0fdebe243c42d789b4
118192
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
119193
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
194+
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
120195
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
121196
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
122197
sqlite3: 8d708bc63e9f4ce48f0ad9d6269e478c5ced1d9b
@@ -126,6 +201,6 @@ SPEC CHECKSUMS:
126201
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
127202
workmanager_apple: 904529ae31e97fc5be632cf628507652294a0778
128203

129-
PODFILE CHECKSUM: faeab82d8b6e3c9d039ddf62b7666988a3dea540
204+
PODFILE CHECKSUM: 16bb7f67e16d8aaa2bfb97666803fbfb291b6559
130205

131206
COCOAPODS: 1.16.2

ios/Runner.xcodeproj/project.pbxproj

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@
214214
9705A1C41CF9048500538489 /* Embed Frameworks */,
215215
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
216216
2E10BAE564A4AFFCFF5B4EF0 /* [CP] Embed Pods Frameworks */,
217+
BE3E47DA555D39F032C6A1DB /* [CP] Copy Pods Resources */,
217218
);
218219
buildRules = (
219220
);
@@ -380,6 +381,23 @@
380381
shellPath = /bin/sh;
381382
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
382383
};
384+
BE3E47DA555D39F032C6A1DB /* [CP] Copy Pods Resources */ = {
385+
isa = PBXShellScriptBuildPhase;
386+
buildActionMask = 2147483647;
387+
files = (
388+
);
389+
inputFileListPaths = (
390+
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
391+
);
392+
name = "[CP] Copy Pods Resources";
393+
outputFileListPaths = (
394+
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
395+
);
396+
runOnlyForDeploymentPostprocessing = 0;
397+
shellPath = /bin/sh;
398+
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
399+
showEnvVarsInLog = 0;
400+
};
383401
/* End PBXShellScriptBuildPhase section */
384402

385403
/* Begin PBXSourcesBuildPhase section */
@@ -475,7 +493,7 @@
475493
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
476494
GCC_WARN_UNUSED_FUNCTION = YES;
477495
GCC_WARN_UNUSED_VARIABLE = YES;
478-
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
496+
IPHONEOS_DEPLOYMENT_TARGET = 15.5;
479497
MTL_ENABLE_DEBUG_INFO = NO;
480498
SDKROOT = iphoneos;
481499
SUPPORTED_PLATFORMS = iphoneos;
@@ -496,7 +514,7 @@
496514
INFOPLIST_FILE = Runner/Info.plist;
497515
INFOPLIST_KEY_CFBundleDisplayName = Plezy;
498516
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment";
499-
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
517+
IPHONEOS_DEPLOYMENT_TARGET = 15.5;
500518
LD_RUNPATH_SEARCH_PATHS = (
501519
"$(inherited)",
502520
"@executable_path/Frameworks",
@@ -609,7 +627,7 @@
609627
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
610628
GCC_WARN_UNUSED_FUNCTION = YES;
611629
GCC_WARN_UNUSED_VARIABLE = YES;
612-
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
630+
IPHONEOS_DEPLOYMENT_TARGET = 15.5;
613631
MTL_ENABLE_DEBUG_INFO = YES;
614632
ONLY_ACTIVE_ARCH = YES;
615633
SDKROOT = iphoneos;
@@ -660,7 +678,7 @@
660678
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
661679
GCC_WARN_UNUSED_FUNCTION = YES;
662680
GCC_WARN_UNUSED_VARIABLE = YES;
663-
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
681+
IPHONEOS_DEPLOYMENT_TARGET = 15.5;
664682
MTL_ENABLE_DEBUG_INFO = NO;
665683
SDKROOT = iphoneos;
666684
SUPPORTED_PLATFORMS = iphoneos;
@@ -683,7 +701,7 @@
683701
INFOPLIST_FILE = Runner/Info.plist;
684702
INFOPLIST_KEY_CFBundleDisplayName = Plezy;
685703
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment";
686-
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
704+
IPHONEOS_DEPLOYMENT_TARGET = 15.5;
687705
LD_RUNPATH_SEARCH_PATHS = (
688706
"$(inherited)",
689707
"@executable_path/Frameworks",
@@ -710,7 +728,7 @@
710728
INFOPLIST_FILE = Runner/Info.plist;
711729
INFOPLIST_KEY_CFBundleDisplayName = Plezy;
712730
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment";
713-
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
731+
IPHONEOS_DEPLOYMENT_TARGET = 15.5;
714732
LD_RUNPATH_SEARCH_PATHS = (
715733
"$(inherited)",
716734
"@executable_path/Frameworks",

ios/Runner/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<key>NSLocalNetworkUsageDescription</key>
4141
<string>This app needs to connect to your Plex Media Server on your local network.</string>
4242
<key>NSCameraUsageDescription</key>
43-
<string>Camera access is included by the WebRTC library used for Watch Together, but is not actively used by this app.</string>
43+
<string>Camera is used to scan QR codes for Companion Remote pairing.</string>
4444
<key>UIApplicationSupportsIndirectInputEvents</key>
4545
<true/>
4646
<key>UIFileSharingEnabled</key>

lib/focus/input_mode_tracker.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
44
import '../utils/platform_detector.dart';
55
import '../services/gamepad_service.dart';
66
import 'dpad_navigator.dart';
7+
import '../services/companion_remote/companion_remote_receiver.dart';
78

89
/// Tracks whether the user is navigating via keyboard/d-pad or pointer (mouse/touch).
910
///
@@ -57,12 +58,16 @@ class _InputModeTrackerState extends State<InputModeTracker> {
5758

5859
// Register callback for gamepad input to switch to keyboard mode
5960
GamepadService.onGamepadInput = () => _setMode(InputMode.keyboard);
61+
62+
// Register callback for companion remote input to switch to keyboard mode
63+
CompanionRemoteReceiver.onRemoteInput = () => _setMode(InputMode.keyboard);
6064
}
6165

6266
@override
6367
void dispose() {
6468
HardwareKeyboard.instance.removeHandler(_handleKeyEvent);
6569
GamepadService.onGamepadInput = null;
70+
CompanionRemoteReceiver.onRemoteInput = null;
6671
super.dispose();
6772
}
6873

@@ -112,7 +117,15 @@ class _InputModeTrackerState extends State<InputModeTracker> {
112117
onPointerDown: (_) => _setMode(InputMode.pointer),
113118
onPointerHover: (_) => _setMode(InputMode.pointer),
114119
behavior: HitTestBehavior.translucent,
115-
child: _InputModeProvider(mode: _mode, child: widget.child),
120+
child: MouseRegion(
121+
cursor: _mode == InputMode.keyboard
122+
? SystemMouseCursors.none
123+
: MouseCursor.defer,
124+
child: IgnorePointer(
125+
ignoring: _mode == InputMode.keyboard,
126+
child: _InputModeProvider(mode: _mode, child: widget.child),
127+
),
128+
),
116129
);
117130
}
118131
}

lib/i18n/strings.g.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
/// To regenerate, run: `dart run slang`
55
///
66
/// Locales: 9
7-
/// Strings: 5130 (570 per locale)
7+
/// Strings: 5121 (569 per locale)
88
///
9-
/// Built on 2026-02-09 at 17:54 UTC
9+
/// Built on 2026-02-09 at 18:36 UTC
1010
1111
// coverage:ignore-file
1212
// ignore_for_file: type=lint, unused_import

lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import 'providers/download_provider.dart';
2525
import 'providers/offline_mode_provider.dart';
2626
import 'providers/offline_watch_provider.dart';
2727
import 'providers/shader_provider.dart';
28+
import 'providers/companion_remote_provider.dart';
2829
import 'watch_together/watch_together.dart';
2930
import 'services/multi_server_manager.dart';
3031
import 'services/offline_watch_sync_service.dart';
@@ -307,6 +308,7 @@ class _MainAppState extends State<MainApp> with WidgetsBindingObserver {
307308
ChangeNotifierProvider(create: (context) => PlaybackStateProvider()),
308309
ChangeNotifierProvider(create: (context) => WatchTogetherProvider()),
309310
ChangeNotifierProvider(create: (context) => ShaderProvider()),
311+
ChangeNotifierProvider(create: (context) => CompanionRemoteProvider()),
310312
],
311313
child: Consumer<ThemeProvider>(
312314
builder: (context, themeProvider, child) {

lib/mixins/refreshable.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ mixin FocusableTab {
1515
/// Mixin for screens with focusable search input
1616
mixin SearchInputFocusable {
1717
void focusSearchInput();
18+
void setSearchQuery(String query);
1819
}
1920

2021
/// Mixin for screens that can load a specific library by key

0 commit comments

Comments
 (0)