Skip to content

Commit 16f9aa6

Browse files
Merge pull request #9 from HapticTide/codex/recording-history-replay
增加录制历史回放功能
2 parents b542ecf + 10c276f commit 16f9aa6

15 files changed

Lines changed: 1901 additions & 64 deletions

ScreenPresenter.xcodeproj/project.pbxproj

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@
6464
D1000001000000000004 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1000002000000000004 /* ToastView.swift */; };
6565
D1000001000000000005 /* DeviceStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1000002000000000005 /* DeviceStatusView.swift */; };
6666
D1000001000000000006 /* DeviceCaptureInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1000002000000000006 /* DeviceCaptureInfoView.swift */; };
67+
D1000001000000000007 /* RecordingReplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1000002000000000007 /* RecordingReplayView.swift */; };
68+
D1000001000000000008 /* RecordingReplayView+Layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1000002000000000008 /* RecordingReplayView+Layout.swift */; };
69+
D1000001000000000009 /* RecordingReplayView+Playback.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1000002000000000009 /* RecordingReplayView+Playback.swift */; };
70+
D100000100000000000A /* RecordingReplayView+DevicePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = D100000200000000000A /* RecordingReplayView+DevicePane.swift */; };
71+
D100000100000000000B /* RecordingHistoryPopoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D100000200000000000B /* RecordingHistoryPopoverView.swift */; };
6772
DD604589504C2702EA91DEAD /* IOSDeviceSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C66B6DF8C1E31F829EDE370 /* IOSDeviceSource.swift */; };
6873
E1000001000000000002 /* FBDeviceControlKit in Frameworks */ = {isa = PBXBuildFile; productRef = E1000002000000000002 /* FBDeviceControlKit */; };
6974
E1000001000000000003 /* Opus in Frameworks */ = {isa = PBXBuildFile; productRef = E1000002000000000003 /* Opus */; };
@@ -80,8 +85,22 @@
8085
R0000001000000000001 /* RecordingFileNaming.swift in Sources */ = {isa = PBXBuildFile; fileRef = R0000002000000000001 /* RecordingFileNaming.swift */; };
8186
R0000001000000000002 /* RecordingFrameSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = R0000002000000000002 /* RecordingFrameSnapshot.swift */; };
8287
R0000001000000000003 /* RecordingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = R0000002000000000003 /* RecordingService.swift */; };
88+
R0000001000000000004 /* RecordingLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = R0000002000000000004 /* RecordingLibrary.swift */; };
89+
TST000010000000000001 /* RecordingFileNamingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TST000020000000000001 /* RecordingFileNamingTests.swift */; };
90+
TST000010000000000002 /* ScrcpyVideoStreamParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TST000020000000000002 /* ScrcpyVideoStreamParserTests.swift */; };
91+
TST000010000000000003 /* RecordingLibraryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = TST000020000000000003 /* RecordingLibraryTests.swift */; };
8392
/* End PBXBuildFile section */
8493

94+
/* Begin PBXContainerItemProxy section */
95+
TST000070000000000001 /* PBXContainerItemProxy */ = {
96+
isa = PBXContainerItemProxy;
97+
containerPortal = A10000012419FFF8000001A1 /* Project object */;
98+
proxyType = 1;
99+
remoteGlobalIDString = A10000012419FFFF000001A1;
100+
remoteInfo = ScreenPresenter;
101+
};
102+
/* End PBXContainerItemProxy section */
103+
85104
/* Begin PBXCopyFilesBuildPhase section */
86105
PREVIEW000005000000000001 /* Embed Foundation Extensions */ = {
87106
isa = PBXCopyFilesBuildPhase;
@@ -153,6 +172,11 @@
153172
D1000002000000000004 /* ToastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastView.swift; sourceTree = "<group>"; };
154173
D1000002000000000005 /* DeviceStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceStatusView.swift; sourceTree = "<group>"; };
155174
D1000002000000000006 /* DeviceCaptureInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceCaptureInfoView.swift; sourceTree = "<group>"; };
175+
D1000002000000000007 /* RecordingReplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingReplayView.swift; sourceTree = "<group>"; };
176+
D1000002000000000008 /* RecordingReplayView+Layout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RecordingReplayView+Layout.swift"; sourceTree = "<group>"; };
177+
D1000002000000000009 /* RecordingReplayView+Playback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RecordingReplayView+Playback.swift"; sourceTree = "<group>"; };
178+
D100000200000000000A /* RecordingReplayView+DevicePane.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RecordingReplayView+DevicePane.swift"; sourceTree = "<group>"; };
179+
D100000200000000000B /* RecordingHistoryPopoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingHistoryPopoverView.swift; sourceTree = "<group>"; };
156180
DC7BD7E5F57E69F54F103E7C /* IOSDevice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = IOSDevice.swift; sourceTree = "<group>"; };
157181
F1000002000000000001 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
158182
FB000002000000000001 /* IOSDeviceStateMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOSDeviceStateMapper.swift; sourceTree = "<group>"; };
@@ -166,6 +190,11 @@
166190
R0000002000000000001 /* RecordingFileNaming.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingFileNaming.swift; sourceTree = "<group>"; };
167191
R0000002000000000002 /* RecordingFrameSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingFrameSnapshot.swift; sourceTree = "<group>"; };
168192
R0000002000000000003 /* RecordingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingService.swift; sourceTree = "<group>"; };
193+
R0000002000000000004 /* RecordingLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingLibrary.swift; sourceTree = "<group>"; };
194+
TST000020000000000000 /* ScreenPresenterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScreenPresenterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
195+
TST000020000000000001 /* RecordingFileNamingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingFileNamingTests.swift; sourceTree = "<group>"; };
196+
TST000020000000000002 /* ScrcpyVideoStreamParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrcpyVideoStreamParserTests.swift; sourceTree = "<group>"; };
197+
TST000020000000000003 /* RecordingLibraryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordingLibraryTests.swift; sourceTree = "<group>"; };
169198
/* End PBXFileReference section */
170199

171200
/* Begin PBXFrameworksBuildPhase section */
@@ -183,6 +212,13 @@
183212
);
184213
runOnlyForDeploymentPostprocessing = 0;
185214
};
215+
TST000040000000000002 /* Frameworks */ = {
216+
isa = PBXFrameworksBuildPhase;
217+
buildActionMask = 2147483647;
218+
files = (
219+
);
220+
runOnlyForDeploymentPostprocessing = 0;
221+
};
186222
/* End PBXFrameworksBuildPhase section */
187223

188224
/* Begin PBXGroup section */
@@ -213,6 +249,7 @@
213249
isa = PBXGroup;
214250
children = (
215251
A1000001241A0001000001A2 /* ScreenPresenter */,
252+
TST000030000000000001 /* ScreenPresenterTests */,
216253
A1000001241A0001000001A3 /* Products */,
217254
);
218255
sourceTree = "<group>";
@@ -235,10 +272,21 @@
235272
isa = PBXGroup;
236273
children = (
237274
A1000001241A0000000001A1 /* ScreenPresenter.app */,
275+
TST000020000000000000 /* ScreenPresenterTests.xctest */,
238276
);
239277
name = Products;
240278
sourceTree = "<group>";
241279
};
280+
TST000030000000000001 /* ScreenPresenterTests */ = {
281+
isa = PBXGroup;
282+
children = (
283+
TST000020000000000001 /* RecordingFileNamingTests.swift */,
284+
TST000020000000000003 /* RecordingLibraryTests.swift */,
285+
TST000020000000000002 /* ScrcpyVideoStreamParserTests.swift */,
286+
);
287+
path = ScreenPresenterTests;
288+
sourceTree = "<group>";
289+
};
242290
A44133052EF93201003DCDD3 /* DeviceDiscovery */ = {
243291
isa = PBXGroup;
244292
children = (
@@ -301,6 +349,7 @@
301349
children = (
302350
R0000002000000000001 /* RecordingFileNaming.swift */,
303351
R0000002000000000002 /* RecordingFrameSnapshot.swift */,
352+
R0000002000000000004 /* RecordingLibrary.swift */,
304353
R0000002000000000003 /* RecordingService.swift */,
305354
);
306355
path = Recording;
@@ -376,6 +425,11 @@
376425
D1000002000000000001 /* DevicePanelView.swift */,
377426
D1000002000000000005 /* DeviceStatusView.swift */,
378427
D1000002000000000004 /* ToastView.swift */,
428+
D1000002000000000007 /* RecordingReplayView.swift */,
429+
D1000002000000000008 /* RecordingReplayView+Layout.swift */,
430+
D1000002000000000009 /* RecordingReplayView+Playback.swift */,
431+
D100000200000000000A /* RecordingReplayView+DevicePane.swift */,
432+
D100000200000000000B /* RecordingHistoryPopoverView.swift */,
379433
3E7E9FE2FF970D867ABAC3C4 /* ColorCompensationPanel.swift */,
380434
);
381435
path = Components;
@@ -435,6 +489,24 @@
435489
productReference = A1000001241A0000000001A1 /* ScreenPresenter.app */;
436490
productType = "com.apple.product-type.application";
437491
};
492+
TST000060000000000001 /* ScreenPresenterTests */ = {
493+
isa = PBXNativeTarget;
494+
buildConfigurationList = TST000090000000000001 /* Build configuration list for PBXNativeTarget "ScreenPresenterTests" */;
495+
buildPhases = (
496+
TST000040000000000001 /* Sources */,
497+
TST000040000000000002 /* Frameworks */,
498+
TST000040000000000003 /* Resources */,
499+
);
500+
buildRules = (
501+
);
502+
dependencies = (
503+
TST000080000000000001 /* PBXTargetDependency */,
504+
);
505+
name = ScreenPresenterTests;
506+
productName = ScreenPresenterTests;
507+
productReference = TST000020000000000000 /* ScreenPresenterTests.xctest */;
508+
productType = "com.apple.product-type.bundle.unit-test";
509+
};
438510
/* End PBXNativeTarget section */
439511

440512
/* Begin PBXProject section */
@@ -448,6 +520,10 @@
448520
A10000012419FFFF000001A1 = {
449521
CreatedOnToolsVersion = 15.0;
450522
};
523+
TST000060000000000001 = {
524+
CreatedOnToolsVersion = 16.4;
525+
TestTargetID = A10000012419FFFF000001A1;
526+
};
451527
};
452528
};
453529
buildConfigurationList = A10000012419FFFB000001A1 /* Build configuration list for PBXProject "ScreenPresenter" */;
@@ -473,6 +549,7 @@
473549
projectRoot = "";
474550
targets = (
475551
A10000012419FFFF000001A1 /* ScreenPresenter */,
552+
TST000060000000000001 /* ScreenPresenterTests */,
476553
);
477554
};
478555
/* End PBXProject section */
@@ -489,6 +566,13 @@
489566
);
490567
runOnlyForDeploymentPostprocessing = 0;
491568
};
569+
TST000040000000000003 /* Resources */ = {
570+
isa = PBXResourcesBuildPhase;
571+
buildActionMask = 2147483647;
572+
files = (
573+
);
574+
runOnlyForDeploymentPostprocessing = 0;
575+
};
492576
/* End PBXResourcesBuildPhase section */
493577

494578
/* Begin PBXSourcesBuildPhase section */
@@ -535,6 +619,11 @@
535619
D1000001000000000004 /* ToastView.swift in Sources */,
536620
D1000001000000000005 /* DeviceStatusView.swift in Sources */,
537621
D1000001000000000006 /* DeviceCaptureInfoView.swift in Sources */,
622+
D1000001000000000007 /* RecordingReplayView.swift in Sources */,
623+
D1000001000000000008 /* RecordingReplayView+Layout.swift in Sources */,
624+
D1000001000000000009 /* RecordingReplayView+Playback.swift in Sources */,
625+
D100000100000000000A /* RecordingReplayView+DevicePane.swift in Sources */,
626+
D100000100000000000B /* RecordingHistoryPopoverView.swift in Sources */,
538627
A481F79C2F0B8CF300D9DAB0 /* ScrcpyAudioStreamParser.swift in Sources */,
539628
A481F79D2F0B8CF300D9DAB0 /* ScrcpyAudioDecoder.swift in Sources */,
540629
A481F79E2F0B8CF400D9DAB0 /* ScrcpyOpusDecoder.swift in Sources */,
@@ -557,12 +646,31 @@
557646
2A000001000000000001 /* AudioPlayer.swift in Sources */,
558647
R0000001000000000001 /* RecordingFileNaming.swift in Sources */,
559648
R0000001000000000002 /* RecordingFrameSnapshot.swift in Sources */,
649+
R0000001000000000004 /* RecordingLibrary.swift in Sources */,
560650
R0000001000000000003 /* RecordingService.swift in Sources */,
561651
);
562652
runOnlyForDeploymentPostprocessing = 0;
563653
};
654+
TST000040000000000001 /* Sources */ = {
655+
isa = PBXSourcesBuildPhase;
656+
buildActionMask = 2147483647;
657+
files = (
658+
TST000010000000000001 /* RecordingFileNamingTests.swift in Sources */,
659+
TST000010000000000003 /* RecordingLibraryTests.swift in Sources */,
660+
TST000010000000000002 /* ScrcpyVideoStreamParserTests.swift in Sources */,
661+
);
662+
runOnlyForDeploymentPostprocessing = 0;
663+
};
564664
/* End PBXSourcesBuildPhase section */
565665

666+
/* Begin PBXTargetDependency section */
667+
TST000080000000000001 /* PBXTargetDependency */ = {
668+
isa = PBXTargetDependency;
669+
target = A10000012419FFFF000001A1 /* ScreenPresenter */;
670+
targetProxy = TST000070000000000001 /* PBXContainerItemProxy */;
671+
};
672+
/* End PBXTargetDependency section */
673+
566674
/* Begin PBXVariantGroup section */
567675
B1000002000000000011 /* Localizable.strings */ = {
568676
isa = PBXVariantGroup;
@@ -772,6 +880,52 @@
772880
};
773881
name = Release;
774882
};
883+
TST0000A0000000000001 /* Debug */ = {
884+
isa = XCBuildConfiguration;
885+
buildSettings = {
886+
BUNDLE_LOADER = "$(TEST_HOST)";
887+
CODE_SIGN_STYLE = Automatic;
888+
COMBINE_HIDPI_IMAGES = YES;
889+
DEVELOPMENT_TEAM = TNX486YJGV;
890+
GENERATE_INFOPLIST_FILE = YES;
891+
LD_RUNPATH_SEARCH_PATHS = (
892+
"$(inherited)",
893+
"@executable_path/../Frameworks",
894+
"@loader_path/../Frameworks",
895+
);
896+
MACOSX_DEPLOYMENT_TARGET = 13.0;
897+
PRODUCT_BUNDLE_IDENTIFIER = com.haptictide.ScreenPresenterTests;
898+
PRODUCT_NAME = "$(TARGET_NAME)";
899+
SWIFT_VERSION = 5.0;
900+
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScreenPresenter.app/Contents/MacOS/ScreenPresenter";
901+
TEST_TARGET_NAME = ScreenPresenter;
902+
WRAPPER_EXTENSION = xctest;
903+
};
904+
name = Debug;
905+
};
906+
TST0000A0000000000002 /* Release */ = {
907+
isa = XCBuildConfiguration;
908+
buildSettings = {
909+
BUNDLE_LOADER = "$(TEST_HOST)";
910+
CODE_SIGN_STYLE = Automatic;
911+
COMBINE_HIDPI_IMAGES = YES;
912+
DEVELOPMENT_TEAM = TNX486YJGV;
913+
GENERATE_INFOPLIST_FILE = YES;
914+
LD_RUNPATH_SEARCH_PATHS = (
915+
"$(inherited)",
916+
"@executable_path/../Frameworks",
917+
"@loader_path/../Frameworks",
918+
);
919+
MACOSX_DEPLOYMENT_TARGET = 13.0;
920+
PRODUCT_BUNDLE_IDENTIFIER = com.haptictide.ScreenPresenterTests;
921+
PRODUCT_NAME = "$(TARGET_NAME)";
922+
SWIFT_VERSION = 5.0;
923+
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScreenPresenter.app/Contents/MacOS/ScreenPresenter";
924+
TEST_TARGET_NAME = ScreenPresenter;
925+
WRAPPER_EXTENSION = xctest;
926+
};
927+
name = Release;
928+
};
775929
/* End XCBuildConfiguration section */
776930

777931
/* Begin XCConfigurationList section */
@@ -793,6 +947,15 @@
793947
defaultConfigurationIsVisible = 0;
794948
defaultConfigurationName = Release;
795949
};
950+
TST000090000000000001 /* Build configuration list for PBXNativeTarget "ScreenPresenterTests" */ = {
951+
isa = XCConfigurationList;
952+
buildConfigurations = (
953+
TST0000A0000000000001 /* Debug */,
954+
TST0000A0000000000002 /* Release */,
955+
);
956+
defaultConfigurationIsVisible = 0;
957+
defaultConfigurationName = Release;
958+
};
796959
/* End XCConfigurationList section */
797960

798961
/* Begin XCLocalSwiftPackageReference section */

0 commit comments

Comments
 (0)