Skip to content

Commit de6836f

Browse files
author
Isaac
committed
Various improvements
1 parent 095b068 commit de6836f

File tree

15 files changed

+468
-130
lines changed

15 files changed

+468
-130
lines changed

submodules/DebugSettingsUI/Sources/DebugController.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
106106
case experimentalCallMute(Bool)
107107
case liveStreamV2(Bool)
108108
case dynamicStreaming(Bool)
109+
case enableLocalTranslation(Bool)
109110
case preferredVideoCodec(Int, String, String?, Bool)
110111
case disableVideoAspectScaling(Bool)
111112
case enableNetworkFramework(Bool)
@@ -130,7 +131,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
130131
return DebugControllerSection.web.rawValue
131132
case .keepChatNavigationStack, .skipReadHistory, .dustEffect, .crashOnSlowQueries, .crashOnMemoryPressure:
132133
return DebugControllerSection.experiments.rawValue
133-
case .clearTips, .resetNotifications, .crash, .fillLocalSavedMessageCache, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .resetTagHoles, .reindexUnread, .resetCacheIndex, .reindexCache, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .storiesExperiment, .storiesJpegExperiment, .playlistPlayback, .enableQuickReactionSwitch, .experimentalCompatibility, .enableDebugDataDisplay, .rippleEffect, .browserExperiment, .localTranscription, .enableReactionOverrides, .restorePurchases, .disableReloginTokens, .disableCallV2, .experimentalCallMute, .liveStreamV2, .dynamicStreaming:
134+
case .clearTips, .resetNotifications, .crash, .fillLocalSavedMessageCache, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .resetTagHoles, .reindexUnread, .resetCacheIndex, .reindexCache, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .storiesExperiment, .storiesJpegExperiment, .playlistPlayback, .enableQuickReactionSwitch, .experimentalCompatibility, .enableDebugDataDisplay, .rippleEffect, .browserExperiment, .localTranscription, .enableReactionOverrides, .restorePurchases, .disableReloginTokens, .disableCallV2, .experimentalCallMute, .liveStreamV2, .dynamicStreaming, .enableLocalTranslation:
134135
return DebugControllerSection.experiments.rawValue
135136
case .logTranslationRecognition, .resetTranslationStates:
136137
return DebugControllerSection.translation.rawValue
@@ -251,8 +252,10 @@ private enum DebugControllerEntry: ItemListNodeEntry {
251252
return 53
252253
case .dynamicStreaming:
253254
return 54
255+
case .enableLocalTranslation:
256+
return 55
254257
case let .preferredVideoCodec(index, _, _, _):
255-
return 55 + index
258+
return 56 + index
256259
case .disableVideoAspectScaling:
257260
return 100
258261
case .enableNetworkFramework:
@@ -1361,6 +1364,16 @@ private enum DebugControllerEntry: ItemListNodeEntry {
13611364
})
13621365
}).start()
13631366
})
1367+
case let .enableLocalTranslation(value):
1368+
return ItemListSwitchItem(presentationData: presentationData, title: "Local Translation", value: value, sectionId: self.section, style: .blocks, updated: { value in
1369+
let _ = arguments.sharedContext.accountManager.transaction ({ transaction in
1370+
transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in
1371+
var settings = settings?.get(ExperimentalUISettings.self) ?? ExperimentalUISettings.defaultSettings
1372+
settings.enableLocalTranslation = value
1373+
return PreferencesEntry(settings)
1374+
})
1375+
}).start()
1376+
})
13641377
case let .preferredVideoCodec(_, title, value, isSelected):
13651378
return ItemListCheckboxItem(presentationData: presentationData, title: title, style: .right, checked: isSelected, zeroSeparatorInsets: false, sectionId: self.section, action: {
13661379
let _ = arguments.sharedContext.accountManager.transaction ({ transaction in
@@ -1519,6 +1532,7 @@ private func debugControllerEntries(sharedContext: SharedAccountContext, present
15191532
entries.append(.experimentalCallMute(experimentalSettings.experimentalCallMute))
15201533
entries.append(.liveStreamV2(experimentalSettings.liveStreamV2))
15211534
entries.append(.dynamicStreaming(experimentalSettings.dynamicStreaming))
1535+
entries.append(.enableLocalTranslation(experimentalSettings.enableLocalTranslation))
15221536
}
15231537

15241538
/*let codecs: [(String, String?)] = [

submodules/GalleryUI/Sources/GalleryController.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,14 @@ public func galleryItemForEntry(
246246
} else {
247247
if true || (file.mimeType == "video/mpeg4" || file.mimeType == "video/mov" || file.mimeType == "video/mp4") {
248248
var isHLS = false
249-
if NativeVideoContent.isHLSVideo(file: file) {
250-
isHLS = true
251-
252-
if let data = context.currentAppConfiguration.with({ $0 }).data, let disableHLS = data["video_ignore_alt_documents"] as? Double {
253-
if Int(disableHLS) != 0 {
254-
isHLS = false
249+
if #available(iOS 13.0, *) {
250+
if NativeVideoContent.isHLSVideo(file: file) {
251+
isHLS = true
252+
253+
if let data = context.currentAppConfiguration.with({ $0 }).data, let disableHLS = data["video_ignore_alt_documents"] as? Double {
254+
if Int(disableHLS) != 0 {
255+
isHLS = false
256+
}
255257
}
256258
}
257259
}

submodules/MediaPlayer/Sources/ChunkMediaPlayer.swift

Lines changed: 46 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,15 @@ public final class ChunkMediaPlayerPart {
119119
public let startTime: Double
120120
public let endTime: Double
121121
public let file: TempBoxFile
122+
public let clippedStartTime: Double?
122123

123124
public var id: Id {
124125
return Id(rawValue: self.file.path)
125126
}
126127

127-
public init(startTime: Double, endTime: Double, file: TempBoxFile) {
128+
public init(startTime: Double, clippedStartTime: Double? = nil, endTime: Double, file: TempBoxFile) {
128129
self.startTime = startTime
130+
self.clippedStartTime = clippedStartTime
129131
self.endTime = endTime
130132
self.file = file
131133
}
@@ -620,58 +622,54 @@ private final class ChunkMediaPlayerContext {
620622

621623
var validParts: [ChunkMediaPlayerPart] = []
622624

625+
var minStartTime: Double = 0.0
623626
for i in 0 ..< self.partsState.parts.count {
624627
let part = self.partsState.parts[i]
628+
629+
let partStartTime = max(minStartTime, part.startTime)
630+
let partEndTime = max(partStartTime, part.endTime)
631+
if partStartTime >= partEndTime {
632+
continue
633+
}
634+
625635
var partMatches = false
626-
if timestamp >= part.startTime - 0.5 && timestamp < part.endTime + 0.5 {
636+
if timestamp >= partStartTime - 0.5 && timestamp < partEndTime + 0.5 {
627637
partMatches = true
628638
}
629639

630640
if partMatches {
631-
validParts.append(part)
641+
validParts.append(ChunkMediaPlayerPart(
642+
startTime: part.startTime,
643+
clippedStartTime: partStartTime == part.startTime ? nil : partStartTime,
644+
endTime: part.endTime,
645+
file: part.file
646+
))
647+
minStartTime = max(minStartTime, partEndTime)
632648
}
633649
}
650+
634651
if let lastValidPart = validParts.last {
635652
for i in 0 ..< self.partsState.parts.count {
636653
let part = self.partsState.parts[i]
637-
if lastValidPart !== part && part.startTime > lastValidPart.startTime && part.startTime <= lastValidPart.endTime + 0.5 {
638-
validParts.append(part)
639-
break
640-
}
641-
}
642-
}
643-
644-
/*for i in 0 ..< self.partsState.parts.count {
645-
let part = self.partsState.parts[i]
646-
var partMatches = false
647-
if timestamp >= part.startTime - 0.001 && timestamp < part.endTime - 0.001 {
648-
partMatches = true
649-
} else if part.startTime < 0.2 && timestamp < part.endTime - 0.001 {
650-
partMatches = true
651-
}
652-
653-
if !partMatches, i != self.partsState.parts.count - 1, part.startTime >= 0.001, timestamp >= part.startTime {
654-
let nextPart = self.partsState.parts[i + 1]
655-
if timestamp < nextPart.endTime - 0.001 {
656-
if part.endTime >= nextPart.startTime - 0.1 {
657-
partMatches = true
658-
}
659-
}
660-
}
661-
662-
if partMatches {
663-
validParts.append(part)
664654

665-
inner: for lookaheadPart in self.partsState.parts {
666-
if lookaheadPart.startTime >= part.endTime - 0.001 && lookaheadPart.startTime - 0.1 < part.endTime {
667-
validParts.append(lookaheadPart)
668-
break inner
669-
}
655+
let partStartTime = max(minStartTime, part.startTime)
656+
let partEndTime = max(partStartTime, part.endTime)
657+
if partStartTime >= partEndTime {
658+
continue
670659
}
671660

672-
break
661+
if lastValidPart !== part && partStartTime > (lastValidPart.clippedStartTime ?? lastValidPart.startTime) && partStartTime <= lastValidPart.endTime + 0.5 {
662+
validParts.append(ChunkMediaPlayerPart(
663+
startTime: part.startTime,
664+
clippedStartTime: partStartTime == part.startTime ? nil : partStartTime,
665+
endTime: part.endTime,
666+
file: part.file
667+
))
668+
minStartTime = max(minStartTime, partEndTime)
669+
break
670+
}
673671
}
674-
}*/
672+
}
675673

676674
if validParts.isEmpty, let initialSeekTimestamp = self.initialSeekTimestamp {
677675
for part in self.partsState.parts {
@@ -701,6 +699,8 @@ private final class ChunkMediaPlayerContext {
701699
self.initialSeekTimestamp = nil
702700
}
703701

702+
//print("validParts: \(validParts.map { "\($0.startTime) ... \($0.endTime)" })")
703+
704704
self.loadedState.partStates.removeAll(where: { partState in
705705
if !validParts.contains(where: { $0.id == partState.part.id }) {
706706
return true
@@ -742,7 +742,13 @@ private final class ChunkMediaPlayerContext {
742742
for i in 0 ..< self.loadedState.partStates.count {
743743
let partState = self.loadedState.partStates[i]
744744
if partState.mediaBuffersDisposable == nil {
745-
partState.mediaBuffersDisposable = (partState.frameSource.seek(timestamp: i == 0 ? timestamp : 0.0)
745+
let partSeekOffset: Double
746+
if let clippedStartTime = partState.part.clippedStartTime {
747+
partSeekOffset = clippedStartTime - partState.part.startTime
748+
} else {
749+
partSeekOffset = 0.0
750+
}
751+
partState.mediaBuffersDisposable = (partState.frameSource.seek(timestamp: i == 0 ? timestamp : partSeekOffset)
746752
|> deliverOn(self.queue)).startStrict(next: { [weak self, weak partState] result in
747753
guard let self, let partState else {
748754
return
@@ -921,13 +927,14 @@ private final class ChunkMediaPlayerContext {
921927

922928
for partState in self.loadedState.partStates {
923929
if let audioTrackFrameBuffer = partState.mediaBuffers?.audioBuffer {
930+
//print("Poll audio: part \(partState.part.startTime) frames: \(audioTrackFrameBuffer.frames.map(\.pts.seconds))")
924931
let frame = audioTrackFrameBuffer.takeFrame()
925932
switch frame {
926933
case .finished:
927934
continue
928935
default:
929936
/*if case let .frame(frame) = frame {
930-
print("audio: \(frame.position.seconds) \(frame.position.value) next: (\(frame.position.value + frame.duration.value))")
937+
print("audio: \(frame.position.seconds) \(frame.position.value) part \(partState.part.startTime) next: (\(frame.position.value + frame.duration.value))")
931938
}*/
932939
return frame
933940
}

submodules/TelegramBaseController/Sources/TelegramBaseController.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,40 @@ open class TelegramBaseController: ViewController, KeyShortcutResponder {
461461
invite: nil,
462462
activeCall: EngineGroupCallDescription(id: groupCallPanelData.info.id, accessHash: groupCallPanelData.info.accessHash, title: groupCallPanelData.info.title, scheduleTimestamp: groupCallPanelData.info.scheduleTimestamp, subscribedToScheduled: groupCallPanelData.info.subscribedToScheduled, isStream: groupCallPanelData.info.isStream)
463463
)
464+
}, notifyScheduledTapAction: { [weak self] in
465+
guard let self, let groupCallPanelData = self.groupCallPanelData else {
466+
return
467+
}
468+
if groupCallPanelData.info.scheduleTimestamp != nil && !groupCallPanelData.info.subscribedToScheduled {
469+
let _ = self.context.engine.calls.toggleScheduledGroupCallSubscription(peerId: groupCallPanelData.peerId, callId: groupCallPanelData.info.id, accessHash: groupCallPanelData.info.accessHash, subscribe: true).startStandalone()
470+
471+
//TODO:localize
472+
let controller = UndoOverlayController(
473+
presentationData: presentationData,
474+
content: .universal(
475+
animation: "anim_profileunmute",
476+
scale: 0.075,
477+
colors: [
478+
"Middle.Group 1.Fill 1": UIColor.white,
479+
"Top.Group 1.Fill 1": UIColor.white,
480+
"Bottom.Group 1.Fill 1": UIColor.white,
481+
"EXAMPLE.Group 1.Fill 1": UIColor.white,
482+
"Line.Group 1.Stroke 1": UIColor.white
483+
],
484+
title: nil,
485+
text: "You will be notified when the liver stream starts.",
486+
customUndoText: nil,
487+
timeout: nil
488+
),
489+
elevatedLayout: false,
490+
animateInAsReplacement: false,
491+
action: { _ in
492+
return true
493+
}
494+
)
495+
self.audioRateTooltipController = controller
496+
self.present(controller, in: .current)
497+
}
464498
})
465499
if let accessoryPanelContainer = self.accessoryPanelContainer {
466500
accessoryPanelContainer.addSubnode(groupCallAccessoryPanel)

0 commit comments

Comments
 (0)