mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Video avatar fixes
This commit is contained in:
parent
6351adf805
commit
fb49a4496d
@ -5638,7 +5638,9 @@ Any member of this group will be able to see messages in the channel.";
|
||||
"Settings.ViewVideo" = "View Video";
|
||||
"Settings.RemoveVideo" = "Remove Video";
|
||||
|
||||
"Settings.EditProfileMedia" = "Edit";
|
||||
|
||||
"Conversation.Unarchive" = "Unarchive";
|
||||
"Conversation.UnarchiveDone" = "The chat was moved to your main list.";
|
||||
|
||||
"SettingsSearch.Synonyms.ChatSettings.IntentSettings" = "Siri Suggestions";
|
||||
"SettingsSearch.Synonyms.ChatSettings.IntentsSettings" = "Siri Suggestions";
|
||||
|
@ -71,6 +71,8 @@
|
||||
- (TGPhotoEditorTab)activeTab;
|
||||
- (TGPhotoEditorTab)highlightedTabs;
|
||||
|
||||
- (bool)presentedForAvatarCreation;
|
||||
|
||||
+ (CGRect)photoContainerFrameForParentViewFrame:(CGRect)parentViewFrame toolbarLandscapeSize:(CGFloat)toolbarLandscapeSize orientation:(UIInterfaceOrientation)orientation panelSize:(CGFloat)panelSize hasOnScreenNavigation:(bool)hasOnScreenNavigation;
|
||||
|
||||
+ (TGPhotoEditorTab)highlightedButtonsForEditorValues:(id<TGMediaEditAdjustments>)editorValues forAvatar:(bool)forAvatar;
|
||||
|
@ -2217,7 +2217,11 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
|
||||
}
|
||||
else if (gestureRecognizer == _videoSwipeGestureRecognizer)
|
||||
{
|
||||
newMode = PGCameraModeVideo;
|
||||
if (_intent == TGCameraControllerAvatarIntent) {
|
||||
newMode = PGCameraModeSquareVideo;
|
||||
} else {
|
||||
newMode = PGCameraModeVideo;
|
||||
}
|
||||
}
|
||||
|
||||
if (newMode != PGCameraModeUndefined && _camera.cameraMode != newMode)
|
||||
|
@ -48,6 +48,8 @@
|
||||
|
||||
- (CGPoint)scrubberPositionForPosition:(NSTimeInterval)position;
|
||||
|
||||
- (void)_updateScrubberAnimationsAndResetCurrentPosition:(bool)resetCurrentPosition;
|
||||
|
||||
@end
|
||||
|
||||
@protocol TGMediaPickerGalleryVideoScrubberDelegate <NSObject>
|
||||
|
@ -983,18 +983,13 @@ typedef enum
|
||||
CGPoint point = [self _scrubberPositionForPosition:_value duration:_duration zoomedIn:zoomedIn];
|
||||
CGRect frame = CGRectMake(CGFloor(point.x) - _scrubberHandle.frame.size.width / 2, _scrubberHandle.frame.origin.y, _scrubberHandle.frame.size.width, _scrubberHandle.frame.size.height);
|
||||
|
||||
CGPoint dotPoint = [self _dotPositionForPosition:_value duration:_duration];
|
||||
CGRect dotFrame = CGRectMake(CGFloor(dotPoint.x) - _dotHandle.frame.size.width / 2, _dotHandle.frame.origin.y, _dotHandle.frame.size.width, _dotHandle.frame.size.height);
|
||||
|
||||
if (_trimStartValue > DBL_EPSILON && fabs(_value - _trimStartValue) < 0.01)
|
||||
{
|
||||
frame = CGRectMake(_trimView.frame.origin.x + [self _scrubbingRectZoomedIn:zoomedIn].origin.x, _scrubberHandle.frame.origin.y, _scrubberHandle.frame.size.width, _scrubberHandle.frame.size.height);
|
||||
dotFrame = CGRectMake(_trimView.frame.origin.x + [self _scrubbingRectZoomedIn:false].origin.x, _dotHandle.frame.origin.y, _dotHandle.frame.size.width, _dotHandle.frame.size.height);
|
||||
}
|
||||
else if (fabs(_value - _trimEndValue) < 0.01)
|
||||
{
|
||||
frame = CGRectMake(_trimView.frame.origin.x + _trimView.frame.size.width - [self _scrubbingRectZoomedIn:zoomedIn].origin.x - _scrubberHandle.frame.size.width, _scrubberHandle.frame.origin.y, _scrubberHandle.frame.size.width, _scrubberHandle.frame.size.height);
|
||||
dotFrame = CGRectMake(_trimView.frame.origin.x + _trimView.frame.size.width - [self _scrubbingRectZoomedIn:false].origin.x - _dotHandle.frame.size.width, _dotHandle.frame.origin.y, _dotHandle.frame.size.width, _dotHandle.frame.size.height);
|
||||
}
|
||||
|
||||
if (_isPlaying)
|
||||
@ -1023,8 +1018,6 @@ typedef enum
|
||||
[self removeHandleAnimation];
|
||||
_scrubberHandle.frame = frame;
|
||||
}
|
||||
|
||||
_dotHandle.frame = dotFrame;
|
||||
}
|
||||
|
||||
- (void)addHandleAnimationFromFrame:(CGRect)fromFrame toFrame:(CGRect)toFrame duration:(NSTimeInterval)duration
|
||||
|
@ -331,7 +331,7 @@
|
||||
|
||||
+ (AVAssetReaderVideoCompositionOutput *)setupVideoCompositionOutputWithAVAsset:(AVAsset *)avAsset image:(UIImage *)image composition:(AVMutableComposition *)composition videoTrack:(AVAssetTrack *)videoTrack preset:(TGMediaVideoConversionPreset)preset entityRenderer:(id<TGPhotoPaintEntityRenderer>)entityRenderer adjustments:(TGMediaVideoEditAdjustments *)adjustments timeRange:(CMTimeRange)timeRange outputSettings:(NSDictionary **)outputSettings dimensions:(CGSize *)dimensions conversionContext:(SAtomic *)conversionContext
|
||||
{
|
||||
CGSize transformedSize = CGRectApplyAffineTransform((CGRect){CGPointZero, videoTrack.naturalSize}, videoTrack.preferredTransform).size;;
|
||||
CGSize transformedSize = CGRectApplyAffineTransform((CGRect){CGPointZero, videoTrack.naturalSize}, videoTrack.preferredTransform).size;
|
||||
CGRect transformedRect = CGRectMake(0, 0, transformedSize.width, transformedSize.height);
|
||||
if (CGSizeEqualToSize(transformedRect.size, CGSizeZero))
|
||||
transformedRect = CGRectMake(0, 0, videoTrack.naturalSize.width, videoTrack.naturalSize.height);
|
||||
@ -368,7 +368,7 @@
|
||||
UIImage *overlayImage = nil;
|
||||
if (adjustments.paintingData.imagePath != nil)
|
||||
overlayImage = [UIImage imageWithContentsOfFile:adjustments.paintingData.imagePath];
|
||||
|
||||
|
||||
AVMutableVideoComposition *videoComposition;
|
||||
if (entityRenderer != nil || adjustments.toolsApplied) {
|
||||
PGPhotoEditor *editor = nil;
|
||||
|
@ -488,7 +488,8 @@ const CGFloat TGPhotoAvatarPreviewLandscapePanelSize = TGPhotoAvatarPreviewPanel
|
||||
previewView.hidden = true;
|
||||
[previewView performTransitionInIfNeeded];
|
||||
|
||||
[_cropView openCurtains];
|
||||
if (!self.initialAppearance)
|
||||
[_cropView openCurtains];
|
||||
[_cropView transitionInFinishedFromCamera:(self.fromCamera && self.initialAppearance)];
|
||||
|
||||
PGPhotoEditor *photoEditor = self.photoEditor;
|
||||
|
@ -2218,6 +2218,8 @@
|
||||
_initializedScrubber = true;
|
||||
[_scrubberView reloadData];
|
||||
[_scrubberView resetToStart];
|
||||
if (_isPlaying)
|
||||
[_scrubberView _updateScrubberAnimationsAndResetCurrentPosition:true];
|
||||
} else {
|
||||
if (previousWidth != _portraitToolbarView.frame.size.width)
|
||||
[_scrubberView reloadThumbnails];
|
||||
|
@ -498,4 +498,9 @@ const CGFloat TGPhotoEditorToolbarSize = 49.0f;
|
||||
return highlightedButtons;
|
||||
}
|
||||
|
||||
- (bool)presentedForAvatarCreation
|
||||
{
|
||||
return _intent & (TGPhotoEditorControllerAvatarIntent | TGPhotoEditorControllerSignupAvatarIntent);
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -501,10 +501,6 @@ UIImageOrientation TGVideoOrientationForAsset(AVAsset *asset, bool *mirrored)
|
||||
{
|
||||
CGFloat scaleX = sqrt(t.a * t.a + t.c * t.c);
|
||||
CGFloat scaleY = sqrt(t.b * t.b + t.d * t.d);
|
||||
/*UIView *tempView = [[UIView alloc] init];
|
||||
tempView.transform = t;
|
||||
CGSize scale = CGSizeMake([[tempView.layer valueForKeyPath: @"transform.scale.x"] floatValue],
|
||||
[[tempView.layer valueForKeyPath: @"transform.scale.y"] floatValue]);*/
|
||||
CGSize scale = CGSizeMake(scaleX, scaleY);
|
||||
|
||||
*mirrored = (scale.width < 0);
|
||||
|
@ -944,6 +944,14 @@ const CGFloat TGPhotoEditorToolsLandscapePanelSize = TGPhotoEditorToolsPanelSize
|
||||
CGSize referenceSize = [self referenceViewSize];
|
||||
CGRect containerFrame = _preview ? CGRectMake(0.0f, 0.0f, referenceSize.width, referenceSize.height) : [TGPhotoToolsController photoContainerFrameForParentViewFrame:CGRectMake(0, 0, referenceSize.width, referenceSize.height) toolbarLandscapeSize:self.toolbarLandscapeSize orientation:self.effectiveOrientation panelSize:TGPhotoEditorPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation];
|
||||
CGSize fittedSize = TGScaleToSize(photoEditor.rotatedCropSize, containerFrame.size);
|
||||
|
||||
if ([self presentedForAvatarCreation]) {
|
||||
CGAffineTransform transform = CGAffineTransformMakeRotation(TGRotationForOrientation(photoEditor.cropOrientation));
|
||||
if (photoEditor.cropMirrored)
|
||||
transform = CGAffineTransformScale(transform, -1.0f, 1.0f);
|
||||
previewView.transform = transform;
|
||||
}
|
||||
|
||||
previewView.frame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - fittedSize.width) / 2, containerFrame.origin.y + (containerFrame.size.height - fittedSize.height) / 2, fittedSize.width, fittedSize.height);
|
||||
|
||||
[UIView performWithoutAnimation:^
|
||||
|
@ -408,8 +408,24 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -
|
||||
var finalDuration: Double
|
||||
switch data {
|
||||
case let .asset(asset):
|
||||
finalDimensions = asset.dimensions
|
||||
finalDuration = asset.videoDuration
|
||||
if let adjustments = adjustments {
|
||||
if adjustments.cropApplied(forAvatar: false) {
|
||||
finalDimensions = adjustments.cropRect.size
|
||||
if adjustments.cropOrientation == .left || adjustments.cropOrientation == .right {
|
||||
finalDimensions = CGSize(width: finalDimensions.height, height: finalDimensions.width)
|
||||
}
|
||||
} else {
|
||||
finalDimensions = asset.dimensions
|
||||
}
|
||||
if adjustments.trimEndValue > 0.0 {
|
||||
finalDuration = adjustments.trimEndValue - adjustments.trimStartValue
|
||||
} else {
|
||||
finalDuration = asset.videoDuration
|
||||
}
|
||||
} else {
|
||||
finalDimensions = asset.dimensions
|
||||
finalDuration = asset.videoDuration
|
||||
}
|
||||
case let .tempFile(_, dimensions, duration):
|
||||
finalDimensions = dimensions
|
||||
finalDuration = duration
|
||||
|
@ -180,6 +180,7 @@ public class AvatarGalleryController: ViewController, StandalonePresentableContr
|
||||
|
||||
private let centralItemTitle = Promise<String>()
|
||||
private let centralItemTitleView = Promise<UIView?>()
|
||||
private let centralItemRightBarButtonItems = Promise<[UIBarButtonItem]?>(nil)
|
||||
private let centralItemNavigationStyle = Promise<GalleryItemNodeNavigationStyle>()
|
||||
private let centralItemFooterContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>()
|
||||
private let centralItemAttributesDisposable = DisposableSet();
|
||||
@ -313,6 +314,10 @@ public class AvatarGalleryController: ViewController, StandalonePresentableContr
|
||||
self?.navigationItem.titleView = titleView
|
||||
}))
|
||||
|
||||
self.centralItemAttributesDisposable.add(self.centralItemRightBarButtonItems.get().start(next: { [weak self] rightBarButtonItems in
|
||||
self?.navigationItem.rightBarButtonItems = rightBarButtonItems
|
||||
}))
|
||||
|
||||
self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode, _ in
|
||||
self?.galleryNode.updatePresentationState({
|
||||
$0.withUpdatedFooterContentNode(footerContentNode)
|
||||
@ -432,6 +437,7 @@ public class AvatarGalleryController: ViewController, StandalonePresentableContr
|
||||
if let node = strongSelf.galleryNode.pager.centralItemNode() {
|
||||
strongSelf.centralItemTitle.set(node.title())
|
||||
strongSelf.centralItemTitleView.set(node.titleView())
|
||||
strongSelf.centralItemRightBarButtonItems.set(node.rightBarButtonItems())
|
||||
strongSelf.centralItemNavigationStyle.set(node.navigationStyle())
|
||||
strongSelf.centralItemFooterContentNode.set(node.footerContent())
|
||||
}
|
||||
@ -460,6 +466,7 @@ public class AvatarGalleryController: ViewController, StandalonePresentableContr
|
||||
if let centralItemNode = self.galleryNode.pager.centralItemNode(), let presentationArguments = self.presentationArguments as? AvatarGalleryControllerPresentationArguments {
|
||||
self.centralItemTitle.set(centralItemNode.title())
|
||||
self.centralItemTitleView.set(centralItemNode.titleView())
|
||||
self.centralItemRightBarButtonItems.set(centralItemNode.rightBarButtonItems())
|
||||
self.centralItemNavigationStyle.set(centralItemNode.navigationStyle())
|
||||
self.centralItemFooterContentNode.set(centralItemNode.footerContent())
|
||||
|
||||
|
@ -118,6 +118,7 @@ private class PeerAvatarImageGalleryContentNode: ASDisplayNode {
|
||||
|
||||
final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
private let context: AccountContext
|
||||
private let presentationData: PresentationData
|
||||
private let peer: Peer
|
||||
private let sourceHasRoundCorners: Bool
|
||||
|
||||
@ -130,6 +131,8 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
|
||||
fileprivate let _ready = Promise<Void>()
|
||||
fileprivate let _title = Promise<String>()
|
||||
fileprivate let _rightBarButtonItems = Promise<[UIBarButtonItem]?>()
|
||||
|
||||
private let statusNodeContainer: HighlightableButtonNode
|
||||
private let statusNode: RadialStatusNode
|
||||
fileprivate let footerContentNode: AvatarGalleryItemFooterContentNode
|
||||
@ -141,6 +144,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
|
||||
init(context: AccountContext, presentationData: PresentationData, peer: Peer, sourceHasRoundCorners: Bool) {
|
||||
self.context = context
|
||||
self.presentationData = presentationData
|
||||
self.peer = peer
|
||||
self.sourceHasRoundCorners = sourceHasRoundCorners
|
||||
|
||||
@ -204,12 +208,16 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
if self.entry != entry {
|
||||
self.entry = entry
|
||||
|
||||
var barButtonItems: [UIBarButtonItem] = []
|
||||
var footerContent: AvatarGalleryItemFooterContent
|
||||
if self.peer.id == self.context.account.peerId {
|
||||
footerContent = .own((entry.indexData?.position ?? 0) == 0)
|
||||
let rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Settings_EditProfileMedia, style: .plain, target: self, action: #selector(editPressed))
|
||||
barButtonItems.append(rightBarButtonItem)
|
||||
} else {
|
||||
footerContent = .info
|
||||
}
|
||||
self._rightBarButtonItems.set(.single(barButtonItems))
|
||||
|
||||
self.footerContentNode.setEntry(entry, content: footerContent)
|
||||
|
||||
@ -471,6 +479,10 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
return self._title.get()
|
||||
}
|
||||
|
||||
override func rightBarButtonItems() -> Signal<[UIBarButtonItem]?, NoError> {
|
||||
return self._rightBarButtonItems.get()
|
||||
}
|
||||
|
||||
@objc func statusPressed() {
|
||||
if let entry = self.entry, let largestSize = largestImageRepresentation(entry.representations.map({ $0.representation })), let status = self.status {
|
||||
switch status {
|
||||
@ -494,6 +506,10 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func editPressed() {
|
||||
|
||||
}
|
||||
|
||||
override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> {
|
||||
return .single((self.footerContentNode, nil))
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user