Video avatar fixes

This commit is contained in:
Ilya Laktyushin 2020-07-02 11:37:12 +03:00
parent 6351adf805
commit fb49a4496d
16 changed files with 1714 additions and 1659 deletions

View File

@ -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";

View File

@ -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;

View File

@ -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)

View File

@ -48,6 +48,8 @@
- (CGPoint)scrubberPositionForPosition:(NSTimeInterval)position;
- (void)_updateScrubberAnimationsAndResetCurrentPosition:(bool)resetCurrentPosition;
@end
@protocol TGMediaPickerGalleryVideoScrubberDelegate <NSObject>

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -2218,6 +2218,8 @@
_initializedScrubber = true;
[_scrubberView reloadData];
[_scrubberView resetToStart];
if (_isPlaying)
[_scrubberView _updateScrubberAnimationsAndResetCurrentPosition:true];
} else {
if (previousWidth != _portraitToolbarView.frame.size.width)
[_scrubberView reloadThumbnails];

View File

@ -498,4 +498,9 @@ const CGFloat TGPhotoEditorToolbarSize = 49.0f;
return highlightedButtons;
}
- (bool)presentedForAvatarCreation
{
return _intent & (TGPhotoEditorControllerAvatarIntent | TGPhotoEditorControllerSignupAvatarIntent);
}
@end

View File

@ -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);

View File

@ -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:^

View File

@ -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

View File

@ -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())

View File

@ -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))
}