From b6cafcc8342dbd14050ae7bd2c033f9bc7fbe34e Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 4 Aug 2017 14:20:00 +0300 Subject: [PATCH] no message --- LegacyComponents.xcodeproj/project.pbxproj | 18 ++-- LegacyComponents/CBCoubLoopCompositionMaker.m | 9 +- LegacyComponents/GLProgram.m | 7 +- LegacyComponents/GPUImageFilter.m | 4 +- LegacyComponents/LegacyComponents.h | 10 +- LegacyComponents/LegacyComponentsContext.h | 25 +++++ LegacyComponents/LegacyComponentsGlobals.h | 10 +- LegacyComponents/LegacyComponentsInternal.h | 4 +- LegacyComponents/LegacyComponentsInternal.m | 26 ++++- LegacyComponents/PGBlurTool.m | 5 - LegacyComponents/PGContrastTool.m | 5 - LegacyComponents/PGCurvesTool.m | 5 - LegacyComponents/PGEnhanceTool.m | 5 - LegacyComponents/PGExposureTool.m | 5 - LegacyComponents/PGFadeTool.m | 5 - LegacyComponents/PGGrainTool.m | 5 - LegacyComponents/PGHighlightsTool.m | 5 - LegacyComponents/PGPhotoCustomFilterPass.m | 6 +- LegacyComponents/PGPhotoTool.h | 1 - LegacyComponents/PGSaturationTool.m | 5 - LegacyComponents/PGShadowsTool.m | 5 - LegacyComponents/PGSharpenTool.m | 5 - LegacyComponents/PGTintTool.m | 5 - LegacyComponents/PGVignetteTool.m | 5 - LegacyComponents/PGWarmthTool.m | 5 - .../AttachmentMenuInteractiveCameraIcon.png | Bin 0 -> 328 bytes ...AttachmentMenuInteractiveCameraIcon@2x.png | Bin 0 -> 640 bytes ...AttachmentMenuInteractiveCameraIcon@3x.png | Bin 0 -> 911 bytes .../AttachmentTipIcons@2x.png | Bin 0 -> 20164 bytes .../CameraAutoFocusCrosshairs.png | Bin 0 -> 158 bytes .../CameraAutoFocusCrosshairs@2x.png | Bin 0 -> 199 bytes .../CameraAutoFocusCrosshairs@3x.png | Bin 0 -> 197 bytes .../CameraDeleteIcon@2x.png | Bin 0 -> 732 bytes .../CameraExposureIcon@2x.png | Bin 0 -> 430 bytes .../CameraFlashActive@2x.png | Bin 0 -> 258 bytes .../CameraFlashButton@2x.png | Bin 0 -> 359 bytes .../CameraFlashButton@3x.png | Bin 0 -> 569 bytes .../CameraFocusCrosshairs.png | Bin 0 -> 152 bytes .../CameraFocusCrosshairs@2x.png | Bin 0 -> 175 bytes .../CameraFocusCrosshairs@3x.png | Bin 0 -> 161 bytes .../CameraLargeFlipButton@2x.png | Bin 0 -> 1926 bytes .../CameraLargeFlipButton@3x.png | Bin 0 -> 1176 bytes .../CameraSegmentsBack@2x.png | Bin 0 -> 1112 bytes .../CoubWatermark@2x.png | Bin 0 -> 2065 bytes .../DefaultPlayer.html | 42 ++++++++ .../DefaultPlayerInject.js | 18 ++++ .../EmbedVideoFullScreenIcon@2x.png | Bin 0 -> 155 bytes .../EmbedVideoPIPIcon@2x.png | Bin 0 -> 1198 bytes .../EmbedVideoPauseIcon@2x.png | Bin 0 -> 139 bytes .../EmbedVideoPlayIcon@2x.png | Bin 0 -> 479 bytes .../EmbedVideoTrackHollow@2x.png | Bin 0 -> 979 bytes .../ImagePickerPhotoCounter_Close@2x.png | Bin 0 -> 285 bytes .../ImagePickerPhotoCounter_Close@3x.png | Bin 0 -> 395 bytes .../InstagramPlayer.html | 52 +++++++++ .../MediaGroupAll@2x.png | Bin 0 -> 100 bytes .../MediaGroupBurst@2x.png | Bin 0 -> 101 bytes .../MediaGroupFavorites@2x.png | Bin 0 -> 329 bytes .../MediaGroupPanoramas@2x.png | Bin 0 -> 212 bytes .../MediaGroupScreenshots@2x.png | Bin 0 -> 173 bytes .../MediaGroupSelfPortraits@2x.png | Bin 0 -> 357 bytes .../MediaGroupSlomo@2x.png | Bin 0 -> 264 bytes .../MediaGroupTimelapse@2x.png | Bin 0 -> 469 bytes .../MediaGroupVideo@2x.png | Bin 0 -> 216 bytes .../ModernListsDisclosureIndicator@2x.png | Bin 0 -> 294 bytes .../ModernListsDisclosureIndicator@3x.png | Bin 0 -> 365 bytes .../ModernMediaEmptyAlbumIcon@2x.png | Bin 0 -> 151 bytes .../ModernMediaItemSloMoIcon@2x.png | Bin 0 -> 793 bytes .../ModernMediaItemTimelapseIcon@2x.png | Bin 0 -> 894 bytes .../ModernMediaItemVideoIcon@2x.png | Bin 0 -> 194 bytes .../ModernSegmentedControlBackground@2x.png | Bin 0 -> 294 bytes .../ModernSegmentedControlBackground@3x.png | Bin 0 -> 916 bytes .../ModernSegmentedControlDivider@2x.png | Bin 0 -> 74 bytes .../ModernSegmentedControlDivider@3x.png | Bin 0 -> 105 bytes .../ModernSegmentedControlHighlighted@2x.png | Bin 0 -> 294 bytes .../ModernSegmentedControlHighlighted@3x.png | Bin 0 -> 902 bytes .../ModernSegmentedControlSelected@2x.png | Bin 0 -> 235 bytes .../ModernSegmentedControlSelected@3x.png | Bin 0 -> 664 bytes .../NavigationSearchIcon@2x.png | Bin 0 -> 565 bytes .../PaintBrushIcon@2x.png | Bin 0 -> 1178 bytes .../PaintBrushIcon@3x.png | Bin 0 -> 1804 bytes .../PaintCheck@2x.png | Bin 0 -> 1420 bytes .../PaintEraserIcon@2x.png | Bin 0 -> 749 bytes .../PaintEraserIcon@3x.png | Bin 0 -> 1036 bytes .../PaintMirrorIcon@2x.png | Bin 0 -> 914 bytes .../PaintMirrorIcon@3x.png | Bin 0 -> 1460 bytes .../PaintPopupCenterBackground@2x.png | Bin 0 -> 1218 bytes .../PaintPopupLandscapeLeftBackground@2x.png | Bin 0 -> 1083 bytes .../PaintPopupLandscapeRightBackground@2x.png | Bin 0 -> 949 bytes .../PaintPopupPortraitBackground@2x.png | Bin 0 -> 936 bytes .../PaintRedoIcon@2x.png | Bin 0 -> 720 bytes .../PaintSegmentedControlHighlighted@2x.png | Bin 0 -> 305 bytes .../PaintStickersIcon@2x.png | Bin 0 -> 1050 bytes .../PaintStickersIcon@3x.png | Bin 0 -> 1522 bytes .../PaintTextIcon@2x.png | Bin 0 -> 263 bytes .../PaintTextIcon@3x.png | Bin 0 -> 353 bytes .../PaintTextSettingsIcon@2x.png | Bin 0 -> 1314 bytes .../PaintTextSettingsIcon@3x.png | Bin 0 -> 2001 bytes .../PaintUndoIcon@2x.png | Bin 0 -> 400 bytes .../PaintUndoIcon@3x.png | Bin 0 -> 539 bytes .../Paint_Blit.fsh | 11 ++ .../Paint_Blit.vsh | 13 +++ .../Paint_BlitWithEraseMask.fsh | 17 +++ .../Paint_BlitWithMask.fsh | 20 ++++ .../Paint_BlitWithMaskLight.fsh | 26 +++++ .../Paint_Brush.fsh | 14 +++ .../Paint_Brush.vsh | 16 +++ .../Paint_BrushLight.fsh | 12 +++ .../Paint_BrushLightPreview.fsh | 21 ++++ .../Paint_CompositeWithEraseMask.fsh | 13 +++ .../Paint_CompositeWithMask.fsh | 18 ++++ .../Paint_CompositeWithMaskLight.fsh | 24 +++++ .../Paint_NonPremultipliedBlit.fsh | 10 ++ .../Passthrough.fsh | 9 ++ .../Passthrough.vsh | 10 ++ .../PhotoEditorAspectRatioIcon@2x.png | Bin 0 -> 178 bytes .../PhotoEditorAspectRatioIcon@3x.png | Bin 0 -> 248 bytes .../PhotoEditorBlurIcon@2x.png | Bin 0 -> 660 bytes .../PhotoEditorBlurIcon@3x.png | Bin 0 -> 1027 bytes .../PhotoEditorBlurLinear.png | Bin 0 -> 165 bytes .../PhotoEditorBlurLinear@2x.png | Bin 0 -> 276 bytes .../PhotoEditorBlurLinear@3x.png | Bin 0 -> 402 bytes .../PhotoEditorBlurOff.png | Bin 0 -> 146 bytes .../PhotoEditorBlurOff@2x.png | Bin 0 -> 263 bytes .../PhotoEditorBlurOff@3x.png | Bin 0 -> 388 bytes .../PhotoEditorBlurRadial.png | Bin 0 -> 371 bytes .../PhotoEditorBlurRadial@2x.png | Bin 0 -> 875 bytes .../PhotoEditorBlurRadial@3x.png | Bin 0 -> 1299 bytes .../PhotoEditorCaption.png | Bin 0 -> 87 bytes .../PhotoEditorCaption@2x.png | Bin 0 -> 111 bytes .../PhotoEditorCaption@3x.png | Bin 0 -> 122 bytes .../PhotoEditorCrop@2x.png | Bin 0 -> 194 bytes .../PhotoEditorCrop@3x.png | Bin 0 -> 274 bytes .../PhotoEditorCropCorners@2x.png | Bin 0 -> 117 bytes .../PhotoEditorCurvesIcon@2x.png | Bin 0 -> 589 bytes .../PhotoEditorCurvesIcon@3x.png | Bin 0 -> 862 bytes .../PhotoEditorMirrorIcon@2x.png | Bin 0 -> 594 bytes .../PhotoEditorMirrorIcon@3x.png | Bin 0 -> 903 bytes .../PhotoEditorMute@2x.png | Bin 0 -> 845 bytes .../PhotoEditorMuteActive@2x.png | Bin 0 -> 652 bytes .../PhotoEditorPaint@2x.png | Bin 0 -> 509 bytes .../PhotoEditorPaint@3x.png | Bin 0 -> 674 bytes .../PhotoEditorQuality@2x.png | Bin 0 -> 144 bytes .../PhotoEditorQuality@3x.png | Bin 0 -> 207 bytes .../PhotoEditorRotateIcon@2x.png | Bin 0 -> 378 bytes .../PhotoEditorRotateIcon@3x.png | Bin 0 -> 539 bytes .../PhotoEditorRotationNeedle@2x.png | Bin 0 -> 184 bytes .../PhotoEditorRotationWheel@2x.png | Bin 0 -> 8809 bytes .../PhotoEditorRotationWheelLeft@2x.png | Bin 0 -> 9242 bytes .../PhotoEditorRotationWheelRight@2x.png | Bin 0 -> 9078 bytes .../PhotoEditorTimer0@2x.png | Bin 0 -> 1121 bytes .../PhotoEditorTimer0@3x.png | Bin 0 -> 1818 bytes .../PhotoEditorTimer@2x.png | Bin 0 -> 1010 bytes .../PhotoEditorTimer@3x.png | Bin 0 -> 1594 bytes .../PhotoEditorTintIcon@2x.png | Bin 0 -> 712 bytes .../PhotoEditorTintIcon@3x.png | Bin 0 -> 977 bytes .../PhotoEditorTintTool@2x.png | Bin 0 -> 418 bytes .../PhotoEditorTools@2x.png | Bin 0 -> 175 bytes .../PhotoEditorTools@3x.png | Bin 0 -> 257 bytes .../PhotoPickerArrow@2x.png | Bin 0 -> 230 bytes .../PhotoPickerArrow@3x.png | Bin 0 -> 215 bytes .../PhotoPickerBackIcon@2x.png | Bin 0 -> 863 bytes .../PhotoPickerBackIcon@3x.png | Bin 0 -> 1404 bytes .../PhotoPickerCancelIcon@2x.png | Bin 0 -> 806 bytes .../PhotoPickerCancelIcon@3x.png | Bin 0 -> 1300 bytes .../PhotoPickerDoneIcon@2x.png | Bin 0 -> 1011 bytes .../PhotoPickerDoneIcon@3x.png | Bin 0 -> 1568 bytes .../PhotoPickerSendIcon@2x.png | Bin 0 -> 3166 bytes .../PhotoPickerSendIcon@3x.png | Bin 0 -> 5098 bytes .../PreviewSheetShadow@2x.png | Bin 0 -> 1610 bytes .../PreviewUpArrow@2x.png | Bin 0 -> 1478 bytes .../StickerKeyboardGifIcon@2x.png | Bin 0 -> 1264 bytes .../StickerKeyboardGifIcon@3x.png | Bin 0 -> 1798 bytes .../StickerKeyboardRecentTab@1x.png | Bin 0 -> 383 bytes .../StickerKeyboardRecentTab@2x.png | Bin 0 -> 698 bytes .../StickerKeyboardRecentTab@3x.png | Bin 0 -> 1082 bytes .../StickerKeyboardSettingsIcon@2x.png | Bin 0 -> 1152 bytes .../StickerKeyboardSettingsIcon@3x.png | Bin 0 -> 1807 bytes .../StickerKeyboardTrendingIcon@2x.png | Bin 0 -> 933 bytes .../StickerKeyboardTrendingIcon@3x.png | Bin 0 -> 1291 bytes .../VideoMessage.fsh | 32 ++++++ .../VideoMessage.vsh | 10 ++ .../VideoScrubberLeftArrow@2x.png | Bin 0 -> 301 bytes .../VideoScrubberRightArrow@2x.png | Bin 0 -> 302 bytes .../VimeoPlayer.html | 95 +++++++++++++++++ .../VimeoPlayerInject.js | 52 +++++++++ .../VinePlayer.html | 51 +++++++++ .../VinePlayerInject.js | 80 ++++++++++++++ .../VineWatermark@2x.png | Bin 0 -> 1238 bytes .../YoutubePlayer.html | 100 ++++++++++++++++++ .../YoutubePlayerInject.js | 47 ++++++++ .../YoutubeWatermark@2x.png | Bin 0 -> 2781 bytes LegacyComponents/TGActivityIndicatorView.h | 14 --- LegacyComponents/TGActivityIndicatorView.m | 90 ---------------- LegacyComponents/TGAttachmentCameraView.m | 2 +- .../TGAttachmentCarouselItemView.h | 4 +- .../TGAttachmentCarouselItemView.m | 18 +++- LegacyComponents/TGAttachmentVideoCell.m | 9 +- LegacyComponents/TGCameraController.m | 38 ++++--- LegacyComponents/TGCameraFlashActiveView.m | 4 +- LegacyComponents/TGCameraFlashControl.m | 4 +- LegacyComponents/TGCameraFlipButton.m | 4 +- .../TGCameraFocusCrosshairsControl.m | 6 +- .../TGCameraPhotoPreviewController.m | 6 +- LegacyComponents/TGCameraSegmentsView.m | 7 +- LegacyComponents/TGEmbedCoubPlayerView.m | 4 +- LegacyComponents/TGEmbedInstagramPlayerView.m | 2 +- LegacyComponents/TGEmbedPlayerControls.m | 8 +- LegacyComponents/TGEmbedPlayerScrubber.m | 7 +- LegacyComponents/TGEmbedPlayerView.m | 4 +- LegacyComponents/TGEmbedVimeoPlayerView.m | 4 +- LegacyComponents/TGEmbedVinePlayerView.m | 6 +- LegacyComponents/TGEmbedYoutubePlayerView.m | 6 +- LegacyComponents/TGHacks.h | 5 - LegacyComponents/TGItemMenuSheetPreviewView.m | 10 +- LegacyComponents/TGItemPreviewController.m | 4 +- LegacyComponents/TGLegacyCameraController.m | 8 +- LegacyComponents/TGLegacyMediaPickerTipView.m | 2 +- LegacyComponents/TGMediaAssetsController.m | 4 +- .../TGMediaAssetsPickerController.m | 2 +- LegacyComponents/TGMediaAssetsTipView.m | 2 +- LegacyComponents/TGMediaAssetsVideoCell.m | 6 +- LegacyComponents/TGMediaAvatarMenuMixin.h | 3 +- LegacyComponents/TGMediaAvatarMenuMixin.m | 20 ++-- LegacyComponents/TGMediaEditingContext.m | 3 +- LegacyComponents/TGMediaGroupCell.m | 20 ++-- LegacyComponents/TGMediaGroupsController.h | 4 +- LegacyComponents/TGMediaGroupsController.m | 4 +- LegacyComponents/TGMediaPickerController.h | 2 +- LegacyComponents/TGMediaPickerController.m | 4 +- .../TGMediaPickerGalleryInterfaceView.m | 24 +++-- .../TGMediaPickerGalleryVideoScrubber.m | 2 +- .../TGMediaPickerGalleryVideoTrimView.m | 4 +- .../TGMediaPickerModernGalleryMixin.m | 10 +- .../TGMediaPickerPhotoCounterButton.m | 2 +- .../TGMediaPickerPhotoStripCell.m | 6 +- LegacyComponents/TGMenuSheetController.h | 1 + LegacyComponents/TGMenuSheetController.m | 5 +- LegacyComponents/TGMenuView.m | 2 - LegacyComponents/TGModernGalleryController.m | 43 ++------ LegacyComponents/TGModernGalleryView.h | 3 +- LegacyComponents/TGModernGalleryView.m | 12 ++- LegacyComponents/TGOverlayController.h | 1 + LegacyComponents/TGOverlayController.m | 4 + LegacyComponents/TGOverlayControllerWindow.h | 5 +- LegacyComponents/TGOverlayControllerWindow.m | 65 +++++++++--- LegacyComponents/TGPaintShader.m | 4 +- LegacyComponents/TGPasscodeEntryController.h | 2 +- LegacyComponents/TGPasscodeEntryController.m | 4 +- .../TGPhotoAvatarCropController.h | 2 +- .../TGPhotoAvatarCropController.m | 8 +- LegacyComponents/TGPhotoBrushSettingsView.m | 2 +- LegacyComponents/TGPhotoCropAreaView.m | 4 +- LegacyComponents/TGPhotoCropController.m | 10 +- LegacyComponents/TGPhotoCropRotationView.m | 13 +-- LegacyComponents/TGPhotoEditorBlurToolView.m | 6 +- LegacyComponents/TGPhotoEditorController.m | 18 ++-- .../TGPhotoEditorInterfaceAssets.m | 38 +++---- .../TGPhotoEditorItemController.h | 4 +- .../TGPhotoEditorItemController.m | 4 +- LegacyComponents/TGPhotoPaintActionsView.m | 4 +- LegacyComponents/TGPhotoPaintController.m | 2 +- LegacyComponents/TGPhotoPaintSettingsView.m | 12 +-- LegacyComponents/TGPhotoQualityController.h | 2 +- LegacyComponents/TGPhotoQualityController.m | 4 +- LegacyComponents/TGPhotoStickersView.m | 28 ++--- LegacyComponents/TGPhotoTextSettingsView.m | 8 +- LegacyComponents/TGPhotoToolbarView.m | 8 +- LegacyComponents/TGPhotoToolsController.h | 2 +- LegacyComponents/TGPhotoToolsController.m | 4 +- LegacyComponents/TGProgressWindow.m | 1 - .../TGStickerCollectionViewCell.m | 1 + LegacyComponents/TGStickerKeyboardTabCell.m | 2 +- .../TGStickerKeyboardTabSettingsCell.m | 8 +- LegacyComponents/TGViewController.h | 9 ++ LegacyComponents/TGViewController.mm | 82 ++++++++++---- TGRootControllerProtocol.h | 12 --- 276 files changed, 1326 insertions(+), 524 deletions(-) create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentMenuInteractiveCameraIcon.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentMenuInteractiveCameraIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentMenuInteractiveCameraIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentTipIcons@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraDeleteIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraExposureIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashActive@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashButton@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashButton@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraLargeFlipButton@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraLargeFlipButton@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraSegmentsBack@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/CoubWatermark@2x.png create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/DefaultPlayer.html create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/DefaultPlayerInject.js create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoFullScreenIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoPIPIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoPauseIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoPlayIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoTrackHollow@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ImagePickerPhotoCounter_Close@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ImagePickerPhotoCounter_Close@3x.png create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/InstagramPlayer.html create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupAll@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupBurst@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupFavorites@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupPanoramas@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupScreenshots@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupSelfPortraits@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupSlomo@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupTimelapse@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupVideo@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernListsDisclosureIndicator@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernListsDisclosureIndicator@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaEmptyAlbumIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemSloMoIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemTimelapseIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemVideoIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlBackground@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlBackground@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlDivider@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlDivider@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlHighlighted@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlHighlighted@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlSelected@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlSelected@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/NavigationSearchIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintBrushIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintBrushIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintCheck@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintEraserIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintEraserIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintMirrorIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintMirrorIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupCenterBackground@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupLandscapeLeftBackground@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupLandscapeRightBackground@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupPortraitBackground@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintRedoIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintSegmentedControlHighlighted@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintStickersIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintStickersIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintTextIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintTextIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintTextSettingsIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintTextSettingsIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintUndoIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintUndoIcon@3x.png create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.vsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithEraseMask.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMask.fsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMaskLight.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.vsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLight.fsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLightPreview.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithEraseMask.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMask.fsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMaskLight.fsh create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_NonPremultipliedBlit.fsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.fsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.vsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorAspectRatioIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorAspectRatioIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCrop@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCrop@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCropCorners@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCurvesIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCurvesIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMirrorIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMirrorIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMute@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMuteActive@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorPaint@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorPaint@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorQuality@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorQuality@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotateIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotateIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationNeedle@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheel@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheelLeft@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheelRight@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer0@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer0@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintTool@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTools@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTools@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerArrow@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerArrow@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerBackIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerBackIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerCancelIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerCancelIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerDoneIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerDoneIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerSendIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerSendIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PreviewSheetShadow@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/PreviewUpArrow@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardGifIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardGifIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@1x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardSettingsIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardSettingsIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardTrendingIcon@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardTrendingIcon@3x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.fsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.vsh create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoScrubberLeftArrow@2x.png create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoScrubberRightArrow@2x.png create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayer.html create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayerInject.js create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayer.html create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayerInject.js create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/VineWatermark@2x.png create mode 100755 LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubePlayer.html create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubePlayerInject.js create mode 100644 LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubeWatermark@2x.png delete mode 100644 LegacyComponents/TGActivityIndicatorView.h delete mode 100644 LegacyComponents/TGActivityIndicatorView.m delete mode 100644 TGRootControllerProtocol.h diff --git a/LegacyComponents.xcodeproj/project.pbxproj b/LegacyComponents.xcodeproj/project.pbxproj index de6fa474bb..f917c32734 100644 --- a/LegacyComponents.xcodeproj/project.pbxproj +++ b/LegacyComponents.xcodeproj/project.pbxproj @@ -188,7 +188,6 @@ D01778EE1F20CAE60044446D /* TGOverlayController.m in Sources */ = {isa = PBXBuildFile; fileRef = D01778E21F20CAE60044446D /* TGOverlayController.m */; }; D01778EF1F20CAE60044446D /* TGOverlayControllerWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = D01778E31F20CAE60044446D /* TGOverlayControllerWindow.h */; settings = {ATTRIBUTES = (Public, ); }; }; D01778F01F20CAE60044446D /* TGOverlayControllerWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = D01778E41F20CAE60044446D /* TGOverlayControllerWindow.m */; }; - D01778F31F20CC7A0044446D /* TGRootControllerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D01778F11F20CC7A0044446D /* TGRootControllerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D01778F71F20CDAC0044446D /* TGHacks.h in Headers */ = {isa = PBXBuildFile; fileRef = D01778F51F20CDAC0044446D /* TGHacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; D01778F81F20CDAC0044446D /* TGHacks.m in Sources */ = {isa = PBXBuildFile; fileRef = D01778F61F20CDAC0044446D /* TGHacks.m */; }; D01778FB1F20CF6B0044446D /* TGBackdropView.h in Headers */ = {isa = PBXBuildFile; fileRef = D01778F91F20CF6B0044446D /* TGBackdropView.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -638,8 +637,6 @@ D07BC87E1F2A365000ED97AA /* TGProgressSpinnerView.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BC87A1F2A365000ED97AA /* TGProgressSpinnerView.m */; }; D07BC87F1F2A365000ED97AA /* TGProgressWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BC87B1F2A365000ED97AA /* TGProgressWindow.h */; settings = {ATTRIBUTES = (Public, ); }; }; D07BC8801F2A365000ED97AA /* TGProgressWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BC87C1F2A365000ED97AA /* TGProgressWindow.m */; }; - D07BC8831F2A367500ED97AA /* TGActivityIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BC8811F2A367500ED97AA /* TGActivityIndicatorView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D07BC8841F2A367500ED97AA /* TGActivityIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BC8821F2A367500ED97AA /* TGActivityIndicatorView.m */; }; D07BC8931F2A375800ED97AA /* TGPhotoCropAreaView.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BC8851F2A375800ED97AA /* TGPhotoCropAreaView.h */; }; D07BC8941F2A375800ED97AA /* TGPhotoCropAreaView.m in Sources */ = {isa = PBXBuildFile; fileRef = D07BC8861F2A375800ED97AA /* TGPhotoCropAreaView.m */; }; D07BC8951F2A375800ED97AA /* TGPhotoCropControl.h in Headers */ = {isa = PBXBuildFile; fileRef = D07BC8871F2A375800ED97AA /* TGPhotoCropControl.h */; }; @@ -1252,7 +1249,6 @@ D01778E21F20CAE60044446D /* TGOverlayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGOverlayController.m; path = LegacyComponents/TGOverlayController.m; sourceTree = ""; }; D01778E31F20CAE60044446D /* TGOverlayControllerWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TGOverlayControllerWindow.h; path = LegacyComponents/TGOverlayControllerWindow.h; sourceTree = ""; }; D01778E41F20CAE60044446D /* TGOverlayControllerWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TGOverlayControllerWindow.m; path = LegacyComponents/TGOverlayControllerWindow.m; sourceTree = ""; }; - D01778F11F20CC7A0044446D /* TGRootControllerProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGRootControllerProtocol.h; sourceTree = ""; }; D01778F51F20CDAC0044446D /* TGHacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGHacks.h; sourceTree = ""; }; D01778F61F20CDAC0044446D /* TGHacks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGHacks.m; sourceTree = ""; }; D01778F91F20CF6B0044446D /* TGBackdropView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGBackdropView.h; sourceTree = ""; }; @@ -2130,6 +2126,7 @@ D07BCBFA1F2B757700ED97AA /* TGEmbedPIPScrubber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGEmbedPIPScrubber.m; sourceTree = ""; }; D07BCC031F2B82D100ED97AA /* TGModernConversationTitleActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TGModernConversationTitleActivityIndicator.h; sourceTree = ""; }; D07BCC041F2B82D100ED97AA /* TGModernConversationTitleActivityIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TGModernConversationTitleActivityIndicator.m; sourceTree = ""; }; + D0EB42021F3142F400838FE6 /* LegacyComponentsResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = LegacyComponentsResources.bundle; path = Resources/LegacyComponentsResources.bundle; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -2164,6 +2161,7 @@ D01777291F1F8F100044446D /* LegacyComponents */ = { isa = PBXGroup; children = ( + D0EB409E1F2FC0AA00838FE6 /* Resources */, D017776F1F1F91B00044446D /* Utils */, D01779B01F2139720044446D /* POP */, D017797F1F2107B80044446D /* LMDB */, @@ -2505,7 +2503,6 @@ D01778E21F20CAE60044446D /* TGOverlayController.m */, D01778E31F20CAE60044446D /* TGOverlayControllerWindow.h */, D01778E41F20CAE60044446D /* TGOverlayControllerWindow.m */, - D01778F11F20CC7A0044446D /* TGRootControllerProtocol.h */, D07BCAD51F2B4F2800ED97AA /* TGOverlayFormsheetController.h */, D07BCAD61F2B4F2800ED97AA /* TGOverlayFormsheetController.m */, D07BCAD71F2B4F2800ED97AA /* TGOverlayFormsheetWindow.h */, @@ -3484,6 +3481,14 @@ name = Coub; sourceTree = ""; }; + D0EB409E1F2FC0AA00838FE6 /* Resources */ = { + isa = PBXGroup; + children = ( + D0EB42021F3142F400838FE6 /* LegacyComponentsResources.bundle */, + ); + name = Resources; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -3845,7 +3850,6 @@ D07BC90B1F2A380D00ED97AA /* TGPaintFaceDetector.h in Headers */, D07BCA481F2A9CE300ED97AA /* TGModernMediaListSelectableItem.h in Headers */, D07BC9F31F2A9A2B00ED97AA /* TGMediaPickerController.h in Headers */, - D01778F31F20CC7A0044446D /* TGRootControllerProtocol.h in Headers */, D07BC8161F2A2C0B00ED97AA /* PGPhotoGaussianBlurFilter.h in Headers */, D017783B1F1F961D0044446D /* TGStickerPackReference.h in Headers */, D01779DF1F2139980044446D /* POPAction.h in Headers */, @@ -3998,7 +4002,6 @@ D07BC8CF1F2A37EC00ED97AA /* TGPhotoPaintSettingsWrapperView.h in Headers */, D01778491F1F961D0044446D /* TGDocumentMediaAttachment.h in Headers */, D0177AD21F23D9810044446D /* ASWatcher.h in Headers */, - D07BC8831F2A367500ED97AA /* TGActivityIndicatorView.h in Headers */, D07BC80E1F2A2C0B00ED97AA /* PGPhotoEnhancePass.h in Headers */, D07BC9051F2A380D00ED97AA /* TGPaintCanvas.h in Headers */, D07BC7411F2A2AC500ED97AA /* TGPhotoEditorButton.h in Headers */, @@ -4146,7 +4149,6 @@ D0177ADA1F23D9B80044446D /* SGraphListNode.m in Sources */, D01778B31F1FFF810044446D /* TGLabel.m in Sources */, D07BCA6C1F2B3CE700ED97AA /* TGCameraController.m in Sources */, - D07BC8841F2A367500ED97AA /* TGActivityIndicatorView.m in Sources */, D07BC94F1F2A3EA900ED97AA /* TGHashtagPanelCell.m in Sources */, D017782E1F1F961D0044446D /* TGBotReplyMarkupRow.m in Sources */, D01779271F20FE480044446D /* TGObserverProxy.m in Sources */, diff --git a/LegacyComponents/CBCoubLoopCompositionMaker.m b/LegacyComponents/CBCoubLoopCompositionMaker.m index 73a30dd9d0..6d552e1839 100755 --- a/LegacyComponents/CBCoubLoopCompositionMaker.m +++ b/LegacyComponents/CBCoubLoopCompositionMaker.m @@ -149,13 +149,6 @@ static AVURLAsset *gDigitalSilenceAsset = nil; AVAssetTrack *silence = nil; CMTimeRange silenceTimeRange = kCMTimeRangeZero; - // if(originalAudioTrack && CMTIME_COMPARE_INLINE(audioTrackTimeRange.duration, <, videoTrackTimeRange.duration)) - // { - // if(!gDigitalSilenceAsset) - // gDigitalSilenceAsset = [[AVURLAsset alloc] initWithURL:[[NSBundle mainBundle] URLForResource:@"silence2" withExtension:@"caf"] options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @YES}]; - // silence = gDigitalSilenceAsset.anyAudioTrack; - // silenceTimeRange.duration = CMTimeSubtract(videoTrackTimeRange.duration, audioTrackTimeRange.duration); - // } if([self isCancelled]) return nil; @@ -326,4 +319,4 @@ static NSOperationQueue *gOperationQueue = nil; return instance; } -@end \ No newline at end of file +@end diff --git a/LegacyComponents/GLProgram.m b/LegacyComponents/GLProgram.m index ab6320e85b..26173d05c6 100755 --- a/LegacyComponents/GLProgram.m +++ b/LegacyComponents/GLProgram.m @@ -2,6 +2,7 @@ // A description of this can be found at his page on the topic: // http://iphonedevelopment.blogspot.com/2010/11/opengl-es-20-for-ios-chapter-4.html +#import "LegacyComponentsInternal.h" #import "GLProgram.h" // START:typedefs @@ -66,7 +67,7 @@ typedef void (*GLLogFunction) (GLuint program, - (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderFilename:(NSString *)fShaderFilename { - NSString *fragShaderPathname = [[NSBundle mainBundle] pathForResource:fShaderFilename ofType:@"fsh"]; + NSString *fragShaderPathname = TGComponentsPathForResource(fShaderFilename, @"fsh"); NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragShaderPathname encoding:NSUTF8StringEncoding error:nil]; if ((self = [self initWithVertexShaderString:vShaderString fragmentShaderString:fragmentShaderString])) @@ -79,10 +80,10 @@ typedef void (*GLLogFunction) (GLuint program, - (id)initWithVertexShaderFilename:(NSString *)vShaderFilename fragmentShaderFilename:(NSString *)fShaderFilename { - NSString *vertShaderPathname = [[NSBundle mainBundle] pathForResource:vShaderFilename ofType:@"vsh"]; + NSString *vertShaderPathname = TGComponentsPathForResource(vShaderFilename, @"vsh"); NSString *vertexShaderString = [NSString stringWithContentsOfFile:vertShaderPathname encoding:NSUTF8StringEncoding error:nil]; - NSString *fragShaderPathname = [[NSBundle mainBundle] pathForResource:fShaderFilename ofType:@"fsh"]; + NSString *fragShaderPathname = TGComponentsPathForResource(fShaderFilename, @"fsh"); NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragShaderPathname encoding:NSUTF8StringEncoding error:nil]; if ((self = [self initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString])) diff --git a/LegacyComponents/GPUImageFilter.m b/LegacyComponents/GPUImageFilter.m index 68b713fb1f..1f54c6eb63 100755 --- a/LegacyComponents/GPUImageFilter.m +++ b/LegacyComponents/GPUImageFilter.m @@ -1,6 +1,8 @@ #import "GPUImageFilter.h" #import +#import "LegacyComponentsInternal.h" + // Hardcode the vertex shader for standard filters, but this can be overridden NSString *const kGPUImageVertexShaderString = SHADER_STRING ( @@ -119,7 +121,7 @@ NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING - (id)initWithFragmentShaderFromFile:(NSString *)fragmentShaderFilename { - NSString *fragmentShaderPathname = [[NSBundle mainBundle] pathForResource:fragmentShaderFilename ofType:@"fsh"]; + NSString *fragmentShaderPathname = TGComponentsPathForResource(fragmentShaderFilename, @"fsh"); NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragmentShaderPathname encoding:NSUTF8StringEncoding error:nil]; if (!(self = [self initWithFragmentShaderFromString:fragmentShaderString])) diff --git a/LegacyComponents/LegacyComponents.h b/LegacyComponents/LegacyComponents.h index d1d030a2d0..70ff6a714c 100644 --- a/LegacyComponents/LegacyComponents.h +++ b/LegacyComponents/LegacyComponents.h @@ -154,7 +154,6 @@ FOUNDATION_EXPORT const unsigned char LegacyComponentsVersionString[]; #import #import #import -#import #import #import #import @@ -193,7 +192,6 @@ FOUNDATION_EXPORT const unsigned char LegacyComponentsVersionString[]; #import #import #import -#import #import #import @@ -266,6 +264,7 @@ FOUNDATION_EXPORT const unsigned char LegacyComponentsVersionString[]; #import #import #import +#import #import #import @@ -275,3 +274,10 @@ FOUNDATION_EXPORT const unsigned char LegacyComponentsVersionString[]; #import #import #import +#import +#import +#import +#import + +#import +#import diff --git a/LegacyComponents/LegacyComponentsContext.h b/LegacyComponents/LegacyComponentsContext.h index 82ab6f1f06..c59e964f2b 100644 --- a/LegacyComponents/LegacyComponentsContext.h +++ b/LegacyComponents/LegacyComponentsContext.h @@ -3,6 +3,7 @@ @class TGKeyCommandController; @class SSignal; +@class TGOverlayControllerWindow; typedef enum { LegacyComponentsActionSheetActionTypeGeneric, @@ -21,6 +22,18 @@ typedef enum { @end + +@protocol LegacyComponentsContext; + +@protocol LegacyComponentsOverlayWindowManager + +- (id)context; +- (void)bindController:(UIViewController *)controller; +- (bool)managesWindow; +- (void)setHidden:(bool)hidden window:(UIWindow *)window; + +@end + @protocol LegacyComponentsContext - (CGRect)fullscreenBounds; @@ -33,6 +46,16 @@ typedef enum { - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated; - (void)forceStatusBarAppearanceUpdate; +- (CGFloat)applicationStatusBarAlpha; +- (void)setApplicationStatusBarAlpha:(CGFloat)alpha; + +- (void)animateApplicationStatusBarAppearance:(int)statusBarAnimation delay:(NSTimeInterval)delay duration:(NSTimeInterval)duration completion:(void (^)())completion; +- (void)animateApplicationStatusBarAppearance:(int)statusBarAnimation duration:(NSTimeInterval)duration completion:(void (^)())completion; + +- (void)animateApplicationStatusBarStyleTransitionWithDuration:(NSTimeInterval)duration; + +- (bool)rootCallStatusBarHidden; + - (bool)currentlyInSplitView; - (UIUserInterfaceSizeClass)currentSizeClass; @@ -47,4 +70,6 @@ typedef enum { - (void)presentActionSheet:(NSArray *)actions view:(UIView *)view completion:(void (^)(LegacyComponentsActionSheetAction *))completion; +- (id)makeOverlayWindowManager; + @end diff --git a/LegacyComponents/LegacyComponentsGlobals.h b/LegacyComponents/LegacyComponentsGlobals.h index d937f4eecf..6143acd30a 100644 --- a/LegacyComponents/LegacyComponentsGlobals.h +++ b/LegacyComponents/LegacyComponentsGlobals.h @@ -1,11 +1,12 @@ #import +#import -#import #import #import -#import - +@class SSignal; +@class SThreadPool; +@protocol SDisposable; @class TGLocalization; @class UIViewController; @class TGWallpaperInfo; @@ -25,8 +26,7 @@ typedef enum { @protocol LegacyComponentsGlobalsProvider - (TGLocalization *)effectiveLocalization; -- (void)log:(NSString *)format :(va_list)args; -- (UIViewController *)rootController; +- (void)log:(NSString *)string; - (NSArray *)applicationWindows; - (UIWindow *)applicationStatusBarWindow; - (UIWindow *)applicationKeyboardWindow; diff --git a/LegacyComponents/LegacyComponentsInternal.h b/LegacyComponents/LegacyComponentsInternal.h index 3bc70293da..b69a834ef7 100644 --- a/LegacyComponents/LegacyComponentsInternal.h +++ b/LegacyComponents/LegacyComponentsInternal.h @@ -22,6 +22,9 @@ void TGDispatchAfter(double delay, dispatch_queue_t queue, dispatch_block_t bloc int deviceMemorySize(); int cpuCoreCount(); +UIImage *TGComponentsImageNamed(NSString *name); +NSString *TGComponentsPathForResource(NSString *name, NSString *type); + #define UIColorRGB(rgb) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:1.0f]) #define UIColorRGBA(rgb,a) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:a]) @@ -58,4 +61,3 @@ int cpuCoreCount(); #ifdef __cplusplus } #endif - diff --git a/LegacyComponents/LegacyComponentsInternal.m b/LegacyComponents/LegacyComponentsInternal.m index 8ca86a9a76..58c12b85e2 100644 --- a/LegacyComponents/LegacyComponentsInternal.m +++ b/LegacyComponents/LegacyComponentsInternal.m @@ -35,8 +35,9 @@ void TGLog(NSString *format, ...) { va_list L; va_start(L, format); - [[LegacyComponentsGlobals provider] log:format :L]; + NSString *string = [[NSString alloc] initWithFormat:format arguments:L]; va_end(L); + [[LegacyComponentsGlobals provider] log:string]; } int iosMajorVersion() @@ -155,3 +156,26 @@ void TGDispatchAfter(double delay, dispatch_queue_t queue, dispatch_block_t bloc { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((delay) * NSEC_PER_SEC)), queue, block); } + +static NSBundle *frameworkBundle() { + static NSBundle *currentBundle = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + currentBundle = [NSBundle bundleForClass:[LegacyComponentsGlobals class]]; + NSString *updatedPath = [[currentBundle bundlePath] stringByAppendingPathComponent:@"LegacyComponentsResources.bundle"]; + currentBundle = [NSBundle bundleWithPath:updatedPath]; + }); + return currentBundle; +} + +UIImage *TGComponentsImageNamed(NSString *name) { + UIImage *image = [UIImage imageNamed:name inBundle:frameworkBundle() compatibleWithTraitCollection:nil]; + if (image == nil) { + assert(true); + } + return image; +} + +NSString *TGComponentsPathForResource(NSString *name, NSString *type) { + return [frameworkBundle() pathForResource:name ofType:type]; +} diff --git a/LegacyComponents/PGBlurTool.m b/LegacyComponents/PGBlurTool.m index cd9233928c..897ebffb96 100644 --- a/LegacyComponents/PGBlurTool.m +++ b/LegacyComponents/PGBlurTool.m @@ -95,11 +95,6 @@ return TGLocalized(@"PhotoEditor.BlurToolRadius"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorBlurTool"]; -} - - (UIView *)itemControlViewWithChangeBlock:(void (^)(id newValue, bool animated))changeBlock { return [self itemControlViewWithChangeBlock:changeBlock explicit:false nameWidth:0.0f]; diff --git a/LegacyComponents/PGContrastTool.m b/LegacyComponents/PGContrastTool.m index c0343866bc..f72969da23 100644 --- a/LegacyComponents/PGContrastTool.m +++ b/LegacyComponents/PGContrastTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.ContrastTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorContrastTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - (float)self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGCurvesTool.m b/LegacyComponents/PGCurvesTool.m index 92258ea117..26cd42c9e8 100644 --- a/LegacyComponents/PGCurvesTool.m +++ b/LegacyComponents/PGCurvesTool.m @@ -195,11 +195,6 @@ const NSUInteger PGCurveDataStep = 2; return TGLocalized(@"PhotoEditor.CurvesTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorCurvesTool"]; -} - - (UIView *)itemAreaViewWithChangeBlock:(void (^)(id))changeBlock explicit:(bool)explicit { __weak PGCurvesTool *weakSelf = self; diff --git a/LegacyComponents/PGEnhanceTool.m b/LegacyComponents/PGEnhanceTool.m index a7d8691c85..4bb20d3755 100644 --- a/LegacyComponents/PGEnhanceTool.m +++ b/LegacyComponents/PGEnhanceTool.m @@ -31,11 +31,6 @@ return TGLocalized(@"PhotoEditor.EnhanceTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorEnhanceTool"]; -} - - (PGPhotoProcessPass *)pass { [self updatePassParameters]; diff --git a/LegacyComponents/PGExposureTool.m b/LegacyComponents/PGExposureTool.m index 8fd8800e7d..638d38c75e 100644 --- a/LegacyComponents/PGExposureTool.m +++ b/LegacyComponents/PGExposureTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.ExposureTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorExposureTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - (float)self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGFadeTool.m b/LegacyComponents/PGFadeTool.m index 5121f0695f..ad07744ea5 100644 --- a/LegacyComponents/PGFadeTool.m +++ b/LegacyComponents/PGFadeTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.FadeTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorFadeTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGGrainTool.m b/LegacyComponents/PGGrainTool.m index 30b48fcdc5..4ea1ada749 100644 --- a/LegacyComponents/PGGrainTool.m +++ b/LegacyComponents/PGGrainTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.GrainTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorGrainTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - (float)self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGHighlightsTool.m b/LegacyComponents/PGHighlightsTool.m index 6bdce97069..488f827c85 100644 --- a/LegacyComponents/PGHighlightsTool.m +++ b/LegacyComponents/PGHighlightsTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.HighlightsTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorHighlightsTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGPhotoCustomFilterPass.m b/LegacyComponents/PGPhotoCustomFilterPass.m index b06b970779..bd47f4a682 100644 --- a/LegacyComponents/PGPhotoCustomFilterPass.m +++ b/LegacyComponents/PGPhotoCustomFilterPass.m @@ -2,6 +2,8 @@ #import "PGPhotoEditorPicture.h" +#import "LegacyComponentsInternal.h" + NSString *const PGPhotoFilterDefinitionsShaderString = PGShaderString ( precision highp float; @@ -367,7 +369,7 @@ NSString *const PGPhotoFilterMainShaderString = PGShaderString - (instancetype)initWithShaderFile:(NSString *)shaderFile textureFiles:(NSArray *)textureFiles optimized:(bool)optimized { - NSString *fragmentShaderPathname = [[NSBundle mainBundle] pathForResource:shaderFile ofType:@"fsh"]; + NSString *fragmentShaderPathname = TGComponentsPathForResource(shaderFile, @"fsh"); NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragmentShaderPathname encoding:NSUTF8StringEncoding error:nil]; NSMutableArray *textureImages = [[NSMutableArray alloc] init]; @@ -387,7 +389,7 @@ NSString *const PGPhotoFilterMainShaderString = PGShaderString NSString *name = [[textureFile lastPathComponent] stringByDeletingPathExtension]; NSString *extension = [textureFile pathExtension]; - NSString *texturePathname = [[NSBundle mainBundle] pathForResource:name ofType:extension]; + NSString *texturePathname = TGComponentsPathForResource(name, extension); UIImage *textureImage = [UIImage imageWithContentsOfFile:texturePathname]; [textureImages addObject:textureImage]; diff --git a/LegacyComponents/PGPhotoTool.h b/LegacyComponents/PGPhotoTool.h index 55a7e8c9e8..c0fc9b9b6e 100644 --- a/LegacyComponents/PGPhotoTool.h +++ b/LegacyComponents/PGPhotoTool.h @@ -33,7 +33,6 @@ typedef enum @property (nonatomic, readonly) PGPhotoToolType type; @property (nonatomic, readonly) NSInteger order; -@property (nonatomic, readonly) UIImage *image; @property (nonatomic, readonly) bool isHidden; diff --git a/LegacyComponents/PGSaturationTool.m b/LegacyComponents/PGSaturationTool.m index 87fc1c8490..ec5193a0cc 100644 --- a/LegacyComponents/PGSaturationTool.m +++ b/LegacyComponents/PGSaturationTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.SaturationTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorSaturationTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - (float)self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGShadowsTool.m b/LegacyComponents/PGShadowsTool.m index aea61ee457..0fbf5ca6c2 100644 --- a/LegacyComponents/PGShadowsTool.m +++ b/LegacyComponents/PGShadowsTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.ShadowsTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorShadowsTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - (float)self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGSharpenTool.m b/LegacyComponents/PGSharpenTool.m index 641f8b089d..cfeb696d6d 100644 --- a/LegacyComponents/PGSharpenTool.m +++ b/LegacyComponents/PGSharpenTool.m @@ -31,11 +31,6 @@ return TGLocalized(@"PhotoEditor.SharpenTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorSharpenTool"]; -} - - (PGPhotoProcessPass *)pass { [self updatePassParameters]; diff --git a/LegacyComponents/PGTintTool.m b/LegacyComponents/PGTintTool.m index 5c4ab532bf..57d5ae28e8 100644 --- a/LegacyComponents/PGTintTool.m +++ b/LegacyComponents/PGTintTool.m @@ -96,11 +96,6 @@ return TGLocalized(@"PhotoEditor.TintTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorTintTool"]; -} - - (UIView *)itemControlViewWithChangeBlock:(void (^)(id, bool))changeBlock explicit:(bool)explicit nameWidth:(CGFloat)__unused nameWidth { __weak PGTintTool *weakSelf = self; diff --git a/LegacyComponents/PGVignetteTool.m b/LegacyComponents/PGVignetteTool.m index a13709dae3..3e64b56e5b 100644 --- a/LegacyComponents/PGVignetteTool.m +++ b/LegacyComponents/PGVignetteTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.VignetteTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorVignetteTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - (float)self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/PGWarmthTool.m b/LegacyComponents/PGWarmthTool.m index 33e0ada382..05fdce3c61 100644 --- a/LegacyComponents/PGWarmthTool.m +++ b/LegacyComponents/PGWarmthTool.m @@ -33,11 +33,6 @@ return TGLocalized(@"PhotoEditor.WarmthTool"); } -- (UIImage *)image -{ - return [UIImage imageNamed:@"PhotoEditorWarmthTool"]; -} - - (bool)shouldBeSkipped { return (ABS(((NSNumber *)self.displayValue).floatValue - self.defaultValue) < FLT_EPSILON); diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentMenuInteractiveCameraIcon.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentMenuInteractiveCameraIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..4edffbcd9eb615bd720dba6489719b43702a8222 GIT binary patch literal 328 zcmV-O0k{5%P)V0AkSy0`dvULKcM8S`#Pab3&7;2GbNXm4E06yS$EFM%++##u70>gZ4LQ z8DY7@2sh=1vRI+l#GqF$9ilk2LZf^avutpwX_hW+H_E3d3R(JOhdJVzBZlSrurCRP za@`yf=ZJ3k@Fk&Pxp~se$`8LJR4=zlnhp7u7liKIC220@z0bd*f@d@@Km78yc9i|r zzT`WC<%chOj!iB#%{_eC%kZ+0Qt5w9ju(cUzrPia7A-?8l!bPAJ$r6wls#U@HlyaB aA4&~Iw|12)I(~cr0000_0N@@=zR4q_UIMq za6u3RK@hNq&qVQ=Jz|do#Boq;v49%lsAZX0;tFwH5j$)riS3dOyC_9b%1%-A;xydC27!tIP~EWNj;*Ev^DmT#y)9V4B#zkyk&sI$2^WwN_#5hDD%XR z1^l5S{9%FkaFmX6RD38Ut|o4h#|9?QpZ-i>1G(I!iT|Br5|cQGU%B`YPa`GF6%Xc8 zLL*8|l4eZ8kMxCJvq~~x6|X&oCR!D`&RB66#bHkKj#|oj!f6gON*u;=69t@QB2zeP zQ|Kc7U49^i{Gp{k6fsDe(Vq*nU{UBP!(4hM5AcHr%ygNdJhd*=z$%xW$_Fy}z*OB! z4Yq|!bg}Nzn!CDi#g>JdnCp@SL{X@hK$Bge8!k7RzeMqu(Jp_(u27!K9U-bCE}v&t zXrs%WBC69azsau91ebeHRPSAWf>|NG5NnC5Rxe27LS?pv;xE}V`z7nLn>x26j=jOf zX#eOajP>Yfv?~O~E;)$%wB~{F!&Nn~Qpf#?Og`#duCRXnfF}%f=~@0f)h_QPtS__2Val+m8bILZPEf*=Tj az|KE04;wjS%0YGj0000Duyse0LS!D)^7wD!ivBKF#fld~^6Tfx~zbhZ&M#?g2hXFR7$rFKx;s7k** zd4I9^n&N=6tbI!SB%;jkYsLdcxGfx(=f&uC?zzSKze0r&0KMQ3Er|~iA z_>|LS2YX1*K3PEv1Egn=vt_wWruMnhR4XpV+{@CBK{;Be{zu;hu6r?t7;V1k*&3A3_c=T zA1Pe~9Og4h*jM5+4il&n%;Y`)9`dOqHCUbyejO{oFnXDKtrJuMDSW3VWK7huC{me?mu#rxZb+Sn@ ztmG#WG%9SbBIJ0G$~;I;5w_b4dqENMyi4WYC9eq2+X^dizCr}NLv`LEP>6FWSPHvb z5gw#^4=TdtcEW~eQHV{{W>akZI%Fm6*4P8SliGALSs`w>61GSo4p6&;3bDvWSeqgo zqjtv>q18gz!?71^eO4;O!xqAJD8yCN=PHHRVIgdtLcB?R-cpFQ7Q$vJL>u*KQ;3-s z!tx4Hpgu)~m~J3U5$dLhpRp#p$7WavTbsdCapgpPk8QOOc7Fz69`{=aJD$O};xYfa z_x~~fgC2M0@etK}$mYxg3Y@DD0UuJGkI2QQRKu3S;Q5s1iqF}b1n-%clVJFXm5O0g z1+)9j%`m%%J}y-ZlR3l*#&&{3qgGq`z-AZ>vToew$_mAAN#Rh*WvK4vfser9VO zE1EXLBF}SyD#isoPsDZ@6sy=ZPz3v7af95(r5YEPM*BRPDJ;^;!|Y%!GssKinZa7N z^Drlf7zi`S!+xbXm6VLnXilFg8HZ_3hn0*R-_v}4AU6@W&VJ8KRf2#cd_@`i%6!EU l0y*cLbIv*EoO8~_{SEAL=Dh-d|Nj60002ovPDHLkV1n)ssyP4v literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentTipIcons@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/AttachmentTipIcons@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb05b2f187adc2c49b431e9b81297755bd3a0920 GIT binary patch literal 20164 zcmV)1K+V62P)%1tvq*^e2C2no&=g{8;Va}hEH#3K1VJA_BVuD2hWTxU+58T3 z7>He_I14iOPtHE~R%?bUhT#Q1{mz%(?{1Jk#(c2ZaDn}<0SP1_2u3=rGSo<|g>Y&m zUdZdPPsW^gI^T2s{94;ycMaHNudr)$%T%p!*4g5tx4HwqWEjo}ef`UhQw+n;zi%&| zH_vxiw`O@Kat%$S%18vPSX2>p>Lc$a@@ghn^LFOY^6iTu9~q9n5TMSK$TVaciJKC5 z~D3&P@1^JBFe2!(aPrtb4q?ITmP1zvN95E7ZEA?N)ar z@2am%mbKr{hmbriFOtaxa%N+(OZ1uB)TJ}ntcwLB`WJ&B^G_}}03-e3yoEmu4}b1I zxAl!#HWEblO~|Lk+I`x8p@+(-GJ@0jmN}VsvRNe4Ys=c}T%glWHFi$Ryv9Rq&s1%M zpUPiH`oo#9T_}d($3OPhsLLM6*nd^ydW+Q}PdKLTxU?s@C41{A7HL@RO^ z_a~$bQkK;lS1&l8>u5i5i;(|?vpY$2&53kLJVF(XT+Y7_}LH2pBAR<@h z{moj+BH9fR<^RenhK`&GnPn|ujBVBiB-34P$o;AE{T#s^8ioA)~Z()~QS0bT(2H`R@Gcz+YL*Oy!m@(*> z`2vsmZkd_UY%in8H2vR9v@-O?ANgLGOE}SI9MnTB(GQV4;QBjfGNg1Q&PlFb)ea5OVe4U;ZCN2Wbw{Ty^*t2y zGvApUxs%-dl0W+~0{$eMI5Ov7BlP$r(3j~t7Gl=Kz_)Sv(3iZgg>a(Gx|xHxd@kzr zz@O&u1=btLgANk=9y#Wlh0K{N>K!gWefun`Oc5rVK!1{n(wXG@BZ^xR7^57d09Fxf zoks_~Q5Ns0UNsSp;10YP#Q+r3*!*sBQ-^?z0{jf_Gcf(&y!iW3rhfVuR;ehJ$&owB zWZ{25WeUgq>e@aH+E!TFZemhzQG2YuLNPPy1+_9aw!0QpF-Y-@?JK=?kG>_Jp5pXxPMPBHCz)ge?1_V6o2?|LM#dxON=TtF zre4*r6-Qm`hxvWel+WkZewEw`x9JSP)3h5WGZiXi)WTCKa>oKH?yzp@e|n13zZqnb zm50CnCu5RHF5kcQQ)PV{Ac50&OFUvW11~sz+bwkFpVh*@L|>JLL3R#KXRERb)iGH71$lD9LI}G6`u5F&SC_ zfU7Z!tH+L31GE(N3J9%lB4&~5ic~OS2h+>-Lsc?frmSpX{-NeqTHwCz36M`55ukdg zDADRKeG6PQXKgB4x&3;`=4ZaMcGN8WNhZmk{>W7^NyNnA4`N8G@kKgg>)<@`L zVU*}w`dNjLj{|+oMYK+%qU`(wZPuryZ`dYt_VVE+p&j~9-?8F6KgU|=bpG^r){Y9N zKglHdQxo7%5)mK#>Y&~kYCCQjFHfqb+6=ri=7nu~_RK&Sr&;%HSSBoHHXPQcLUz=R zmD$b*gUH)N1hIJ-kXgcZ?N(T(g5rSBc>ZAB(F6TSCcvL$k`HVEJ^?t3Y+js?o^25h z^q%)V4d^4{I_eAht^-gvItS?(IF@D1bWf^hz)S*tKtG^vmih+ZJGRf~^t~m=%~=!Z zPjXb^@F$r>B3F*g!RD})L979vO1}oM$QFyCG5vJ?>H`q({0`7p#4vaM>etkVIDZTl zl|$#OpNFt#p~`JK3F>*u(XidSQr!Ne*-?nopJcM|Cz&k#uMCPbOFNv}@rW9K1HiT< zjN`HK$z8F1x&@!B-vi+Ej_b}c|Upn+wOJNL)S@Q1ewe~n1hj02+p^l610RHT^ zhnvXKpJW334_y_My?_6vJH|D7Riqvhkvk%^t*nqp-aPnUpgp{e?HL#g{n6h2$}CIY zdZ}QUZ4tX~cO7n)NuG4>TZGR5RJ%i{1m+Q!F$KFT2l>pwk#ek(feC+|2*y-FG$lNmcgv8@b*87arH zjNRZ0uS-UzkwR3AVd4@qNbi> zIqD7yCe2AuO%aIffj&-SJjP8QiSsHQJ`vKRKPyeM?+3u&9Nbhkp8p+AneAN%{b?N+ z7k%6>9(!%>`;Clz{o0@z-Sep?6^N>tSx!e`oetyKtaM~y#nl&<3m^27`-*5>@LsD7 ztfT-H=Wp4y_p*Z*9kuJ6e|Pa8j9~xW%l<8-N08Y!>m8Q&;(GqldN)hH@g%6rmPKpF z!X%X@5 z>WGzS1O4K{I$1%bh!4g*bNdSVoA^9^M3Bu@A)Aw>zXA4F#lC+_#Uo&06N+Hnk7d3M z&S=3?KM7qq9_vVZ>5Rt$#39VsD7hibw}oph#rTW2yZfE?$dDo~J$S)Uxz4j8hKTR1 zTlR`a^zXI}@QQbtp@NIBh*_o(sCfdSzK_-N0vKPxrr3Sk$pN-dL;&i*4i>0cvWRGr zs157a_-U~t^|-`b2jxLHUmQy@mx76E5Bu;q=68KT$Il;s7mn3OhU{*{)JzN3HUq7 ze%CGOjZ~zW@KV)fxJyQG#7d&G7W$-*Ag&*ZL?lc$^OMAv!gB$&M#(V9=O5>&`Kwmr zQMFa?K{W?yO~tiRtkitmrA&S2HEjnmMF#qx`p)L0cXFMx*AN?c6*KT<#xwW(E0|uR zXdn2hB=buVZp5|RC+gGud&-RljO&0~GJ^iPrGJxN=hYbWs>qn}q1C^8+Ih7U4am+q zo;fWO-NT`Z&?l$wv<`HtJgCuEgv;(*uY>;QCeSzG?$U8x1CZSk9}PFQ6Il=b$8qV{cmkP(7#&OylNIX0}R1eqL^j#un$l?#0dWmGT01BOcFSbi-!s4 z7)08!=o-KkF1Mf)iYjwXuFE)o9rQ1`2|<4~A|FE%)2;eyi*#$Gb+#Ip?@wU0S)}-D zppN;|)uG3I?$EDamtE_Y{zYc#PXY@SzW6Hp&RDa4NPxn@1^o>5A2;zGub3YkyN7Ag z9$^%Y(rlFKMx!Fz4O5uG(d2jCK1Ld?duIbO zV5Pf-&xkIjzedWBzyrS48-Th1+Tcc!Ng#(`)2Tr^<1-5MEodQJV#k)<>!5$(O>&)A zL)sBp6MF-BVS6tZjmn^Qk->s zL?~ewxt7P=E38{IIy zeEd24&zw5gJ?-}wdhbrej^lUV zsO!AiK2}n!>`jZA2REltK5hj$?PGmunT63mviXIwpXb~+0;4W^Yui8Q+AkN9=#L7 z?>N7pKL}&dFfweF<)5NbarzhCKubUMmRBi4i#JbsyZ7n)HB=D#bb8`1IymrC*<=0P zQTvFeHhOc$`qJk&?WUH;?|h?>dZ684<>8CfhvlUH+)Y`Hen7tod2@a0^qZ`jHoJkq z^Fz!BV4}u=5KhY9e9qmH@xU`@9NPd(;o{5P1LnN1%R1;U?K)oD`XdTO%xs;drSg~s z>#;G*^sosF`UG}WkOAvBj=>dnYuno3PFsfbG7ZB6PkWR-IOcy-;o<{d^6Pxv0e>+- zM<1y(vt`*n3}kHv{NBg;_?Fb?!vS5o$LAyG1Acpa!520q=s#iSo5aOzyJ2k?tOrmf zn&90Gfo72i?peLj58$mw;}|JEmF-1XG#cF`^b zd#`ulRKDx?lS>Nv!* zFna)ufFD-pWslwe;^qVW$M1fl!T`L>RyjAHJ)Qt*5B6OAU0WPj&im>}eb%OR2?Ku@ zx9U4&g}xdpaG{mmSo+m;?(rG-J!3Y~JFxqF4ipW@DQrib&A*JGKWzD7Wu_%L1Mt&; zKnk#IQY|>l@w>{|y?M&gi}WsaEI*Ozp+SLPu^bOP{n5S~gF0;#&qW8Wdm4sSj@nx2 zzK*>=MUDdA7vX(9Era9kj!4t-GR5m%Trkfq*E#(!Z7xnV?+t@G_ zyH7}JHNb6>Ug@F`J8JBHr;X^HZ!Q<7kF7U-@;n+D*!fHm@TSz=*8_F8VFBEr2hlqC zz71R<@mNluC;FObe#OqMd-h&@;JSruuKd(}@A*@tQanPZ=jR>N{kO}x6RtC#FYw18 z>)c=0K5)>s=XTzwFZ&ff_4J3ux4)SY@z&S`@|P#y=ckg^k>{xIZ!QDotTMn3Wh&Vh zs$^y88=o)BfM`pP2ePu)QQyV8R%fJK5DXFV{^0`(V_mC=%MU6p+^5)o4Q@id6+xih zQ#tCnR6a`2+>#Ib`k`2wb*y9m`=K?zjOZ+W z*>zTEBiI@Gqeb%1+H+ zN6SVy7x@kq+hO~#Cq}HSwBz)-c!IKN9J!C%^~S>7MV}OGc=gihZSsxEz3ePvn<@d2ke)Kv^XvQWOCPHV1r5vtea+Xm`7)M3?z-d0 z)j3l$oNHIr*Ja?b>(#M4WC@L94_^?_cc4z^@e8g<;~1pf@6?CIO0Jl%XkK8d*M-wN zorQmopW@v-7iBYh&VBCPEP%V4gwY7}H4ogQ8^G!<#lkt~M;v>Leoh$zbaKjRo5Irn z%ab-Nd|KL!mQhqL5qX+p2YQxa2~(du=Pcb{L(q@Na4T)GWhePwkf62aI^*~#2lQ(! zYz{L}N8fsIz`>zrlR0rbEIFIKDFM7O9-ke);mGu*AeHvhu>^9~$^Y|HOkW%ni_B@! zA}xBy{f1m$q>U)-gZxRf-o4%dS{bdc=geE29mmX$^_|wX7u#wDOaGXY*Dd{Tr9y92 zDEvREH>X-ybGlTy9JM zaeKQ#$AoAZgj0HCO&`I-hrv82ZuB9XeXxP~YMcxt{pWDg zvGu#R-ZsuXZhL3lw_%#|sG|!HwjrAU{EmK^3*4SijpYS8jubf`^yhM~-a*a{8<1~3 zA>w`ycgx-qay;mU{ixScMkd*OpO$*uWhq6=_ZzyC zcejUv-K0IZJIKQstu|)f0UO4oQ9jjR%g*SZNYigqKOnRd`pW|NciH)4VpLAqq;)MS z1-FBHl@qid;jQQH3Ff}md+}@U?nfq-Rdda^%(lioPPxC;^Dbzp9H9(9!37QI&p;+( z2!ADR97B?ME1UyQ|6QOT5rgad{LuA}qYT1dZRfv#U&Lh>xxN!_tuxV%$LO79=JPWg zM7ZPDDTdy$nAvidp(s7eF=93mfN>xvjq!xugT%QB`j{V=*wz8{Bj)Olx|}~Tzb6iK z`X<2J26k2=MAYJ-!OvSHlAUX(pTQh2%O|APB!xgh${>J{$&?(bzPKI^z$!iJE9w_x zvHu(hlg-ZuIrR6h?T;(2ywuJ;aW*DSlcU$3Ew=<-nT1cBUmS0b_H5E1u}V zV^#HLKl`%IpIx(vyWf9%+iS*LX9njt^w)J~cuZH`>yP&?k;ttqaf z@NeWgeMEg)+2$s~TCxZ*jvY-u&#>v=*A?_j&`bfyt8?a>CGTe|><{iXe7=@;N%*E9+2=fIsF%kMf~rhcDWhrj(-q1hITfqJ$QaqBxqY~N)> zTDJWcj|onH83Esc)wY^@c&5`kP;Yqr2p>!R_iFq7cOFMm`c)={)ANGd7U|J7UN`DF z*ju|KV_5>Yz4iqZ+AT|7!BB5nQEZ#D*lL7UN!XlwIX z8r4Yt9@ocKVf*kG$d_AgyYzW4%ev96jv3B9NX61EG%}_7x7<~etY1P6a&hjcK~|Gj0t`D>$L&5I1crN`O5)kw97EiVyk{!p54D6 z=I6t}=JbCTIjL`dH}^a)j~Ja&zn)W)Mfp5JhEt+ngF1<6idm!}|eZQl@eFmn}_Q|EN@E`Zv0+Z2iA74QAP^cgE>#@wL z3Xh(F-=JRx&i3_*(yWs_bkssF-D&DpTUk?3H<@oQ8L+oGRycI3^?h#xpQ{4HlvC`qk_fG(JjIJ>QNXd+x8GI12 zezkX25*&GK9KE2!_H>{`XV+7>c+?HbPT{z|1HEm1YpEcPh4UYrK60>MD(OQL5vohd zq~ha^v+VVw^nDW%vkj6P%}~<3&p3Z;#O+U-1;O_H-x%V1*Vq@ZxHJZfT?E%3CFJLQ zX-T%hWifB>1IXwf8W3u}BW%+<<@QKoabbx zEvN&ty8!`xUL*JQ0KrNhGWfTX(WeFZs^|Gbguj*d;%ZAYX3YDTDbd=~7?-}a8+U3T zd|gu@`yA|R=il#3=HH?Oh~vEc!9|^JPAw(!hdf-eKttx&QKQ~iK=#?VMrdIxk`La9 zxYNnAc+KsO3CblOym}q*HP=bXX*@>?ueo?@yMAw_`nr zRd8F%()unH{g_B=0REimiZcPsqYdW?D25S$VSL+;>DH#jdR60`MV%Vpmxo*ew82ta z-!ADNbMHq8b*ehkUj;Dtmb*vy`(N*OOQwS+%IY1ogXy80>-oyI^Y5};p`K;Gl8wI7 z+WWVSn>yv!tT^rmgJzIOedm@6-CnNOFF54NIbBOVSE9zhq0x%H2aC z?VLJCEFE_Of9oj^8ta@*fw|hq9@mcuYYK7TB@&OE$`SO@19;HdmetOLec7m&K7pT~ z+w6HWvCfSJUOWCmhBmvVe@LZ!KvaF89`C7X*)p44H+@K?80O~fZta^@1uL=j6nYNx zf%W!K*}5$vXJh@rgAv2EPOCe8Q)Q!ihzzDb@OX)>`*fOtoVhuPWFLBPDu;`X`f03T z=`-hzWUt}9Fe{YWC;Q?BLPayyW z^u>RFCZ)@zqIA-?BBi}W8eD~2|K86xusMb2={Xu!`uN%LV-B2%xN5j6)^rW}8P5+& zDGgH8;H?a<0N~b@`%-%1X0-=kNTz|mfqfhKX8lSAyNd|s9be{FzK`>|AB;Hrys_@j ze>dXe9|VA7%#%-zxa+;fIQ)&gI+t7+@$R=P^G(WVSWL?-5Sp=H|(EN!vI&cEMT3yZm#H_Sp3tjQ=HL7#Kf*A>?2wX zVhL`fDM-)COc=-ELY6Ep-o^y+qndF z|9=`P0$$SD%K0e>YX*-GxB~5H;Yh~e^AtHrzx&nN{JrBk>7(rPs-aN)*C#R6En6d= z{`?4n{nx)5vG02gNo!7M;TIksBgmFWXd!!mlE2iE#}9YLS6{4Xyiz+y%5Cv{Yv^~6 zngu;nW=Ol9N#4_}EYuCK+HuLLuP#J$2y(En+Tkw6{0ecYv1~vezRQ<P{M1;wS&!kVbtOf5y51A1`#dYSihbRzuDJhWDNCMJq9Vf+zLWq+WDU6EX^EmzU?4akfhkpd;(%6ihzFVmPk0lX{cOOEQRn?d42!5WZ&w~$Wt-!iE ztTOQRvH92f!-f<1w5OgHQF7_U5m#L1ar!8C@%{2BBcA`V3G&IKT-MGkJtC%b+%hV% z-!?ZH-|cA_EKrOG3KMXaw&A7OxZ=?mH2^Ybn)N2?XL9Vh8CMyhBvD_qrT8SnxOV>H zLo@i60ViT$&boyFZUm|&68SE&E-FSzdIMCUbNzTYVohk&haUj`l;qo9Nxy5CTpR2B zYdmUm?0A%p$KP|;dd-^Q^byyvLWco=1^{;_>U?e=ZNAaT^jB6Q)~@v!Xajw}^WiV> zG1;H`UbhM=Xa7Eq7SL^DPuu@p*-p|>Q%ajM zcd1>b!ZI^6!A8P!Cm(`k?{kn56?+LkZov%sX7N;-qb6<5XB*jkk3k z_TeuRS%Eu&)mN$vD(MgV#G%zOu|%53>$(_~4Q3M)?X{=v69?32n~`IW-~S*u=VBr( zeFy&WM;J94jyVbD?g#b5p?7EOWv^TcPd)-+L3we;Q%|Mfs1sq<9p=PYXZFzw4}IQ5x|wRQXD@aMPAFqiKm>P?U^_u-g!`~A*`w@-sFayH~u1K*X;p7>p%;?TlY&mAznW;Ice-^?B8%; z@wh*%`xT)J6JwU%rlL`ms^ajGi`ct<9wRG8QV~>=4F_l)Xyxs$H+Z4_S+ZeHk5>EF?>c3#hGz7@_0}h3se;0gm#bz{b-Eb7rX{aAA!Q4d7p51rR5|k&UqXT}@ zHcvh8CBrJw^HjRz9;b8UIcsW~Yv-g%1&*OGy2^3o> z@Zo(bm{1c?0+C1lpL=FFbWDn$EXl^+I3}oUk`iXt!bj)5uQ{Rz+}97TdjilI00DIJW*dme6nkbUasQkklvE?viA zBj@u%`*VssX{u^s!Kfn$TtMhU9@_qALc+v)5$~;dz=W!aTs`$hhNXrfATs*nhfRoH z^LL&9H*0@EYp#WOy#DP-2+_u8j4ZOgPj%3C=&TtOU87)|j|*>p<@K@A9T z@qRIHWQvc?g_l~w-K6G;Hi?sEI_FMHaoNl?sehBhK45gfPv=+i-M4eR+3xXPsg|hK z%vn=XTs6x)yh`Hmu_-3iIzI5+0DT1j9W1oPRVof39I~zeHwHi#e3g~vldg-vqhmGT zqoO)YU)p$>rX4$T9o)bDUd|qW9stKTp3K`_Z?PlaQ>5(9Y&thG_5jbfJ;VCGwZ%Ye zh?TbpC7wWas)oxaUsE*p9ohCs33F@z7A99uWmfHMYSVSpXX?3X%C-D>^$#M?Up#nS zcdCQ4@%#?Sa?=&w+9^mUH_mjnGFE%~LkplyoJ@o_UWLE^5wZjE_#g%6T?7k`BErbg zF#ia6`f*+8wCEUR>?8W;uA2eGd%x^D*k`|?^O;|HF@7yNS`7a7ZE(}y^yjo`nd&pz z;w#G8%hv&Tvn19UB>-NGid7iYhKb`Qr4x;PA@r>7@hs~M+1}@wSs$=xgJWEE0KopE zQ<2ASU^q+JJ*(bv`OGwd)8je@Jg>DDSlR7q?(kibCK1u)2 zS$fAB#xe~xIXvhD1Cppl6eIwvzT+bI_(J>h%&Xsz8MQMb>gCjNXYj90f5!m_HXITe zW`LG~W*%z3ACLgQ4&d6A?(Difsms&@u%UN7zh3(@;?)7sycMYm{&U&~qE*D`$}!BU zna$#!#ei4l*jot?bUaB_+9ryrrST;^b`zX6LTDCiR>2>CtxsIY!_9w>d(7^4AQ4VD z4W4@n@_BH?ocnR7P{b=Qz@0bgRM5VD_}$OpBcFxIQ?&um`n9E{lWm!z_2RuN(GRz5 zV7f~wj~$eDNvKNIoxVlTRkWEDk+%&RZT+6Fy*|M5E==d3v!|uGW=`y(PqJLUN~ChS zJ}(kl(}tMH2!Hd z{wuHL*xDBwUVY~9fKTk3i46UFSlE=}_?7|>Zz`a3rmb(s?Jt6_%7!9md*d-BeOn1MNq+h4F~XY$IEQ#-^9t|P9>f@+;z-N;ss;W+wIY18>aElr&?8IW=ta&X5m0Kftn157_41cdje&<=1l7W6?14 z9@7-CM}vMqyxLOWGp}ap$|Ya^>Tb`6o*$rnK+kpd)D+`}y+;uMKHfg6DPXS=dbP5$ zE94_DWZBXunc)<5eq8ka7hcKIlhbo78kbVi$F@bS@z||Y6eKoODQif=fckEXC+wUO zB=g9<9Umi2P1V8v9?2xq-_WE(oC~*Rago74OvwHZ(!{4oxv3T+; zSAZv3NNwwuxYD(*o(QAIz^09WhcS&5(a{bqE%F!*b&P=(%hBYPZD4NTlRfj29=?NQ z1*5Xp!#A8f-V+jUTRr?_9h(bhSnvMN%kz}mgTl?U? z^?5FuDRT^_ai*Oo7ouRedgs6yoqVYs7*fxlGShrAy@~by#B^Ou#(OB6y_$pF44{m<|t3c{hfHX}YzE}}6;w?|B;hoSWFZP1cry?dJl(AEZFn3U!y=W1;c zgFj}hoUie{?dTZ0vT(?DE*A%48%F5IDy2DU^G!JO`Si9n_IkU_a&&BMluCUpQHx-+ zPDWQjeT4%A>v}?--WH;bk*)Rx&p%cbSk#mvIrysck0;eQ!}q`3Twu)((As}4vETgz zn+lviJ3) zl-lLcx!p;EZ6cu}syPK+(@pfMmJhf z**Q{QV8^GG9z8ba-jK6+`w$2{sxOLKg9 zqlce-{Z>h{>||$U+v>7A^`o+ttxo#Ws_Mq^)izN3)Ruzsx@1BdL)f@8WL1}EPJ>N- zL;v8T{C)sU=Y+|bMW%qp(VvHRJHjZ7<~@w8ax_-Kwmy$za1IA(Ji9G#blSa&fe1G3 z@O<~p+-^!eoc8Rkp1vAn41)f-$%CRC3k1c$Yq?|FNlc|rhDG&Ev@AG8uYp28d7mdu z8i2qBQIQl*jI5E)#?(P5{hQajUSmVw1{RE3$iBn(i_$;e!|=>-=8swsy@QKhk%*+*K{(u8?Q5LvFJ^by_wP}nU7O<_ifRDEA9NT(LU4j^Y zU6hOLgst8^f8vEvrVa?sop3(i zTlpQbJ`0pC(ec=oNNcu*JGb7!U0d#qGIFNZ%wSI49Ol&SQB3(fu;IX{sOzEThqO~* zjl9(tLhrZoUrzM!_2WU8jDxAPRUW@WCIgeF!TL4U(0X9>XeodKG4eiAvQ+u}(Q(~f ziStM4mO+4q&@|vNNc7}O_sLcB>+xlSQx`;~lIjuc!_3Y)&G5`LDjy#k->-Gd-dCxLJeDwc= zm9Zy{J(;_<-igDRV5owwmmt*hqJkW4800^+J`_gPwp@{^)$dGXY`zWy4=)#eXwmSct`v#Y=MD(@!(H5 z1w6^~pL7}uCOgMjLoRD0lXhtgy}f?*04y(9)kU9NE^dsvsrZb?;=}lS!iNjGvPl6- z*$%x|Kcwy)7GlDSo?TVS&b1@!Rbvy&w>qUE-ktNH5uG=lXK)*X?yUYHhBk9#x3N>N zgKg2vXqs!0H$!Mg!|nX#S7j?dbuCYAykVQWFYtt5n!^vzG;n6qSpek2JhyJSjXSp7 z9&H0G9JPo^!zSZ_P_KA3yf!aqH=V<|Ukw||91wksTLWArkGgWcT*-djEU zq(Uuxbu_s2f%S96};=3!qSA1wVEaB$S+Ek5Ijm)l%?bVoyMt;8b z=ind|&z%XwCP-34?|MWu&-TI%RhE|I+$$B$Bt3i&X-jt~<7ujDZKDu}LT3jNjyeYB z?FXw@#YTU|49(s5^uXhf0lHT$k3JL|`ntN9vN`)aSg;7ztcFYl%$Nxc4RPA$zyOSE zQf!&g?zb>2f#mjuBtwg}mlZ+@&e~L+0R$y9(IiK|9{#lQ{Zf{=Ubn)rQRBSk{?b{p%9d!W}l{P8T&MYNU8o z!KsuXleO{X0?G_3u_gO8nlTBMxD&`n>>X%eM1K^P@%D?a^J^2aOoa zpC84zswR$WJdTI9KO~f$6eytaFZ;wKMtP^bfLp$8t9IZDefa*r>X9&)PkT z*ZN}ni)y@C$v9^o2ud^#Z^z?6g0{QUqetnRTMyr(&feVvzxxe*$B#b-+gYDbl zH@|@Xej8*R$iff53pf53j2%aW#<4nOv#Se!^aHr$QpDh!>)*XF8VudM-1fz_l#ZvY zpp++7pwc@$Ogu3qP3t4MVGFDJvA!q4;1AQCk%yjLKK)bhF-!}Vw`kfMD5pl_#SY&@_9(^-fF~vQ`_E`m!UTu z2)!vZlJDDo_r~7Ur-yU)__KKrw{5wd9C?W6inedtd^h!#~ja_oo~^c-402C zQgo&IJ3WiJd+Xht(R2pRIi}W3jb2GB*4ww-!Q!4J0QSBBJQm*S=3B*0kyg-21SW`! zOH}PMX9pdK{lWL(*kfVlY#2Wtd|Y(JiWP9row2c(Y#*K8xosPK>+5j(nJ{~gc)WA4 zWpiBA_0*Gbc8{$H)&@Emw(cNN&p+9?TRs1>fNJbum%qt+_L%mERu6yE4r?G!oRsEo zEAs5j+lJsyHztoXXvP~QN-IC$9K6+505ndRnBtZ-d1-m4TX9MejvMsUVeTkB*V>*z zsz`k5cVrIa^Q5?Gb)Ia&E*P~ZAM5ITYX1r~{u{4nS=9|%8o`6ZEX|V=>a<}utAnyi z9}YbP#qU_|Q?2eUPHGaI(?1seKahLWi<&oyc*fy|TY_NTRSYF?($i33K zG^Wd6eS=rVT*hk7-Zn=O%IEOI;i{{Nuwesy{cHNWuC9iBKIZFPX&bEJp|TQE=~z=A zM@jhiv#(UUME!nZqIwx=&n`UW``&@}+@-fCpmU#*ltSeLI561~zdW*%ISnaYX}c^t zs8gewRygzpIN%qHDkB{l(D>l9{VeVDIL!$1y~8V*J5tZ}%{Q_L@%{OBj-S4h+^+$3V^0+pEX##?aeu*TpmsSt}w^ z+KV?4M|EAc#i5mJ!0o2lx~Kf$z)_?RL>Ns6&6M1%J%jQ}fA?;l@6Oi-^1_*!$a{Wv zYXO{7bAuxV{LemVW$f*BdXqHtt0g&px-cM+oskIJs;-btJN=Mxi}_;%j+>ybvAHkg z)-`#xO#P8ChO_P z`$P2*Ef094#z6`IQO&$Dp&E6Zj0Zx%srHaI9$->t<60ul^c1y`8M}BPR$w z3fjOc^3_&Nn8;gs=HWYCYVNe5F`l?7WmnHvIp(#N0uBdE6pV{)22Y_H%s#j6l?*_s%VbFt~tbb53g{8o`3W(czDwwz2k}=c4gXe>f|(6 z?U5l9=s6zVm`8f5YL43aCRQT`RXpTXS-vZ#F8Z?K@B?fcLaEdiz8b8jj@Hw+5(N&~ zMoYvytR6qkwDB~7Vzb}Yg5WiS4nDL2cu;exd&2AM&}LZT7|vgHqu1T8NOsw*<1ZV7 zl+HC*38nM3uP1e-*87sn;ga{cp`{v(VTWWrdy~nNTy$l(6H_zw#ASd5r~be@#m|WL zz0UpiIH$Ii$CcO;7??9Wh^QSItI^)?Bl&{qb&jgEKIYzaIZhKAB*F)t9bjok0o@D( zJW!v3KOJ3_SR~b7@Ppod^njUGA26lPCF=CN*;?S^FJ_6)Y469ncn;AC(i;EK>SfE$ zFiP2+RO_h8*yH}TJjWlF=SBLVM9#k6XR9xj9D^QLK9tUkPkLFk$bE;`CdMJ}3v~6k z)@?#(ieXaH6-A`>zt4SI$KO(SCc6lU>0nN0o0(hhUmq8Z_gCJaZU-BjRqqvNRi6L+ z`PSfjtIso}p1w}-BXcgMv_p`J^-J|N?cveHeC-nLm`{uqFR?yqEDHU}w(roi_&f;ww2ivj9$4;_B+&XpS47>gTpK;-!~DSJv~3#aX`c zY8H=nENmsPlLWRfF{RK@7asY6mm|EEzEXMT-ci(-$02`lMa_7RGa56YP%7x=GQzuu zT9s07tM`Ofv&U$7=j3{ENqYW8ghT7$>kKZu?ug~kB7^>l8@$cJ!FuNS67&x0eLYT} z-()c)rh53&vGC+hTvj(nKix~nM9O%1KPkrH%F1(^f9m(VrCanO4U@fKG8#4;VVRMyJln+x2tHWxJ}aSje{4EWYzRff`8(q0&GO1DjSLE43&Jpe zvCUMp5yg4GYp#HX3aHLFy0al21JIeZ!8B)rZ6wWW3fJN}93v_n6+ztDt9=0MaQ+{6 zcZ{4z5kvv_ANd5p39v;GL1f?tMA$jTkfH-1I~B3a3E(Ean;NRnRy{u6vN+vIwADMk zquRgc&71C?-d?SH3}kJ(0RY7}T%Q>i=K=gTk9KOT=MY*yq<;QbG}3-8RtL<;TQe)C zb5It1?Uda@0C#jDSfBc^{ZdwY&5r^2)hzy}tH(Fm0vR^@*v~*}Cs{Pw{>NCD6?~OT z>eN$CPXzeyCO#e^=ws|L;kFb&wxN;DL;H7%TAIzYg$3}9{sfPQ52f}~Q@JGheOCXj^Wc4-w(=hxX#T)5>n-*73GJf>)T?hEb1JR$B-(pZ#?MMYK z)fY*>X+{%L`IowOH|7QkX->DkdOYGvLNIat{$weIlYisAD{PF^as4jCJLu=NAZq2pu0I0;b~cjy_@O!9t;PFL#O$9n1BmEeJzK7S-o}&ZH6&h zJ^YgeZJ%Ag9XNeJ5kE0x1F$cF{?JTYa4z7I6RwtAv&11yxs*uvJdtGh=x2sbC=HcC z*ZgoZQl0LHuThD94T~vJw*5ZjP&;#b?H{+W&LS6rX>r6oIV10Pf9=^hbBQ(b%r_AEY2GL!s2NAZT3OF0lSSQw&&)b2Jm10HZ8Bc zgMP1uVM9jwW9#~vCef(1q zlTV-B<!eLH57W%OgPDbqG39+6&*ok1i%5U!NLUD-iuXLUz_99GZ$d}Qoe9|3<82+(c0 z>#iN=3JqCh{akm_AI;p^c75qhc@6Gzoh|oJX94_|8{qSzsXM-O>JQ9+nY6`v?ehbg zi(3!(&ZVR;>I#bSi+hDeFgf*ed|AJ24kjm3=K|rR?V&0_Kvz>=0Q~XH#;VgIwz3RYR=*B>|L2%UU%j{={qdNM%qb0@3Yi(8+;{i%du@B( zbD{gzIRnHndjEfI3VqWh1%=u92E&vZDcwga{{iT06-De6W*4HfFnj?2cC^D>^sly9 z4ME$h{5?YlxPy=o(4{kY^xy90TzDh^?jAYaMF2iN){?)yMc3w%TlTHrle;gT-__aZ zKTFyrOJK-bqkHdgAmiFr-f?gKpG!G1Dt9{cNz&bZ|0^vMS0=#U%OZ2)He|(wZ198V z#Pf0e^aAMq!5P_m$Z5x5Z_>mfxLai5z99Xw*U~vlTIMJ3J6`z_ z65kd4j0L|}Wx<4kr0;jhQXAXb>+m{BZ+nVFfH z6G1=}W@ct)ju;~dGjqhp=&8UD`&25;ob%haIqOw&ce`WvzO_8t)9$JFH8z+9oLmb7 zkR>utW^BS$Hci@4#PNGO=Ktj3jWh8cTR>P}WKNFcxMcg@*56W%;jNT}{J4Z9+6uI- zCfonYe^$gQV{vXf1eDh|s-*qb(6s_J@hxja?1@to&z^Wg7h8Pu0yOTd>!((`b9NL> zJV4p&m#xztubJ2HYl7I8e_YM$B%fcSMr4i{Veh|VjXl08xSP1<_|7qVUV~Mxo$p2S zJNUVx5Z{pF@z>a_*Sy!GpPxG|ohMxYI*O#4_t!^Dr^s*%$yzxzQ!XSZ*BJm(L*|@!6hp z25B+}x*U`2nQ4ma*cu2ztH$5b%--=&n^9F4{^zFcPZ1~Jit;2s&9l$<0rJ=0PRe5p zvxk3nR&DOldqTJ4%&Yhra3WivGw<>$C5mO{;fJ1Q;?bLPq5whg=M(+YQu6ux`k}_i z?4@afrhpuejHez9WUh=;u827{#y%8~c{!P&=u2UY{jKuhAN%~7eC6AR%5JRs&f7L3 zWvJ=aP5C|wl8ejorQ^Q+hHZXN(^yO2TsNDq4np-U(0s!8{(S*sn;`uK*-cODz2;3> zo|x^J_t{5}_hIDnnAoQB*3Sz1Hd`jePjpS9PD~*}C0ebYp=FfB1|>>kCM*1ICOedN z<=P*MRprQW!yX^3n}jx3*i|W?8rA~Xd#Rvi+n`c?OVjx( zRlJ^5t@caFKHtl6cd;}zSGH`grp+!kHnIo@dJDR*RRd@Lp$;`E*=oZI3|1ILc^Oau!oPt?^ z?BcLmy2|IJ$OsT1wQAOruGo{W>i*w<5}*9)wGZK!|NJ`W)~rEp*PP(o$4>*6W?=>)^2tYSHJMRUzN3!y4q=8K-=lfh* zP0QlhysAdv?HqIMXE(`yD|GrTo-MC8ywdk7CmONh0QAUC3RRV@&jgdH{nCB#aZm+# z(k8&K0Nih1R=ryS_DwXwh32m_K+fy}kOpVD$;}hHV;TZ|kZnr(b@9LRRq-TA!^YCo zRU-C=*~iv8vUuy~Z$?!$BHpeecJkGpgx}~>ulUDFTv?BybbC}cGRx+MHSfOk?>Dcy zkkX%kZ?oV%*0bLloqqdQDdUUNG#^X+{;;Q-Y_OU|Bd6*=Y>2YO8l^wJPl*LTo7!2YHi~ombnMB`J4u(;b8V<(u760wwcXj>pN3T+AWpnlj6|l%6p_APT8D|~jo0gFi9`64@n6OZ2=%Zg8|biDdm-c_f4_ zK7a&?r{B7Cx_ZJt^+V@FS63l&b?p^%9!MS?40#%suOsXCD_A`+x@N#0yT5@Zy!+cWcqps?%Kl7CP5bSuzFy}~a+SC@+4qE!>V-;`_`?dBR00tp`y zE#tv^^7l^(Y2c>Z+XS?7r@bMOkn_e9x_gm2iq5gSL%4Y9P8{nd|7Wj$G0&G>kDkKh5QoaN#5Hw z8+BgQp$8oY{1u?9t4{sYPKDpqHC(2tE*1`_(gPeP3e$j-Qcoud5^Jlml8KuaXrH@ z{9md7<%@)S`>&BGj1qrS@!LW5)kBBH7w4>(U0weIJwihWlk>8i00000NkvXXu0mjf D@JQQm literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs.png new file mode 100644 index 0000000000000000000000000000000000000000..448abbcfc92aa80afaa30397c82ba72255355e97 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^wIIyI3?x6jYuN^*I0Jk_T!HleGaxi+>g!4%hp8mU zFPMSBJ043zbqgYLxX=@@vl9MQ*xJ2mytJX2MKw)`njxgN@xNAiN!N= literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraAutoFocusCrosshairs@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cea8bb3d3f937cc238877e806b0fd3f567e1d3bd GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^zd)FY8AyI@+O!TxaR&H=xB}__XFzDu)Yp|j4pT{x zUoZpzGo1@7fxK)_7srqa#@WEjjRlY0xlO{KJnW5>GC;7J`X7lro`#r86O{95_SHL z*|*QvFMj@G^WEnBXKYCQ{lFVdQ I&MBb@0NTM=`v3p{ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraDeleteIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraDeleteIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7560d4d7addf7a2a456ab11ca7305ca36d374858 GIT binary patch literal 732 zcmV<20wev2P)Px%mPtfGR9Fesn7>OLQ4q&(Qy7B=0uq8on*^)^Vre>?KuSx|#3GI0Uyve2tPJEo zNavrRB3M}3i9ZS}BL-BgObD7n!CXFb>#XDMd%Jt9ckvB;ee>phXXbnB+r8Tt)ox++ zdVP@e58w@W2_A#HvQrA}fd%k2iXxd;H^g>>Z{QNN!}e)1T3Ip417HWV+y2t9dEq3z z0*5KJ3(UvB^U7Dkkx0EhFb)oY+7F!aTM+VV@Jq89&%uPF-<^i&(F3gT&!rlW^cMU9 zYQJ%s|5ugjmL<_kuDIG(mXV6Ul!Ob-U_1sxDOyXX^y@YK^PeIRXMo%QYP&cuTB^`f zTm{JJq10-ueY8aUZSc&S(BcKF#n}qNtR>;EfhSI~3Bu_I)1c3Uy{_=C_=Qg%c!^~S zvND&f#?C53SBB^az}vXWJz*SnP?C_W1L28nBnuuVrp146PzZgoi}=f+^9Ctr0(afy zdxgWXf+b}=r)*=%)V<~cP%x#=Di70FvC-z9vCxb9)xhM&9dZ4XIM6VdZJVcY{x zExD>sowRV%ra8f)!6wV($OJ~Jige{s*Cjl&&t19cn9*2&kX{U8&L;?RdxUo*%68yt zzqfk^|9(I6bPppmtS=WMJgl#ABRs4hOh$OSf137dZ{KL|IUh%E&ahqr^phYwtk*3g zd>rxNyx1Dy_vr{>Q*{-NTx~h5`3cm{aV85BZ%Lp>wZj_iO99uh*dp;UQ227Hb;^v? z>jknk?dj4!^YX`H+K8k95Y7Rl5&mC~dLtE5W#o#t@=*N@P2WN0Q2ihIIMYgT)*{;g O00006Z8m`*m4EjIU|kt5V*U=6WnfqyF5OU!JTh*Gfn0te<-r@tE`5!M_dW< zu~6&7Ar5hfLo!{71~h>3EQFZ8h^A1Pfegut%nBw`h#>Z49@7jYkLDT76NE(Uqf)?N zF>?$?0Z|Mx>|%HXkFkN^G5rP*G-d!bD9?8y6GTQI@Cj20tV}!VMO)}f+LGUO)WWlx zpm7v`XdES05iRH##b0)eS}eX2hrdQhGEHIykwfz+{|6;C}9#>8}(ZSM2&}K#om76kgGF1;~zt&q!4PQndi-QGj&&4$;sdN}V4xru@px z|MKmW1j|D{Gu^0ycF;9CMQifAZuw03&^)&uM@3WDnu$v`6DiDpQ06@+7&})0iEGV* zF^u3bJYtVW=wmWL$h48VJS!Mg1Op*4ga3t05eORc4l{@v|2u=SV2XZM*CE=&Ar5iK Y1E)tT_UDL(^b literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashActive@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashActive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..122e1ea0977cbb07a5ca3a0b7d92c28864efb872 GIT binary patch literal 258 zcmV+d0sa1oP)2nKOnBgUiw zxN@YFC;0?6EGXp@>;d`_CCM0+KbPAvc*Evnd4_Ko1U{C}aKoquK@d_fddDt;Fu)6p z!VrW-exqnaxWp61M-C7&P(>pQ@(NWuYgnTC%pty@^Cl0Y8<9D8&$G0jhyVZp07*qo IM6N<$g1KO4tpET3 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashButton@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashButton@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..abc8a3dc0c3698b658b0bce430fe8c6506bceed4 GIT binary patch literal 359 zcmV-t0hs=YP)+qRP`b^7$NZ98q=AWf_nh;6eOBQw)ZInCJm-}?=&bFTBVe{{m_#M;Q#K6a9e}wZt^yD+OBU=S;=3$ZLl+Sz<;Q$#hzOV=AI4Hh%s2Tk zghwPCmk(D+=w-Ux*g%+suX1BGtt2}t7iLgRvL0tcjN~_|zQ~0Kq&uwKIEzgXdy)W~ z^2n3aW7EniF^MXyc1z+tRu43Q5H_WZQEogTRSPSX8{=pr)lRvvom6+_#!HfwFj_85 zq?3dumdlO3B-<_@-jQ%yK1`;Ym|{lBhr>zTFO?r(h}j}PrqfHrO<8b)h(bonf*$}h zvP2flCIp1pBpc2Fa9vjX1M(Ru8|D+DfyJ`oGGW%sqYs=DnNeFrrkVf%002ovPDHLk FV1gOJmW}`b literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashButton@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFlashButton@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..923087042b51841b97b07e4c7a800592a91a0860 GIT binary patch literal 569 zcmV-90>=G`P)Rwz00062NkllG9EVP&cF+z*Dh}eH**esv zG?dcXUW!Ywim3eq{TC>a5@Tw~*CBV8`zyZB^Sd$R!<*k-p7*^(LJ&?Q^x-l^EIo6E z&%lwEX(0!|nik5^$heN_rEWuM4Rf7}%`9t}3vA(}U(TdhaG5fvcq1*E zyBvF%4^pOsvTr@IqG{uckC7EklK1!{E1IVSBPp7`5VIs=U2cfHKe|Ct)E$U zdVwZy9cBn!dK%0Xeyf;yS{l%ZirL|k^TS>%n40&FrOC5x-_-AXbFYsSC{WMjEuP! zSkJKZ>^SCQ-r2)ca6tDSYl@tfuBY3#U3bWj=+iD!=boIo$R8KVYTkq%yUYwp4fM%o zesEsHIK#fm4c!apsPT>!11$oO)4$oT1Dl-FL(j12H2>aTGpJb}*j_z000000NkvXX Hu0mjfmud?8 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs.png new file mode 100644 index 0000000000000000000000000000000000000000..54a116fa5c77098524d3415744d84cbe2756f04c GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4x3?y9@CRG9{o&cW^S0MfW3=}y;X3GHi%q2m7 z!3_L7B@t7sfLset7srqa#^fLUjQ`JlFXsRN literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..72b27f345bb45645137ab764a07b95ef1456795e GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPs8Av+j&nyH|JOMr-u0Z<#87Ojy%$5Q2nM;EF zf*JUEN+PCM0lEI3E{-7;jBn5HW^6FvVGcaVbg%w&jzZSIEROxVe_8fDT{3Ocvec!i z&gE>Ejc?2_JeXi0!Nb;UJMX5QVe0WU|2e_jg9#g6olEfZy2-M(b5r)U&hIfmqZvG1 L{an^LB{Ts5f@VA@ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CameraFocusCrosshairs@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2d5a027100e9ac9b2cecd489f39ef28cfa3a17 GIT binary patch literal 161 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 QHt()SBMtJUnwI^)09gHTfB*mh literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/CoubWatermark@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/CoubWatermark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1078b4d8e79e378bf201839a0e55f896742c25 GIT binary patch literal 2065 zcmV+s2=4cZP)^BBr;bfFKwpu-vLgPib zo24E$^-?)B#zpKp*Sbz!GWRqCP*ra>+?j| z@EKqNHc2v28^WGmuYX(N9)okdy#oRmn?j~Fy`iDun9WVAy1IG|FaoPnZTS29dr%os zp+q>{Z-rUSWo$BtG+QiZ+(iV~fDu?n)kX+o6Ui(-Rw}%^ySscAV}4LOOsl=EEzjo0 z1&qKtqE-+QqN1X_DMH*;Dws-(^PY_PfXH;lW^{CPTyZB6U<6iR9#I>$M&o7?!438G zzk&c{Ok>QutE;Qj=H>;gTq};g!I%e~WTv3155uH55t4IxEFcF52Yc=qjk#3rH;#4> z?U4b@4!(k(fMT>SW#=xDjZL++$#8N`q{V8@5+%{!-`~DHHg+A!S#mlxb(@n)q6?UT z-NCG`>vZpmZhqHf`q7)QX$XrjF(USpps3;WlP9;5j0JQsFI*`u-s$XSV78kVR5P2g zsaC7?s4$WG`oo+EKB+`W7#bSt%FD^ww{Op$O*hNRPRWsD(CbeTiTOAT1P?Nwd}sF) z<|Duk4h)`;%{x0gwSqigT0cMr)C|GV8#V-ex@F5U0uw|g@)G$^IN7^NB7_@4=g$uX z0m!&fTDn$hU&35~eZhfYbJ#T{8sTn_9P?W)5L%(+_#93Ze}nJPX8@h669)hg;Q<5}5A7&jKn7aErw?Ou8XFqY@qEFhOJBh+pgAPeyu7?{!qO*ab6^H` zI}xZ94=WrN^yg$|?uHKl9OR5tGCZjvTs*ST1! zCqikzRf#4t&z#v#Bo@L(5dxi+)*!<#o_tp>Umi$iHk&6>5TT&)pb>)J=D0= z$`wG4dlQ<#NsdfHx>dmG!yNH5FdRB`=tTn7rm&~42X+T%Z*OlemMg&0)Rc{~9j6Fj zqLUeZfe?k?vq~M5Fc&#EJ5KhF!Ei*bfM%=pcYD|qUv}*njmGzd@>gBm&m4z6AzsmH zKT*(f=7aoLiD2)Tm>54Q5*tN`oXg4C$n%%IMA@)@eHfyEOxvtQ2IfRWwE@#?ZEZau zzyXfly)ZCv0WVSP0x|s{p+$0|*5Rb2MKB9dAHgBmbB4gOn9YB}PaS#^UZ(JBQ_eD* z&ELUE1&DAfK+ZUC6I_?I+IVi>4uVl0garo&V~`+IwQW=r`N2L#99&;j_1+jpsZHT3 zRS<8i{?qCrx%{ou?U!9F>h;lFwMraZqtVQu1Y9RdM4O+#3;AQjy|DoXY)cm}eg%x> z2yALUa=&`|q)7{a6_`hjBGAg&w6thAw3JY4puXf)uUwO=sj1PR zR1+og+v(HM4%!$^?T>qjc{EVSkP@17;6Nm|Q#nzpva<3Gic-CzBn;KnsZ^WI<$Fq= z8X}llr3$6QSK*{PD@XZ`5*^P;kti%I45f;>Rg?tvC|75Dda4kqWQBb&w!Fy(vQCc2(6We-DpP zXhMR7d@?XI_zcE7xmj78Bf`Sw@%$lWo;2WA^sa<7Z=kndF&I+7CtywzB$PEl{FMQ! zUYHBCA!Sw(5fMIeyFLV!-0bWGuL%>v5n_2CFY$U>j0_(ha1v5ZURhqQks4Oln@ktz zZSWUCfq_dfh=3MgN-p}sfb{{Qm1!MMc^#DJii5K0Zq+ zn1mn!!*ro(9Kd*d$wqPbrg_yO0{R**GMUBnJI12HFdy_2Fd=9F1jgbEZqpneof2qY vmP((YlryvUO + + + + + +
+ +
+ + + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/DefaultPlayerInject.js b/LegacyComponents/Resources/LegacyComponentsResources.bundle/DefaultPlayerInject.js new file mode 100644 index 0000000000..4e3bbaa0b0 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/DefaultPlayerInject.js @@ -0,0 +1,18 @@ +function fixInline() { + var video = document.getElementsByTagName('video')[0]; + video.setAttribute('webkit-playsinline', ''); + video.setAttribute('playsinline', ''); + video.webkitExitFullscreen = undefined; + + video.play(); +} + +function receiveMessage(evt) { + try { + var obj = JSON.parse(evt.data); + if (obj.cmd == 'fixInline') + fixInline(); + } catch (ex) { } +} + +window.addEventListener('message', receiveMessage, false); diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoFullScreenIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoFullScreenIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad54e3680604fa8d0c9145249189709659d7edb GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|LOop^Lp*qs zQxpVWyngvt-IZHdv+HD_br$2nfMk^wO)RW8gbrlL2=E-ZsGua_(sN_dwWHqCS4^vM zf83BD)59isP~p%lpN}tDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49qH-ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XRMoSU}&gdW~OIo zVrph)sH0$HU}&Uo07PcGh9*{~W>!Y#3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0uU}qX zu2*iXmtT~wZ)j<02{OaTNEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPC z!8&|>tvvIJOA_;vQ$1a5m4IgGWoD*WSy~#HIJvkP8JHQE7#g~oS(sT^SeQGy7`VE* z8C#e*!t}c2Czs}?=9R$orXchhmw7Fj-? z%(;paLoUeNWnIG6SYk6Fu5HR3HY3T0IccGp!Y_V=DTKB?`O)d& znNg7Dr*eV!$o|G1{I7oKC7rr;FsRs%;ZcqXyD{G@0r@q&8y;Q`JIHkJv4Hr3(4vD^ zg$2OPr3X9n1)lEd8VJLp*qs zuUxx#izP^rbl(DIaZ U*E3Gz2%v!sp00i_>zopr0Qp%bQUCw| literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoPlayIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoPlayIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a2e4422ec85ff5e1ab3779de3632176a5b49d1 GIT binary patch literal 479 zcmV<50U-W~P)Px$nMp)JR5%f>l|N6yKp2O6{SzT1PHwI)n$T)U&uJny~jRdXnPqLglHYq)gAScPcX ztK&GQjYdOH!z9$UnFMH?mR0qAKa^riPva(~@o3~bwtZDDmorOK{uahz8p^hydhsfFZhCP zi^bw5k1Oq&1e%%>LOwJ?>S@fTfGD4&g+=J_-9{#}*X?$j<`iD-CNxa5+Ua!KB5f73 zAEN7*I1oG;#DS`2&#pBexF002ovPDHLkV1nq)(oz5b literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoTrackHollow@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/EmbedVideoTrackHollow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0f4e5a009cc9041927f410fd18bb167bd181f8 GIT binary patch literal 979 zcmaJ=L2J}N6b@917F#bOS`db`h=QABvb$*$n$~o)YZscbZWrBSv&pm@+GOHnYO=j3 z9>jtN!9O5)@#IxRLA?l`de@T*UiB!V)|u_@*2C5zWZpd9_r34Ud$U_xxjH^JIVK3g zcy-CHvz^i(PLMQP4sgL1c>GUcMGV;G5!&qN6x*3AKZz9fDSORvO;U zrlVhoXiV`C;#V)VGZ0?pt&<&xRrg$K#>C`|869kG+ttruqyvN<0$8G{6zyjBX2WQ&VJ04@wB*0d17@u8CckoVl?KC54yN z4|JUWhlb%GI-zxRsCOuF(&)rUuA>BR6OT1+eTt`wjS@jF#iW7pR{s`jZA@{}#xW?Z zYT%;ddO^e;m%0eYF{)8Q-N-{#+Y}jx6a>BjbsJiGakiX?8ieJd4mGu6>&i@}v}h@? z(8t=?+YV7g`&j=Fs~?Hw!w|+SvyDh_3;7j-L(nbS2!?1`ELfGiHOu+f8m8p{>krY= z!&*mTWhO@Et^KFfeHWV_ZVm>Q9R{P1A~x@Y4fZQ=;Tn4s<*IEpvJb5_wnjehUio$A z{{E9sX-$7PdGAE?^y4oRqtlPJ{_OAX-FaZOYA>EIpZxLmwm$){rz+@tJwLxE96Kw# V`3T8V=eNn9S+%@kKU-Y8`xjJ-GokPx#*GWV{R5%g6mEjJ8Fbsqj-;RI$^ZmnXNakJLk}|v6ir8cjx4Unp1y^dV3&z&Q zTD}bUSH)RM`+=Lp1J`?&O%DdWJ+=|dg%lk65lV)D`3QP9E`;FFSx|akC3OVTvV=Wh zAsUd;O1~n8h{kNbXY|%g*f==>?3m}!5o+>*54Y9vbI`s+gO6Df&bjFuL;tNq{&sKK zjvo%Q?eVkvo@*Y`v6?2?d24PdBgTm4ut~-c)`o>Dm5&|>uKC*pn8%Wi)N2Hz)$F$u jBn9o2G2jBe)XT00000NkvXXu0mjf=Wcx8 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ImagePickerPhotoCounter_Close@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ImagePickerPhotoCounter_Close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0a4bd6e318bd224fe7232be719fb44547edfa9 GIT binary patch literal 395 zcmV;60d)R}P)Px$MM*?KR9Fecm|YHnFc5@!!Y9t%8+j!XFM%@!8U@Zi^wuiWU*%Nn-y$0b2aDv1E7(wCzK0sK6y&B-> z)1DK0Rn|uQN+?xwgHjgE$ePUWkIA{+&l&n%nY!DL8Dh|&10Y&KnPMj p28IC$K*}+Ybun+w@lXGscmqHB>!szQRn!0g002ovPDHLkV1iEerceL? literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/InstagramPlayer.html b/LegacyComponents/Resources/LegacyComponentsResources.bundle/InstagramPlayer.html new file mode 100755 index 0000000000..b21889acac --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/InstagramPlayer.html @@ -0,0 +1,52 @@ + + + + + + +
+ +
+ + + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupAll@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupAll@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9abbef6249ee2b923da6e21f12162bffd3b3d1c2 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk~Bp9L@-6Me%Q%R6tFatx`kdg0003HNkl)oBP~UTW#5xvNdPhwr#s5+s5k4UvproLLn;{GPT4NmY#`7&lZEYo z=$V5yujXi#mYj=ww5?!8s8O@nh40oePv>l|fBGTryIvLlzkuCQGhYQwj8#3qqJ+6o z@u%yfIf{&57`hfOQLxkM(bOo^c=6P1o~DzyH*@pC#--f`M>n@h#T*po`Nvkzd|qZ@ z|I*%r7mi(WpYix+Qv8fbFE~_w9~O~_mw9f;_%0;ilC<}&`O`NuT$50nU27)U4|FDj Mr>mdKI;Vst0KY?3AOHXW literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupScreenshots@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupScreenshots@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..86f314fb7343e9d41819fec5b2e722ec96053ec9 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UC7v#hAr*|t3#5Lm|5$(dfB65v zgW3ybuod3=`mg?9zbM1euN{U7wlU7uAxoI_HqDb@j{AR{H%>VDKz-6v4s9vZgewh! z%x=6ArVRQDTO;y+>;K%}cqOTpc@mqP!hGS*{qwG@(q%t!-euh_kM%M23q#gzVP&|o W$L{H4_slM!{S2P2elF{r5}E)nJwbH< literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupSelfPortraits@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupSelfPortraits@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ae188a3546f8a7aacc4ed92af132d6a2d1996915 GIT binary patch literal 357 zcmV-r0h<1aP)kdg0003jNkloY}@TEVX7(H`*XMKDSOGrlI_bk>s+0*{oil@ZC}XvPmFZN zGe3Lgj1eJ?UJ4YYK(A0VH63-sDRo0o!6n7HtU}R&PM&^V_Yllgk~yIyYMCTQNpg%; zJ;cG74J#1a@+0uduO4cqy$gU`YgIN| z?A4DztiLwi_}Nxv9TX`pa4rPL#D?gR8d#6& z@R`mjfqg1?=vS9i4MBC+QUbYJnIX0&1e-_+uwOaz6+~amA~isks@hm?kMm+l0q&Tl ziE>)}X&^!T1?l21?DQwL{|Gd&M-I~E*rP$n_%}WP><=0(kdg0002bNklbAUD{rtZr@RNS1Z+Zqwr?Z?5WR^TF6GW zL*;E_8Le4za&C(2(7-jO&ZR}xp-CKp9TNwYe+N$}FaJ>k{|*ieZN;N(I6Fum9p#y2 z8rusE>@8oWx?ah3ZhY=RiI0~-d{RH>s2Z(2>t`4idn~E=V+rsVR^}E`tN#Vz7Mdmi O0000kdg0004;Nkl;BiF z(kwM+Z% zgVC%8S#Hz^-=($dFCYHN%RukqanS^iaVOB1K9!k5n^#T;I^YfFGrGuXhR)-Sfxw;i zN_%l|qhr#sbOHPG?E7&(meP)C%%5N*zPqO{Bc)78<=JD6KKFdbhQb}(@*Z!T%@56= z#szQi-mSbH=(0_V5zoP7*$F1Vb0b=8)0G&mVRwdGaG>H24p_)=yKyZs%vmX$-Et{k zG4~r=Cjt=F@0+h&tz&}V`@4oY%XMGkvbjXOnxxUeifKHUq|w#H(48ryVNYr*q^E}S z3n{;p&(&YbNi*FyShbl3+%MHk4UX2;&PO$r29#4pfD+XNC^4kH3iM9BkQNUE6+m?? z2GxPuV10KUtRJWW*5m6;Yp?^$@dV4*DPyVUX`9NSvg!C~`wzzt;OqB3FHM6y00000 LNkvXXu0mjfOr+qc literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupVideo@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/MediaGroupVideo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b765b548bce9ff02e347f1d2477bc6ab5ddf09d8 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4U^F3W0Ln;{GUUpQ}Wn^f(_@6Q0 zL7BkgXABG2Spp74v3oNyC@@ApV5n%ADaoLIVEgY+rhg1m?siU}6J!$CY6SxWsce3NeM3f8yWnx|7=x6b(b{ilE13gY^J PPG#_P^>bP0l+XkK|0Yso literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernListsDisclosureIndicator@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernListsDisclosureIndicator@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..13f35bc8813eb3009bc7617006a86826fe5f259e GIT binary patch literal 294 zcmV+>0oneEP)LP_(%ncZmPBL|nQo*2>J`s8;~eaY@g8zR<6Qk92@(#C z^RO?*JIHok;ei-$AF_Bk4 s4gBk@zwa6Duqeh>qym#jj(+nz07RN|ma{6a!~g&Q07*qoM6N<$f;hl@H2?qr literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernListsDisclosureIndicator@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernListsDisclosureIndicator@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d32cedeccecb0c16550f3d44e889b6b64e5659 GIT binary patch literal 365 zcmV-z0h0cSP)Px$CrLy>R7efw*F6q{AQ%QM1Ou@M35Y?+02L|mLe4_|0_y*Y1W?1V zGQmJhcrXwf9t5O>?*ggen*c|+7vKta0-WI%z#YBvS4*wYlqz;HRNYm?Xn|9?QE7(8A5T-G@yGywoJQ!Ez% literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemSloMoIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemSloMoIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9f9ef93a72d489f9106ea5af6eacea80eb078a GIT binary patch literal 793 zcmV+!1LpjRP)+qRvn#=Pf>m6lNC-tRybw9r&_n;MRYSV+!Y&9@|Wy`u>fW6)t&&=o^6FdefREGXGzw6 zQ)GzyO(M9|qF~p1Zvfd@rVUeHn&sWcndi?9Sv+QHjP%8K6>hL+^VR{G<2c&J&t5JsoAJ23tPn$Dk z#{tgAA|s^Bc`FARqMggu#2x#V$3cI>W5>}nQCD*jZRhu$_aHoR8adlp`Z)J&mMjmh zLw^I;$?~t}{^&4%4PYo#$6@e#MR5{fLAv#QZPY)-b%p@BJbo_w&Zn>k<=D&l&bKof zd{oE(I>A3rwmbK&H?qHP&g=XF6Q*hcSe}#}JMuZg>JDB~!Oujwn4(V@M-v2l7NnyN z2y5so$pIqO>3#G#rl`?lgTJQjG)GuPM%ubY4@?n|u!^`5VG%ci7O8V&$CJ<4BCM@u zdW>wt_q_G9JfL)~*{H+Z=VJR13o%~99mYfApHDZb?o_v^d z6a84y^fl}`TozHBp-a0j?xByN`TVWJKI}&~nsa(_4}q%M%~GsfiPAyx&C6m-c+DIdgVso_`-_ zWt;ftt7vO zjF2I^@9p(LPaI1E$Z^z$UCjmX`tUubAnBUzfBHACekiN__1{c+N40Jb9o>xnC)WG~ X6U?HT^{JX*00000NkvXXu0mjf%$$dC literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemTimelapseIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemTimelapseIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b3bd9f85ebccdfbc61464412cd7a8dfaf7b1f6d3 GIT binary patch literal 894 zcmV-^1A+XBP)ASl;J%^8!i5#1I*g|7b32ZIr1Y&ladKYVcg`z2sg(8>5u)A49Xs&Q&m=EjZ}7uHk6aY=_Aw^Uowfo8-cKQCe&10uh%iyEi2)%cBFyjV-`YK8Jmp}2zhbJrCfR{HXRX2WbmmQJ864afDZG)|A9r)-DZq-V9!eQ0d& zzIhf=Y-Zkckxjs`vlu6g!&uuAMGTXT?@5qcJXKlU);DpAo&9)-DS?jk7(k-`mbJe@b$Y#(@Y68yLasVS68ON&&-z?n{Q~dTC)^OIj*{mUY{ITc-5A190OrJew+Z!sEwY zxrz{Vlt5h~H*TIfiIACsX3FN_$Bme*!Z==nlDmHG->|hpF=K6u(pa(ZpWuIf2DUeI U#R^@QwEzGB07*qoM6N<$f_)0X(*OVf literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemVideoIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernMediaItemVideoIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfceac4215820fa912444f056c730a7420a97bc GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P0wkGC6jgy#r>Bc!NCo5DDMuNZ9C=)qORTZI z^HO6iWA^jy*KY>Kd_MQ{rpXq=jVnaTU~`C|{ZFYp99iow&>&t;ucLK6UXyHJk+ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlBackground@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlBackground@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..159b99f7c7b01b694ede5080b4fd908c0d0de05f GIT binary patch literal 294 zcmV+>0oneEP)l@d78cHBif* zadvPs1wCjT*)P(Tj&$0nc*0ff4fN7cO^b$$B0yNs(WuqM>Hwi$KIrlbga$n#6rl)3 zC_)j6P=q2Bp$J9z_reHIvj~sJiVG7UH0$SW26|vYzC)G+OGg%AMBpD{)Zh#b9?5~Z s+8ts<8?(6Ll&3#I=aF>G)pM;AACc_sSMU1)M*si-07*qoM6N<$f+5v*$^ZZW literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlBackground@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlBackground@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..90b1d048b206454b8984e2c18f52a0afd5e63279 GIT binary patch literal 916 zcmeAS@N?(olHy`uVBq!ia0vp^azGr;!3HFS)4zf!#^NA%Cx&(BWL`2bF#CDBIEG}f zzKz=GClV;KH{Z?S=G;Rz!0Ls&LJ1H9K}A!{H#mfW3o4MovJ^mIchcWo}C^ z>l+9Pai@BBv!}SGA1l89X3xyKsZZZlb)MbLdFJl!@^dq*pY6T=Ch*Jlh#QuEg*I-P zR$iKOU0w_PTg10L<4X3DjJZ>)oHKVgU2eW_{bf<^`idR4KD$rW)>QK@c^Ier``VPQ zi<@0)5Ayhim_`4--T8dGe&VU;8E;G?wU5=!H(mLG%Qrl3s`Ttm`4^r(mi?OErC+CM z#4g)V-@B;Mch|azOW!JHxouh8e^GC)YS8q;^R0_KRS)d-y?k-;o-lzAOFTCvd5YFD z9^f^pKQVjvu5&L16Lgbu=bU<%{3*d^zKyckdy{`XZEbt9diz3-zg+g~qG)9H=f__( zu5J(e$PjR_W!b+EJo`T%sCm*lW%8#bLQ8ng@Yn6IVw-uLm%sRrSDHomk?3dTe?_h1eg3dODSL^mI z-Ik*_*F@eXaNFD^o-!Y7Ha2@0>BePA%E|`pxx%M(a!bX^)RGd1k3rTQDwiKEop$je z<5BOo3X^=gr$@QDvy13&rILo9>x0Di@qH_j2{B2|p0^`y=a=)3+;gHuyk>38{?q-l zt+lWG{LL6E&E#g`Bd*78#Gs}v;RB!jZS`Sy-5U{$c@AbQ}d~!+qC`_`S}Mh*^4h-+Psw8UOZoNbJh0` z#e%*U?`9mdVg6?-TwGfATWRS>?v$YRPP57PR_;mpVdFK~)GMbj`TW$N?xR`fZ|~kQ zYwn_X5^KbQ+%o6y=(#)FyYTQF-aWpXWrN+e{FHZ)V_fj^oWxdOHe>K~^>bP0l+XkK DzGkDn literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlDivider@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlDivider@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fedfad1d89dea00611dc5df62c87bf48d846e9ec GIT binary patch literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bK0U|~J%5Mfzf}SppArj%q2`~P#I4!=Cu!zC( W=i1)DeD;e#Nd`|>KbLh*2~7YuEfWU- literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlDivider@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlDivider@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c165592d51dc22f7e6af82247bcec86ecd60a2fd GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^%s?E@!3HD`n*WajQjEnx?oJHr&dIz4a+Ez?978Mw zlT%*&{W71CYeoW(fbA(s-sX!X3?~H_S2l80GBPw+G3&7QxV!@@XYh3Ob6Mw<&;$Sm Cj~nFx literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlHighlighted@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/ModernSegmentedControlHighlighted@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..84fc7c3f7c19daca623eb17e99a9ea927b15e905 GIT binary patch literal 294 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintBrushIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintBrushIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..50e06961857ecda50477139401d4b0f00f78c322 GIT binary patch literal 1804 zcmajg`9Bkk0|)R8vzcQRmdx$JsFZ8Ocv!Bn5PHp(d+z1tam6fiC3kL9c~BlljICy} zh{S^;b5)2)jp89`^7Q-z-|r8f&-?ZI`~#nC2RkcKs5BG+0El9(%^iQ~_Fo`^zuKV5 zjPDn~Xh$mypmj{ zSL8+=xQLzwRTS5xWJ_SAu=JuFB+r3bg8claV1`9`-6=~qhv0JQA~#Ay0_$*ksk)!$ zsuLYBR(nBbtre6S7{Fz5=8leJ_dd^d=92|0D)<`G)V-nQ{~r-=(7}%%YNT;?a6#jt zMF-*Xt9WzC+xJE87Ju9d^tKWHVSMl2JwN*G)bm!~xbA1kD@*YK_ z*}E;l!xMW1HP0{Gk7$v$^J05}q&BjKz}V4Ja@>iisV%@|*o-80x$DZ+8y^LHe5v)H z$1EXE_U6|`Z_IY)4FrEOMC!nkCGSqC^P=ww)Ona+SFUF<%B;HN9SB)kg2{>xkbCEP z6Dk$;_% za>&X-a)i|9HViy?dMA;Y>37j`q4PdNZlPXxyUjuuBToQ93P>?HnHEob`XD?~IRT2#9D{-K0SU&}25(I;z&Ep$ z)nogH6z&@zKglduZLb#VwSR$X_}NzCg|I3&>}P|u9;QDNe(wwKkP)Ple<$P6wIjmV znSD17*|5JaNh^UMmGsx!CY)Lf&qv|CPYJOx;sOKV0d7bS?YrtNRPZQr!A0)-DXgwC zrN@l&x28XFg{>XzzI9sm3Ft-&Q~Ya244!2+AhfHR=BaQ_&Ig_pXbY7d2U63>i&hGq z`S*{1%yl;(Y6K<(1$T=#;?_9Yrv^q8*D+G-$FhkXe`OswNg#Bh1 zQL0d}`A(TM^>A1ZF2E!ORNSojtw_r~$#ifG6D2tquWg-L-_$b}U+azD9u6Dml4Tnb zW5p(4n%44KuhytsE*hS)uL|@kBD}4C$TF_BKJ#vkVkA2=vcZWPTH7t!2SXSZLK@BK z8Cq0~J>F&5ks#Nw`n9{Q9}J{oMiM(hnI2Y_95*@FdCi-Iv$QjB*L>XMxG<`f*OUxb ziI!X#$whNsz6hmayy}m=+|>QkZBp|)Z*@-SzwsPKhb0Zo7M4{CWSFe)cRZe=Wc#_Q z*ot#;G{km1nW&vU-q9KkW?eyJxY1nCOCT=<&qOura`>!kh~hJ z6(#~qB8Bek_*yJe7gju)s|ed0#oy4!5*-!QndwokX3FCPo9nJY(rYzg&3u>u=)Sw+ z!8OkmrEiWZN0grJz*=zBd-k=A`h`oA+FJmj=i=Qz4};{s>x={0!;40Bvkyj%94?tg z5od}@(L_5cp3Yk#4X_rG6S!WDHEmQ;qd4zQjBks4!`UppQx&eGAa_Y$J&vMX)Q>Rx zR!(R(zf}Sx)QJUen)bFaM8nXa>Gbv%eu*nMRNZLE`IyPq&sCE4b=}{@eCgru!=Nhv z2@aEaH}2t8fj@d4t6X5j>GCreTzd^`OIY8>l;uUUDn3Q`sOCW|TM>Oejj*nf&8&uJ z=hC0$NQ*b(Kf6f9ww#gX6WLv47)4oHx^X-54FDk23=7mXYOa@m;o{O19O%quV{?WP019$=xMnE`|HwD1RjU_5YwIc6bLVP3=Ik=OHPwg{Y?%< ztb1Okp>#;2aWq+b#wXR(sfAh?@RVbXYVVGMehyAsRWs=P`|zoGsK3*QT?9l1IK&2- z!nq)AFxAO8DvMTzygHCb=Y45piLwJpO(&&tSXF1dOOxUXKXj+jcyrEi`I~&Mm7^$6 z&}y|><8gc_8KAUJG~Ih^@wXk)F6>iK;Ydi`U`xA+c?HCO?DX$OlY7fcw`fi!*ZA_u z*bJ4*cE4VR-S jr#^}E|AQcT&`*Ahe4^N^*ZgmO-5UUFVQ1co@lO92Ovy_s literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintCheck@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintCheck@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..69d47f8abf8887a26357ba517437e0823252d3db GIT binary patch literal 1420 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Eu!3HE}2mdz#Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?@QuLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ@J&q4%mWE% zf_3=%T6yLbmn7yTr+T{BDgn*V%gju%a&)zDGqZFxGch+YGcT7;+1MHoK%2WtOF;xE1B+Du6w0m5JLeCOFN5 z>P^Az7E_#h^?{Dj2SqJXRKtXT=?BDwCtM&0p7c}mfa$#mn6NiALrL#cu8BH1 zx>H(PTYEPt^tXJpF7@lZZCjppX0GMe*LN)M+dlt4zxw>oeXlv$n%iPO``Alt-15L@ zUg=)5U5qc(zb!lFtIWvzF>V+0iw5PobhR@KNy#PB6O`ItJ#6`SXNR;y%CtPsm?)>v z0yi6LOTSy5I{TdL9~GPzs(z>`$F}Fw#B%F9mz#eq+fi`aVb-0Tv%3y6=61-hVl?MX zX^z<8Cj7sV?TEfJ`(2|6{EQk`kL*9t{$s1@gSN&b&A0`f^$wDc%F7%t7v<~;?E3xS zj^iK6u98RfJPL7+<=*!t7FGz)aayPLkE6B2`dLZ;3f7=M5=9S0qaGYejI+*hUZqyY z|FmO&%Wv^zt}(Kz8)s*m7PBSZcl^WVr6d@>KEc8zW^2jWiL)9^C%!a!9qXvN$9-34 z3uB;;S#FZ#q9VtwXP$oEkTCgrsIdP=KD)&?kE->*ioTL@ssCB z`}3oM&zF(g{63v{ g>GS?u>lv6CF3s;ac3{`uc2N1~>FVdQ&MBb@014d-Q2+n{ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintEraserIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintEraserIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20d8c4f293c9d894d377876e42bae582126cee9b GIT binary patch literal 749 zcmVPx%r%6OXRA>e5n!kz^K@f*;RSfPlF)Tys4QR5(Q(zmh8`oB7i-TYb~Lbit4AneM5ouV#0;XW5O7YPABj0;wv{G|kym zzO(WR=uLEpexr}*aaIX>CIj4U^c98n%rj0Fz98&^RrvLRZh`&8x%+4zSt}nJn()pF z>@E4&(QcxBWUX9iC^}*Fd&ZpgfR2G(8|X2x#Y0blEf#te*y5l)V2gqFgv}m01#Gs^ zz}`W2Z!9ka4>Vzq7JqH)^b-%?qkOc${^6Y15?vkTY+y3}Lg-`8T^YE{ZlfC^M06f>AF-`-by}5nNREs?T&Xu ze9E1EcM?Mzw>vv3U!rd#`!REe#{WFu*{({Ygw76Di;x03Ti6uP*~5B57X#}7Jtyo! z0j9JhzRh*7k*=G^^be4%tzCARfxBk#bk|uEcv4rOkzKMljJA2!*-514BJi%GH_@0) zBR}81K%2(RsdQKRNQW5$aE)^}P~YE=WQ+Kgt>RI5eLb!fs1>LcaH#+fqdoK!^W?uc6kmS9h_UBP>f1fV_((ZNa+4gZ)e6)K)C$xJ)C$xJ f)C$xJ%vOQFqYSu00000NkvXXu0mjfy0u*= literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintEraserIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintEraserIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7b7e5bdad6dcfaf1266d261f305155c0d212b2 GIT binary patch literal 1036 zcmV+n1oQieP)Px&#z{m$RCodH-M?Yi=+*+fHpuEt>=0;AWMU71`~|9;h_9+^WNz7Q(1GUKT?q1qtOxlH zg4k_P&1Kpm>+6WE5+2zXSyxSLm1vPek#*I?RtZP$ima<9wn|uXU&y*@Vyi?Y_l>Np zCbmi-4~48<5IX`gu_GcEjXm`4LUGMp)NUjdvZ5D(of^3a>|Bs1jopC!OMaadAZC_+ z5p`$%jxcXL*I7}l>r^LZpSOMdybu#v`$E4i>@8g`>x@CPK|Ytpj~uagvj&#p8j$~~ zu8~t>%at0l9cK-VYF%5hTp4+W_-l@8`8+x{`rSZCU1rPl}EHUC45ij@%KISMx>I>QiAiAkSqyT4Odj6j=ul8@ov4*w{rQ z$HFGEN+S=o8zFK9Ss(U|O=Oj|20w`i7ZGc{3*iLq9N;>g(8~HjmSxS+gUiNKhHm_D}&pUDvcH$xl)e{ zTP};)THeSqI8=RXseDrho+6_j7q(e${>V${U9)mLmkXM=Qy^=f=)Vp2IFOgnTNY@U zB-lx=URSW?N=@BmvGE`;p=TJ(5yIAzVWSw=N&9gjSGJsW4D8e z!7c(hHFizX7|#@`4?Z`Z$BtqyOFNaM6SMJOY9F_RgKr5 z;CX)c!c_;J;xSOx5YG{R5M7$w*1Lnam|`5EeGc|vSXU5$mJvr&Ko6rcbFC_n)UP#~2+&~Y@5g|DID7l^xvwN%AN?pKcE-ypVe9RJC;?@;L1 z=;*$0XA@ce0MHM7#}W!Hr#a=cWr^)4pfCFlJoHj%% zj8(=gV`rlP1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CXBX9<)9^(i}cu_k50000Px&Oi4sRRA>e5Si4dcK@bJ12#AOzgOnI^%=rMw2ndWUsx&b11N;DD3lbyA#he^s zQp_|lGO)_Jp5Ahn*|TT&?(Ch}ht5<@?ev+R?$h1(?xWY%^2iy;8ORy|Gqlg=h zVf*`Pe>NBbxWX)kBJK8Yy;A$Lz(9Tv^Op-ok#>83_4brbENml|Az|k&uuXw0$n;Eq zUIP`{!Tjk}tnEMQ)J%UTRivpZ`UZrz0!f>`otwu%RkksIxH7q`V(<36tDW0cx~pO- zD*6hf`jWMCc7ECe)!4%P=2fU%D(2;8bz$d2fA-3J1&dwLm$3e<;vrnH^JZt716A0> ze5@AdNm8tzc55rM)AiA$OxLiO6+MOZ-I|AffY~v7(;CSB2IfPpE*_v5d)sPh_F@)7 zQ3%68=!BS-uYL|!7TsRU^+cT;4Fl0TB6~@4mp3CmV)ET+L9t_yIU8 z>~j#{F|{%{ndep*u6m6~u0c+-FCG@Kq{m zrf!_w!LM*$G`%RGGV_G58mO5Yr-=r~Mbpa*sPbR(@M5Vd!8%Li;hSh6R5rala+SNI zhZoBTfezn919N^()}D6>0yUGDDq%@5INQbKH=kp6W~}_d`zHJQ9oOd9-ha_!Yb3;jBH4Z{A{|5wN#RS*d=^KU%T z3}jg~z0RAwaaEKa>jcQbO|+1Ta?|TO$bV1)41lF+q9N0&>GiHHAg+$mWt~7deiID@ z&WXg*pAPBAyzBa=8~-{gv8@=as;1Zb)?BJEidpz@i>b{hkQV(W8~4NX9v8{Y|}EK|rC o$Qj5P$Qj5P$Qj5P_@^`Q2X43U_V<7{`~Uy|07*qoM6N<$f`$0Fpa1{> literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintMirrorIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintMirrorIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c13f50e3509764816ead4521f388d594b096f4c GIT binary patch literal 1460 zcmV;l1xxygP)Px)Zb?KzRCodHoI8w_MHI(bA2Apcj0O`-FmVegq>x4%F%e8qqYx1kgav%?kcYDJ z*2IJc3<(t4Km{c=))HE%wZ+6j5(_FD3$p%>3CX>8zjMENoO#@vndA%m&73)N&Tr0s z``!7oyJSggjX)#N2s8qXKqJryGy;vlFoA`Ig=dF*hVS~uhpo%pJyvE}r&SO4Sj_?W znI4;>!&Sls+S5?^riaY)jDOW*Q*^jWxDeULwcLTsJR9+pgIy7m>fi$FNk|-bq_G0K z&mC>En^gxF0=v0ZdXPBDhCJ?JpUt!?xImJ4PI+ekGWMT(&dFk46)2TE=kIxAa^CnV51Yd!*m1(+RjO7V z3$?VQLZ&%fsA+CS;nzCEsIQ zqBe{+`LJ+tw6mi70~Ch2kZA^&;6xWYqyW1?)yl`+TAOHWUt0%f2A9C(Hy*o$M>&}J z(K_%1{*F>0rb4C(T!NBEfjknr+D)qVx2}Q8`sA^2&@v_yxCAs#c)Va4aAIHIQYi8R z&ZI@dC75x-<1MN-myBZpL|)0vgv@BT1T)9AQpqf*grkJu-EH<8nNe`5TA8m2k9Vos zU%gW+KVg;-wp)Y|1(yIm;;KP-v|usl<1B>}Eo8>R)lQW}c)U3n?Sy?TLguE}n1kW6 zv+uHaO~PX=i_!VodGx5AdLIlIkJ{pYFjhi%RFe!G5Fv9z;N1VG1;J&}bR(A(;F^TJ5G4K%sa4p8KocIjY^SkrF9jy2 zX3ov2a&fvGk6$`_olZkJ=RNL|niE_c&U1AMk3MTngRPg4>G}ihZ^)dhjLz*s@yLIA zk=M@F8i7Wj5oiP&fkvPaXapL8MxYUB1R8-xpb=;U8i7Wj5oiRagus8q4(5~tL literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupCenterBackground@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupCenterBackground@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..54f036c022c9fa461932a3f1ecbfd0accaf665ac GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0y~yV0s5+&*ESPk_X@0vN13)@&)*Wxc(mnNFne}Gdc_y zKv5+@e!&cCsZ)2~`}AM8?;)etQRCwr{eM-@TfX)DYOeBz{oKSqC%up8bwANbpLy_p z#?v1Cci$Z+oJgCt=gu#2tGvxW1WP$WWASzJE8pEkUlc{7XW%sHRujK!a? zD$JOF+LpWfs!Bx63Hxc&RtIj_GiCo8lRdK2!aucN-I^t_X6>`-UwgBpa@IUwel|-c z=UMy7FjKy5YCqF<#GY+_o4D_m=8FS<`)=vJIFPsRhW3j?ag+Ww>Ag|6)Oc~ou_)p~ z=V2Mql1CcHS?5}u^K?}AD~h_%d6|dH%Fx5nJZORS3%*^=?~tj*XhJs1tY|7g>ZvJ| z5^$l@(U04zaMt7|zd28KED%0!sr}+eBp*;{#vJjIhc+i&9mVw~#fX(WG>Y%xwlX*u zZp|ut<7D{Zw^?#I{GZRJtd?Srp8RJ+WN-7?KPGzveVcn<{xK>KeCBs*@0MPx{mjo&UOwYlsLWT5<;%l)8LFyfD%;|% zcUS*@&CXSE>EN$__uie;KbZdUC-cDx`@A$HKKwos-B6I?8lR&oB&N@_XycB39yVg4 z>zRa{e=#|8GTP|Oyp-;(%KBm3Pv+Wb&6SKc>+2uS%;q;xuwCXa<;|Voq_*1sL>h~M zlKJZXS!X#D+~VY?iXWI@|Et5EDdLgX7f04`hTtyMT8EVy4Tk4t+{->Acwo+^d#iOC z97XrKyE1g&S#>Y4l+|G6w)NZJTxT&jwemG@sXN1Fsm)bqbDS9t&#LkbX1MJ3$ B)7k(4 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupLandscapeLeftBackground@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupLandscapeLeftBackground@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1efe4aaf28148a8b38818bafb2ee43c1080cbf0c GIT binary patch literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuFE&U}5rfaSW+oe0#(A%hPfZ*N^!* z(pOh>=H6bp$f!(ob9e3*NBP^^a%VsOnSDR$&CKuj{wCI6yH#7fDwvI(ef6DFTa;zJ z#V^nOVzAfs{)O{j_`e1|e`)`#OK$n>mljg4OM^o*b5>tsEYY;}u@5kP8NI8`Y}IFm z>C2s8hW%>zwX*Ju(p&%TD~S!SFTMPt(W`EH{PY%AQT821vd;cN_A7V(dKne9i;MYA z>2>b+w;ta#P~g`q|7ejd~00JvKk)*#7bh zgZN_Mm*SJ2J>!?UxRUXmL;hqF`+JL)ilsGZUy?O(xYV?x&XIkGcCGWJLoXKVK1*-t zzI618dyx7bukJIa8NwI+_I$O4`I*@P(-)$Xc0FvhMa z6gGHY5LWqmh~Jp+gVm&}%)=)i-@e&w+2}XJ=79N%>q~AY*X#~vdwEmhf$S8=Ush~C zI8!J5>t^g*EE2S^Ub9!`!QLrud<87Ni$sbVF0KT!4R+1Dbb?XO>3R^C<$;rPoolB! z@fldn__q+G!0ij`(h1Bx*A^_-Y?VpaA`$DW`Gi5e+@cpMYYCDKTjUOrz3T&(75W+o zH0p)MEC(QWv27*~NYS@Ng&>1(%~u22^Mb`onO)+pN9Gd-@#WJ&x=rRB14}RgC3f)q z^#Ex#2Dw+uWM0q-Mz`<5QkDlUg9N^TJfI6wrm}P*v&u=vQ;c4G0ek^P4Mh!S)!8-J zH7p%09bm#6em-G%%AkrYY&KtJfy@GA;RDYmGf!cjf-HQa24vnOWZ~KVFl%7K37=us zfNci}=hz|Jj>Ay_x(|Sk@>j@=QvX)eAU(-sEpM{K-Z$)%4)upr*&fjLDu=(%i}(xk}d z^~mX#(^0988?GYSOFT=D9d~U>ndDjY-m?5w+Plv+E%ImfKA-n_9;ae(iQxf_@EvEB z&HO{e|cmQ9`YQ0RWZ!?S6Zw_ZFiu{OGQ_MFGgad~|4 z`j4k9X4Na666^YCtFcdSQRriKJIyDYp6bC9`_b&Kbp1}d{!kYG(hZ){| z41IT$&w>hSuTkR>8T~UTTV0l>SXE4qeK- z>+rv=_P5l&oZMnrI7hdaLHkz9JEiq&+4d~+?pwEc@x1))YL>rSw@+i97obwU|I;y{ z2R(9vu}_b>?#t6vvfj&KvBKrcqpEn0#?M|Z--|gK=a+cAaCpEkDzr<$?5gGa|LgBJ zv3Z{5o^dUnY1!Ak4VtzKoexae$KiP3hntxFQ=N5*w^(}Cp1STmJ966g_L>bf)>l83 zcF+68TYLI)zxFw2mNQpZvN_AGO3CT#my%xer|Ld^gTr*_t}}Jd<0A;j^|4x}_lp zw%ijnSUZ<#*;d~JOCJ48JH#Rq;K1nXz{m=s$t1wqFMv%V)&y=A8>Ks+*&Z|Oo?0DO z-qF4L7NfDEncph*IUVdZ?zRc#9sL_GeU9bU4AituQ03jw+ZpuP_k!4^Mbon~f3Et{ z_C-Qd_ko9o(yf^~s`piHI~!g+*?j5a*-L_5-FDBsj+(p2Ync6-sV{i{VL;8E_(}4g zYQMESb5Rf0J#X%so)NdDcvjTuM^`15*_v2a?YuXs=5edeY~#8Ip;0-r6MOzW>ECvz z$Ck%%@5`6VBp0dwDZh9$ea=&@?G*+xE+%?g>ly`_0K$WCKSZ^2Z_}Hvm=A2 LtDnm{r-UW|uN$OB literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupPortraitBackground@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintPopupPortraitBackground@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..41cca8ef2f5e8df63723a5bcd6ddbb8360d43543 GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I1xP9$TfdBffjQsP#WAGf*4w*#vqRHm4t%`7 zcAMLVtzs?$=Dy2TIkzQ5cXjbqIo@FjmyUP1qa(|5obOhKM&`MS% z2wUOetZTL6hf~(Adp}BdWC#_qK{wuzz z#V}XM?AWB%hUQ&MG727U+PTQ9OY8HrYg2Zt^n7*q&Z2=b7Tdl~2!jD0`nx z*J#^Dt_r8lp1Et7>_U{1>s?vmUrks%??D5X5&Z(pb>IG^+tbbCSyB$^dIu1DZfIGohPd?-VWd2epDlAs>_W)!2T|I#FZG z#kXq0V)nTH+3PoUJjj4`fZU+KP9_DXrPTPq>5v!^zgRi`kx z+ox9U>Wig|++N8Y%i(!7F;nof+=gyL*Pw67XL|GIWlmaEbf({KS%~Kyp74H-#=Ru-+k=)|K+h)NnFh#t$mL;#AoDLKiK!;NyNd6+va`o*)N}5 zYVati@1y^0hV!n5NxF-38UI*y33dP6`Lt&H;)ucpM_;%7(}>cYYiOI4DWbn^d(New zwIasbKIU`(m}erXSYq<7Lq?{+a+aJtdw-pv|4Pyfv9 zeDB-%P2N|1PUJL`^eMAd?@XTco^k$5v*{m}ht!CgWq*5k`bieofyZ6CDlsSbw$zCK z@K}FKfAVwAA9)*MR#&y`o|X5mE`6zAFGqdGiSO*$CRuJ3tMu+0Xn)D%i&*uu@Uyhv z=Z#jLg8ZNV+w6<3S?y(YsC3SA*7ZA2OKw~C^J#RNeBLJgvy~#i9LV75>gTe~DWM4f Dr9Pwk literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintRedoIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintRedoIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..10be9f4ea8acda07ded39b5c773bd82d42a24e92 GIT binary patch literal 720 zcmV;>0x$iEP)Px%ib+I4RA>e5nXyk5K@i3{3QS1UP+0(lg`u=CF`?m=Lg0U}&|Ye-rLd-=r^P?Q zLK7`)3D8kMfff`-iFy1+cg=9`F5cbSz1t z6|f3e1#+sucs$+%cXHy~i7O(deF96J0_1YjADMsuoYReR;oX|25-R2uc-1;c4mXs9 z`r$std=C5@bM(q8`mgvNHV%~fg%tv|>l=e-scUG&Pphi2f8&1*ibes|MXhg8_x>|o z;x!zbU==(93t$e!XzvO7yeNvx7{MoEB5)SG07szjb}&IGh67bA;B(*VT)qSPyD@a# zh)I%laOslzP8N$@umzSu>&KRR{@3I?`UV8~%H0rE9*{&t{sO-Jz}Nxz%h$FY`+zll zf2%G8icI~%j9(2q*dy0UMV$wD+zi_ryklnuk+RYRC;0gsi~C|kh6g$e;g zM&Hz@B2-?}zNlFZ{+gDAP&cblU%ZnM>cnm^tL3AVxA^WQMKlB%M2T2^q{474tMOEa zVKEi1R6U2~H+1NX*fxI%N&auEgo( zUlLtsw9MJYRspMkRlq7>6|f3e1*`&A0joe}6}SfJ#01uFF^FOS0000Of|i+$nuhhWoBLW+@B}dr0Z@h z=2GFNuIHGQK3yVv%HsW< z_6pC>Tv2uVkuA1cA~d7>9RCF6R~D0ZJkLM%zjxg?UeBk%FktX>^>bP0l+XkKbx(R^ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintStickersIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintStickersIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d06e5f6b3cc8bcf74a5e702c53897154fa0ee6c3 GIT binary patch literal 1050 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintTextIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PaintTextIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..839068d0dc4bde0b7c9bcc2de88e5f90830e034b GIT binary patch literal 263 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.fsh new file mode 100755 index 0000000000..a3b4c6d24c --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.fsh @@ -0,0 +1,11 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; + +void main (void) +{ + gl_FragColor = texture2D(texture, varTexcoord.st, 0.0); + gl_FragColor.rgb *= gl_FragColor.a; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.vsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.vsh new file mode 100755 index 0000000000..bb6535aa6a --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Blit.vsh @@ -0,0 +1,13 @@ +precision highp float; + +uniform mat4 mvpMatrix; + +attribute vec4 inPosition; +attribute vec2 inTexcoord; +varying vec2 varTexcoord; + +void main (void) +{ + gl_Position = mvpMatrix * inPosition; + varTexcoord = inTexcoord; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithEraseMask.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithEraseMask.fsh new file mode 100755 index 0000000000..8af5d2bcb9 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithEraseMask.fsh @@ -0,0 +1,17 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; +uniform sampler2D mask; + +void main (void) +{ + vec4 dst = texture2D(texture, varTexcoord.st, 0.0); + float srcAlpha = 1.0 - texture2D(mask, varTexcoord.st, 0.0).a; + + float outAlpha = dst.a * srcAlpha; + + gl_FragColor.rgb = dst.rgb * outAlpha; + gl_FragColor.a = outAlpha; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMask.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMask.fsh new file mode 100755 index 0000000000..2db02d9a85 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMask.fsh @@ -0,0 +1,20 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; +uniform sampler2D mask; +uniform vec4 color; + +void main (void) +{ + vec4 dst = texture2D(texture, varTexcoord.st, 0.0); + float srcAlpha = color.a * texture2D(mask, varTexcoord.st, 0.0).a; + + float outAlpha = srcAlpha + dst.a * (1.0 - srcAlpha); + + gl_FragColor.rgb = (color.rgb * srcAlpha + dst.rgb * dst.a * (1.0 - srcAlpha)) / outAlpha; + gl_FragColor.a = outAlpha; + + gl_FragColor.rgb *= gl_FragColor.a; +} \ No newline at end of file diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMaskLight.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMaskLight.fsh new file mode 100644 index 0000000000..d44696d48b --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BlitWithMaskLight.fsh @@ -0,0 +1,26 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; +uniform sampler2D mask; +uniform vec4 color; + +void main (void) +{ + vec4 dst = texture2D(texture, varTexcoord.st, 0.0); + vec3 maskColor = texture2D(mask, varTexcoord.st, 0.0).rgb; + + float srcAlpha = clamp(0.78 * maskColor.r + maskColor.b + maskColor.g, 0.0, 1.0); + + vec3 borderColor = mix(color.rgb, vec3(1.0, 1.0, 1.0), 0.86); + vec3 finalColor = mix(color.rgb, borderColor, maskColor.g); + finalColor = mix(finalColor.rgb, vec3(1.0, 1.0, 1.0), maskColor.b); + + float outAlpha = srcAlpha + dst.a * (1.0 - srcAlpha); + + gl_FragColor.rgb = (finalColor * srcAlpha + dst.rgb * dst.a * (1.0 - srcAlpha)) / outAlpha; + gl_FragColor.a = outAlpha; + + gl_FragColor.rgb *= gl_FragColor.a; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.fsh new file mode 100755 index 0000000000..d6effd7b91 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.fsh @@ -0,0 +1,14 @@ +precision highp float; + +varying vec2 varTexcoord; +varying float varIntensity; + +uniform sampler2D texture; + +void main (void) +{ + float f = texture2D(texture, varTexcoord.st, 0.0).a; + float v = varIntensity * f; + + gl_FragColor = vec4(0, 0, 0, v); +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.vsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.vsh new file mode 100755 index 0000000000..b9b6fe4fb1 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_Brush.vsh @@ -0,0 +1,16 @@ +precision highp float; + +uniform mat4 mvpMatrix; + +attribute vec4 inPosition; +attribute vec2 inTexcoord; +attribute float alpha; +varying vec2 varTexcoord; +varying float varIntensity; + +void main (void) +{ + gl_Position = mvpMatrix * inPosition; + varTexcoord = inTexcoord; + varIntensity = alpha; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLight.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLight.fsh new file mode 100644 index 0000000000..9a94a278d0 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLight.fsh @@ -0,0 +1,12 @@ +precision highp float; + +varying vec2 varTexcoord; +varying float varIntensity; + +uniform sampler2D texture; + +void main (void) +{ + vec4 f = texture2D(texture, varTexcoord.st, 0.0); + gl_FragColor = vec4(f.r * varIntensity, f.g, f.b, 0.0); +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLightPreview.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLightPreview.fsh new file mode 100644 index 0000000000..506a4f975b --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_BrushLightPreview.fsh @@ -0,0 +1,21 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D mask; +uniform vec4 color; + +void main (void) +{ + vec3 maskColor = texture2D(mask, varTexcoord.st, 0.0).rgb; + float srcAlpha = color.a * clamp(maskColor.r + maskColor.b, 0.0, 1.0); + + vec3 borderColor = vec3(1.0, 1.0, 1.0); + //vec3 finalColor = mix(color.rgb, borderColor, maskColor.g); + vec3 finalColor = mix(color.rgb, vec3(1.0, 1.0, 1.0), maskColor.b); + + gl_FragColor.rgb = (finalColor * srcAlpha) / srcAlpha; + gl_FragColor.a = srcAlpha; + + gl_FragColor.rgb *= gl_FragColor.a; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithEraseMask.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithEraseMask.fsh new file mode 100755 index 0000000000..1d2e7f189b --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithEraseMask.fsh @@ -0,0 +1,13 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; +uniform sampler2D mask; + +void main (void) +{ + gl_FragColor = texture2D(texture, varTexcoord.st, 0.0); + float srcAlpha = 1.0 - texture2D(mask, varTexcoord.st, 0.0).a; + gl_FragColor.a *= srcAlpha; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMask.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMask.fsh new file mode 100755 index 0000000000..3f0b4d26ea --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMask.fsh @@ -0,0 +1,18 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; +uniform sampler2D mask; +uniform vec4 color; + +void main (void) +{ + vec4 dst = texture2D(texture, varTexcoord.st, 0.0); + float srcAlpha = color.a * texture2D(mask, varTexcoord.st, 0.0).a; + + float outAlpha = srcAlpha + dst.a * (1.0 - srcAlpha); + + gl_FragColor.rgb = (color.rgb * srcAlpha + dst.rgb * dst.a * (1.0 - srcAlpha)) / outAlpha; + gl_FragColor.a = outAlpha; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMaskLight.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMaskLight.fsh new file mode 100644 index 0000000000..aeee1dcf09 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_CompositeWithMaskLight.fsh @@ -0,0 +1,24 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; +uniform sampler2D mask; +uniform vec4 color; + +void main (void) +{ + vec4 dst = texture2D(texture, varTexcoord.st, 0.0); + vec3 maskColor = texture2D(mask, varTexcoord.st, 0.0).rgb; + + float srcAlpha = clamp(0.78 * maskColor.r + maskColor.b + maskColor.g, 0.0, 1.0); + + vec3 borderColor = mix(color.rgb, vec3(1.0, 1.0, 1.0), 0.86); + vec3 finalColor = mix(color.rgb, borderColor, maskColor.g); + finalColor = mix(finalColor.rgb, vec3(1.0, 1.0, 1.0), maskColor.b); + + float outAlpha = srcAlpha + dst.a * (1.0 - srcAlpha); + + gl_FragColor.rgb = (finalColor * srcAlpha + dst.rgb * dst.a * (1.0 - srcAlpha)) / outAlpha; + gl_FragColor.a = outAlpha; +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_NonPremultipliedBlit.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_NonPremultipliedBlit.fsh new file mode 100755 index 0000000000..fe2a39f049 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Paint_NonPremultipliedBlit.fsh @@ -0,0 +1,10 @@ +precision highp float; + +varying vec2 varTexcoord; + +uniform sampler2D texture; + +void main (void) +{ + gl_FragColor = texture2D(texture, varTexcoord.st, 0.0); +} \ No newline at end of file diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.fsh new file mode 100644 index 0000000000..acbf3fdbef --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.fsh @@ -0,0 +1,9 @@ +precision mediump float; + +varying mediump vec2 varTexcoord; +uniform sampler2D texture; + +void main() +{ + gl_FragColor = texture2D(texture, varTexcoord); +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.vsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.vsh new file mode 100644 index 0000000000..78e3bb95f6 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/Passthrough.vsh @@ -0,0 +1,10 @@ +attribute vec4 inPosition; +attribute mediump vec4 inTexcoord; +varying mediump vec2 varTexcoord; + +void main() +{ + gl_Position = inPosition; + varTexcoord = inTexcoord.xy; +} + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorAspectRatioIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorAspectRatioIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1944b5f66a5c576323c9feb85efd41009f407e0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw0wgDV75oXLDm`5sLn02pyVrWV)3Is{E+mF3@;a#E7MYigJ)a!U6bC-?;ZX{>SLlT(`)hm z@(TyPC+l11M}BAIJK&qo$pZ&};&<@;JoH1pIJ)gXW9X5PmzPBQbmKcZUhL%ksIp7( U&m(b8pd%POUHx3vIVCg!0IS?VBLDyZ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorAspectRatioIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorAspectRatioIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c5bd9b29043a3f90da9b13447a363b75c701d9 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S900wgCb?Cb~9)sZKywc&?6R Z%+ouxZc>rfCZJasJYD@<);T3K0RUZ~WDfuU literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..17b1e58928cd6f47232e05bb963f8580de83b7dd GIT binary patch literal 660 zcmV;F0&D$=P)7o!KE`c~XIQXmfnuMC#T!J8Kaf{|${0oB6p+OCE z@&`eRC^%@4B%x1(hnqs>eb3SBazEp}?}z7o?|aUdbF-|HN-8PFu;Hs=j~tbqHsS~z z8Mz9!ytL84F8W+X`V`x!(PE%S%gAO~mX(P%R%CA#Kf6_=$I8f-fi@o4g|lp+7Xm$A zM)nfv^VmzGJq+ypzu7>~2m0YfKJC1l=U#iWNT)uvUcX9Z&(Od0rm$^x^RQ>=UAJS| zI$yvyO}TnazJVomaqx3+;BM|_rvvajhHbPD9!1^sBd~um(eqVbgrBQA3a+*UUgRxa z_XG4tFU)@M!}XZja?(~@j<|JGU@{4w1XKA+8{l3Nd=G5osnmz}Q_P2dZit# zW{I&1+Dk9o2OpE+kKlgkg#j>=49|dp(hFT+E*YK!U8NV=z}IB>D`?9zx8SFmB(}y+ z$ThpddhAJpdm{FRSKwt5{1Uv%SLy?6@gqc)HPDx@R%;IoMZ-g2Pi@}f$@ya?Zh@(> z5_tyE5Dt1zqTnatz}FB{o&blsb2qykf{D1dbj>HQttD5l#WwilTI>R8wguMRDYjvKI?s`g|{K)En?UOua&u77xNP_t-nF|Gl!+JICQz`yfk?j<7X2^jha%uj%wU zEGSlVWET@RO#72fQyv@Ct=pi-rfi=2cG`{XBBS7g^YS72&He-L^VZH^$sKQVPUYNq uwSs5fcyHFM_uhD_5cfx?l1eJMko*RB4_G+K3Z-ZO0000Hlzfv77PGL>y$dB9*GD!M)=Dg-u)w{sU}Xjy zl8uz4q?AziB2kjh|6Q2Q`y4alnmOl~ck2DGXMWFb-j6fSdES>XD^{#nv0^1sf+|!+ zp7I^;B1#)oxC4L)(&oyMqm62!{GweQY0Bo;Mm6r?FZZU^Mvb7nid8|oCK8lm5o>a7 z)C$Tgh-Hj1#9~Fzt~I@~skH+un^qfjg7UJc?A2ZtwChZ-Y&vZpWkWqx|rGWk1>vAFhptV3qx9H-t~w{XS){wmU4^p(}??TTVGF+9(nF<)z@2 zz1mAczg?nJIS*HYvOQ#yUC_Qlo-XBh9I8?FqkV{YJ<_wJ$cCJ4oR*u6dhu^}fjO)ZL=bj=?t@I!{BF#$4&4fIt5}bq^4qjA#;Vp9Z4U*Jh z`#AOqxyq$;@x=Lks-Q9W%b`agcJUe)h?2+Ukee_?n{*1f8FS=uKR9fiX$;nRo$vCnVGirnD&5QL49mmZ z+Ij=Aj?vq=6V8TbJ#U(+LUd$=5>lyEJem3tW2A985xqPSX#*=%pq;kL&jrMHNZA9nXqe7 zwv(w!n;K*?`B&`FBHcj-zsahgGe$F`cnZWALmX+!X4GMwWD3-;T)Lmoohrc|vhZap zRn8=fok#7_$RiuiEp`1K9M~co=RDOXafF=2X=T)DLLE_mhbNML59m_D>>|V?BvCw-F*f1urelmT*s8DJRsUcBPu_kavna&`Zj0yqZ z1TI7eNpRsrV9W(a2t_*v~8=7 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear.png new file mode 100644 index 0000000000000000000000000000000000000000..12235381179eb0f283eb87ed9797076b55aed88d GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D98VX=kP61P*N!tb8}K+>oU=zn zP9U!$ptAKmQ;CPu&-Y#vpRDR%=OfhVw83rZgl+6EZZ5hjr_iwH)mfe+-xvr9P zIQW%$P2pb#pBs P+RNbS>gTe~DWM4fB*;OE literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f67c444953fb9903be091cf42c3128e798ab2f GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgZhN{ohEy=Vy``FTG(d#m;_A3B z{b$9P*WFE&+#a-U)~Y7$yYh1uCou_s)ll)A1Vl^bFS<~C#@6zk<+9~RA~JTU-8VfO zQU8C|-yI93lov2Rm^#lYDB$vEE(deB1BMLFOCAX{JT_#CV_cyuYRaIW%);=YaPEWG zo3{xkI4nBLE^%PKWP*bdGmpUm1_Y6w!e*gvmT-_!Z@u(}FSeV0KYbS@*R$RGX8jxC z_e!k0`)eQ7^)z%ze|tPF>twoWUPh9R2-~?zh2zZ6d8SN&xO3ZMUPd|2XYN|-_<-JI N@O1TaS?83{1OUyxYTp0= literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurLinear@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6279040ce9a04435623e10c0352cadd775e490 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ)^zFh+X1IEGX(zP+=xREANc?c(;0 z8+r3};y4PGftkwNW-M{#)N%FRAqnqbu zT#l)Z`kOM-Tm9zRld0y%cWzlzS2WK%`K(g1-rR8epL4u#n|9|sz4ZK*`t(bclCxM( zsa!Lk;K0PGGGX%!Fy-*`HH(mkLL*C&m@tR}v(boIJq}Ejs})i7>Az)#YWuBQY5Y6> z{OrB|tL*Z=-2dbHb@JaBt9iAb4%K~~EMA^go^v&2(^NzCo!|D<&3~!?jQ#HFpEDi4 z&NfP!`g4s@NO|Ow%4s`KO!s*n+qdb=XPqorShz4Sd=O^Zr`zC@u!A2Y=IQF^vd$@? F2>^KJrwIT6 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff.png new file mode 100644 index 0000000000000000000000000000000000000000..037d980c35336e6c3b4a7755cdf1b6ee617c1e60 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DNKY5XkP61P*LE^CC+ uEfHa8RIPAM?$_gOTbHhjh?eu2l(uP2^m4`Ie^Ee77(8A5T-G@yGywp?a4-G< literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc203196e4a65b6db64631ae51a8289ca350079 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcg&Uv~xhEy=Vy``RX#6X1YVSCD+ zMf(iwy>+*1?rd}WQtmNH#S@6^T@xS7NiVV~KIhPxyzuF~n(teV z@A_NK_qg$y1fwm(e4Z;Fj;RlX8~#Z!K4<8e*cHrhu3zv2r$cW@2!mapAj5$t?@bjt z8QCNf8gLN@E}3t7{&d|G_2bc+?SK9Dbc?+CX8p0Cr=g9V@A1U6lmESJE*#q!AhGjV mtBih(aZr*q*kzNJ=%3@^+4^J$>Z7(8A5T-G@yGywpJi)SnV literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurOff@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1de339b991ebd1c10eae21cd56e025824d0d6c82 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ)^zFnW8sIEGX(zP+=(P{vW9?V{am zqn=cuD~ImCDNqw?tdw+6X3Ns8i<%&J)lc|q97}L~@9laerHWxp3SjZSNF+sdERw_ol}G7ubw~W)YqzJ z2PRIH30R3*4jdBLb$m(tarN`rd*SDQ_r81PziNKY^DF;8JZ*jZN?m_lPWhdvlAwfh zj^}LG-%tO0wC=**U%X-~s!mMtJ$5r?)w@lnKCdaBq#t>1_nXwY&m*sv!a{<9;eh`- W4i@)Sm#uLLcZ&LJ=6%-T{ zLQDVcgarDWhsYhszBxaXYpE7*}i811ep947A*iwE)MiR-p$}yZ|_HwK_eZ{h6O= z{`M#8^7W9D@{pTtxc`tR^nmQEuW42ffD!3QVK}wHkd&Tb@M9Idg|vz^aLynl4@OJG z?9x8$dRy#zf;P&jrHcu%>m9va>*wl^OuB)+LLd6k=dLaL`fE#2P*BiM&^539VJM8A Rb2k70002ovPDHLkV1l_ypo;(i literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e689c5f6fdc42cc39c5417bb806113dbc0473bf7 GIT binary patch literal 875 zcmV-x1C;!UP)_?^$pNm|Z1=bUrSIp>^n&M}F3?4(6DTI^&VlO!)ZP9NFpo(iBRGh-eWbta0ARgyf}K@2m$zl28olb;xQQ!kFtW3B$|9#m;fx`7V0YNnJ!~u z8tb`=y2YYG1Yi+~qr57q@G3`1ERG(4&$)&Ai;4u4sj;2ITmTvzW;-=X5>VkU)Ga=b z8i1E*qW)r<7|Lwo62o0$BV{p6vj|OIjv3$|)KN-e_=Yo#?hN0Ep~O+tzcB--E4*e` zcd;2vAB%a1$C$)pyu%{;z-;0!QNn9n0f-%7oftNdIKjuaGgi(Y%A(0Gh|H6 z;0S7~T|dJ0m;rvVW0^~+4`p0@fVxCE)QA{hl^tuSUP*;sR4vqq7~p+7)=`Tk6&9oF zp+>|2PuuYT>K#diH&F-d>Y11UX4$cUdQ4KGf@*{s@%sT1lWwm@{Ab|N2|WYNP^07C z18+oq4`lEuw5T|rLaXdJ8`UGJ(2bfMY82?3_=8USCce%icD8MTzlFBN|1C85*XY9& z`!yPZuPR{9lQF z9+$i@iTQNVCL3+Kn9n3}&N=6tbIv*EoOAB~<3CID^F|%tHe~<+002ovPDHLkV1jvm BoiG3Z literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorBlurRadial@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6601bfdb3747e197f6cfc98b201184f47dffded GIT binary patch literal 1299 zcmV+u1?>8XP)|_<4wcegsqwes0 z*Rxi%2+y`1jXl$~_#I#RRb$ZI>8ko}enI=a&c8mt_sSb^8-BhgMEVHvJ$`QYf;g9P z4Cgq;W$u>eW=3(AQEql~>lwy*hF#i<$lz_(vA}iN;TsDFSt(`H7YUJ+$x>noc7G;wdyc zC{JoJ*n{S2&kMu~G~39C(E%HIiXD8$0Mkq}z-R2>DH_R)Iht)lv(nQ7aTybYc{1uZ zXW`>F;_(|k&WhpbNy1EUnU@86pD@0N?^n@5h}j6yK~vtraNMoA2mTB zpL)HVFeg|uC%bDn5qI6=^S(gS)T%4qr{q~OXUj{JL<7{=y5Y3f1=^urbrELmylk(H z+s%Sr7w92*&N)~J!FgMM6T#vf_5Oq27HEq67^~kQ>gR2}j-gmv*aWaWO&&xe0s7 zjU8GxqXnf{AVXRZwQ1;LXP7aIeU8wQ;z9Zv1J*$)n&#Ic>@Z~=v>^=(MNhA!kH|Bc zQn1wsAv9_qM(pNOuvy)pH>;-X=HbDZ#~pRa9e0>>9t1%ZW)7v~z$~Q0(F9F8lkP~# zk!zPxXVSVuP(^>zhxYxpAd=6pxEL#v4*RUK#l=R!8|d4u{{hUPaA5K97n17q{# zMuna?P#q^LaYIz-IoB4OKWU0U@GZqEdEpRtEcUaGCThtchgzCg$9^pA9MH)N6shbE z)AEDJp_}>AO^%8AK_A4+Fk{8M5~x13QyspSGipLGeQ50B-W-A#H zNt|u`K|KDTjkBVX@3t6{cyu!W7Yb$i+rh94^$XjyhiTT1$qhL8^`aw z@RAz^x;x_D9VKbKrNAP-CCpt(7+bje%fkJGE_Ygqg*#9s4wpIF(cb2=)7%aj+(m#N zu}B}|d`*D6Tsrpr*&ZAV000004Dz=g!~O~Y0000000000fGb$xpEP-8Nm>8^002ov JPDHLkV1mrSUt9nH literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption.png new file mode 100644 index 0000000000000000000000000000000000000000..112471166029138cae9d4b145f041dec1690c4c6 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!2%?MGxX$ul$@uFV@L&K@{jmF)@6o&jzopr02lEV^8f$< literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCaption@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed8cb0d450c214f5031183749015ce029cb7cf8 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gz!2%@DtF>PPQf8hmjv*C{$v^V{+;8>BIP;FAt2f_eIm4p5+D{Y3x!`LpuV Rm4Svac)I$ztaD0e0suZkC@la0 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCrop@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCrop@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ed7807f2aa21cd6a16a276b3c2df9b71d91af4 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw0wgDV75oXLIz3$+Ln02pytPEept4oS>9(&%V-7{?M_AD6!--_uG39hB2}Wh#D{)I&`QqP5puF@0kBS z%QvPyEPS({hk45%X35|OaRtXF=e2Htf)Bg}_W!s3`J~@lQtUsQ>F|j|+HZ5N25WCS nD=fCI<#bwO=w<)pd9%d5&R=-MEBas~&`}JYu6{1-oD!MIC~ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCrop@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCrop@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1490c67dcadb57986c6aa7f207499a1a71fb96b7 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S900wgCb?CbN!f zPek?VoML(X2U^@S^|YK8daO45m6)cfC-+de>Bu@`W8=-T7bnj=@nzzLndO#3yL4U% zaqd-%+LCc`k!!bD?8hIG52Ooz-;D27Y5R5jeDOsFkIEL7RU?f!gL`sUVOgrc;owBw_o&!dvE=1y(H~L)%S9V8PbcEM=^i0IkYcj>GZ39 z)#<+{&D{6cP6cMdUuLT(Uq4O||El~?C^0RqY;oL@g72T|b>n6LJ;~td>gTe~DWM4f D9AbJU literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCropCorners@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCropCorners@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a0ac370fc19dbdb01b8e1cdaa8f6d50a6bb1f5 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^V9W?)FuV`nX9lF0N`m}?85qhYpS1w;^gLZ0Ln;`P zfABMXQ+UMi@y-7kZ|r#j4%pAQu{cLgL->S48o!r$|E9uc`az#H8D{EzS$fg6Wdg`N MPgg&ebxsLQ01fjb;s5{u literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCurvesIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorCurvesIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..568807854e04472418ddff7a9975073647c573f0 GIT binary patch literal 589 zcmV-T0Vgrc-s4r;Au&v?A;vxn8we(SkB-`~aadP#YCd3hl*lf{%PUTot&KYfXCQVg~VR$3&onmGDfhi z3WwX+VP)V9_EMoxOaiM^1}YfAHYyC(WBrHuH=&O@k)vp5jI|mSnEtMjy6A zapO34MR8*-HbjAPfew;n)1qk*6e$8*u!jnPk65iDum|f@2()9}ioh}Kv_fDxHp)UxK_|9PVbF^m z(Gu+J1K1C>~UB85RQLs-2sa1gtraA?IoQKU%}Fn~2E9Of{Hozx_nvG0^B zBo1IHc54E4jA2I=8n>_%H#timY0sIh(3sB$GQFo-aiE-T{z-6=GR21#G|eU&Z{ZZAC1-+%-J6a!|)#|C}#hS^bbK?3f=4vgXK7c{apmw#2-QZ zH)#IRA6kULBIHmJ#6PCeA7dCN+Fz+z#KorP<})1McOPqa_r2X8em-CLJ|0pkl}e>j zsZ=Vpj4W@klaD#b5Nj1aHgcTbappP7a|#!2j8SE!GQA2D9ehtccj-}x_>xBESf|iX z;Asn-=)}y^t_C=axgx)K4fC@aViQh}eBvFpD1D`6oYP@Zu!FqW<;@=!Hmfta+G87NDa;8yD|As}k<}Vigk6}MiqOU#R&S9K zU1|m;T5(Ph@;t)yE5anLDXAGeq!m?iif{o_RD_+h=AoKFiPr2;gd*mGBIKyjijtZ^ z7bO;1y-7vbhJ1?;rLV*neldBvcTvZ3gBNLk5X z-fWj+updqK!LhD<;boOPMU$s+vYaP7;3i~5vzOc$$PeC(n0lDayx2+4@50X}^I$t1 zf}gQ)WqPP1dw2od8Ht5Q+<}Fx**;fb^@Xa1gTN}d(w8k<2IqPj!adGGIZJljBbckE zYT+O-2Of=Q2k(JjZ>hIO;rG3l6*~_ej3tDb&w}lB0ZMUH1NcI3`|ujL^f3j@TD$D1 zd+@DlmIS^x+8(?M4yx}+P2mHu+YUQZc?6oMnKpwb!bjyyt8BM3u<>Tz1P%fl;7oUG z@CvxrpBnCW4OUuVhuwn3x|ODI5Lg7ahSS5_;J40};7$)T&{s#%8;$JYCr7>% gZ_SDnDe^z(FGa(-&-m>YE&u=k07*qoM6N<$f=Pc7p#T5? literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMirrorIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMirrorIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..06abfe2818461c4836ef1a31a320f7b367e44e50 GIT binary patch literal 903 zcmV;219<$2P)pdbMeB!yUrg`^Q1NhLO#Mop!HB54wAG?kb_V)hLc9Fz?mod3>C>je<2>cqbPp#NEXW-4UEK1uEcp@^f@ZyMbC1|l_&aP#%!GAMnd}FiJl;D{e@ASWJlHv#oho;{i|^pZQe;~*E~kORIU*B3e$oBZ?;#ro0X9nT)k80PrEC93tJ=gCvIDiFGgJlW@UlAFn!JnF=A8pSBNyIB`G z58Hgx1Ed0@Qv|(@JU!?Evgs=~p3|uCp+2C4T#949;aB<*A&EXlY4qqx@;&6a7taS8 zn2efS!+Q+iv*nsB`WiLSq8IsAzwuNN8d!{y+(I^bmvvPh4YWi>&c_blCnYCA&)y~>YHP^KO|#h1TDy)tw?Zu#+)YH}TJ_~O$J zb0pA=VVa-ZpiV7%g)e=Ia;4~UobuBZmE<<^h7LN;l0q|vL9%+ADl)0dvFrS3l1Ara zS9$f0A@WMJy3CVAGlo{O!;lIxt;?5PXG)_P!!jTGrJ#Dp3}5aKY9m9}Dy-gxy8NTZ z+z@Et*&VieCw2KxJkf*>SG}W?EcDuQwmLM>siH3b?)?Q+DO$FA7wYmCKIW@L%T@0} zUGD2Y+ltXL)w@uaKZ^kkdRqVI zH<7CyEmOT?%vzW0MO&)(G0D1IH#%_jp83rY09@SHqC4FFnEJ3K{)j4e^c}X)$4pF2OiWBn dOiccR`~@9yWvw}X%mx4e002ovPDHLkV1lRZuJ`}| literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMute@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMute@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3012a49a606dc4e124ab93cd36faed76a33ac215 GIT binary patch literal 845 zcmV-T1G4;yP)Px&2T4RhRA>e5n9FMvK@i3>3L)SN1Tl#Zf}TVq2qLHu6g+tlZ-Rp2QLpO7gClqm z{{(XoJovaJ3L@eu2!fy}LN1~RMtoc}_{3<&UoSI5S=)AI$?j}Ns^O!*>iW9ptD4Qs zZhCrbSO=^F)&c8)b-+4c9k32q2do3u0qcOL16h`(p5^~*i6YN|EL0WgQ{XeW0oI4K zQRXn6g2o6LMBs`n#x&$$NFP-WvyD4hxDS~_a~jMR+I&7A+7m?%qp30-{OCH<=y!lu zYTtz@3i6r2XsXOMLZ4QzAzTIStNn+xuIn)dQ)RLYtD0j&FBmH~X4yCR=BoQUuER_! z%r((g46u1AcqR_H-OB!sX)*NIgGU%FslGUg;+1j@KH$l3V*OWnK$eYYO|3CTQeozw zRGUI5Uny^hhdr86ap1Vlw>1_QnitikI847%rdV4ob;KLQMZd!PWWKFjTxed@XNm*& zf{)_hOIk-x{;lrQ`B1zll&mwCB*{IlcU)ZaD1|K(v7>iHyiM>qX*7j8rxbggX)<@+ z%d8(dFY}z6`URhpMpbC;_OWoiPH;!xiFm;mIxC7v1b6g@h+BFX#dt@ziejb&cT_%! z<=s`X<}j*4dH5W_;+EXz4D*DtJSgIYStv#Bq=->b$W8CwhZlx zLr(zt74JRq8mS{*4t@eR-0xNSF_zNKb1uFgdFR6yu22bS1{kFnC+I(zDML8t;RV^(Ek;IO7pqzjk~_ z*0YA0jo^haSkkHv*sv1ZEjMP_418DB{k7>Z)eoKsqYYZc0K(niwc2~E%HFPMFuDRv zNW&o`=v;HIfZuWt{7h(H6gf=xf$_q4$P}8%LYL3(x98!|o~Uw|T?{UR;J-UbKXsaX z++rSzs*oyXFr9#lAuai};3R12_h#r!%UK7k1J(iSfOWt+U>&dySO=^F)&c84bRGBu XnDVWE;wme}00000NkvXXu0mjfI+=#M literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMuteActive@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorMuteActive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..61175da4aadf9ceb89e1cfb078b86d711fce9a8c GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^Rv^s51|%Qu_R;`SjKx9jP7LeL$-HD>U~=SS8fprOFkfkIh`yy*G5a-SB(I67M}yu&S8ffPt8V2W zcUbMN=F%)&KUNSjcKDmgewBulI%gnyhzhh5cT+D9w zj(gpsTTN|YqWlGC9F8QYAB$w}w9?*k>H31cFsYkd=ay+-T&nr2@$8&Z$4z&qXCyy5 zZKG`&waj_Ggatdhv3h-s@wr9zw>=&BZhd)OcJt#T2G>oM8_YWNRepISy^@kRkd_yD z`N#Himpw1rX$DLV=}8Y-u&(#G!)@s)nyWwguw7y8H0`|2@R!}J^Q;EH&}-2N>+VYI z-eQ^FE8u!wMdoO<-#x)cw-yLUe?9vm&Htm%sr^;`zdm?h7L~8j{uy}Gbe-~%(k~+4 zjiRGx{K)xnUv=-sdowenHojV2dGT^n;w!24q`gCqOw z?oDp&x?c}*<$eAuW|esV-=YSknTgSR&BQXh!@qXt7b)I$WpgyXZJEWB*FK>Csn`(|<1%^4}-_Z~7yfpDL=3fes=9 itS*cwRO1b<8s^Ir+4S0WX)ytl7lWs(pUXO@geCy^(i?RE literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorPaint@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorPaint@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..41f3d9765ded42071c18979f2b1de0ac7c634ca3 GIT binary patch literal 509 zcmVd{#Li%+c`Y)YcjoMFR?+*FGsSbWyLTI6Oq@7zetSr=N`)L=b zk3F+U``CgpYf>F~(4kiC2Gyy(Fo7q`tB(0IH<^ zD4P#iYfx_9=KVtLBtTAL|AM5m5+go9Z!ko5gZ`ztF`<1rH2I#s~ zHbCpJWN>NFq)7vpOeh^SOOi5g`13~D|I3M@4tq{m&I5Ed`b91abb&*fG!7S1DQg~` zj4X1AgjY*Yk_FG`!LCf32vid?wW|j=0B}0$4gd{3xCubIqn-w!sl}!Mcn;|d>cZ0i z+=U)GfO{?Y1c2?3&KdxRI_$b!^phQ(9v%Q#h#nndSMHnrknRQmPYgzj4pZe-zD_p` zbo3YHk(Q&McZL^%kC+H_M%nTH$LZGC-&r2L>);lb73Nvv*n6OBhO|!f2zz{&1Nx0- zn4%)zuFqUCXKaK%99D4IXNx7qO`JG!esA6Z##MV!>oS-500000NkvXXu0mjf69(Y+ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorPaint@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorPaint@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8c602ad190f63e945bf6c1d283947b978ff53f GIT binary patch literal 674 zcmV;T0$u%yP)4_qYx4Yu}i^NI`}8V&Gi3BX*Lm>SUPlW3e_d3gM(ASB@PBUR7f{L z2b0wbZbF(s6=UBH!aeuodF~7dy*v8-toIpST)xje2YI4MB9TZW5{cx0LWLe<`mA#) z6mpX!2h4{+-XNX#-m^1g|Jk`@zu8mdJ$`u4o+58Y5f4)A1Mg0fEIEoY?DYW18FoJi zauh`odunAI3VB;w>xD;#N_gaEc;pQspI34#{9SIzE(5 z+EcQP?J?QJ_MDu@4uG7)4uNc8`%E^lU6LtMqr-p^BL;M+QJjJ8j!c0zlgu7YXj8DV z9g?ezjE~res*&xGT;~*9PO0azo$j)o{Fhzz=`1Lu2IH6pWnyB=G&oKTNx>ge{%IYE3NUrQ$1(wd*8b#~}Q#rbS$EqFB^tSQbrOKU~7_T7^&@KJFd zS$Z#2Yu7!xuD$K<7+cr*?#&G?%xS#v@ZE1r6hg@|#&#yDP z-KW6{_qajK0#%-CCkDWgv(eDb=O#ayJxAR2Fn^j)&fp45JV!%GTRGhy3Boc{4B9VleKhf^I!@Eg482|tP07*qo IM6N<$f^GCZv;Y7A literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorQuality@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorQuality@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fff3a37e75d54d162da8575e5ea3d77481fc4d38 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw0wgDV75oXL!aZFaLn02py|Iz^fB_G)WB9z- z$yvP1OfIQ4+_|G)z-qlt)wBMT-%{hi<(v3pX0GA8v$#Os!qdp;RWwuc!2|;d9ySOy nuVwvQ{p;_RMYGRVseQ@#TF|+3WA_dZpcM?Bu6{1-oD!Mz@qLo)8Yy|t0|uz>)JquH`! zPu4|<>|SubGtprhQ|dG6&7wSZKVC#lR`I-achl1Jl%sA{+q6H;OApISvyZP#`}*wq z*2}>Q>su@43>Nwjol0K7xpggO%+Nhs!KE+Y6SQ;^XAxbTvb%^5`gO=z zbhxukbAJ&2zcH8Gha~s^CuhvTq0Nzz4iOi;@FdNiu>k-{G~tSO5QaJDo*$7xPbm20 zcQP`jj2Y4m#l}42&mA-R&BHAo`8yvh=rv8BIv(|$C2QWc$6lETE-pHZxY-U|(`vq) zGIu#K;MNYU8mIjYgqY&{uEVv=2gm58r6(ptIHv6!E9^4s8QBoqcfByuVPNaJFHcv+ zHIs)&RU?&$JGPs3<>@s5LwR@!z}SCMLQcuPDalEkbIt*n`r(|q$(?g%)fdbUm$l*Y zFu2w~l>aJH08)84A|)jfhXYQbu)+!}tgylgE3EMUfCK!{?*<3h!t4eI*tBUh8cn15 Y0$9iMCs!;bH~;_u07*qoM6N<$g4ETi=Kufz literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotateIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotateIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..937885fcaa4a2b7dadd6e65bc91849873e6d5b8c GIT binary patch literal 539 zcmV+$0_6RPP)a-<^f6f)jjzYao@mV!x|c=_Z1*Y(nTIPU&;m$R%t2qj9Eq_DyT9v%mB$lE;flZg!QGG}=B zkwD(!j;Z7wyhMk05QJuf8|Ea>F?VIubEGvs+rn|sPRFL`XzVKme1g@&oc>0n$j>e zDPt|;w0N27?XtP5eI9+oM1_Z`v0XG*1cR;V>#uEX2H{F#`VjDe$6_kDC*4!Y-~kK~}c!Fea{qg7lcq>~9Q)y&bH@I|`uILQ=EHN1gOkzLIa?UGI0 zEYXvU(2+i_g>ojwu|+)p}TR7Mx)Va dG#btS%QxTKT#kgUnc)Bc002ovPDHLkV1lIQ4ln=! literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationNeedle@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationNeedle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c59b218a2c7856fbe739cd4aa986ef46b03af5f8 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy}!2%>d-ZYyHr0P9g978G?TQ9gX9&!+22s~xT zrIeJrW`e871;>wqDFXaQ7#no3ow>;~iG}+y7SYvVl8 kiCect7OP~=Hl5AAn7yIJ{73a!pi>w;UHx3vIVCg!0H$h4CjbBd literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheel@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheel@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..218551f7f46d7486d374542307f83f5e77cb5310 GIT binary patch literal 8809 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheelRight@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorRotationWheelRight@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9853411408ebbec6552b51bf108cd4fe2127527c GIT binary patch literal 9078 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 XG6O0*s^sUdzk0Wfw90SZefoa@!G4A` literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer0@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer0@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..064c43d18a147501638592b94e01910a134b49bc GIT binary patch literal 1121 zcmV-n1fKheP)Px(8%ab#RA>e5n!j!oF%ZUc5lRIu3Q(MM6%T;OHAocckSLI#;2l!(2&rfST`1E~ zg(4C!aG?QSfGSc75-J)fAb^hF7j~4%%DJ<>zRQN}NT1gBdS<@ydcFR$3k#ieEzq?< z*8&q-U_2hLgP&lUsLuKXQ$=p|iddOogdo0g`|5-${?_+iuXoKCluj>}HW;w?lCq;f zdA&$=RJW6^1-cf9Z-JQ(S`1jSzXBeB0l4WfCVdDFD(rE63*Iwu>E6W=0$l~0;1HyW zbfml5`iLPp1S3#NWNTP5@FHCrQtGbH!J_~J2KbHd-`Wlwt;+jna`8P zquyEHjbD>rN(q+w10hjo2_5+|5r^5n(>M@OKR~I~Q-fVb=cvMRM$rCAi%U|&rTAOG z_%<-ndzIXc(YbF1lujZ*W%&gDo!(Bh5mg^2LtvtjGi!iCuTj7vE8oD6-bE)T#|?sm zU0|{m)k=X%7-$@@%wk8MKNC%A$_Z9AP?=~#ko}!Sw^YD=Y>A6W)Bv^^*(^_7y-lWg z`!0Vj$%@0KbN<++^OH1R5BOEj-F$1uU9rd$76*7~>S`j6Q>U>pPgv_&`+R62@KMfM zA|K!(P7-kx*NGAnuomwoJ8fE=S6s9bGx1!l?9??T;DOT^xpZ5SeuVa1gZyFw)_T=M zYuUDm*4QSVtCgL){tp5BhtLIl>hY4fQZESP{SM;PVLzZ>FZx8muc}b#rs6qyu0gvo z0c+T|^B(Ot>8vPQ7+JsYy}T_0N@p87QS^IY_K7;VTT8{f!%6Q*&3-UTpnF2_W_qE2 zZ#~zbrPP46yVy4IoQeeOpM#07|x$uQkYO#@5y z#lzJ3YR$yVvT!TEcwlhRQ19ofPiGcEx?#_y+&rI_EVcoV9#dEYPJNKP0T8wpD8={) zm}~{A%(Vz2ev4;R+&K>X;FZ0JSArN^X1|FiqBv^2P1`hJILv38whFlMMtqZi309{M z^V^88g4O`m=%^(p=qlLx9<>-zoL`>9G#B*cIWBcU>q-0Wtx literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer0@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTimer0@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9010b48edd41552b6aa15e074ed5f46448569285 GIT binary patch literal 1818 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..87138622f8c671e300385103341fb787be330bf2 GIT binary patch literal 712 zcmV;(0yq7MP)7|nUi2j(d~ z?7;M~S|h?39$@a0Eq@fziK)?uF_lhCwfu1e^MD+Mz%EQHx$;9EuQ8Phg(R(*D*0g* zrb(f35K}Kd)MNH3H0EPo$PX7W%M=<}yv2-@51KJ0@<1b|R6gj%B;|ny%rg0)8#75B zIEPs!AGBj;%L9)vi{*nGm`Zt|3o}hVIF31}(3pYgAWJ@2hiO)59Kf8GAM)wJEL12Y zc#f%(FHT{ukfjjVgn34`d{Ig-W{XCQ65eC#ln(Y_I+>{vA<1>jUGkI;a=C|TXRiK= ziQL3|pj7Fij1J5@Dl{x+(L%~rMS(KfFg>i%A2FNPn2&5!RG3aP<};NV5{0y3-cYV6 zF`0*$CXyNg$1ty$rKnLrJEmH{p@2TjQpJJom?s1T1Ox;G1Ox5b`Oen55!EfN>gx0OJ%N0*uoj1Q@6I za1yguKOv7hm=%f-8!-LUlC7^OpaIj(1jUCO8c1p65ZgGxOHwu~UX0=rzv`z(@gu=* udKl0`h5i-BQbjE%s9^yKWn^UhPhS93QdV7&vuulpk literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..133880fe7c1b5d8483f84a08cededbddeb2b10da GIT binary patch literal 977 zcmV;?11|iDP)F^HENX3H5hGk?%%tM_@3WcXU%hVe$P42#q)Yei9{liNW>pi zG_i`Od6^e^o`+aKwc?5tt9X}gvW;?*o!p~%;a>LB$F-cNjg;bmJNSg$g{-4Yr9>TX zGfKWrvqYuB0=md{m5?L6M?3rYl<)YRY*%?grNBCdn5>WeJV>SfgBD)mIO9yVn+g>d z?M&9idQzGOEqu;oUsI*x;T1Cd#b#zH2Q1?RnLegW#lfRwI!V29Mv8aH^qPu+PM*EXFXk@{O~YW%7oFm@fH8C+1ao!wZqT-w-g;}>B01H zi)M^~0ZcD-iV_=ferAqlgeHE)c}h{^3!D?wDQ~pWhw~+6iW)c3jdOv!lo!@9jB|lG zDh3wOkJC@9a>f=i_0pnZVL5|1L#$R#c$Q3;nXh7^m0p|?R_dB~gbAE;G^^NX2je1jQbw*D7&3}ZSeS1HlJ70f0A0s;a80s;a8 z0s;a8Hem*st5RbZ`Prq?<394ULZwHFVRAP{rQ(2Ya@VVP;44BxLPA19LPA19LPA19 zLPA19LPA20Dv?Me(n!;kNK<@}rYVu8_#jPFB2DpuQ?4wOlcxCK5~f{QXvbVqd~gt_ zgBqn#LkG@5#RrQS$LV4RYq^vAd7UntaTY61*v7SOQ{1qf>1|gWv4KIRHpm9W74tYm zwnNNQywSjV_V6v2`Hc_R$n8ob5{X12k@(j?r$3Fo6e;Ik00000NkvXXu0mjfgVMaR literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintTool@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTintTool@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb64ec8327a70e56591eda6cbd6d1c73f7f10f16 GIT binary patch literal 418 zcmV;T0bTxyP)dRqj&3+cU-%WIwz*!dJ?IR7%m8J;6f$87nJ|S+m_jB@Arq#M2~)_1v6%-FY*XJEVjf7an7o7V z1i)p;8kYb(4Uba&nw%NTa}&0lK0T zG)i3gA;r9qVg|^7DP+I|qDj+&2~^`VpQ&ZX1gdflz&X{tn2Zr^y0x>8nLsmqquV!T zvSB*w*kQ1pT(eQ3I%)MBm_Q-0MB37StuuinK9ctFzZSJX5_hEC{gF~kA&nK%R{kt0 zrjW!OKN;*Nb0PdKc9{HQI#g&dS_9ZmTGl^jEU?A{53I2eH0S@oUrdidu;8G<`2YX_ M07*qoM6N<$f_Po7Jpcdz literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTools@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoEditorTools@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c814f6114a98bb3617242213ae8ea0f34e60ba85 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw0wgDV75oXL$~;{hLn02po#x1OK!NALpFek+ zZNE;5Rp*(b5S&(|zc9cnNNA$3LhuRWBaBCQ3>msawcpi>9_&>&{Oj`hZ@{Zg$0Uu_ zd2d3s!~R5n-123nXtmo0!8H*dPbHnR`gZT4&!Gn|&fIo<^l#7KoaFUU8sK7->C3L;iO1k}Zg{x*=3|9LhWC8{y z;V(2UPP^<{!<=Wodx2)umE`mt{}+CruaNwP$@ZP|exrRaZylYbx6LL43|>giEt)pH zC~H=soi6uj^*Pm>zv#ENfxti2s@yBpdvd?1F21*Q;ji8ouh;44xxL@BFGKQv$;%|) t@Mt-RjbAdibocMRaP?@rif8{@UfJ4NQQ|Xig#-P>;OXk;vd$@?2>=LFYrg;h literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerArrow@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerArrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..11824c738ac17643d6ed60e12140c7de53e5a801 GIT binary patch literal 230 zcmVmf2Ve!pV3dx)1b7s_7D-Y|FO1NX_$faSX9I{r1vE!3G5ZmIJGg zxNTvqE;I5w$=c{s=n{Q#f{AXzG$U#q1Xmyb^Dm+ z#{w)5UPTKt@WtG4cV8!v8#{5&|2g(QjV$+Ayz2aVdx!+h!O$;a7GBr5^ PUCQ9;>gTe~DWM4fzSK~O literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerBackIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerBackIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..483a034b640048e05694c131b0e8fe14be68f3ee GIT binary patch literal 863 zcmV-l1EBngP)~&5U?T8k|K(gq*Xr-cey6eAK&lYrQf?PkoV=u-TOYzbN5Dw(2E6f6lu_=L!Ti- z`gCa1ph%7dG0jDc3^n$+YVA=YL(DyZMat|GX6;jE(H(##HaQtfe@v4S1yUqQ5GPK8 zBq<7%XmULE%@a0RvIj6ng;SmMfGTO?mqx@%Q{_O%oKj)V2EsaBootsZGl3&#$g-hU0^K9vkSq>Vs z!jTH9xaoFcR8+_Zz!(6WH=Me)n+ zz%f$j%V#MhOJ)rr+)#%J@GNjtR3uK?i_jh|rh(RS01|-%U+_mk81U3m#uBou1w(+K4a#$UGd(e- z`H3b47%qMON(~B0hC99t<$jS@aj#9vyBLTCK^7oFU+|ty1aAIm4+Pi%l zduMBOKe{lwK3INjS9c@4{5ZJ=-n703Ms^|I^zUiFi$@Yqo{PMAIP>HQ(UZqiFP@c! z@Zy182rotrYB!=Dx~STSdi97Sf07#>Inn)5SNfWJf z(8o9nWUiRO9r}rd0ivDlq91U`D#NsuD5Z^IRyiyxX`6Pt5bBxXtU&DvOZ1dubBNQ! z5+?-`&zPa!7Kk*t0)_V&BpFa{l0ohjNY0VAVOFOL6lF=9TF1mllP%CNZPXOgQlR3# z4XZ*o_Y3~27E{9S@JJJ#XM!3_3%7;|{?W8O;*JTy13b~huG4JU7B;i4X?(&!P?1AC zQv{we8j^1skVaZp607#hWBzR=ifxV{jArsms#`qQpYiEQ&`5&FaCRM@J4?3GTkuIjDg01{JC`QEZw{ zf|6%Nl)k{1KH6p~pv0uYGl(Zu8jquJc!u^2Lf_5TE)${A_OLDVA^Y{KbZR zF>DmXCq59rm`uVLmU1`Fr^l{S@f1y-j6MSR65*uP&{J>&e+?i7f zj+_~B=LC-%=cyby-6n+Ztl?^}oxM#$IMQi$F(Z24Ur1d9j2P_uyVxVu--RiJ5WE?3Pi)>oPwa&sss0Y-3(sEt z{o*octoH7G8OB%tT?#ToyzFL+m22K?u~MO%E#x{b{hpCV>WEWEW5n(mQLIXJ-}<6J z>158(9XxXtx`RhC#npZzl4f(N`+lkdIQng2Ir5y5CujGzu>S$MOq>cb45u>y0000< KMNUMnLSTX}#-}&{ literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerCancelIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerCancelIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dec7b64a1a42c14a98fd0a3f02f869330cd64015 GIT binary patch literal 806 zcmV+>1KIqEP)8u`2M7kVvIK|71XuI(afA@$g8JAy1tq13ow2{N|DD@c^!9 z^J9#@(V>X9cZNri4sT}84{ffFfly&;jJ;6i!g}TfWnRqODV1;lE_pCUo+*T~QQ+Cw zc;GU)BaZas8MUJhw8l(Z8U=DxawZa z1>uW&q)b!iOT)+=_62ni@7zXCc(=UkLrL$Ch>_lf$RTJLU)n|eBgF(|T~0Kp{|2l- zHEDM|X&U@>(aLUup6Z}XoD@Vt2kdkQnQMfz<9We?H)cC`oUBe$H95nerc>K?hNY)+ zgq&&UoYLE72c;JZX9H2tdSlHPv;Y{&8HY~vt+l@@mMotYL|L<^ibYCVH64^J+%aLY zU!YK7!h|~u*`w4~Nj-J}=vbgvJGSKB_lK|HI>j2PI4@$%rtwH$0Fc9oO6x9Vm zU1gMl_N+AL(jUeKgr$w9#M8<=B~$?zSh~}_9}NFr_E`G|Kvie}(6sjIor{HmAVL#> zhR_e1y#Fp34uVPSebF)|A1KDR77YtQguIeC!We)|K&n|UykZp&f(RJ^#=;zcWMIZy z!w3mMgd_lSVF6$hpgUl!41`s12qJg@EF1yh#Bn&`m`;SK6J+HCZO56w2EPf+g;ef@ zsBuN!IU#giko@NI^Ah9b$B}DbY!~83_euj!6iFN@7dcTlbEJgmNHNukva*O11$Gf9 zS`B(P;%>TV--x^Yq$4HnMx3FqbxU#>xFtC}x+Q7IJnrVK$*{f9ZR%bGZR!n2jkjUH k5$*AQy08T%@{c(F1KUwybpS@b5C8xG07*qoM6N<$f(w3Y9RL6T literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerCancelIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerCancelIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..512bcad69537b7619ccd6ec91d9df0a06ec75842 GIT binary patch literal 1300 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerDoneIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerDoneIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f35657722495f7f48fc64f4e75ee426c3ba8c310 GIT binary patch literal 1568 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerSendIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PhotoPickerSendIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bd23c60ed92a6eb3ae3a82c8384574d0de0cae82 GIT binary patch literal 5098 zcmVPx|q)9|URCodHoqMcoXH~$zIgfkVAdyHE5qt!#qCym`@j=?!AcCa@C9y$5m82R2 zH$p&?YHUOjG&RzqmP@0ANQ0@+DmCE`4gNu5EgFNB1bieVp=uwtO>2P`dhhA&asBq5 z-<&ny*?VTroS8Z2-s?(c*80}_TWinWGkf;l-=G|2_~V_;@^rZUcH(^y8iR5=UfVG`8PW#>-(5D!U4ici%{$7k43Hg37#yjr+Tvdo zg}*XNdSR6I8=CTxB$-lhAk!_UeRnqM)v`g;x<{i)pNR(D8qN90QEHCq=d@Q#-@0>t zd8GViY{$PCg@0aCe2Z;%7Izxo%%|z;w{6aS@j1J>JiGi(xpMF|T^t5Bt<}fAY3Hig znfzLO3SJxySnJ)|$;{%`S!RBwC+THbwpoiTHp=H>=XZU1^WY;{ZB;bstQJn}{CYIu znrOna_5{ww$ux?N#e0mCPS#gXJF)zXm2H&AqA9;ujt{QO;$_o>Uq0;Y49bb}o@l^Z ziCY=s33>)v|hwRu@lSwX7b`W6x*zSov&xQm%+&%6*1fByPW>FVZ8vPVBs= zJX!uT8u5~tLfZ%mB3PW7=h(*Ou{1uQ-MwX>>MX;as3&7S%{#cTDARV`RDT7_%XV`uftB=smzaW+Id-QIe#;DfOhM( zu(^1Bv>7ND!=Hs-r9B7ut@5haZQW_ugW$#NrcUgtsad*;pjslx%mDbMHT z#+_T@ApQC<-aSZLyzG%EH9zyD#n~3Ri=TPY;={0KhUb-!#t+3e)Zu3xlm2{gCH-y?^Z+;@OJQqCEwGQL6!G0}fu@z^fj}P9Lr#OkWe3Nuq8NVa=8ppQ>tt?tyT*rNS zeSEVxTkO~4jNEzU;#q%(SQg9BjrnDLe|c#1gHA1r#yHc;#eK5O&$M>pK3V2xT03!{ zEb}w1ow!ey`I*)Zyb(VPzomTBEWgxeJ7zo(r#Mbmr@jf~CqtTqgiNF7Sd8AeV9yUj z>Nf*SZw4pD^0_7pNKq}UI2YaESqAT1w5NWYJe>lTs#}fI;GCsA9e?4YX|XLRR$csA zdFPV-MpSXDeEX!+?~^|n{2!4ULGf&aZFDR~N04W8;AdVQ%hxu`rr4jip8U>X-@RtKDPR2MQZD({ z)VBk=o558aIIJP_q-~JB7Awy_GEaIA z`=9x)Qf_}uDO(&X5-`5~wWT0G%K68!ixTV5SMYWHT{>J8tK-*Q z<$<&AJoZlw>x};)j8BV8F1^x^00uEQMwvHsGD0S+Ue=WsXI&j+9(qal>KB)C^H0ZR z=i?b`xd)?%{?#uE(GkdhG#BTz9amIR?*!vhJ5}B}GGYQ22M5x5Vmit^gTd40fc9_x zfl@vge`Brb+qhFO`X7wHd9WYll5^EQ^Ng{;{F|CuiyVt2%QDmUvuGN8bN9_^qL6YZuE74{F^xQ+7IjBHiMfP z>x6U+29%58XPwN4&ax@?YoYrm@fGxVd~@o9FMg?%i(`xbLf{7Q-vz_CU-;k9kA`5^ z2gl=P1>zEaG(YK#ap3&K$g@u7?{ogKS86uFwPt_CU8Oj#L7vW$XI>u5&pzZ$u;;AC zpT4S;Uy2`feQ-C0{b(uou%&08eFj7RJv1=vu7P`2gqY-fn%JWgBuS)8``h3`kH8~*)~cGq<86G?9T z#2O=0{Cnfr!7&6seL#Hj7@cNG_Ki(X{s*1^$i6*pT*PjQo8H@k8MLdYIYH^haQFsq zANH{sl#g9r%Ija4os83;d$^RJh(bQV!P=P98iBmZAA9`ZuMfzBd^Y)rRQAnyTKs*^ zzax)m22UO^I2ze0V`N>4)O>V-8SIZmBR>AxQeJmKYtr?8*Mp^88vFc*o*eo_sV`=B z&=dcmxWoI>+e*Q2ACS+-uZT0k#Nh?hG5c!KYR@$PPQTFyJ{dd$Vmvt7289+fPugU2 z^5`qqHu2v5>oQBf6xA9Da7f6Cchs0G2iIuU#!#p+D9MSD?&Bwb1vV2V0i@Jr~Qt8Onitx z^w+df{h(0UH@V4EF4j(*`SQTE zeO#H#ZfX<#22^H%GA}@5=*(lBVMhC#J5FVM@}5#&eS0ZSJT-JUPyC$A6#FNl;lv|u z4NZPi?8i119n3iYMm_7c_M01lc}&o5r$~ZvR+bm+Fw=@hkgvnz8q^ zxempBj*$!MfVC4VLpOM*PRIGDzmM0Q8V6Qq2K$k2G9Quqv5#C%KHcU)J|iG+peO%P zeD%EzKgW#LIXDNCp94rM0|W98%f8K`eYaTVm2;C;rk(u5%6}MtEp}2*kGgGgBn8yT zP2xKt?Znt9TeLkfx?oZq^pV$jnWJ)Xt=GptsD1Q-Pe$y)19DKtwR6W}ZNR``*te0p z-|IXbi_KZx_GCxoKOYbb`VOuTA)@~gpIRp)Qq7H{)S z>g3o~Z9*9{v2nxkkGi_(NoTw)d;Hdr#JeB)&uc(tBmv37kp z>t)|HU;C^Buhw%cMh6>V9{XJH@H5^FR#e%Hg*-AC+`wY^%EWa-_{lQHi?qjI4aSr2 z*tlZ&%EYV8pE_47*o-%W32elQDkNuOIeFwc@vM{itFkAb8tR;mYW~!@g1yaPX&aua z2jq!Ji*xa_Zeuun%evCyMcLq2#oLE{-#vTxb05bF;&;wz*8EvIr~@<~7x6r#KPX>{OBJ5k2++zC z?4tFcM|I#Y!T!0=DCOVYRLZl?GjLoi9apV?-_3D9M{dZH;x|$Ayi8--{5N9BptqH; z?^?sD`;)<9PpmQIsdWpRgV(glpv%joYP~*R`?Ti<7%pD^beuPMJg!&=Gk$;_>yvFLucU)uTHC9i);~Fck zv3l|y*I0Rt)sxS7tNcqmwEm@vYTW(FP>aQ$xPt@0DK8*nw{&rYt1Dn^DIptC(5F3H=JuAMSi6?)_^QwX(3;qK}7; z4NymXF4?nK*4qXb<|%j4lRp_+u<90zJppdj%4#0PmRC1IzB;YuxKCx+o(=Z=rl5W^ zz--OnWEQJ#ah5S}+0ec$9N2=2m5~rU$J%Dz*<{Zu0n{y>45S2oFk3UQX8E(N=1Fb4 zSCUXTU+7p|i!D|LhKC-Yt$JsZefu@`olV`^*-m|*y&1S-VUDeGLlkqjA@J+sI<~mz z!*kr9Q(-- z!&fFglkKU)vE~yI4^5g6_IJ#vW3WKrdDSt*f@X}J1s5aFI++ihWk=nfMo@=2c1=u8 zumq0h!ynjrM=W~s`|(AtZLY=CTRn!~#p~1W((U3MhCN^R`IfnlRmV)T#!P83z-ncu zV%6jAcuuR33)V%~JnZ;H2(?_9d@=gafI85%T$y~ax?pwWIj(i#Z^jS0V~bn$m=KGD z|6dRMK($)orApv73T~yFK6#3 z09|#&efHcSv=;YA9E;2HpB-0&&-lMXcDG16PiK*S=kvwW@_9%*&j#m_)I15T^GWSq9(W=8Iz+jbBQaDNF;2^z#vDIT&G(g%aSJ1`F(xFd>x$5ASNlXH6eKN4{uLPvd}bpQYW M07*qoM6N<$f*+lThX4Qo literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/PreviewSheetShadow@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/PreviewSheetShadow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..41b973711e5c6d1eb611b3e13bb673d8300372cb GIT binary patch literal 1610 zcmbW2|3A|S9LGP~m|1p1tqm7a#GI_t;^f;JGV^72vqUkYXtp$$FPFL|U)C3kk*?68 zS+g-&HS)Og$d{2QDTeBV$5L*)%KD;wnLGC{-0Sgrzn(w6-oL)iQ6lyt;MQ;e01%{* zKUPSbIfM(aZoy5BP9et+gO?I0~ zhX(IL-oUR}_LI6!c&F@2DurX)zUqRs?c6W=%bS~90T+d(=H|0z`@|g`jHHxa$%S^i zBuMIjvkKIj?hJ|(Y8K9Yrg)3FZRO0Hjtd@t`EN_bo{$<;vO0OcAwkX%oZ1(g36`8` zyMF4ibvQh=z^4`##>TPZ;m+0b(mC-i%)y3KbP^UzR!(Qlk(#TjV z2_*ioRfL{k#2n&WyA)C4!~Yqll=o!WqNo96rx+>6KgYbTFCy99z#1j`ix$$3M8Rj+5jIYsBD7!K^TI zJ6N*D(q_LvH1)n7ikG;6PHqHo;zz76(|yzIl_XRAjm3fZn;*Vca`W8yYC5&uMGW<| z%hIVcgzWa%bYx0T_xXc_N95D=)Y|c$V0+`QRldueS5ZZIK=tr5%K^jtrSpW1B2V4; zYL4gG>gkc3Fiw$#;W%-xwM^eg+k%=C8Pc{rX+?IiT3C*#7NS}JmIm~oH+7wf&K@jA z)wfV_E2F1pP5S%@ru{5~RkXOrsUk!-FP2hOW+qv#^7^@EwESp3o6sa{j9{M31BykuP=vBD9Xg$lozFo zcg$V)f44{dnNJ}uKonUlV{DCo(eqhJmJgi`P`J_sO3e;`yx*4?uEOhcW<%03FO4pS zqn)X&q-qEp>eIBw@WMqMmDKR#r`kRev!a)Yn5JDh9r|TDNGZ{g*h>}Ew=!?)qgxqRdZzyRcFI_{R7g?EhG=fCqP{K4 zMITl^O#{X)QnxKz@@RK~kZ3~#m44RqB9FSu!85m39xaqkrf?FHrlU8wK<2i zufnel?dA9hpHr}Z?)y?z;huT#;LJ7k_3l$@Av}95JIbB)kA8FstsSX3j|A}@4BfAd$!f>B!3$pOf zZ@!loKMMZEq@3KD9Y2KiO~SyKvwe$yN6oCJxOuRhT6E)fJzJ&b2V<5?4annlaG2?^ zF&ZZAW;5+oU2N^NDsTwQr5j^>o zSpGVV*!->5watN${G0IRpGyw6F?)40ko^uHS-uBwn_MO%?IV#1?vvzV4HXJG(s4Xp zVrFE}o()h%o4gIN!sNkBcfNmg^da~GGLZf7Xh>&x`Zzj{>4e@Vp90EiCMPUBguE}` zKb#!Ai@dMPeHpidcW2AtTe~bE^H#Uo<1jTO8{V~ZSMF=y1;7A+mpA+<;e>TfNa4&T zzDH$o;O0*ofl5$Vb;)}|eVtK|!-^BH5=?7C&WAQB3WCT+ZAMk(13m@w5GBYw7(kem vRso01%=JKruq+sa`gJE?&#A7_6MAPrFv4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`GuBNuFf>#!Gt)CP zF*P$Y)KM@pFf`IP03tJ8LlY}gGbUo-h6WQb!1OB;3-k^33_xCjDfIQluQWFouDZA+C>7yetOgf{R2HP_ z2c;J0mlh=hBQ8xDWL1Hcb5UwyNq$jCetr%t6azByOY(~|@(UE4gUu8)d=ry1^FRWc zU>&}`R-SpqC5d^-sh%#jN-xZPrm(>$o& z6x?nx!Kqgt=oo!a)FMSSObD2MKumbT1#;j?KQ#}S-iv?NF{?!~PSoLrbx3j`-ka(OR!u$4Pgk;7?a$0Mf> zo;3$N)Kn!5IHFhrC$PBsc1bLLnmlLWF`2L5YzveGkMBHZTl_xs*Wq;Y?{ohDER=ul z)3q$K@Bi2JLArBx^L&4JTR6WwD_7 z!&}d{#$W8M=1|{#F@;@8te)4`NJLrmh{7*}@(WCwj>cINmsPyckb9_i@0O*&$EJ1D z9OoFm6#ca9?&?_MBHZ^X<6Niqk2M+ZzVGNbhff=7vyd(q|$ z$3EWo9Ti0vyYj8BS!(H7>^$!MmG{+zI)>&On#|%K^o~WjvK_tsUH)-|Glze{H-Q!b nZ_8r>({8h@KXc%tdjlgw*DbYQ@hQ>kK_#oFtDnm{r-UW|z~voD literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardGifIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardGifIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..382c35e0335b2625cac33a8ebc30ea1b6fbb2cd6 GIT binary patch literal 1264 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 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..95cc50e35f68bfa767bb5a95434a6353b4d081a1 GIT binary patch literal 698 zcmV;r0!96aP)Abrw>6yANs z6w61#{rTRy$H>g~rh12b+I0fE~1fR?yo1y|Zg?AN=;w zyi+f*edzw3jXoRD5X%0*CxeFen`id3HTreKj-XfC*b_8?8iH@bJf6t=6&lrb3omFh zFVGxn23)6Uo-ef40!mK_yQK{rpiYHrcAx{Td27&>121XeEz~-}x~+Hq(2L5SSz2%n zB`1885@=0(7*&>yDM4)oSQUCpiL776b9+zEY)ja1Zc2pP`#`U(G$intvT;Z7%1d6k zlE^4~kAszqR6)%}znhZRjp#L}itH)`@QjLzrX%1c6(=(pm<|FH-A@N5ze)MPAs_Lm zHf}fsZcy#rRm_T#(T1;k05;D}$+J+5_9dgCW8h)QbFZ{zj-~T#<`_6Dou`jb`(I3Y zS~Adqh2+{(3xwSn0Pm!N#yX0eu-pPu;+m=%dQ}nd4=4%byP`}j0j~oBf2QNz_Ylx@ zY%Dz8(uqOp(Aq66BrONfl(eqHzm}Xq>#rrb@X(=!!Xpb`S~`NJ((_!{M>Tqc`!whu*}~+q8P9ZCaO&cs=AseEifBKc>;5 zi%a-i%FpxdC43NP=w*!~4@)SGLoIP^$eu9i2wiq literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardRecentTab@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..045a394615bb1094e389f078110a86586251192a GIT binary patch literal 1082 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S903?%u>HW~n_GXXv!uK)l4Z|$2oJP_yn-%o-5 zaw!S&3ufTd3y9CDWYo#q@ZjHn!@lRNiI=k0z-2GWj=$rYoJq!#?H$7b(Ln;{G%xLXg zvGHf4KmYA*D>v;a%YU?wqx#6KC#OCwXkWME;8bn7_2=a|*qH0)Uw8iB8(<;Sd-SOK z#|RT4zKc)qs7!KlG%9o!pXim|GR?;-Rd3GO&dpCgwLNNG^kY%Tx{&OzRcoU(rymhN z%4E6xqKN#KTXXaJ?Ov8zzrD76<4uM3FZS<~3}i0KyB+@ceC?N$f|FlXFF5;bNupgf z|B07JJXQ2tj^6N2|4=u_Ceiv-u=l|=e;!PqP_H^8_0+SO_osGeH?8S@f9u=1xdJ|^ zE@l#;ER#1pbv&4}Ev5Udn}KlCm$f%eOwRojHs^pu&XYC9lbP2PKM!~pVHt6A67x1u zZGFeP8g=%^9{U?aO9qPntf*d-C+`&{-t~+hT{lCuSohDPCvX^rmwiSQny<}(3 z{nuULUxi+-T9?DNWMNrniEo|2g{hCNCe>A_=$7ieXuGtAcZsjwlaGuU*?KHH1T&b; ze>r?e%;mG2f9L_LX7g6d)IHyXWwRf u?J_ODc@eiA)ckYSNJ?ffxE<7xU}bPGEK9ByPDlV|8U{~SKbLh*2~7ZtP7A~U literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardSettingsIcon@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardSettingsIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dc89b9ff65b0853b23098b9179450d2e204c4e GIT binary patch literal 1152 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$6c6wTaRqWGO4S?&F^=Fgws zHgR@q|IEHst3ZbI&Hn%YKadMDvv20ARjZ~>UDe({y920wB3KY;3&>cYAv4=1fY=>< zK&$5fEdq*kOax0!nB5O{4A8)iNpr!*&IH;8WPo&m5ztH^w|&Cwwh2HJ=70o&=1iE? zK5-7%g)`eHfVF@OpVbO9b|O#&Wzr%J0U0EpMCYv^52?V7GD-HFfi@* zba4!+V0=5Rb<$%ufwtRc?jO>5KWo~|nUZHD>i$3Xu+d6Q^_;pqv1i^KSZDTa6T?m0+8eE&hMW1>7g@4c zh@54V`CGW=i@UDu;ZD2x^XAT& ze$A)367Iz{J6X3sdL;Hvum56Cb@p4iO@BWa6B*4PS&CC8ulu__XWqw_kE4JJS^&z51&$GxFu* z#VyPJDAt}y>tOpeUF)1!{AjjgLXnrlJ@i}(7qFAi*NI{?=1Yj` zce=99$^0!EwQWD^`db#vA%=?o*5n=Bx$WM9%xdW}|M`cnt?KyrC^zHAJ+(bM_00B_ z-ThXdUibDQXZnG-1=j?9x3j(9$5^~H>+|=JsSDN~zMJWMbGBCT#4WRUohQyX{kb~7 zQc8Mp&$1`iC7w;Isjt0VSNk#Zq++asxdS7rZ& g_8X1rAK!l-USFCWY$5Cu4a_eLp00i_>zopr0Pw&&*#H0l literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardSettingsIcon@3x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/StickerKeyboardSettingsIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..54b04299e54072494572f46b87b62c5f938c1e07 GIT binary patch literal 1807 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 Q20tN5upya$E>2STFGr$$RR910 literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.fsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.fsh new file mode 100644 index 0000000000..6fc0dbdf41 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.fsh @@ -0,0 +1,32 @@ +precision mediump float; + +varying mediump vec2 varTexcoord; +uniform sampler2D texture; +uniform sampler2D previousTexture; +uniform mediump float opacity; +uniform mediump float aspectRatio; +uniform mediump float noMirror; + +void main() +{ + vec2 texcoord = vec2(1.0 - varTexcoord.x * noMirror + clamp(noMirror, -1.0, 0.0), varTexcoord.y); + vec2 prevTexcoord = vec2(texcoord.x, 1.0 - texcoord.y); + + vec4 white = vec4(1.0, 1.0, 1.0, 1.0); + vec4 color = texture2D(texture, texcoord); + vec4 previousColor = texture2D(previousTexture, prevTexcoord); + + color.rgb = mix(color.rgb, previousColor.rgb, opacity); + + vec2 c = vec2((varTexcoord.x * 2.0 - 1.0) * aspectRatio, varTexcoord.y * 2.0 - 1.0) * 0.996; + vec2 c1 = c - 0.005; + vec2 c2 = c + 0.005; + vec2 c3 = vec2(c1.x, c2.y); + vec2 c4 = vec2(c2.x, c1.y); + float s1 = floor(dot(c1, c1)); + float s2 = floor(dot(c2, c2)); + float s3 = floor(dot(c3, c3)); + float s4 = floor(dot(c4, c4)); + + gl_FragColor = mix(color, white, (s1 + s2 + s3 + s4) * 0.25); +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.vsh b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.vsh new file mode 100644 index 0000000000..78e3bb95f6 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoMessage.vsh @@ -0,0 +1,10 @@ +attribute vec4 inPosition; +attribute mediump vec4 inTexcoord; +varying mediump vec2 varTexcoord; + +void main() +{ + gl_Position = inPosition; + varTexcoord = inTexcoord.xy; +} + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoScrubberLeftArrow@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoScrubberLeftArrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c5299dce463bd6877da3d51c7ae0112212cf117f GIT binary patch literal 301 zcmV+|0n+}7P)2$~ zzbnLX9LMq3_oT~NY|4*}7m3Y|g)*>Ry5TlmSq&sI-lAL?`~eoqLI&$)yRs`M6Uxs; z>71uQ?_QsKJfs9Y)cD|;HFaa1f4@w~$haj`Wz1tMGENCE{1rP>MQMlrfFfl%h#^qE|*0Tb41v7vVxFjtOmsWz1n)GBR3( zJ2DyD*sP2ZI)u7XToO){Vv(?_Zj`y_@S00000NkvXXu0mjf?W29P literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoScrubberRightArrow@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VideoScrubberRightArrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..86d32b4f801fe3ac4048fb767ab1b5088eba1767 GIT binary patch literal 302 zcmV+}0nz@6P)Nkl2$~ zzbnLX9LMq3_oT~NY|4*}7m3Y|g)*>Ry5TlmSq&sI-lAL?`~eoqLI&$)yRs`M6Uxs; z>71uQ?_QsKJS4HkGauCGQHlwE`M0hVRl+Tqj1_ENMxGbKsZ#6{z8RD;j%_MMgU}); zql_)c=;MuWrW6N+HbXKdu^pwjCOnXnQNfmE6nH0`E5#w4hG}-@cZ~y=R07*qoM6N<$f;Xvn Ak^lez literal 0 HcmV?d00001 diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayer.html b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayer.html new file mode 100755 index 0000000000..5175d13427 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayer.html @@ -0,0 +1,95 @@ + + + + + + +
+ +
+ + + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayerInject.js b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayerInject.js new file mode 100644 index 0000000000..8b1cd8bc28 --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VimeoPlayerInject.js @@ -0,0 +1,52 @@ +function fixPlayer() { + var controls = document.getElementsByClassName('controls')[0]; + controls.style.display = 'none'; + + var sidedock = document.getElementsByClassName('sidedock')[0]; + sidedock.style.display = 'none'; + + var video = document.getElementsByTagName('video')[0]; + video.setAttribute('webkit-playsinline', ''); + video.setAttribute('playsinline', ''); + video.webkitEnterFullscreen = undefined; +} + +function switchToPIP() { + var video = document.getElementsByTagName('video')[0]; + video.webkitSetPresentationMode('picture-in-picture'); +} + +function eventFire(el, etype){ + if (el.fireEvent) { + el.fireEvent('on' + etype); + } else { + var evObj = document.createEvent('Events'); + evObj.initEvent(etype, true, false); + el.dispatchEvent(evObj); + } +} + +function initialPlay() { + var playButton = document.getElementsByClassName('play')[0]; + eventFire(playButton, 'click'); +} + +function receiveMessage(evt) { + if ((typeof evt.data) != 'string') + return; + + try { + var obj = JSON.parse(evt.data); + if (!obj.event || obj.event != 'inject') + return; + + if (obj.cmd == 'fixPlayer') + fixPlayer(); + else if (obj.cmd == 'initialPlay') + initialPlay(); + else if (obj.cmd == 'switchToPIP') + switchToPIP(); + } catch (ex) { } +} + +window.addEventListener('message', receiveMessage, false); diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayer.html b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayer.html new file mode 100755 index 0000000000..2fba84115c --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayer.html @@ -0,0 +1,51 @@ + + + + + + +
+ +
+ + + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayerInject.js b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayerInject.js new file mode 100644 index 0000000000..cc57644e2a --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VinePlayerInject.js @@ -0,0 +1,80 @@ +function hidePlayButton() { + var css = 'video::-webkit-media-controls { display: none !important }', + head = document.head || document.getElementsByTagName('head')[0], + style = document.createElement('style'); + + style.type = 'text/css'; + if (style.styleSheet){ + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } + + head.appendChild(style); +} + +var video; + +function fixPlayer() { + var controls = document.getElementsByClassName('VolumeControl')[0]; + controls.style.display = 'none'; + + video.setAttribute('webkit-playsinline', ''); + video.setAttribute('playsinline', ''); + video.webkitEnterFullscreen = undefined; + + hidePlayButton(); +} + +function play() { + video.play(); +} + +function pause() { + video.pause(); +} + +function showWatermark() { + var logo = document.getElementsByClassName('vine-logo')[0]; + logo.style.display = 'block'; +} + +function hideWatermark() { + var logo = document.getElementsByClassName('vine-logo')[0]; + logo.style.display = 'none'; +} + +function receiveMessage(evt) { + if ((typeof evt.data) != 'string') + return; + + try { + var obj = JSON.parse(evt.data); + if (!obj.event || obj.event != 'inject') + return; + + if (obj.cmd == 'play') + play(); + else if (obj.cmd == 'pause') + pause(); + else if (obj.cmd == 'showWatermark') + showWatermark(); + else if (obj.cmd == 'hideWatermark') + hideWatermark(); + } catch (ex) { } +} + +window.addEventListener('message', receiveMessage, false); + +var video = document.getElementsByTagName('video')[0]; + +fixPlayer(); +hidePlayButton(); + +video.addEventListener("playing", onPlaybackStart, false); + +window.parent.postMessage(JSON.stringify({ "event": "src", "data": video.src }), '*'); + +function onPlaybackStart() { + window.parent.postMessage('playbackStarted', '*'); +} diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/VineWatermark@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/VineWatermark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3457c7df072ddc8c55fb6efcf160dcd9eb1156e7 GIT binary patch literal 1238 zcmV;{1S$K8P)W6ls# z&&N|?H2k3uFAN_HKMwkrw=q0}QlLhHFhV$j@L#}!*Nvsn5Q&f&iIW73IQ$hQVZfX4 zI>`tlAdjc4Wh7JU1)|4k=VDb%fscoJYJ9g-UYUY5iJSw zJ})y7f+RNE{x+v#*(e+YG_~5YS@g4y`&e}ZwO1q2nKm~p9e27w?;zSNcsjs6UCGCE zMF0+}uV>t`<^1L((NPYx*~BtW(-DEcH8{9e0Q+FW=$)==SUT?Yf)h1nGqWc2?~&*I zPmdPU#q_iOrB7gA%{&r<{jgbLWlVC|g@2AMoG3}sEDxj3eg>xMMK;fh3;48`gXz{0 zV#wHYZDcFi`dz2^?W+kC!vcf1H%^NSuC)Tl^e;V=rV3FQB3nobM)UG1$s~iTY=Vnv zSO4-AfA@+jZuJ0yW?rf=q<|w5c>a(${dfSx2(lxYE1pPOgS|A{V#HV&bO&oBcDq}g zUK#Zh0eE{L4ompeBOhs8@H2;I*t3ksdq~Z2kN*DSbZ%xpdgx zD5f_jQQ`AoZ^$kN9y7Dpv^l=qZsk4S`kOX!zLdMZ2hawLBuUP;-|hV2L$uc~7S0MP z|Ji57GONa6bww%n{a(z!B;pfbFRL*E7z66BK1VFuV(@w_SF=*CFm!PTz?%TBV`K+q zi!qkJ+AjX+ZB7!yi>HdqX~N(yMjsB|>Y3}le*o)ZK&XrSsQS`~_>%{Rt;jHKju72> z<4N%!wMv1z7;AR^nfDCMQKK3f<5&W-$VkeOakB#*=;Jo?3zeiE4%P}LT*JiU0mXr0 zG+TEcX}-~0n-nf-QqE8BvTU$jm>|v1J{MQ5oLSATj4d8r*snTIxQSn$bl5EFjB9?} zBV$PmL^JD#G-o$du{@UZzwNVbK+}E6)vV(-iAnvNN9}enwb!!B1)1c^`I)`4A0T$v ze4t{hW2H6}8`Wm0bUNl#5U}y-U2->cWheJSl^)sDP_Y^B3s%=EMC7#Rq7o*UgwA?!)SCgN23o_Ku2czfZBbW1c z`+riBV*XGqGB`Tnn;l9On<`CJaH*!Y+BL}GERj%NXb_}u(9X4bMR1}un#R{!mp`kR1)YmxH`3m&@H_*!O*8lhO4!h + + + + + +
+
+
+ + + + diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubePlayerInject.js b/LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubePlayerInject.js new file mode 100644 index 0000000000..2985148f4a --- /dev/null +++ b/LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubePlayerInject.js @@ -0,0 +1,47 @@ +function fixChrome() { + var watermark = document.getElementsByClassName('ytp-watermark')[0]; + watermark.style.display = 'none'; + + var button = document.getElementsByClassName('ytp-large-play-button')[0]; + button.style.display = 'none'; + button.style.opacity = '0'; + + var video = document.getElementsByTagName('video')[0]; + video.setAttribute('webkit-playsinline', ''); + video.setAttribute('playsinline', ''); + video.webkitEnterFullscreen = undefined; +} + +function initial() { + var css = 'video::-webkit-media-controls { display:none !important; }', + head = document.head || document.getElementsByTagName('head')[0], + style = document.createElement('style'); + + style.type = 'text/css'; + if (style.styleSheet){ + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } + + head.appendChild(style); +} + +function switchToPIP() { + var video = document.getElementsByTagName('video')[0]; + video.webkitSetPresentationMode('picture-in-picture'); +} + +function receiveMessage(evt) { + try { + var obj = JSON.parse(evt.data); + if (obj.cmd == 'fixChrome') + fixChrome(); + else if (obj.cmd == 'initial') + initial(); + else if (obj.cmd == 'switchToPIP') + switchToPIP(); + } catch (ex) { } +} + +window.addEventListener('message', receiveMessage, false); diff --git a/LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubeWatermark@2x.png b/LegacyComponents/Resources/LegacyComponentsResources.bundle/YoutubeWatermark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..63ac73179592e67a724f9a29d818289d0fe82948 GIT binary patch literal 2781 zcmV<33L^E1P)v~3y}iB2$jHFJz{A7C!otGJ%F52p&ezx1 z;o;%z?ChVPpM8COc6N4YX=&!>=H=z(<>lq=?d|sV_WAkw_V)Jo_xJbr_xk$!`~3X> z|Ns5{{rdX)@9*#G>gwm`=i=hx`1ts)uC6dJFyG(b2L}iA^z<7W8`jp=n3$Nfw6y#C z`^w77@$vCtVPWv_@UXD3Z*On4wYAmN)#T*l_V)I;xVX>H&q+y1MpAGmnV2>J0032V zQchC<0RjUC2@DYx7a1KNAtNOwD>gbnK1o(zWovJ4a)OVXpQf*|vT9L3Kf%-BxK7n}G4>?e2jUvndRQpzOf$6<%@O|9i}2lETc1m}z%ry8AsZNY;K{m-5w4CBMbt zrv`=khzRXB=ifr_PnUuMiuV22_FL&A)WaHMx@A4R9APj8P~}u7Eyft?PIJzQ80kaz zP4E4)bXn#WCV} zxdW8|7>47Lbnb{+`SEwtw2m}0>ZzAb{7jp3LXUdDSWd;jg{*bgDr)AQ-87;&o1wHx zh!I?_bO^1$g^bAzwcD`PdR)-kYsY|=g^gfL<^X&VA{VnZF90d{L*oVX(~7oCxk!3z z*?Xtw^VZgg0$a@xxR4mr04O#+{WzGTA8zVH;BDFEA||yKoCZHuDUezN z)_i_vTfo11Hz*e}GQV&H;G6Uj&G|#e(@o%~NiMc#j17*cp>n|duC>8PvT1}OW<=5D?2#y%T z+ANTKB}Rhyql+h zPF{cHa;n5{I{z|7=7qsp>um{Od;cDr-JIS3WF!%~WOnP@)o)ifwybb!!3Yk}xI8_k z;2uia0?L*eyZFIDJ7W{gP&8Y9btZPpK3=(76y>A$>cgE`rmp;79Ma8!|)`@paPms1dS2$4;3yQ0y`gy#c95) z_jjB0b99C9@MZ?ivp(p!%^^pfc+teb1(-Z~JDSA{HOrZF>kE5>+{6#nPpESGdUBB2S1B;7AZ7qRcjcJqUW5R;mt8Q}qFG z*GWhcpb98T&wDrMQ9a-Sv&jSc>;o~V3P#Z9jG*%efL&J=F-lwHX=#j2046rxyZVd* z**io!Z1Uda<84kYDueAUgX+tn_0fIdytj6f%wG*5h!}w#YY89h**N=sP-9F^o5aZA zv=}d~15}raX%CS7R|pyb`qaG^!t#CwXkG>d{8u3;jTGQ$B+*%VbSW~}ycOfia<#=@-Qhf0tk(YT zK~Y)zb`F@BrlxhbdAM@7kkoyb_R{nzX?T4(6He)VGy2H&eL7@R=}`^BdBzGI2MJcH zO1P9RixoP=IdP4@K`U<)`Qj2lF?l<)RjX)~CO2g|DyyI38(`}Yk8oE(5^6&z>W zsKCTg4iHwdxA^#n8%GmgjRMb{aP6B>;BapClKm`_{4%Aq6|+~(7k+Ws%)}!{S8Gcn zLQkF>0XVD_K+;s)oi8L-mDjRVkThFNKaZsk#ozu5Kn%^$$gg|OWJdt0(xye29^X;a z16YGp3P_^Fa$;}cSUDBv4`k0wmP*gahpmNfW2NvlE_ifd$7a_V+GcfYAv zhN8y4Qc|<{?A$1~Kd^}jJNbQ(UCpG9glR#jCUX|eLp??!4=eRI`&0Lzdf zn>QwHNlnByX77~&z%Z<;SSsx9m{0>5+ur@~Ug2pIhL@z)E;N(N2gVqy0?HplKs9Qd zX{Gsc>3!v?Ee-3Okvkun*#j{~I*^3vJtk2&8l7ULLDw|=!Wf4W`%LXpX-90orZ?Zd zud%9>8q>g7W5oanf&hyj+-4aBg!jH@YnCp77w#!2EV874LZl;x5F)39+Su;iqWgth juzCehR3CrE$T|NHQ2n1`xj8#|00000NkvXXu0mjf+}KN@ literal 0 HcmV?d00001 diff --git a/LegacyComponents/TGActivityIndicatorView.h b/LegacyComponents/TGActivityIndicatorView.h deleted file mode 100644 index c66f8b2072..0000000000 --- a/LegacyComponents/TGActivityIndicatorView.h +++ /dev/null @@ -1,14 +0,0 @@ -#import - -typedef enum { - TGActivityIndicatorViewStyleSmall = 0, - TGActivityIndicatorViewStyleLarge = 1, - TGActivityIndicatorViewStyleSmallWhite = 2 -} TGActivityIndicatorViewStyle; - -@interface TGActivityIndicatorView : UIImageView - -- (id)init; -- (id)initWithStyle:(TGActivityIndicatorViewStyle)style; - -@end diff --git a/LegacyComponents/TGActivityIndicatorView.m b/LegacyComponents/TGActivityIndicatorView.m deleted file mode 100644 index caf564c72b..0000000000 --- a/LegacyComponents/TGActivityIndicatorView.m +++ /dev/null @@ -1,90 +0,0 @@ -#import "TGActivityIndicatorView.h" - -@implementation TGActivityIndicatorView - -+ (NSArray *)animationFrames -{ - static NSArray *array = nil; - if (array == nil) - { - NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; - for (int i = 1; i <= 24; i++) - { - UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"grayProgress%d.png", i]]; - if (image != nil) - [mutableArray addObject:image]; - } - array = [[NSArray alloc] initWithArray:mutableArray]; - } - return array; -} - -+ (NSArray *)largeAnimationFrames -{ - static NSArray *array = nil; - if (array == nil) - { - NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; - for (int i = 0; i <= 24; i++) - { - UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"navbar_big_progress_%d.png", i]]; - if (image != nil) - [mutableArray addObject:image]; - } - array = [[NSArray alloc] initWithArray:mutableArray]; - } - return array; -} - -+ (NSArray *)smallWhiteAnimationFrames -{ - static NSArray *array = nil; - if (array == nil) - { - NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; - - for (int i = 1; i <= 24; i++) - { - UIImage *image = [UIImage imageNamed:[[NSString alloc] initWithFormat:@"RProgress%d.png", i]]; - if (image != nil) - [mutableArray addObject:image]; - } - array = [[NSArray alloc] initWithArray:mutableArray]; - } - return array; -} - -- (id)initWithStyle:(TGActivityIndicatorViewStyle)style -{ - NSArray *frames = style == TGActivityIndicatorViewStyleSmall ? [TGActivityIndicatorView animationFrames] : (style == TGActivityIndicatorViewStyleLarge ?[TGActivityIndicatorView largeAnimationFrames] : [TGActivityIndicatorView smallWhiteAnimationFrames]); - self = [super initWithImage:[frames objectAtIndex:0]]; - if (self) - { - [self setAnimationImages:frames]; - } - return self; -} - -- (id)init -{ - NSArray *frames = [TGActivityIndicatorView animationFrames]; - self = [super initWithImage:[frames objectAtIndex:0]]; - if (self) - { - [self setAnimationImages:frames]; - } - return self; -} - -- (id)initWithFrame:(CGRect)__unused frame -{ - NSArray *frames = [TGActivityIndicatorView animationFrames]; - self = [super initWithImage:[frames objectAtIndex:0]]; - if (self) - { - [self setAnimationImages:frames]; - } - return self; -} - -@end diff --git a/LegacyComponents/TGAttachmentCameraView.m b/LegacyComponents/TGAttachmentCameraView.m index 705df21317..e83a613253 100644 --- a/LegacyComponents/TGAttachmentCameraView.m +++ b/LegacyComponents/TGAttachmentCameraView.m @@ -47,7 +47,7 @@ [_wrapperView addSubview:_previewView]; [camera attachPreviewView:_previewView]; - _iconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"AttachmentMenuInteractiveCameraIcon"]]; + _iconView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"AttachmentMenuInteractiveCameraIcon")]; [self addSubview:_iconView]; [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]]; diff --git a/LegacyComponents/TGAttachmentCarouselItemView.h b/LegacyComponents/TGAttachmentCarouselItemView.h index 3dab09bd3d..af2c79d01c 100644 --- a/LegacyComponents/TGAttachmentCarouselItemView.h +++ b/LegacyComponents/TGAttachmentCarouselItemView.h @@ -1,13 +1,13 @@ +#import #import #import -#import - @class TGMediaSelectionContext; @class TGMediaEditingContext; @class TGSuggestionContext; @class TGViewController; @class TGAttachmentCameraView; +@protocol TGModernGalleryTransitionHostScrollView; @interface TGAttachmentCarouselCollectionView : UICollectionView diff --git a/LegacyComponents/TGAttachmentCarouselItemView.m b/LegacyComponents/TGAttachmentCarouselItemView.m index 3183685d8f..26fe3f1357 100644 --- a/LegacyComponents/TGAttachmentCarouselItemView.m +++ b/LegacyComponents/TGAttachmentCarouselItemView.m @@ -48,8 +48,16 @@ const CGFloat TGAttachmentZoomedPhotoAspectRatio = 1.2626f; const NSUInteger TGAttachmentDisplayedAssetLimit = 500; +@interface TGAttachmentCarouselCollectionView () + +@end + @implementation TGAttachmentCarouselCollectionView +- (bool)disableGalleryTransitionOffsetFix { + return true; +} + @end @interface TGAttachmentCarouselItemView () @@ -193,12 +201,12 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; { __strong TGAttachmentCarouselItemView *strongSelf = weakSelf; if (strongSelf == nil) - return; + return; [strongSelf.superview bringSubviewToFront:strongSelf]; if (strongSelf.cameraPressed != nil) - strongSelf.cameraPressed(strongSelf->_cameraView); + strongSelf.cameraPressed(strongSelf->_cameraView); }; } @@ -778,7 +786,9 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; if (self.openEditor) { - TGPhotoEditorController *controller = [[TGPhotoEditorController alloc] initWithContext:_context item:asset intent:TGPhotoEditorControllerAvatarIntent adjustments:nil caption:nil screenImage:thumbnailImage availableTabs:[TGPhotoEditorController defaultTabsForAvatarIntent] selectedTab:TGPhotoEditorCropTab]; + id windowManager = [_context makeOverlayWindowManager]; + + TGPhotoEditorController *controller = [[TGPhotoEditorController alloc] initWithContext:[windowManager context] item:asset intent:TGPhotoEditorControllerAvatarIntent adjustments:nil caption:nil screenImage:thumbnailImage availableTabs:[TGPhotoEditorController defaultTabsForAvatarIntent] selectedTab:TGPhotoEditorCropTab]; controller.editingContext = _editingContext; controller.dontHideStatusBar = true; @@ -828,7 +838,7 @@ const NSUInteger TGAttachmentDisplayedAssetLimit = 500; return [editableItem originalImageSignal:position]; }; - TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithParentController:_parentController contentController:controller]; + TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:windowManager parentController:_parentController contentController:controller]; controllerWindow.hidden = false; controller.view.clipsToBounds = true; diff --git a/LegacyComponents/TGAttachmentVideoCell.m b/LegacyComponents/TGAttachmentVideoCell.m index 8dafd4dd08..02dda155a7 100644 --- a/LegacyComponents/TGAttachmentVideoCell.m +++ b/LegacyComponents/TGAttachmentVideoCell.m @@ -1,6 +1,7 @@ #import "TGAttachmentVideoCell.h" -#import +#import "LegacyComponentsInternal.h" +#import "TGFont.h" #import @@ -61,11 +62,11 @@ NSString *const TGAttachmentVideoCellIdentifier = @"AttachmentVideoCell"; _durationLabel.frame = durationFrame; if (asset.subtypes & TGMediaAssetSubtypeVideoTimelapse) - _iconView.image = [UIImage imageNamed:@"ModernMediaItemTimelapseIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemTimelapseIcon"); else if (asset.subtypes & TGMediaAssetSubtypeVideoHighFrameRate) - _iconView.image = [UIImage imageNamed:@"ModernMediaItemSloMoIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemSloMoIcon"); else - _iconView.image = [UIImage imageNamed:@"ModernMediaItemVideoIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemVideoIcon"); SSignal *adjustmentsSignal = [self.editingContext adjustmentsSignalForItem:self.asset]; diff --git a/LegacyComponents/TGCameraController.m b/LegacyComponents/TGCameraController.m index 24c6c66633..19ff6a0526 100644 --- a/LegacyComponents/TGCameraController.m +++ b/LegacyComponents/TGCameraController.m @@ -140,7 +140,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus - (instancetype)initWithContext:(id)context saveEditedPhotos:(bool)saveEditedPhotos saveCapturedMedia:(bool)saveCapturedMedia camera:(PGCamera *)camera previewView:(TGCameraPreviewView *)previewView intent:(TGCameraControllerIntent)intent { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _context = context; @@ -701,7 +701,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [UIView animateWithDuration:0.3f animations:^ { - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; }]; [[[LegacyComponentsGlobals provider] applicationInstance] setIdleTimerDisabled:true]; @@ -716,7 +716,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [UIView animateWithDuration:0.3f animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; }]; } @@ -986,6 +986,15 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus return; } + id windowManager = nil; + id windowContext = nil; + if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { + windowManager = [_context makeOverlayWindowManager]; + windowContext = [windowManager context]; + } else { + windowContext = _context; + } + __weak TGCameraController *weakSelf = self; TGOverlayController *overlayController = nil; @@ -995,7 +1004,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus { case TGCameraControllerAvatarIntent: { - TGPhotoEditorController *controller = [[TGPhotoEditorController alloc] initWithContext:_context item:image intent:(TGPhotoEditorControllerFromCameraIntent | TGPhotoEditorControllerAvatarIntent) adjustments:nil caption:nil screenImage:image availableTabs:[TGPhotoEditorController defaultTabsForAvatarIntent] selectedTab:TGPhotoEditorCropTab]; + TGPhotoEditorController *controller = [[TGPhotoEditorController alloc] initWithContext:windowContext item:image intent:(TGPhotoEditorControllerFromCameraIntent | TGPhotoEditorControllerAvatarIntent) adjustments:nil caption:nil screenImage:image availableTabs:[TGPhotoEditorController defaultTabsForAvatarIntent] selectedTab:TGPhotoEditorCropTab]; __weak TGPhotoEditorController *weakController = controller; controller.beginTransitionIn = ^UIView *(CGRect *referenceFrame, __unused UIView **parentView) { @@ -1079,7 +1088,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus default: { - TGCameraPhotoPreviewController *controller = _shortcut ? [[TGCameraPhotoPreviewController alloc] initWithContext:_context image:image metadata:metadata recipientName:self.recipientName backButtonTitle:TGLocalized(@"Camera.Retake") doneButtonTitle:TGLocalized(@"Common.Next") saveCapturedMedia:_saveCapturedMedia saveEditedPhotos:_saveEditedPhotos] : [[TGCameraPhotoPreviewController alloc] initWithContext:_context image:image metadata:metadata recipientName:self.recipientName saveCapturedMedia:_saveCapturedMedia saveEditedPhotos:_saveEditedPhotos]; + TGCameraPhotoPreviewController *controller = _shortcut ? [[TGCameraPhotoPreviewController alloc] initWithContext:windowContext image:image metadata:metadata recipientName:self.recipientName backButtonTitle:TGLocalized(@"Camera.Retake") doneButtonTitle:TGLocalized(@"Common.Next") saveCapturedMedia:_saveCapturedMedia saveEditedPhotos:_saveEditedPhotos] : [[TGCameraPhotoPreviewController alloc] initWithContext:windowContext image:image metadata:metadata recipientName:self.recipientName saveCapturedMedia:_saveCapturedMedia saveEditedPhotos:_saveEditedPhotos]; controller.allowCaptions = self.allowCaptions; controller.shouldStoreAssets = self.shouldStoreCapturedAssets; controller.suggestionContext = self.suggestionContext; @@ -1146,7 +1155,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus break; } - if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) + if (windowManager != nil) { TGOverlayController *contentController = overlayController; if (_shortcut) @@ -1159,7 +1168,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [contentController.view addSubview:navigationController.view]; } - TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithParentController:self contentController:contentController]; + TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:windowManager parentController:self contentController:contentController]; controllerWindow.windowLevel = self.view.window.windowLevel + 0.0001f; controllerWindow.hidden = false; } @@ -1240,6 +1249,11 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [[[LegacyComponentsGlobals provider] applicationInstance] setIdleTimerDisabled:false]; + id windowManager = nil; + id windowContext = nil; + windowManager = [_context makeOverlayWindowManager]; + windowContext = [windowManager context]; + AVURLAsset *asset = [AVURLAsset assetWithURL:url]; AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; generator.appliesPreferredTrackTransform = true; @@ -1254,11 +1268,11 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus videoItem.editingContext = _editingContext; videoItem.immediateThumbnailImage = thumbnailImage; - TGModernGalleryController *galleryController = [[TGModernGalleryController alloc] initWithContext:_context]; + TGModernGalleryController *galleryController = [[TGModernGalleryController alloc] initWithContext:windowContext]; galleryController.adjustsStatusBarVisibility = false; galleryController.hasFadeOutTransition = true; - TGMediaPickerGalleryModel *model = [[TGMediaPickerGalleryModel alloc] initWithContext:_context items:@[ videoItem ] focusItem:videoItem selectionContext:nil editingContext:_editingContext hasCaptions:self.allowCaptions hasTimer:self.hasTimer inhibitDocumentCaptions:self.inhibitDocumentCaptions hasSelectionPanel:false recipientName:self.recipientName]; + TGMediaPickerGalleryModel *model = [[TGMediaPickerGalleryModel alloc] initWithContext:windowContext items:@[ videoItem ] focusItem:videoItem selectionContext:nil editingContext:_editingContext hasCaptions:self.allowCaptions hasTimer:self.hasTimer inhibitDocumentCaptions:self.inhibitDocumentCaptions hasSelectionPanel:false recipientName:self.recipientName]; model.controller = galleryController; model.suggestionContext = self.suggestionContext; @@ -1439,7 +1453,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [contentController.view addSubview:navigationController.view]; } - TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithParentController:self contentController:contentController]; + TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:windowManager parentController:self contentController:contentController]; controllerWindow.hidden = false; controllerWindow.windowLevel = self.view.window.windowLevel + 0.0001f; galleryController.view.clipsToBounds = true; @@ -1492,7 +1506,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [UIView animateWithDuration:0.3f animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; }]; [self setInterfaceHidden:true animated:true]; @@ -1568,7 +1582,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus { _finishedWithResult = true; - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; self.view.hidden = true; diff --git a/LegacyComponents/TGCameraFlashActiveView.m b/LegacyComponents/TGCameraFlashActiveView.m index 4b3bb2035e..71502ab3fd 100644 --- a/LegacyComponents/TGCameraFlashActiveView.m +++ b/LegacyComponents/TGCameraFlashActiveView.m @@ -1,5 +1,7 @@ #import "TGCameraFlashActiveView.h" +#import "LegacyComponentsInternal.h" + #import "TGCameraInterfaceAssets.h" @interface TGCameraFlashActiveView () @@ -25,7 +27,7 @@ _iconView = [[UIImageView alloc] initWithFrame:CGRectMake((frame.size.width - 8) / 2, (frame.size.height - 13) / 2, 8, 13)]; _iconView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; - _iconView.image = [UIImage imageNamed:@"CameraFlashActive"]; + _iconView.image = TGComponentsImageNamed(@"CameraFlashActive"); [_backgroundView addSubview:_iconView]; [self setActive:false animated:false]; diff --git a/LegacyComponents/TGCameraFlashControl.m b/LegacyComponents/TGCameraFlashControl.m index 6c960046a1..4962d217f6 100644 --- a/LegacyComponents/TGCameraFlashControl.m +++ b/LegacyComponents/TGCameraFlashControl.m @@ -35,7 +35,7 @@ const CGFloat TGCameraFlashControlHeight = 44.0f; _flashIconView.exclusiveTouch = true; _flashIconView.hitTestEdgeInsets = UIEdgeInsetsMake(0, -10, 0, -10); _flashIconView.tag = -1; - [_flashIconView setImage:[UIImage imageNamed:@"CameraFlashButton"] forState:UIControlStateNormal]; + [_flashIconView setImage:TGComponentsImageNamed(@"CameraFlashButton") forState:UIControlStateNormal]; [_flashIconView addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_flashIconView]; @@ -43,7 +43,7 @@ const CGFloat TGCameraFlashControlHeight = 44.0f; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^ { - UIImage *image = [UIImage imageNamed:@"CameraFlashButton"]; + UIImage *image = TGComponentsImageNamed(@"CameraFlashButton"); UIGraphicsBeginImageContextWithOptions(image.size, false, 0.0f); CGContextRef context = UIGraphicsGetCurrentContext(); [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; diff --git a/LegacyComponents/TGCameraFlipButton.m b/LegacyComponents/TGCameraFlipButton.m index a50975840b..55fbdb5136 100644 --- a/LegacyComponents/TGCameraFlipButton.m +++ b/LegacyComponents/TGCameraFlipButton.m @@ -1,5 +1,7 @@ #import "TGCameraFlipButton.h" +#import "LegacyComponentsInternal.h" + @implementation TGCameraFlipButton - (instancetype)initWithFrame:(CGRect)frame @@ -8,7 +10,7 @@ if (self != nil) { self.exclusiveTouch = true; - [self setImage:[UIImage imageNamed:@"CameraLargeFlipButton"] forState:UIControlStateNormal]; + [self setImage:TGComponentsImageNamed(@"CameraLargeFlipButton") forState:UIControlStateNormal]; } return self; } diff --git a/LegacyComponents/TGCameraFocusCrosshairsControl.m b/LegacyComponents/TGCameraFocusCrosshairsControl.m index 27f52528c4..6b8407fcc8 100644 --- a/LegacyComponents/TGCameraFocusCrosshairsControl.m +++ b/LegacyComponents/TGCameraFocusCrosshairsControl.m @@ -61,14 +61,14 @@ [_wrapperView addSubview:_focusIndicatorView]; _focusIndicatorImageView = [[UIImageView alloc] initWithFrame:CGRectMake(45, 45, 75, 75)]; - _focusIndicatorImageView.image = [UIImage imageNamed:@"CameraFocusCrosshairs"]; + _focusIndicatorImageView.image = TGComponentsImageNamed(@"CameraFocusCrosshairs"); _focusIndicatorImageView.alpha = 0.0; [_focusIndicatorView addSubview:_focusIndicatorImageView]; _autoFocusIndicator = [[UIImageView alloc] initWithFrame:CGRectMake(CGFloor((self.bounds.size.width - 125) / 2), CGFloor((self.bounds.size.height - 125) / 2), 125, 125)]; _autoFocusIndicator.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; _autoFocusIndicator.backgroundColor = [UIColor clearColor]; - _autoFocusIndicator.image = [UIImage imageNamed:@"CameraAutoFocusCrosshairs"]; + _autoFocusIndicator.image = TGComponentsImageNamed(@"CameraAutoFocusCrosshairs"); _autoFocusIndicator.alpha = 0.0f; [_wrapperView addSubview:_autoFocusIndicator]; @@ -85,7 +85,7 @@ [_exposureClipView addSubview:_exposureIndicatorView]; _exposureIconView = [[UIImageView alloc] initWithFrame:CGRectMake(-1, 59.5f, 25, 25)]; - _exposureIconView.image = [UIImage imageNamed:@"CameraExposureIcon"]; + _exposureIconView.image = TGComponentsImageNamed(@"CameraExposureIcon"); [_exposureIndicatorView addSubview:_exposureIconView]; _exposureTopLine = [[UIView alloc] initWithFrame:CGRectMake(11, _exposureIconView.frame.origin.y - 3 - _exposureIndicatorView.frame.size.height, 1, _exposureIndicatorView.frame.size.height)]; diff --git a/LegacyComponents/TGCameraPhotoPreviewController.m b/LegacyComponents/TGCameraPhotoPreviewController.m index 75e121111d..0f2ae5d19c 100644 --- a/LegacyComponents/TGCameraPhotoPreviewController.m +++ b/LegacyComponents/TGCameraPhotoPreviewController.m @@ -94,7 +94,7 @@ - (instancetype)initWithContext:(id)context image:(UIImage *)image metadata:(PGCameraShotMetadata *)metadata recipientName:(NSString *)recipientName backButtonTitle:(NSString *)backButtonTitle doneButtonTitle:(NSString *)doneButtonTitle saveCapturedMedia:(bool)saveCapturedMedia saveEditedPhotos:(bool)saveEditedPhotos { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _context = context; @@ -381,7 +381,7 @@ if (_recipientName.length > 0) { - _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PhotoPickerArrow"]]; + _arrowView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"PhotoPickerArrow")]; _arrowView.alpha = 0.45f; [_wrapperView addSubview:_arrowView]; @@ -565,7 +565,7 @@ - (void)transitionIn { - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; if (_appeared) return; diff --git a/LegacyComponents/TGCameraSegmentsView.m b/LegacyComponents/TGCameraSegmentsView.m index abfe5ad623..6f5ed063cf 100644 --- a/LegacyComponents/TGCameraSegmentsView.m +++ b/LegacyComponents/TGCameraSegmentsView.m @@ -1,6 +1,7 @@ #import "TGCameraSegmentsView.h" -#import +#import "LegacyComponentsInternal.h" +#import "TGImageUtils.h" #import "TGCameraInterfaceAssets.h" @@ -51,7 +52,7 @@ const CGFloat TGCameraSegmentsMinimumWidth = 4.0f; UIGraphicsEndImageContext(); }); - _backgroundView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"CameraSegmentsBack"] resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]]; + _backgroundView = [[UIImageView alloc] initWithImage:[TGComponentsImageNamed(@"CameraSegmentsBack") resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]]; [self addSubview:_backgroundView]; _segmentWrapper = [[UIView alloc] init]; @@ -62,7 +63,7 @@ const CGFloat TGCameraSegmentsMinimumWidth = 4.0f; _deleteButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; _deleteButton.exclusiveTouch = true; - [_deleteButton setImage:[UIImage imageNamed:@"CameraDeleteIcon"] forState:UIControlStateNormal]; + [_deleteButton setImage:TGComponentsImageNamed(@"CameraDeleteIcon") forState:UIControlStateNormal]; [_deleteButton addTarget:self action:@selector(deleteButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_deleteButton]; diff --git a/LegacyComponents/TGEmbedCoubPlayerView.m b/LegacyComponents/TGEmbedCoubPlayerView.m index 5b651ca1c2..1f56bd2e8d 100644 --- a/LegacyComponents/TGEmbedCoubPlayerView.m +++ b/LegacyComponents/TGEmbedCoubPlayerView.m @@ -68,7 +68,7 @@ } } - self.controlsView.watermarkImage = [UIImage imageNamed:@"CoubWatermark"]; + self.controlsView.watermarkImage = TGComponentsImageNamed(@"CoubWatermark"); self.controlsView.watermarkOffset = CGPointMake(12.0f, 12.0f); } return self; @@ -156,7 +156,7 @@ - (NSString *)_embedHTML { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"DefaultPlayer" ofType:@"html"]; + NSString *path = TGComponentsPathForResource(@"DefaultPlayer", @"html"); NSString *embedHTMLTemplate = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) diff --git a/LegacyComponents/TGEmbedInstagramPlayerView.m b/LegacyComponents/TGEmbedInstagramPlayerView.m index 7dc8028675..22bc77a484 100644 --- a/LegacyComponents/TGEmbedInstagramPlayerView.m +++ b/LegacyComponents/TGEmbedInstagramPlayerView.m @@ -86,7 +86,7 @@ NSString *const TGInstagramPlayerCallbackOnPlayback = @"onPlayback"; - (NSString *)_embedHTML { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"InstagramPlayer" ofType:@"html"]; + NSString *path = TGComponentsPathForResource(@"InstagramPlayer", @"html"); NSString *embedHTMLTemplate = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) diff --git a/LegacyComponents/TGEmbedPlayerControls.m b/LegacyComponents/TGEmbedPlayerControls.m index 6082243b5b..338de1552c 100644 --- a/LegacyComponents/TGEmbedPlayerControls.m +++ b/LegacyComponents/TGEmbedPlayerControls.m @@ -91,13 +91,13 @@ const CGFloat TGEmbedPlayerControlsPanelHeight = 32.0f; _pauseButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 38, TGEmbedPlayerControlsPanelHeight)]; _pauseButton.exclusiveTouch = true; - [_pauseButton setImage:[UIImage imageNamed:@"EmbedVideoPauseIcon"] forState:UIControlStateNormal]; + [_pauseButton setImage:TGComponentsImageNamed(@"EmbedVideoPauseIcon") forState:UIControlStateNormal]; [_pauseButton addTarget:self action:@selector(pauseButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_backgroundView addSubview:_pauseButton]; _playButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 38, TGEmbedPlayerControlsPanelHeight)]; _playButton.exclusiveTouch = true; - [_playButton setImage:[UIImage imageNamed:@"EmbedVideoPlayIcon"] forState:UIControlStateNormal]; + [_playButton setImage:TGComponentsImageNamed(@"EmbedVideoPlayIcon") forState:UIControlStateNormal]; [_playButton addTarget:self action:@selector(playButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_backgroundView addSubview:_playButton]; @@ -121,7 +121,7 @@ const CGFloat TGEmbedPlayerControlsPanelHeight = 32.0f; _pictureInPictureButton = [[TGModernButton alloc] initWithFrame:CGRectMake(frame.size.width - 45.0f, 0, 45.0f, TGEmbedPlayerControlsPanelHeight)]; _pictureInPictureButton.exclusiveTouch = true; - [_pictureInPictureButton setImage:[UIImage imageNamed:@"EmbedVideoPIPIcon"] forState:UIControlStateNormal]; + [_pictureInPictureButton setImage:TGComponentsImageNamed(@"EmbedVideoPIPIcon") forState:UIControlStateNormal]; [_pictureInPictureButton addTarget:self action:@selector(pictureInPictureButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_backgroundView addSubview:_pictureInPictureButton]; @@ -193,7 +193,7 @@ const CGFloat TGEmbedPlayerControlsPanelHeight = 32.0f; _fullscreenButton = [[TGModernButton alloc] initWithFrame:_fullscreenButtonWrapper.bounds]; _fullscreenButton.exclusiveTouch = true; - [_fullscreenButton setImage:[UIImage imageNamed:@"EmbedVideoFullScreenIcon"] forState:UIControlStateNormal]; + [_fullscreenButton setImage:TGComponentsImageNamed(@"EmbedVideoFullScreenIcon") forState:UIControlStateNormal]; [_fullscreenButton addTarget:self action:@selector(fullscreenButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_fullscreenButtonWrapper addSubview:_fullscreenButton]; } diff --git a/LegacyComponents/TGEmbedPlayerScrubber.m b/LegacyComponents/TGEmbedPlayerScrubber.m index 70839b6147..3837876bb9 100644 --- a/LegacyComponents/TGEmbedPlayerScrubber.m +++ b/LegacyComponents/TGEmbedPlayerScrubber.m @@ -1,6 +1,7 @@ #import "TGEmbedPlayerScrubber.h" -#import +#import "LegacyComponentsInternal.h" +#import "TGImageUtils.h" #import @@ -33,7 +34,7 @@ const CGFloat TGEmbedPlayerKnobMargin = 8.0f; { self.hitTestEdgeInsets = UIEdgeInsetsMake(-20, -20, -20, -20); - UIImage *hollowTrackImage = [[UIImage imageNamed:@"EmbedVideoTrackHollow"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 2, 0, 2)]; + UIImage *hollowTrackImage = [TGComponentsImageNamed(@"EmbedVideoTrackHollow") resizableImageWithCapInsets:UIEdgeInsetsMake(0, 2, 0, 2)]; _backgroundView = [[UIImageView alloc] initWithImage:hollowTrackImage]; [self addSubview:_backgroundView]; @@ -142,7 +143,7 @@ const CGFloat TGEmbedPlayerKnobMargin = 8.0f; - (void)setTintColor:(UIColor *)tintColor { - UIImage *tintedImage = [TGTintedImage([UIImage imageNamed:@"EmbedVideoTrackHollow"], tintColor) resizableImageWithCapInsets:UIEdgeInsetsMake(0, 2, 0, 2)]; + UIImage *tintedImage = [TGTintedImage(TGComponentsImageNamed(@"EmbedVideoTrackHollow"), tintColor) resizableImageWithCapInsets:UIEdgeInsetsMake(0, 2, 0, 2)]; _backgroundView.image = tintedImage; _downloadProgressView.backgroundColor = tintColor; } diff --git a/LegacyComponents/TGEmbedPlayerView.m b/LegacyComponents/TGEmbedPlayerView.m index 6dc32e6bce..a270f9d342 100644 --- a/LegacyComponents/TGEmbedPlayerView.m +++ b/LegacyComponents/TGEmbedPlayerView.m @@ -752,7 +752,7 @@ - (NSString *)_embedHTML { - NSString *path = [[NSBundle mainBundle] pathForResource:@"DefaultPlayer" ofType:@"html"]; + NSString *path = TGComponentsPathForResource(@"DefaultPlayer", @"html"); NSError *error = nil; NSString *embedHTMLTemplate = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) @@ -778,7 +778,7 @@ - (void)_setupUserScripts:(WKUserContentController *)__unused contentController { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"DefaultPlayerInject" ofType:@"js"]; + NSString *path = TGComponentsPathForResource(@"DefaultPlayerInject", @"js"); NSString *scriptText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) TGLog(@"[DefaultEmbedPlayer]: Received error loading inject script: %@", error); diff --git a/LegacyComponents/TGEmbedVimeoPlayerView.m b/LegacyComponents/TGEmbedVimeoPlayerView.m index c9da22ff50..8d0ea459c3 100644 --- a/LegacyComponents/TGEmbedVimeoPlayerView.m +++ b/LegacyComponents/TGEmbedVimeoPlayerView.m @@ -148,7 +148,7 @@ NSString *const TGVimeoPlayerCallbackOnState = @"onState"; - (NSString *)_embedHTML { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"VimeoPlayer" ofType:@"html"]; + NSString *path = TGComponentsPathForResource(@"VimeoPlayer", @"html"); NSString *embedHTMLTemplate = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) @@ -170,7 +170,7 @@ NSString *const TGVimeoPlayerCallbackOnState = @"onState"; - (void)_setupUserScripts:(WKUserContentController *)contentController { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"VimeoPlayerInject" ofType:@"js"]; + NSString *path = TGComponentsPathForResource(@"VimeoPlayerInject", @"js"); NSString *scriptText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) TGLog(@"[VimeoEmbedPlayer]: Received error loading inject script: %@", error); diff --git a/LegacyComponents/TGEmbedVinePlayerView.m b/LegacyComponents/TGEmbedVinePlayerView.m index 2ebcc8dbe6..7581fed87b 100644 --- a/LegacyComponents/TGEmbedVinePlayerView.m +++ b/LegacyComponents/TGEmbedVinePlayerView.m @@ -34,7 +34,7 @@ NSString *const TGVinePlayerCallbackOnPlayback = @"onPlayback"; { _videoId = [TGEmbedVinePlayerView _vineVideoIdFromText:webPage.embedUrl]; - self.controlsView.watermarkImage = [UIImage imageNamed:@"VineWatermark"]; + self.controlsView.watermarkImage = TGComponentsImageNamed(@"VineWatermark"); self.controlsView.watermarkPrerenderedOpacity = true; self.controlsView.watermarkOffset = CGPointMake(12.0f, 12.0f); } @@ -175,7 +175,7 @@ NSString *const TGVinePlayerCallbackOnPlayback = @"onPlayback"; - (NSString *)_embedHTML { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"VinePlayer" ofType:@"html"]; + NSString *path = TGComponentsPathForResource(@"VinePlayer", @"html"); NSString *embedHTMLTemplate = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) @@ -196,7 +196,7 @@ NSString *const TGVinePlayerCallbackOnPlayback = @"onPlayback"; - (void)_setupUserScripts:(WKUserContentController *)contentController { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"VinePlayerInject" ofType:@"js"]; + NSString *path = TGComponentsPathForResource(@"VinePlayerInject", @"js"); NSString *scriptText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) TGLog(@"[VineEmbedPlayer]: Received error loading inject script: %@", error); diff --git a/LegacyComponents/TGEmbedYoutubePlayerView.m b/LegacyComponents/TGEmbedYoutubePlayerView.m index b9a41ad302..3bdfc5ae86 100644 --- a/LegacyComponents/TGEmbedYoutubePlayerView.m +++ b/LegacyComponents/TGEmbedYoutubePlayerView.m @@ -54,7 +54,7 @@ const NSInteger TGYTPlayerStateBufferingCode = 3; } }; - self.controlsView.watermarkImage = [UIImage imageNamed:@"YoutubeWatermark"]; + self.controlsView.watermarkImage = TGComponentsImageNamed(@"YoutubeWatermark"); self.controlsView.watermarkPosition = TGEmbedPlayerWatermarkPositionBottomRight; self.controlsView.watermarkOffset = CGPointMake(-12.0f, -12.0f); } @@ -251,7 +251,7 @@ const NSInteger TGYTPlayerStateBufferingCode = 3; } NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"YoutubePlayer" ofType:@"html"]; + NSString *path = TGComponentsPathForResource(@"YoutubePlayer", @"html"); NSString *embedHTMLTemplate = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) @@ -283,7 +283,7 @@ const NSInteger TGYTPlayerStateBufferingCode = 3; - (void)_setupUserScripts:(WKUserContentController *)contentController { NSError *error = nil; - NSString *path = [[NSBundle mainBundle] pathForResource:@"YoutubePlayerInject" ofType:@"js"]; + NSString *path = TGComponentsPathForResource(@"YoutubePlayerInject", @"js"); NSString *scriptText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (error != nil) TGLog(@"[YTEmbedPlayer]: Received error loading inject script: %@", error); diff --git a/LegacyComponents/TGHacks.h b/LegacyComponents/TGHacks.h index 63b2be7efe..51a0a7cfb4 100644 --- a/LegacyComponents/TGHacks.h +++ b/LegacyComponents/TGHacks.h @@ -30,13 +30,8 @@ typedef enum { + (void)setSecondaryAnimationDurationFactor:(float)factor; + (void)setForceSystemCurve:(bool)forceSystemCurve; -+ (CGFloat)applicationStatusBarAlpha; -+ (void)setApplicationStatusBarAlpha:(CGFloat)alpha; - + (CGFloat)applicationStatusBarOffset; + (void)setApplicationStatusBarOffset:(CGFloat)offset; -+ (void)animateApplicationStatusBarAppearance:(int)statusBarAnimation delay:(NSTimeInterval)delay duration:(NSTimeInterval)duration completion:(void (^)())completion; -+ (void)animateApplicationStatusBarAppearance:(int)statusBarAnimation duration:(NSTimeInterval)duration completion:(void (^)())completion; + (void)animateApplicationStatusBarStyleTransitionWithDuration:(NSTimeInterval)duration; + (CGFloat)statusBarHeightForOrientation:(UIInterfaceOrientation)orientation; diff --git a/LegacyComponents/TGItemMenuSheetPreviewView.m b/LegacyComponents/TGItemMenuSheetPreviewView.m index f1aadf30e8..1085aa2954 100644 --- a/LegacyComponents/TGItemMenuSheetPreviewView.m +++ b/LegacyComponents/TGItemMenuSheetPreviewView.m @@ -118,7 +118,7 @@ typedef enum if (requiresShadow && _shadowView == nil) { _shadowView = [[UIImageView alloc] init]; - _shadowView.image = [[UIImage imageNamed:@"PreviewSheetShadow"] resizableImageWithCapInsets:UIEdgeInsetsMake(42.0f, 42.0f, 42.0f, 42.0f)]; + _shadowView.image = [TGComponentsImageNamed(@"PreviewSheetShadow") resizableImageWithCapInsets:UIEdgeInsetsMake(42.0f, 42.0f, 42.0f, 42.0f)]; [_containerView addSubview:_shadowView]; } @@ -144,7 +144,7 @@ typedef enum [_arrowView removeFromSuperview]; - _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PreviewUpArrow"]]; + _arrowView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"PreviewUpArrow")]; _arrowView.alpha = 0.0f; [_mainSheetView addSubview:_arrowView]; @@ -238,7 +238,7 @@ typedef enum if (!self.dontBlurOnPresentation || self.presentActionsImmediately) { - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; [self performAppearBackgroundTransition:completionBlock]; } @@ -287,7 +287,7 @@ typedef enum { [UIView animateWithDuration:0.22 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; _blurView.alpha = 0.0f; } completion:^(__unused BOOL finished) @@ -297,7 +297,7 @@ typedef enum } else { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; completionBlock(); } } diff --git a/LegacyComponents/TGItemPreviewController.m b/LegacyComponents/TGItemPreviewController.m index 32afd48a07..11545de2d7 100644 --- a/LegacyComponents/TGItemPreviewController.m +++ b/LegacyComponents/TGItemPreviewController.m @@ -18,13 +18,13 @@ - (instancetype)initWithContext:(id)context parentController:(TGViewController *)parentController previewView:(TGItemPreviewView *)previewView { - self = [self init]; + self = [self initWithContext:context]; if (self != nil) { _context = context; _previewView = previewView; - TGOverlayControllerWindow *window = [[TGOverlayControllerWindow alloc] initWithParentController:parentController contentController:self keepKeyboard:true]; + TGOverlayControllerWindow *window = [[TGOverlayControllerWindow alloc] initWithManager:[context makeOverlayWindowManager] parentController:parentController contentController:self keepKeyboard:true]; window.windowLevel = 100000000.0f; window.tag = 0xbeef; window.userInteractionEnabled = previewView.userInteractionEnabled; diff --git a/LegacyComponents/TGLegacyCameraController.m b/LegacyComponents/TGLegacyCameraController.m index f6aff5c086..c74e6ff087 100644 --- a/LegacyComponents/TGLegacyCameraController.m +++ b/LegacyComponents/TGLegacyCameraController.m @@ -87,11 +87,11 @@ { [UIView animateWithDuration:0.3 animations:^ { - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; }]; } else - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; } [super viewWillAppear:animated]; @@ -105,11 +105,11 @@ { [UIView animateWithDuration:0.3 animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; }]; } else - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; } [super viewWillDisappear:animated]; diff --git a/LegacyComponents/TGLegacyMediaPickerTipView.m b/LegacyComponents/TGLegacyMediaPickerTipView.m index bc23a1134a..5612b63710 100644 --- a/LegacyComponents/TGLegacyMediaPickerTipView.m +++ b/LegacyComponents/TGLegacyMediaPickerTipView.m @@ -31,7 +31,7 @@ _wrapperView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; [self addSubview:_wrapperView]; - _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"AttachmentTipIcons"]]; + _imageView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"AttachmentTipIcons")]; [self addSubview:_imageView]; _titleLabel = [[UILabel alloc] init]; diff --git a/LegacyComponents/TGMediaAssetsController.m b/LegacyComponents/TGMediaAssetsController.m index 4624fb2de9..c719d2e366 100644 --- a/LegacyComponents/TGMediaAssetsController.m +++ b/LegacyComponents/TGMediaAssetsController.m @@ -78,7 +78,7 @@ } }; - TGMediaGroupsController *groupsController = [[TGMediaGroupsController alloc] initWithAssetsLibrary:assetsController.assetsLibrary intent:intent]; + TGMediaGroupsController *groupsController = [[TGMediaGroupsController alloc] initWithContext:context assetsLibrary:assetsController.assetsLibrary intent:intent]; groupsController.openAssetGroup = ^(id group) { __strong TGMediaAssetsController *strongController = weakController; @@ -683,7 +683,7 @@ if (iosMajorVersion() < 7) { - TGModernBarButton *searchButton = [[TGModernBarButton alloc] initWithImage:[UIImage imageNamed:@"NavigationSearchIcon.png"]]; + TGModernBarButton *searchButton = [[TGModernBarButton alloc] initWithImage:TGComponentsImageNamed(@"NavigationSearchIcon.png")]; searchButton.portraitAdjustment = CGPointMake(-7, -5); [searchButton addTarget:self action:@selector(searchButtonPressed) forControlEvents:UIControlEventTouchUpInside]; return [[UIBarButtonItem alloc] initWithCustomView:searchButton]; diff --git a/LegacyComponents/TGMediaAssetsPickerController.m b/LegacyComponents/TGMediaAssetsPickerController.m index 79dc5e84b1..58f61695d3 100644 --- a/LegacyComponents/TGMediaAssetsPickerController.m +++ b/LegacyComponents/TGMediaAssetsPickerController.m @@ -72,7 +72,7 @@ break; } - self = [super initWithSelectionContext:hasSelection ? selectionContext : nil editingContext:hasEditing ? editingContext : nil]; + self = [super initWithContext:context selectionContext:hasSelection ? selectionContext : nil editingContext:hasEditing ? editingContext : nil]; if (self != nil) { _context = context; diff --git a/LegacyComponents/TGMediaAssetsTipView.m b/LegacyComponents/TGMediaAssetsTipView.m index 71efa7240f..fa1ed784a7 100644 --- a/LegacyComponents/TGMediaAssetsTipView.m +++ b/LegacyComponents/TGMediaAssetsTipView.m @@ -30,7 +30,7 @@ _wrapperView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; [self addSubview:_wrapperView]; - _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"AttachmentTipIcons"]]; + _imageView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"AttachmentTipIcons")]; [self addSubview:_imageView]; _titleLabel = [[UILabel alloc] init]; diff --git a/LegacyComponents/TGMediaAssetsVideoCell.m b/LegacyComponents/TGMediaAssetsVideoCell.m index 4562b28d07..e6b8c063fc 100644 --- a/LegacyComponents/TGMediaAssetsVideoCell.m +++ b/LegacyComponents/TGMediaAssetsVideoCell.m @@ -106,11 +106,11 @@ NSString *const TGMediaAssetsVideoCellKind = @"TGMediaAssetsVideoCellKind"; _durationLabel.text = durationString; if (asset.subtypes & TGMediaAssetSubtypeVideoTimelapse) - _iconView.image = [UIImage imageNamed:@"ModernMediaItemTimelapseIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemTimelapseIcon"); else if (asset.subtypes & TGMediaAssetSubtypeVideoHighFrameRate) - _iconView.image = [UIImage imageNamed:@"ModernMediaItemSloMoIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemSloMoIcon"); else - _iconView.image = [UIImage imageNamed:@"ModernMediaItemVideoIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemVideoIcon"); SSignal *adjustmentsSignal = [self.editingContext adjustmentsSignalForItem:(id)self.item]; diff --git a/LegacyComponents/TGMediaAvatarMenuMixin.h b/LegacyComponents/TGMediaAvatarMenuMixin.h index b1b9f24426..ea2394e0b7 100644 --- a/LegacyComponents/TGMediaAvatarMenuMixin.h +++ b/LegacyComponents/TGMediaAvatarMenuMixin.h @@ -2,6 +2,7 @@ #import @class TGViewController; +@class TGMenuSheetController; @interface TGMediaAvatarMenuMixin : NSObject @@ -11,6 +12,6 @@ - (instancetype)initWithContext:(id)context parentController:(TGViewController *)parentController hasDeleteButton:(bool)hasDeleteButton saveEditedPhotos:(bool)saveEditedPhotos saveCapturedMedia:(bool)saveCapturedMedia; - (instancetype)initWithContext:(id)context parentController:(TGViewController *)parentController hasDeleteButton:(bool)hasDeleteButton personalPhoto:(bool)personalPhoto saveEditedPhotos:(bool)saveEditedPhotos saveCapturedMedia:(bool)saveCapturedMedia; -- (void)present; +- (TGMenuSheetController *)present; @end diff --git a/LegacyComponents/TGMediaAvatarMenuMixin.m b/LegacyComponents/TGMediaAvatarMenuMixin.m index 9727a3a4ba..64dc9bd20f 100644 --- a/LegacyComponents/TGMediaAvatarMenuMixin.m +++ b/LegacyComponents/TGMediaAvatarMenuMixin.m @@ -49,17 +49,17 @@ return self; } -- (void)present +- (TGMenuSheetController *)present { [_parentController.view endEditing:true]; if (iosMajorVersion() >= 7 && [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) - [self _presentAvatarMenu]; + return [self _presentAvatarMenu]; else - [self _presentLegacyAvatarMenu]; + return [self _presentLegacyAvatarMenu]; } -- (void)_presentAvatarMenu +- (TGMenuSheetController *)_presentAvatarMenu { __weak TGMediaAvatarMenuMixin *weakSelf = self; TGMenuSheetController *controller = [[TGMenuSheetController alloc] initWithContext:_context dark:false]; @@ -164,9 +164,10 @@ [controller setItemViews:itemViews]; [controller presentInViewController:_parentController sourceView:nil animated:true]; + return controller; } -- (void)_presentLegacyAvatarMenu +- (TGMenuSheetController *)_presentLegacyAvatarMenu { NSMutableArray *actions = [[NSMutableArray alloc] init]; @@ -200,6 +201,7 @@ controller.didDismiss(); } }]; + return nil; } - (void)_displayCameraWithView:(TGAttachmentCameraView *)cameraView menuController:(TGMenuSheetController *)menuController @@ -220,14 +222,16 @@ TGCameraController *controller = nil; CGSize screenSize = TGScreenSize(); + id windowManager = [_context makeOverlayWindowManager]; + if (cameraView.previewView != nil) - controller = [[TGCameraController alloc] initWithContext:_context saveEditedPhotos:_saveEditedPhotos saveCapturedMedia:_saveCapturedMedia camera:cameraView.previewView.camera previewView:cameraView.previewView intent:TGCameraControllerAvatarIntent]; + controller = [[TGCameraController alloc] initWithContext:[windowManager context] saveEditedPhotos:_saveEditedPhotos saveCapturedMedia:_saveCapturedMedia camera:cameraView.previewView.camera previewView:cameraView.previewView intent:TGCameraControllerAvatarIntent]; else - controller = [[TGCameraController alloc] initWithContext:_context saveEditedPhotos:_saveEditedPhotos saveCapturedMedia:_saveCapturedMedia intent:TGCameraControllerAvatarIntent]; + controller = [[TGCameraController alloc] initWithContext:[windowManager context] saveEditedPhotos:_saveEditedPhotos saveCapturedMedia:_saveCapturedMedia intent:TGCameraControllerAvatarIntent]; controller.shouldStoreCapturedAssets = true; - TGCameraControllerWindow *controllerWindow = [[TGCameraControllerWindow alloc] initWithParentController:_parentController contentController:controller]; + TGCameraControllerWindow *controllerWindow = [[TGCameraControllerWindow alloc] initWithManager:windowManager parentController:_parentController contentController:controller]; controllerWindow.hidden = false; controllerWindow.clipsToBounds = true; diff --git a/LegacyComponents/TGMediaEditingContext.m b/LegacyComponents/TGMediaEditingContext.m index 18e84b5a15..fadd700037 100644 --- a/LegacyComponents/TGMediaEditingContext.m +++ b/LegacyComponents/TGMediaEditingContext.m @@ -358,9 +358,10 @@ - (SSignal *)captionSignalForItem:(NSObject *)item { + NSString *uniqueIdentifier = item.uniqueIdentifier; SSignal *updateSignal = [[_captionPipe.signalProducer() filter:^bool(TGMediaCaptionUpdate *update) { - return [update.item.uniqueIdentifier isEqualToString:item.uniqueIdentifier]; + return [update.item.uniqueIdentifier isEqualToString:uniqueIdentifier]; }] map:^NSString *(TGMediaCaptionUpdate *update) { return update.caption; diff --git a/LegacyComponents/TGMediaGroupCell.m b/LegacyComponents/TGMediaGroupCell.m index 31590363d2..0937b70fd2 100644 --- a/LegacyComponents/TGMediaGroupCell.m +++ b/LegacyComponents/TGMediaGroupCell.m @@ -147,7 +147,7 @@ const CGFloat TGMediaGroupCellHeight = 86.0f; _countLabel.textColor = [UIColor blackColor]; [self.contentView addSubview:_countLabel]; - UIImageView *disclosureIndicator = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ModernListsDisclosureIndicator"]]; + UIImageView *disclosureIndicator = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"ModernListsDisclosureIndicator")]; disclosureIndicator.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; disclosureIndicator.frame = CGRectOffset(disclosureIndicator.frame, self.contentView.frame.size.width - disclosureIndicator.frame.size.width - 15, 37); [self addSubview:disclosureIndicator]; @@ -228,7 +228,7 @@ const CGFloat TGMediaGroupCellHeight = 86.0f; [imageView reset]; } - [(TGImageView *)_imageViews.firstObject setImage:[UIImage imageNamed:@"ModernMediaEmptyAlbumIcon"]]; + [(TGImageView *)_imageViews.firstObject setImage:TGComponentsImageNamed(@"ModernMediaEmptyAlbumIcon")]; } } @@ -249,35 +249,35 @@ const CGFloat TGMediaGroupCellHeight = 86.0f; switch (assetGroup.subtype) { case TGMediaAssetGroupSubtypeFavorites: - iconImage = [UIImage imageNamed:@"MediaGroupFavorites"]; + iconImage = TGComponentsImageNamed(@"MediaGroupFavorites"); break; case TGMediaAssetGroupSubtypePanoramas: - iconImage = [UIImage imageNamed:@"MediaGroupPanoramas"]; + iconImage = TGComponentsImageNamed(@"MediaGroupPanoramas"); break; case TGMediaAssetGroupSubtypeVideos: - iconImage = [UIImage imageNamed:@"MediaGroupVideo"]; + iconImage = TGComponentsImageNamed(@"MediaGroupVideo"); break; case TGMediaAssetGroupSubtypeBursts: - iconImage = [UIImage imageNamed:@"MediaGroupBurst"]; + iconImage = TGComponentsImageNamed(@"MediaGroupBurst"); break; case TGMediaAssetGroupSubtypeSlomo: - iconImage = [UIImage imageNamed:@"MediaGroupSlomo"]; + iconImage = TGComponentsImageNamed(@"MediaGroupSlomo"); break; case TGMediaAssetGroupSubtypeTimelapses: - iconImage = [UIImage imageNamed:@"MediaGroupTimelapse"]; + iconImage = TGComponentsImageNamed(@"MediaGroupTimelapse"); break; case TGMediaAssetGroupSubtypeScreenshots: - iconImage = [UIImage imageNamed:@"MediaGroupScreenshots"]; + iconImage = TGComponentsImageNamed(@"MediaGroupScreenshots"); break; case TGMediaAssetGroupSubtypeSelfPortraits: - iconImage = [UIImage imageNamed:@"MediaGroupSelfPortraits"]; + iconImage = TGComponentsImageNamed(@"MediaGroupSelfPortraits"); break; default: diff --git a/LegacyComponents/TGMediaGroupsController.h b/LegacyComponents/TGMediaGroupsController.h index f8f8b9023a..6d90a2cd6b 100644 --- a/LegacyComponents/TGMediaGroupsController.h +++ b/LegacyComponents/TGMediaGroupsController.h @@ -1,4 +1,4 @@ -#import +#import #import @@ -11,6 +11,6 @@ @property (nonatomic, copy) void (^openAssetGroup)(TGMediaAssetGroup *); -- (instancetype)initWithAssetsLibrary:(TGMediaAssetsLibrary *)assetsLibrary intent:(TGMediaAssetsControllerIntent)intent; +- (instancetype)initWithContext:(id)context assetsLibrary:(TGMediaAssetsLibrary *)assetsLibrary intent:(TGMediaAssetsControllerIntent)intent; @end diff --git a/LegacyComponents/TGMediaGroupsController.m b/LegacyComponents/TGMediaGroupsController.m index 7c9d22b31b..ecb4b3dbc2 100644 --- a/LegacyComponents/TGMediaGroupsController.m +++ b/LegacyComponents/TGMediaGroupsController.m @@ -24,9 +24,9 @@ @implementation TGMediaGroupsController -- (instancetype)initWithAssetsLibrary:(TGMediaAssetsLibrary *)assetsLibrary intent:(TGMediaAssetsControllerIntent)intent +- (instancetype)initWithContext:(id)context assetsLibrary:(TGMediaAssetsLibrary *)assetsLibrary intent:(TGMediaAssetsControllerIntent)intent { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _assetsLibrary = assetsLibrary; diff --git a/LegacyComponents/TGMediaPickerController.h b/LegacyComponents/TGMediaPickerController.h index 880cded801..ea3cbccbd7 100644 --- a/LegacyComponents/TGMediaPickerController.h +++ b/LegacyComponents/TGMediaPickerController.h @@ -29,7 +29,7 @@ @property (nonatomic, copy) void (^catchToolbarView)(bool enabled); -- (instancetype)initWithSelectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext; +- (instancetype)initWithContext:(id)context selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext; - (NSArray *)resultSignals:(id (^)(id, NSString *, NSString *))descriptionGenerator; - (NSUInteger)_numberOfItems; diff --git a/LegacyComponents/TGMediaPickerController.m b/LegacyComponents/TGMediaPickerController.m index 404647e03a..c6a11c7784 100644 --- a/LegacyComponents/TGMediaPickerController.m +++ b/LegacyComponents/TGMediaPickerController.m @@ -26,9 +26,9 @@ @implementation TGMediaPickerController -- (instancetype)initWithSelectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext +- (instancetype)initWithContext:(id)context selectionContext:(TGMediaSelectionContext *)selectionContext editingContext:(TGMediaEditingContext *)editingContext { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _selectionContext = selectionContext; diff --git a/LegacyComponents/TGMediaPickerGalleryInterfaceView.m b/LegacyComponents/TGMediaPickerGalleryInterfaceView.m index 18f470959d..65c5056c3e 100644 --- a/LegacyComponents/TGMediaPickerGalleryInterfaceView.m +++ b/LegacyComponents/TGMediaPickerGalleryInterfaceView.m @@ -142,7 +142,7 @@ if (recipientName.length > 0) { - _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PhotoPickerArrow"]]; + _arrowView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"PhotoPickerArrow")]; _arrowView.alpha = 0.45f; [_wrapperView addSubview:_arrowView]; @@ -504,15 +504,21 @@ id editableMediaItem = [galleryEditableItem editableMediaItem]; __weak TGMediaPickerGalleryInterfaceView *weakSelf = self; + __weak id weakGalleryEditableItem = galleryEditableItem; [_adjustmentsDisposable setDisposable:[[[[galleryEditableItem.editingContext adjustmentsSignalForItem:editableMediaItem] mapToSignal:^SSignal *(id adjustments) { - return [[galleryEditableItem.editingContext timerSignalForItem:editableMediaItem] map:^id(id timer) { - NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - if (adjustments != nil) - dict[@"adjustments"] = adjustments; - if (timer != nil) - dict[@"timer"] = timer; - return dict; - }]; + __strong id strongGalleryEditableItem = weakGalleryEditableItem; + if (strongGalleryEditableItem != nil) { + return [[strongGalleryEditableItem.editingContext timerSignalForItem:editableMediaItem] map:^id(id timer) { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + if (adjustments != nil) + dict[@"adjustments"] = adjustments; + if (timer != nil) + dict[@"timer"] = timer; + return dict; + }]; + } else { + return [SSignal never]; + } }] deliverOn:[SQueue mainQueue]] startWithNext:^(NSDictionary *dict) { __strong TGMediaPickerGalleryInterfaceView *strongSelf = weakSelf; diff --git a/LegacyComponents/TGMediaPickerGalleryVideoScrubber.m b/LegacyComponents/TGMediaPickerGalleryVideoScrubber.m index 2a251f8f66..7c9ab9be07 100644 --- a/LegacyComponents/TGMediaPickerGalleryVideoScrubber.m +++ b/LegacyComponents/TGMediaPickerGalleryVideoScrubber.m @@ -368,7 +368,7 @@ typedef enum _panGestureRecognizer.delegate = self; [_scrubberHandle addGestureRecognizer:_panGestureRecognizer]; - _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PhotoPickerArrow"]]; + _arrowView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"PhotoPickerArrow")]; _arrowView.alpha = 0.45f; _arrowView.hidden = true; [self addSubview:_arrowView]; diff --git a/LegacyComponents/TGMediaPickerGalleryVideoTrimView.m b/LegacyComponents/TGMediaPickerGalleryVideoTrimView.m index 07263b708e..3b62754051 100644 --- a/LegacyComponents/TGMediaPickerGalleryVideoTrimView.m +++ b/LegacyComponents/TGMediaPickerGalleryVideoTrimView.m @@ -64,12 +64,12 @@ _leftHandleView = [[UIImageView alloc] initWithFrame:_leftSegmentView.bounds]; _leftHandleView.contentMode = UIViewContentModeCenter; - _leftHandleView.image = [UIImage imageNamed:@"VideoScrubberLeftArrow"]; + _leftHandleView.image = TGComponentsImageNamed(@"VideoScrubberLeftArrow"); [_leftSegmentView addSubview:_leftHandleView]; _rightHandleView = [[UIImageView alloc] initWithFrame:_rightSegmentView.bounds]; _rightHandleView.contentMode = UIViewContentModeCenter; - _rightHandleView.image = [UIImage imageNamed:@"VideoScrubberRightArrow"]; + _rightHandleView.image = TGComponentsImageNamed(@"VideoScrubberRightArrow"); [_rightSegmentView addSubview:_rightHandleView]; _startHandlePressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleHandlePress:)]; diff --git a/LegacyComponents/TGMediaPickerModernGalleryMixin.m b/LegacyComponents/TGMediaPickerModernGalleryMixin.m index 4b03b1158a..6e10edc6fc 100644 --- a/LegacyComponents/TGMediaPickerModernGalleryMixin.m +++ b/LegacyComponents/TGMediaPickerModernGalleryMixin.m @@ -30,6 +30,8 @@ NSUInteger _itemsLimit; id _context; + + id _windowManager; } @end @@ -58,7 +60,9 @@ __weak TGMediaPickerModernGalleryMixin *weakSelf = self; - TGModernGalleryController *modernGallery = [[TGModernGalleryController alloc] initWithContext:_context]; + _windowManager = [_context makeOverlayWindowManager]; + + TGModernGalleryController *modernGallery = [[TGModernGalleryController alloc] initWithContext:[_windowManager context]]; _galleryController = modernGallery; _strongGalleryController = modernGallery; modernGallery.isImportant = true; @@ -75,7 +79,7 @@ NSArray *galleryItems = fetchResult != nil ? [self prepareGalleryItemsForFetchResult:fetchResult selectionContext:selectionContext editingContext:editingContext asFile:asFile enumerationBlock:enumerationBlock] : [self prepareGalleryItemsForMomentList:momentList selectionContext:selectionContext editingContext:editingContext asFile:asFile enumerationBlock:enumerationBlock]; - TGMediaPickerGalleryModel *model = [[TGMediaPickerGalleryModel alloc] initWithContext:_context items:galleryItems focusItem:focusItem selectionContext:selectionContext editingContext:editingContext hasCaptions:hasCaptions hasTimer:hasTimer inhibitDocumentCaptions:inhibitDocumentCaptions hasSelectionPanel:true recipientName:recipientName]; + TGMediaPickerGalleryModel *model = [[TGMediaPickerGalleryModel alloc] initWithContext:[_windowManager context] items:galleryItems focusItem:focusItem selectionContext:selectionContext editingContext:editingContext hasCaptions:hasCaptions hasTimer:hasTimer inhibitDocumentCaptions:inhibitDocumentCaptions hasSelectionPanel:true recipientName:recipientName]; _galleryModel = model; model.controller = modernGallery; model.suggestionContext = suggestionContext; @@ -207,7 +211,7 @@ [_galleryController setPreviewMode:false]; - TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithParentController:_parentController contentController:_galleryController]; + TGOverlayControllerWindow *controllerWindow = [[TGOverlayControllerWindow alloc] initWithManager:_windowManager parentController:_parentController contentController:_galleryController]; controllerWindow.hidden = false; _galleryController.view.clipsToBounds = true; diff --git a/LegacyComponents/TGMediaPickerPhotoCounterButton.m b/LegacyComponents/TGMediaPickerPhotoCounterButton.m index f24304f22c..a62c6d6a3f 100644 --- a/LegacyComponents/TGMediaPickerPhotoCounterButton.m +++ b/LegacyComponents/TGMediaPickerPhotoCounterButton.m @@ -76,7 +76,7 @@ const CGFloat TGPhotoCounterButtonMaskFade = 18; _crossIconView.alpha = 0.0f; _crossIconView.contentMode = UIViewContentModeCenter; _crossIconView.hidden = true; - _crossIconView.image = [UIImage imageNamed:@"ImagePickerPhotoCounter_Close"]; + _crossIconView.image = TGComponentsImageNamed(@"ImagePickerPhotoCounter_Close"); [_wrapperView addSubview:_crossIconView]; CGFloat maskWidth = 50.0f; diff --git a/LegacyComponents/TGMediaPickerPhotoStripCell.m b/LegacyComponents/TGMediaPickerPhotoStripCell.m index b7eb385f29..28f0517637 100644 --- a/LegacyComponents/TGMediaPickerPhotoStripCell.m +++ b/LegacyComponents/TGMediaPickerPhotoStripCell.m @@ -162,11 +162,11 @@ NSString *const TGMediaPickerPhotoStripCellKind = @"PhotoStripCell"; _label.text = [NSString stringWithFormat:@"%d:%02d", (int)ceil(asset.videoDuration) / 60, (int)ceil(asset.videoDuration) % 60]; if (asset.subtypes & TGMediaAssetSubtypeVideoTimelapse) - _iconView.image = [UIImage imageNamed:@"ModernMediaItemTimelapseIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemTimelapseIcon"); else if (asset.subtypes & TGMediaAssetSubtypeVideoHighFrameRate) - _iconView.image = [UIImage imageNamed:@"ModernMediaItemSloMoIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemSloMoIcon"); else - _iconView.image = [UIImage imageNamed:@"ModernMediaItemVideoIcon"]; + _iconView.image = TGComponentsImageNamed(@"ModernMediaItemVideoIcon"); if (self.editingContext != nil) { diff --git a/LegacyComponents/TGMenuSheetController.h b/LegacyComponents/TGMenuSheetController.h index 26683d4055..ecd8229a47 100644 --- a/LegacyComponents/TGMenuSheetController.h +++ b/LegacyComponents/TGMenuSheetController.h @@ -23,6 +23,7 @@ @property (nonatomic, copy) void (^willPresent)(CGFloat offset); @property (nonatomic, copy) void (^willDismiss)(bool manual); @property (nonatomic, copy) void (^didDismiss)(bool manual); +@property (nonatomic, copy) void (^customRemoveFromParentViewController)(); @property (nonatomic, assign) UIPopoverArrowDirection permittedArrowDirections; @property (nonatomic, copy) CGRect (^sourceRect)(void); diff --git a/LegacyComponents/TGMenuSheetController.m b/LegacyComponents/TGMenuSheetController.m index 068873b6b6..ec2a67b13c 100644 --- a/LegacyComponents/TGMenuSheetController.m +++ b/LegacyComponents/TGMenuSheetController.m @@ -170,7 +170,7 @@ typedef enum if (strongSelf == nil) return; - [strongSelf repositionMenuWithReferenceSize:[_context fullscreenBounds].size]; + [strongSelf repositionMenuWithReferenceSize:[strongSelf->_context fullscreenBounds].size]; }; if (animated && compact) @@ -939,6 +939,9 @@ typedef enum [window dismiss]; } } + if (_customRemoveFromParentViewController) { + _customRemoveFromParentViewController(); + } [super removeFromParentViewController]; } diff --git a/LegacyComponents/TGMenuView.m b/LegacyComponents/TGMenuView.m index 73b8ed0f14..5e22e2dde8 100644 --- a/LegacyComponents/TGMenuView.m +++ b/LegacyComponents/TGMenuView.m @@ -226,12 +226,10 @@ static UIImage *pagerLeftButtonHighlightedImage() { _maxWidth = 310.0f; - //_arrowTopView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MenuArrowTop.png"] highlightedImage:[UIImage imageNamed:@"MenuArrowTop_Highlighted.png"]]; _arrowTopView = [[UIImageView alloc] init]; _arrowTopView.frame = CGRectMake(0.0f, 0.0f, 20.0f, 12.0f); [self addSubview:_arrowTopView]; - //_arrowBottomView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MenuArrowBottom.png"] highlightedImage:[UIImage imageNamed:@"MenuArrowBottom_Highlighted.png"]]; _arrowBottomView = [[UIImageView alloc] init]; _arrowBottomView.frame = CGRectMake(0.0f, 0.0f, 20.0f, 14.5f); [self addSubview:_arrowBottomView]; diff --git a/LegacyComponents/TGModernGalleryController.m b/LegacyComponents/TGModernGalleryController.m index 762f510ef4..ab98edfeab 100644 --- a/LegacyComponents/TGModernGalleryController.m +++ b/LegacyComponents/TGModernGalleryController.m @@ -55,7 +55,7 @@ - (instancetype)initWithContext:(id)context { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _context = context; @@ -244,7 +244,7 @@ { [UIView animateWithDuration:0.2 animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [strongSelf->_context setApplicationStatusBarAlpha:1.0f]; }]; } @@ -421,7 +421,7 @@ previewSize = self.preferredContentSize; __weak TGModernGalleryController *weakSelf = self; - _view = [[TGModernGalleryView alloc] initWithFrame:self.view.bounds itemPadding:TGModernGalleryItemPadding interfaceView:interfaceView previewMode:_previewMode previewSize:previewSize]; + _view = [[TGModernGalleryView alloc] initWithFrame:self.view.bounds context:_context itemPadding:TGModernGalleryItemPadding interfaceView:interfaceView previewMode:_previewMode previewSize:previewSize]; _view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:_view]; @@ -502,7 +502,7 @@ { [UIView animateWithDuration:0.2 animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [strongSelf->_context setApplicationStatusBarAlpha:1.0f]; }]; } @@ -944,23 +944,15 @@ static CGFloat transformRotation(CGAffineTransform transform) - (void)animateTransitionOutFromView:(UIView *)fromView fromViewContentRect:(CGRect)fromViewContentRect toView:(UIView *)toView velocity:(CGPoint)velocity { - TGLog(@"begin calc"); - - TG_TIMESTAMP_DEFINE(out) - UIView *toScrollView = [self findScrollView:toView]; UIView *toContainerView = toScrollView.superview; - TG_TIMESTAMP_MEASURE(out) - CGRect toContainerFrame = [toContainerView convertRect:toView.bounds fromView:toView]; CGRect toContainerFromFrame = [toContainerView convertRect:[fromView convertRect:fromViewContentRect toView:nil] fromView:nil]; UIView *toViewCopy = nil; TGModernGalleryComplexTransitionDescription *transitionDesc = nil; - TG_TIMESTAMP_MEASURE(out) - if ([toView conformsToProtocol:@protocol(TGModernGalleryTransitionView)]) { if ([toView respondsToSelector:@selector(hasComplexTransition)]) @@ -1024,8 +1016,6 @@ static CGFloat transformRotation(CGAffineTransform transform) CGRect toFrame = [fromView.superview convertRect:[toView convertRect:CGRectInset(toView.bounds, toFrameInsets.left, toFrameInsets.top) toView:nil] fromView:nil]; toFrame = adjustFrameForOriginalSubframe(fromView.frame, fromViewContentRect, toFrame); - TG_TIMESTAMP_MEASURE(out) - if (transitionDesc == nil && toViewCopy == nil) { CGFloat toViewAlpha = toView.alpha; @@ -1044,8 +1034,6 @@ static CGFloat transformRotation(CGAffineTransform transform) if (toViewCopy != nil) [toContainerView insertSubview:toViewCopy aboveSubview:toScrollView]; - TG_TIMESTAMP_MEASURE(out) - __weak TGModernGalleryController *weakSelf = self; self.view.userInteractionEnabled = false; [self animateView:fromView frameFrom:fromView.frame to:toFrame velocity:velocity rotationFrom:0.0f to:0.0f animatingIn:false completion:^(__unused bool finished) @@ -1060,8 +1048,6 @@ static CGFloat transformRotation(CGAffineTransform transform) } }]; - TG_TIMESTAMP_MEASURE(out) - if (toViewCopy != nil) { __weak UIView *weakToViewCopy = toViewCopy; @@ -1072,8 +1058,6 @@ static CGFloat transformRotation(CGAffineTransform transform) }]; } - TG_TIMESTAMP_MEASURE(out) - if (iosMajorVersion() >= 7 && self.shouldAnimateStatusBarStyleTransition) { [self animateStatusBarTransition:0.2]; @@ -1081,17 +1065,13 @@ static CGFloat transformRotation(CGAffineTransform transform) [self setNeedsStatusBarAppearanceUpdate]; } - TG_TIMESTAMP_MEASURE(out) - if (self.adjustsStatusBarVisibility) { [UIView animateWithDuration:0.2 animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; }]; } - - TGLog(@"started animation"); } - (void)viewDidAppear:(BOOL)animated @@ -1137,12 +1117,12 @@ static CGFloat transformRotation(CGAffineTransform transform) _view.interfaceView.alpha = 0.0f; if (self.adjustsStatusBarVisibility) - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; } else if ([_view.interfaceView prefersStatusBarHidden]) { if (self.adjustsStatusBarVisibility) - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; } } @@ -1162,12 +1142,7 @@ static CGFloat transformRotation(CGAffineTransform transform) if (self.adjustsStatusBarVisibility) { - [TGHacks setApplicationStatusBarAlpha:1.0f]; - -// dispatch_async(dispatch_get_main_queue(), ^ -// { -// [TGHacks setApplicationStatusBarAlpha:1.0f]; -// }); + [_context setApplicationStatusBarAlpha:1.0f]; } } @@ -1631,7 +1606,7 @@ static CGFloat transformRotation(CGAffineTransform transform) { if (iosMajorVersion() >= 7 && self.shouldAnimateStatusBarStyleTransition) { - [TGHacks animateApplicationStatusBarStyleTransitionWithDuration:duration]; + [_context animateApplicationStatusBarStyleTransitionWithDuration:duration]; } } diff --git a/LegacyComponents/TGModernGalleryView.h b/LegacyComponents/TGModernGalleryView.h index ec5c1011f1..d810fa0f5c 100644 --- a/LegacyComponents/TGModernGalleryView.h +++ b/LegacyComponents/TGModernGalleryView.h @@ -1,5 +1,6 @@ #import +#import #import @class TGModernGalleryScrollView; @@ -14,7 +15,7 @@ @property (nonatomic, strong, readonly) UIView *interfaceView; @property (nonatomic, strong, readonly) TGModernGalleryScrollView *scrollView; -- (instancetype)initWithFrame:(CGRect)frame itemPadding:(CGFloat)itemPadding interfaceView:(UIView *)interfaceView previewMode:(bool)previewMode previewSize:(CGSize)previewSize; +- (instancetype)initWithFrame:(CGRect)frame context:(id)context itemPadding:(CGFloat)itemPadding interfaceView:(UIView *)interfaceView previewMode:(bool)previewMode previewSize:(CGSize)previewSize; - (bool)shouldAutorotate; diff --git a/LegacyComponents/TGModernGalleryView.m b/LegacyComponents/TGModernGalleryView.m index 5d4f147369..165066157c 100644 --- a/LegacyComponents/TGModernGalleryView.m +++ b/LegacyComponents/TGModernGalleryView.m @@ -27,6 +27,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; CGFloat _scrollViewVerticalOffset; UIView *_instantDismissView; + id _context; } @end @@ -38,7 +39,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; return nil; } -- (instancetype)initWithFrame:(CGRect)frame itemPadding:(CGFloat)itemPadding interfaceView:(UIView *)interfaceView previewMode:(bool)previewMode previewSize:(CGSize)previewSize +- (instancetype)initWithFrame:(CGRect)frame context:(id)context itemPadding:(CGFloat)itemPadding interfaceView:(UIView *)interfaceView previewMode:(bool)previewMode previewSize:(CGSize)previewSize { _previewMode = previewMode; _previewSize = previewSize; @@ -46,6 +47,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; self = [super initWithFrame:frame]; if (self != nil) { + _context = context; _itemPadding = itemPadding; self.opaque = false; @@ -149,7 +151,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^ { _interfaceView.alpha = 0.0f; - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; } completion:nil]; } else @@ -158,7 +160,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; { _interfaceView.alpha = 1.0f; if (![_interfaceView prefersStatusBarHidden]) - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; } completion:nil]; } } @@ -172,7 +174,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; { _interfaceView.alpha = 1.0f; if (![_interfaceView prefersStatusBarHidden]) - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; } completion:nil]; } } @@ -186,7 +188,7 @@ static const CGFloat swipeDistanceThreshold = 128.0f; [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^ { _interfaceView.alpha = 0.0f; - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; } completion:nil]; } } diff --git a/LegacyComponents/TGOverlayController.h b/LegacyComponents/TGOverlayController.h index 24b14265fe..32dbc5df1b 100644 --- a/LegacyComponents/TGOverlayController.h +++ b/LegacyComponents/TGOverlayController.h @@ -6,6 +6,7 @@ @property (nonatomic, weak) TGOverlayControllerWindow *overlayWindow; @property (nonatomic, assign) bool isImportant; +@property (nonatomic, copy) void (^customDismissBlock)(); - (void)dismiss; diff --git a/LegacyComponents/TGOverlayController.m b/LegacyComponents/TGOverlayController.m index 61e84914d5..fc7cdfb7ab 100644 --- a/LegacyComponents/TGOverlayController.m +++ b/LegacyComponents/TGOverlayController.m @@ -21,6 +21,10 @@ { TGOverlayControllerWindow *overlayWindow = _overlayWindow; [overlayWindow dismiss]; + + if (_customDismissBlock) { + _customDismissBlock(); + } } @end diff --git a/LegacyComponents/TGOverlayControllerWindow.h b/LegacyComponents/TGOverlayControllerWindow.h index fb61330339..7627217653 100644 --- a/LegacyComponents/TGOverlayControllerWindow.h +++ b/LegacyComponents/TGOverlayControllerWindow.h @@ -1,4 +1,5 @@ #import +#import @class TGViewController; @class TGOverlayController; @@ -16,8 +17,8 @@ @property (nonatomic) bool dismissByMenuSheet; -- (instancetype)initWithParentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController; -- (instancetype)initWithParentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController keepKeyboard:(bool)keepKeyboard; +- (instancetype)initWithManager:(id)manager parentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController; +- (instancetype)initWithManager:(id)manager parentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController keepKeyboard:(bool)keepKeyboard; - (void)dismiss; diff --git a/LegacyComponents/TGOverlayControllerWindow.m b/LegacyComponents/TGOverlayControllerWindow.m index a254369ccf..6605d2381b 100644 --- a/LegacyComponents/TGOverlayControllerWindow.m +++ b/LegacyComponents/TGOverlayControllerWindow.m @@ -10,7 +10,7 @@ - (UIViewController *)statusBarAppearanceSourceController { - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; + UIViewController *rootController = [[LegacyComponentsGlobals provider] applicationWindows].firstObject.rootViewController; UIViewController *topViewController = nil; if ([rootController respondsToSelector:@selector(viewControllers)]) { topViewController = [(UINavigationController *)rootController viewControllers].lastObject; @@ -43,7 +43,7 @@ - (UIViewController *)autorotationSourceController { - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; + UIViewController *rootController = [[LegacyComponentsGlobals provider] applicationWindows].firstObject.rootViewController; UIViewController *topViewController = nil; if ([rootController respondsToSelector:@selector(viewControllers)]) { topViewController = [(UINavigationController *)rootController viewControllers].lastObject; @@ -90,7 +90,7 @@ } } - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; + UIViewController *rootController = [[LegacyComponentsGlobals provider] applicationWindows].firstObject.rootViewController; if (rootController.presentedViewController != nil) return [rootController.presentedViewController shouldAutorotate]; @@ -136,23 +136,30 @@ @interface TGOverlayControllerWindow () { __weak TGViewController *_parentController; + id _manager; + bool _managedIsHidden; + TGOverlayController *_contentController; } @end @implementation TGOverlayControllerWindow -- (instancetype)initWithParentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController +- (instancetype)initWithManager:(id)manager parentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController { - return [self initWithParentController:parentController contentController:contentController keepKeyboard:false]; + return [self initWithManager:manager parentController:parentController contentController:contentController keepKeyboard:false]; } -- (instancetype)initWithParentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController keepKeyboard:(bool)keepKeyboard +- (instancetype)initWithManager:(id)manager parentController:(TGViewController *)parentController contentController:(TGOverlayController *)contentController keepKeyboard:(bool)keepKeyboard { - _keepKeyboard = keepKeyboard; + assert(manager != nil); - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; - self = [super initWithFrame:[rootController applicationBounds]]; + if (self != nil) { + _keepKeyboard = keepKeyboard; + _manager = manager; + } + + self = [super initWithFrame:[[_manager context] fullscreenBounds]]; if (self != nil) { self.windowLevel = UIWindowLevelStatusBar - 0.001f; @@ -160,8 +167,18 @@ _parentController = parentController; [parentController.associatedWindowStack addObject:self]; - contentController.overlayWindow = self; - self.rootViewController = contentController; + if ([_manager managesWindow]) { + _contentController = contentController; + __weak TGOverlayControllerWindow *weakSelf = self; + contentController.customDismissBlock = ^{ + __strong TGOverlayControllerWindow *strongSelf = weakSelf; + [manager setHidden:true window:strongSelf]; + }; + [_manager bindController:contentController]; + } else { + contentController.overlayWindow = self; + self.rootViewController = contentController; + } } return self; } @@ -194,12 +211,28 @@ self.rootViewController = nil; } +- (BOOL)isHidden { + if ([_manager managesWindow]) { + return _managedIsHidden; + } else { + return [super isHidden]; + } +} + - (void)setHidden:(BOOL)hidden { - [super setHidden:hidden]; - - if (!hidden && !_keepKeyboard) { - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; - [rootController.view.window endEditing:true]; + if ([_manager managesWindow]) { + if (![super isHidden]) { + [super setHidden:true]; + } + + _managedIsHidden = hidden; + [_manager setHidden:hidden window:self]; + } else { + [super setHidden:hidden]; + + if (!hidden && !_keepKeyboard) { + [[[LegacyComponentsGlobals provider] applicationWindows].firstObject endEditing:true]; + } } } diff --git a/LegacyComponents/TGPaintShader.m b/LegacyComponents/TGPaintShader.m index 259c322371..cff09ecf54 100644 --- a/LegacyComponents/TGPaintShader.m +++ b/LegacyComponents/TGPaintShader.m @@ -18,14 +18,14 @@ _program = glCreateProgram(); - NSString *vShaderFilename = [[NSBundle mainBundle] pathForResource:vertexShader ofType:@"vsh"]; + NSString *vShaderFilename = TGComponentsPathForResource(vertexShader, @"vsh"); if (![self _compileShader:&vShader type:GL_VERTEX_SHADER fileName:vShaderFilename]) { [self _destroyVertexShader:vShader fragmentShader:fShader program:_program]; return nil; } - NSString *fShaderFilename = [[NSBundle mainBundle] pathForResource:fragmentShader ofType:@"fsh"]; + NSString *fShaderFilename = TGComponentsPathForResource(fragmentShader, @"fsh"); if (![self _compileShader:&fShader type:GL_FRAGMENT_SHADER fileName:fShaderFilename]) { [self _destroyVertexShader:vShader fragmentShader:fShader program:_program]; diff --git a/LegacyComponents/TGPasscodeEntryController.h b/LegacyComponents/TGPasscodeEntryController.h index 3362ef884f..2a5da3c1a5 100644 --- a/LegacyComponents/TGPasscodeEntryController.h +++ b/LegacyComponents/TGPasscodeEntryController.h @@ -33,7 +33,7 @@ typedef enum { @property (nonatomic, copy) void (^updateAttemptData)(TGPasscodeEntryAttemptData *); @property (nonatomic) bool allowTouchId; -- (instancetype)initWithStyle:(TGPasscodeEntryControllerStyle)style mode:(TGPasscodeEntryControllerMode)mode cancelEnabled:(bool)cancelEnabled allowTouchId:(bool)allowTouchId attemptData:(TGPasscodeEntryAttemptData *)attemptData completion:(void (^)(NSString *))completion; +- (instancetype)initWithContext:(id)context style:(TGPasscodeEntryControllerStyle)style mode:(TGPasscodeEntryControllerMode)mode cancelEnabled:(bool)cancelEnabled allowTouchId:(bool)allowTouchId attemptData:(TGPasscodeEntryAttemptData *)attemptData completion:(void (^)(NSString *))completion; - (void)resetMode:(TGPasscodeEntryControllerMode)mode; - (void)refreshTouchId; diff --git a/LegacyComponents/TGPasscodeEntryController.m b/LegacyComponents/TGPasscodeEntryController.m index e7ea4d2e57..93e88e0198 100644 --- a/LegacyComponents/TGPasscodeEntryController.m +++ b/LegacyComponents/TGPasscodeEntryController.m @@ -55,9 +55,9 @@ typedef enum { @implementation TGPasscodeEntryController -- (instancetype)initWithStyle:(TGPasscodeEntryControllerStyle)style mode:(TGPasscodeEntryControllerMode)mode cancelEnabled:(bool)cancelEnabled allowTouchId:(bool)allowTouchId attemptData:(TGPasscodeEntryAttemptData *)attemptData completion:(void (^)(NSString *))completion +- (instancetype)initWithContext:(id)context style:(TGPasscodeEntryControllerStyle)style mode:(TGPasscodeEntryControllerMode)mode cancelEnabled:(bool)cancelEnabled allowTouchId:(bool)allowTouchId attemptData:(TGPasscodeEntryAttemptData *)attemptData completion:(void (^)(NSString *))completion { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _style = style; diff --git a/LegacyComponents/TGPhotoAvatarCropController.h b/LegacyComponents/TGPhotoAvatarCropController.h index 26a78b9271..0078bbbce7 100644 --- a/LegacyComponents/TGPhotoAvatarCropController.h +++ b/LegacyComponents/TGPhotoAvatarCropController.h @@ -13,7 +13,7 @@ @property (nonatomic, copy) void (^finishedPhotoProcessing)(void); -- (instancetype)initWithPhotoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; +- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; - (void)setImage:(UIImage *)image; - (void)setSnapshotImage:(UIImage *)snapshotImage; diff --git a/LegacyComponents/TGPhotoAvatarCropController.m b/LegacyComponents/TGPhotoAvatarCropController.m index 55fb33abca..5880e68cdb 100644 --- a/LegacyComponents/TGPhotoAvatarCropController.m +++ b/LegacyComponents/TGPhotoAvatarCropController.m @@ -44,9 +44,9 @@ const CGFloat TGPhotoAvatarCropButtonsWrapperSize = 61.0f; @implementation TGPhotoAvatarCropController -- (instancetype)initWithPhotoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView +- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { self.photoEditor = photoEditor; @@ -112,7 +112,7 @@ const CGFloat TGPhotoAvatarCropButtonsWrapperSize = 61.0f; _rotateButton.exclusiveTouch = true; _rotateButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); [_rotateButton addTarget:self action:@selector(rotate) forControlEvents:UIControlEventTouchUpInside]; - [_rotateButton setImage:[UIImage imageNamed:@"PhotoEditorRotateIcon"] forState:UIControlStateNormal]; + [_rotateButton setImage:TGComponentsImageNamed(@"PhotoEditorRotateIcon") forState:UIControlStateNormal]; [_buttonsWrapperView addSubview:_rotateButton]; _mirrorButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 36, 36)]; @@ -120,7 +120,7 @@ const CGFloat TGPhotoAvatarCropButtonsWrapperSize = 61.0f; _mirrorButton.imageEdgeInsets = UIEdgeInsetsMake(4.0f, 0.0f, 0.0f, 0.0f); _mirrorButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); [_mirrorButton addTarget:self action:@selector(mirror) forControlEvents:UIControlEventTouchUpInside]; - [_mirrorButton setImage:[UIImage imageNamed:@"PhotoEditorMirrorIcon"] forState:UIControlStateNormal]; + [_mirrorButton setImage:TGComponentsImageNamed(@"PhotoEditorMirrorIcon") forState:UIControlStateNormal]; [_buttonsWrapperView addSubview:_mirrorButton]; _resetButton = [[TGModernButton alloc] init]; diff --git a/LegacyComponents/TGPhotoBrushSettingsView.m b/LegacyComponents/TGPhotoBrushSettingsView.m index 846003d68f..f97ca65ace 100644 --- a/LegacyComponents/TGPhotoBrushSettingsView.m +++ b/LegacyComponents/TGPhotoBrushSettingsView.m @@ -74,7 +74,7 @@ const CGFloat TGPhotoBrushSettingsItemHeight = 44.0f; _brushViews = brushViews; _brushSeparatorViews = separatorViews; - _selectedCheckView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PaintCheck"]]; + _selectedCheckView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"PaintCheck")]; _selectedCheckView.frame = CGRectMake(15.0f, 16.0f, _selectedCheckView.frame.size.width, _selectedCheckView.frame.size.height); } return self; diff --git a/LegacyComponents/TGPhotoCropAreaView.m b/LegacyComponents/TGPhotoCropAreaView.m index 055ac4266c..b1203b43ea 100644 --- a/LegacyComponents/TGPhotoCropAreaView.m +++ b/LegacyComponents/TGPhotoCropAreaView.m @@ -1,5 +1,7 @@ #import "TGPhotoCropAreaView.h" +#import "LegacyComponentsInternal.h" + #import "TGPhotoCropGridView.h" #import @@ -126,7 +128,7 @@ const CGFloat TGPhotoCropEdgeControlSize = 44; _cornersView = [[UIImageView alloc] initWithFrame:CGRectInset(self.bounds, -2, -2)]; _cornersView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - _cornersView.image = [[UIImage imageNamed:@"PhotoEditorCropCorners"] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 20, 20, 20)]; + _cornersView.image = [TGComponentsImageNamed(@"PhotoEditorCropCorners") resizableImageWithCapInsets:UIEdgeInsetsMake(20, 20, 20, 20)]; [self addSubview:_cornersView]; _topEdgeHighlight = [[UIView alloc] initWithFrame:CGRectMake(0, -1, frame.size.width, 2)]; diff --git a/LegacyComponents/TGPhotoCropController.m b/LegacyComponents/TGPhotoCropController.m index 4be204bfb0..9dbb9ff216 100644 --- a/LegacyComponents/TGPhotoCropController.m +++ b/LegacyComponents/TGPhotoCropController.m @@ -71,7 +71,7 @@ NSString * const TGPhotoCropOriginalAspectRatio = @"original"; - (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView metadata:(PGCameraShotMetadata *)metadata forVideo:(bool)forVideo { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _context = context; @@ -157,7 +157,7 @@ NSString * const TGPhotoCropOriginalAspectRatio = @"original"; _rotateButton.exclusiveTouch = true; _rotateButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); [_rotateButton addTarget:self action:@selector(rotate) forControlEvents:UIControlEventTouchUpInside]; - [_rotateButton setImage:[UIImage imageNamed:@"PhotoEditorRotateIcon"] forState:UIControlStateNormal]; + [_rotateButton setImage:TGComponentsImageNamed(@"PhotoEditorRotateIcon") forState:UIControlStateNormal]; //[_buttonsWrapperView addSubview:_rotateButton]; _mirrorButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 36, 36)]; @@ -165,15 +165,15 @@ NSString * const TGPhotoCropOriginalAspectRatio = @"original"; _mirrorButton.imageEdgeInsets = UIEdgeInsetsMake(4.0f, 0.0f, 0.0f, 0.0f); _mirrorButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); [_mirrorButton addTarget:self action:@selector(mirror) forControlEvents:UIControlEventTouchUpInside]; - [_mirrorButton setImage:[UIImage imageNamed:@"PhotoEditorMirrorIcon"] forState:UIControlStateNormal]; + [_mirrorButton setImage:TGComponentsImageNamed(@"PhotoEditorMirrorIcon") forState:UIControlStateNormal]; //[_buttonsWrapperView addSubview:_mirrorButton]; _aspectRatioButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 36, 36)]; _aspectRatioButton.exclusiveTouch = true; _aspectRatioButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); [_aspectRatioButton addTarget:self action:@selector(aspectRatioButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - UIImage *aspectRatioHighlightedImage = TGTintedImage([UIImage imageNamed:@"PhotoEditorAspectRatioIcon"], [TGPhotoEditorInterfaceAssets accentColor]); - [_aspectRatioButton setImage:[UIImage imageNamed:@"PhotoEditorAspectRatioIcon"] forState:UIControlStateNormal]; + UIImage *aspectRatioHighlightedImage = TGTintedImage(TGComponentsImageNamed(@"PhotoEditorAspectRatioIcon"), [TGPhotoEditorInterfaceAssets accentColor]); + [_aspectRatioButton setImage:TGComponentsImageNamed(@"PhotoEditorAspectRatioIcon") forState:UIControlStateNormal]; [_aspectRatioButton setImage:aspectRatioHighlightedImage forState:UIControlStateSelected]; [_aspectRatioButton setImage:aspectRatioHighlightedImage forState:UIControlStateSelected | UIControlStateHighlighted]; //[_buttonsWrapperView addSubview:_aspectRatioButton]; diff --git a/LegacyComponents/TGPhotoCropRotationView.m b/LegacyComponents/TGPhotoCropRotationView.m index fd177da1e0..481be6d11d 100644 --- a/LegacyComponents/TGPhotoCropRotationView.m +++ b/LegacyComponents/TGPhotoCropRotationView.m @@ -1,6 +1,7 @@ #import "TGPhotoCropRotationView.h" -#import +#import "LegacyComponentsInternal.h" +#import "POPSpringAnimation.h" #import @@ -33,13 +34,13 @@ const CGFloat TGPhotoCropRotationViewMaximumAngle = 45; _wheelView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 400, 400)]; _wheelView.alpha = 0.9f; - _wheelView.image = [UIImage imageNamed:@"PhotoEditorRotationWheel"]; + _wheelView.image = TGComponentsImageNamed(@"PhotoEditorRotationWheel"); [self addSubview:_wheelView]; _needleView = [[UIImageView alloc] initWithFrame:CGRectZero]; _needleView.alpha = 0.9f; _needleView.contentMode = UIViewContentModeCenter; - _needleView.image = [UIImage imageNamed:@"PhotoEditorRotationNeedle"]; + _needleView.image = TGComponentsImageNamed(@"PhotoEditorRotationNeedle"); [self addSubview:_needleView]; _pressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlePress:)]; @@ -287,7 +288,7 @@ const CGFloat TGPhotoCropRotationViewMaximumAngle = 45; { case UIInterfaceOrientationLandscapeLeft: { - _wheelView.image = [UIImage imageNamed:@"PhotoEditorRotationWheelLeft"]; + _wheelView.image = TGComponentsImageNamed(@"PhotoEditorRotationWheelLeft"); _wheelView.center = CGPointMake(52 + 200, self.frame.size.height / 2); _needleView.frame = CGRectMake(43, (self.frame.size.height - 10) / 2, 10, 10); @@ -297,7 +298,7 @@ const CGFloat TGPhotoCropRotationViewMaximumAngle = 45; case UIInterfaceOrientationLandscapeRight: { - _wheelView.image = [UIImage imageNamed:@"PhotoEditorRotationWheelRight"]; + _wheelView.image = TGComponentsImageNamed(@"PhotoEditorRotationWheelRight"); _wheelView.center = CGPointMake(-152, self.frame.size.height / 2); _needleView.frame = CGRectMake(self.frame.size.width - 53, (self.frame.size.height - 10) / 2, 10, 10); @@ -307,7 +308,7 @@ const CGFloat TGPhotoCropRotationViewMaximumAngle = 45; default: { - _wheelView.image = [UIImage imageNamed:@"PhotoEditorRotationWheel"]; + _wheelView.image = TGComponentsImageNamed(@"PhotoEditorRotationWheel"); _wheelView.center = CGPointMake(self.frame.size.width / 2, -152); _needleView.frame = CGRectMake((self.frame.size.width - 10) / 2, 47, 10, 10); diff --git a/LegacyComponents/TGPhotoEditorBlurToolView.m b/LegacyComponents/TGPhotoEditorBlurToolView.m index 43af91eaa9..5d02fb84e7 100644 --- a/LegacyComponents/TGPhotoEditorBlurToolView.m +++ b/LegacyComponents/TGPhotoEditorBlurToolView.m @@ -63,21 +63,21 @@ _offButton = [[TGPhotoEditorBlurTypeButton alloc] initWithFrame:CGRectZero]; _offButton.tag = PGBlurToolTypeNone; [_offButton addTarget:self action:@selector(blurButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [_offButton setImage:[UIImage imageNamed:@"PhotoEditorBlurOff"]]; + [_offButton setImage:TGComponentsImageNamed(@"PhotoEditorBlurOff")]; [_offButton setTitle:TGLocalized(@"PhotoEditor.BlurToolOff")]; [_buttonsWrapper addSubview:_offButton]; _radialButton = [[TGPhotoEditorBlurTypeButton alloc] initWithFrame:CGRectZero]; _radialButton.tag = PGBlurToolTypeRadial; [_radialButton addTarget:self action:@selector(blurButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [_radialButton setImage:[UIImage imageNamed:@"PhotoEditorBlurRadial"]]; + [_radialButton setImage:TGComponentsImageNamed(@"PhotoEditorBlurRadial")]; [_radialButton setTitle:TGLocalized(@"PhotoEditor.BlurToolRadial")]; [_buttonsWrapper addSubview:_radialButton]; _linearButton = [[TGPhotoEditorBlurTypeButton alloc] initWithFrame:CGRectZero]; _linearButton.tag = PGBlurToolTypeLinear; [_linearButton addTarget:self action:@selector(blurButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [_linearButton setImage:[UIImage imageNamed:@"PhotoEditorBlurLinear"]]; + [_linearButton setImage:TGComponentsImageNamed(@"PhotoEditorBlurLinear")]; [_linearButton setTitle:TGLocalized(@"PhotoEditor.BlurToolLinear")]; [_buttonsWrapper addSubview:_linearButton]; diff --git a/LegacyComponents/TGPhotoEditorController.m b/LegacyComponents/TGPhotoEditorController.m index 5e82f9ebc8..8e9ee230fc 100644 --- a/LegacyComponents/TGPhotoEditorController.m +++ b/LegacyComponents/TGPhotoEditorController.m @@ -99,7 +99,7 @@ - (instancetype)initWithContext:(id)context item:(id)item intent:(TGPhotoEditorControllerIntent)intent adjustments:(id)adjustments caption:(NSString *)caption screenImage:(UIImage *)screenImage availableTabs:(TGPhotoEditorTab)availableTabs selectedTab:(TGPhotoEditorTab)selectedTab { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _context = context; @@ -133,6 +133,8 @@ _photoEditor.trimStartValue = videoAdjustments.trimStartValue; _photoEditor.trimEndValue = videoAdjustments.trimEndValue; } + + self.customAppearanceMethodsForwarding = true; } return self; } @@ -410,12 +412,12 @@ { [UIView animateWithDuration:0.3 animations:^ { - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; }]; } else { - [TGHacks setApplicationStatusBarAlpha:0.0f]; + [_context setApplicationStatusBarAlpha:0.0f]; } } else if (!self.dontHideStatusBar) @@ -460,12 +462,12 @@ { [UIView animateWithDuration:0.3 animations:^ { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; }]; } else { - [TGHacks setApplicationStatusBarAlpha:1.0f]; + [_context setApplicationStatusBarAlpha:1.0f]; } } @@ -849,7 +851,7 @@ if ([self presentedForAvatarCreation]) { - TGPhotoAvatarCropController *cropController = [[TGPhotoAvatarCropController alloc] initWithPhotoEditor:_photoEditor previewView:_previewView]; + TGPhotoAvatarCropController *cropController = [[TGPhotoAvatarCropController alloc] initWithContext:_context photoEditor:_photoEditor previewView:_previewView]; bool skipInitialTransition = (![self presentedFromCamera] && self.navigationController != nil) || self.skipInitialTransition; cropController.fromCamera = [self presentedFromCamera]; @@ -1066,7 +1068,7 @@ case TGPhotoEditorToolsTab: { - TGPhotoToolsController *toolsController = [[TGPhotoToolsController alloc] initWithPhotoEditor:_photoEditor previewView:_previewView]; + TGPhotoToolsController *toolsController = [[TGPhotoToolsController alloc] initWithContext:_context photoEditor:_photoEditor previewView:_previewView]; toolsController.toolbarLandscapeSize = TGPhotoEditorToolbarSize; toolsController.beginTransitionIn = ^UIView *(CGRect *referenceFrame, UIView **parentView, bool *noTransitionView) { @@ -1096,7 +1098,7 @@ { _ignoreDefaultPreviewViewTransitionIn = true; - TGPhotoQualityController *qualityController = [[TGPhotoQualityController alloc] initWithPhotoEditor:_photoEditor previewView:_previewView]; + TGPhotoQualityController *qualityController = [[TGPhotoQualityController alloc] initWithContext:_context photoEditor:_photoEditor previewView:_previewView]; qualityController.item = _item; qualityController.toolbarLandscapeSize = TGPhotoEditorToolbarSize; qualityController.beginTransitionIn = ^UIView *(CGRect *referenceFrame, UIView **parentView, bool *noTransitionView) diff --git a/LegacyComponents/TGPhotoEditorInterfaceAssets.m b/LegacyComponents/TGPhotoEditorInterfaceAssets.m index b1b4cc5691..33ef9ca4ba 100644 --- a/LegacyComponents/TGPhotoEditorInterfaceAssets.m +++ b/LegacyComponents/TGPhotoEditorInterfaceAssets.m @@ -43,87 +43,87 @@ + (UIImage *)captionIcon { - return [UIImage imageNamed:@"PhotoEditorCaption.png"]; + return TGComponentsImageNamed(@"PhotoEditorCaption.png"); } + (UIImage *)cropIcon { - return [UIImage imageNamed:@"PhotoEditorCrop.png"]; + return TGComponentsImageNamed(@"PhotoEditorCrop.png"); } + (UIImage *)toolsIcon { - return [UIImage imageNamed:@"PhotoEditorTools.png"]; + return TGComponentsImageNamed(@"PhotoEditorTools.png"); } + (UIImage *)rotateIcon { - return [UIImage imageNamed:@"PhotoEditorRotateIcon.png"]; + return TGComponentsImageNamed(@"PhotoEditorRotateIcon.png"); } + (UIImage *)paintIcon { - return [UIImage imageNamed:@"PhotoEditorPaint.png"]; + return TGComponentsImageNamed(@"PhotoEditorPaint.png"); } + (UIImage *)stickerIcon { - return [UIImage imageNamed:@"PaintStickersIcon.png"]; + return TGComponentsImageNamed(@"PaintStickersIcon.png"); } + (UIImage *)textIcon { - return [UIImage imageNamed:@"PaintTextIcon.png"]; + return TGComponentsImageNamed(@"PaintTextIcon.png"); } + (UIImage *)eraserIcon { - return [UIImage imageNamed:@"PaintEraserIcon.png"]; + return TGComponentsImageNamed(@"PaintEraserIcon.png"); } + (UIImage *)mirrorIcon { - return [UIImage imageNamed:@"PhotoEditorMirrorIcon.png"]; + return TGComponentsImageNamed(@"PhotoEditorMirrorIcon.png"); } + (UIImage *)aspectRatioIcon { - return [UIImage imageNamed:@"PhotoEditorAspectRatioIcon.png"]; + return TGComponentsImageNamed(@"PhotoEditorAspectRatioIcon.png"); } + (UIImage *)aspectRatioActiveIcon { - return TGTintedImage([UIImage imageNamed:@"PhotoEditorAspectRatioIcon.png"], [self accentColor]); + return TGTintedImage(TGComponentsImageNamed(@"PhotoEditorAspectRatioIcon.png"), [self accentColor]); } + (UIImage *)tintIcon { - return [UIImage imageNamed:@"PhotoEditorTintIcon.png"]; + return TGComponentsImageNamed(@"PhotoEditorTintIcon.png"); } + (UIImage *)blurIcon { - return [UIImage imageNamed:@"PhotoEditorBlurIcon.png"]; + return TGComponentsImageNamed(@"PhotoEditorBlurIcon.png"); } + (UIImage *)curvesIcon { - return [UIImage imageNamed:@"PhotoEditorCurvesIcon.png"]; + return TGComponentsImageNamed(@"PhotoEditorCurvesIcon.png"); } + (UIImage *)gifIcon { - return [UIImage imageNamed:@"PhotoEditorMute.png"]; + return TGComponentsImageNamed(@"PhotoEditorMute.png"); } + (UIImage *)gifActiveIcon { - return [UIImage imageNamed:@"PhotoEditorMuteActive.png"]; + return TGComponentsImageNamed(@"PhotoEditorMuteActive.png"); } + (UIImage *)qualityIconForPreset:(TGMediaVideoConversionPreset)preset { - UIImage *background = [UIImage imageNamed:@"PhotoEditorQuality"]; + UIImage *background = TGComponentsImageNamed(@"PhotoEditorQuality"); UIGraphicsBeginImageContextWithOptions(background.size, false, 0.0f); @@ -172,11 +172,11 @@ { if (value < FLT_EPSILON) { - return [UIImage imageNamed:@"PhotoEditorTimer0"]; + return TGComponentsImageNamed(@"PhotoEditorTimer0"); } else { - UIImage *background = [UIImage imageNamed:@"PhotoEditorTimer"]; + UIImage *background = TGComponentsImageNamed(@"PhotoEditorTimer"); UIGraphicsBeginImageContextWithOptions(background.size, false, 0.0f); CGContextRef context = UIGraphicsGetCurrentContext(); diff --git a/LegacyComponents/TGPhotoEditorItemController.h b/LegacyComponents/TGPhotoEditorItemController.h index ac3a9c4124..008fd2eb10 100644 --- a/LegacyComponents/TGPhotoEditorItemController.h +++ b/LegacyComponents/TGPhotoEditorItemController.h @@ -1,4 +1,4 @@ -#import +#import #import "PGPhotoEditorItem.h" @@ -16,7 +16,7 @@ @property (nonatomic, assign) bool initialAppearance; @property (nonatomic, assign) bool skipProcessingOnCompletion; -- (instancetype)initWithEditorItem:(id)editorItem photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; +- (instancetype)initWithContext:(id)context editorItem:(id)editorItem photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; - (void)attachPreviewView:(TGPhotoEditorPreviewView *)previewView; diff --git a/LegacyComponents/TGPhotoEditorItemController.m b/LegacyComponents/TGPhotoEditorItemController.m index 78814d7053..858919f0d4 100644 --- a/LegacyComponents/TGPhotoEditorItemController.m +++ b/LegacyComponents/TGPhotoEditorItemController.m @@ -47,9 +47,9 @@ @implementation TGPhotoEditorItemController -- (instancetype)initWithEditorItem:(id)editorItem photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView +- (instancetype)initWithContext:(id)context editorItem:(id)editorItem photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _editorItem = editorItem; diff --git a/LegacyComponents/TGPhotoPaintActionsView.m b/LegacyComponents/TGPhotoPaintActionsView.m index c3b7d69155..1ea991476d 100644 --- a/LegacyComponents/TGPhotoPaintActionsView.m +++ b/LegacyComponents/TGPhotoPaintActionsView.m @@ -24,7 +24,7 @@ _undoButton.adjustsImageWhenDisabled = false; _undoButton.enabled = false; _undoButton.exclusiveTouch = true; - [_undoButton setImage:[UIImage imageNamed:@"PaintUndoIcon"] forState:UIControlStateNormal]; + [_undoButton setImage:TGComponentsImageNamed(@"PaintUndoIcon") forState:UIControlStateNormal]; [_undoButton addTarget:self action:@selector(undoButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_undoButton]; @@ -32,7 +32,7 @@ _redoButton.adjustsImageWhenDisabled = false; _redoButton.enabled = false; _redoButton.exclusiveTouch = true; - [_redoButton setImage:[UIImage imageNamed:@"PaintRedoIcon"] forState:UIControlStateNormal]; + [_redoButton setImage:TGComponentsImageNamed(@"PaintRedoIcon") forState:UIControlStateNormal]; [_redoButton addTarget:self action:@selector(redoButtonPressed) forControlEvents:UIControlEventTouchUpInside]; //[self addSubview:_redoButton]; diff --git a/LegacyComponents/TGPhotoPaintController.m b/LegacyComponents/TGPhotoPaintController.m index bf9b9dcbfe..49d6fe0879 100644 --- a/LegacyComponents/TGPhotoPaintController.m +++ b/LegacyComponents/TGPhotoPaintController.m @@ -136,7 +136,7 @@ const CGFloat TGPhotoPaintStickerKeyboardSize = 260.0f; - (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { _context = context; diff --git a/LegacyComponents/TGPhotoPaintSettingsView.m b/LegacyComponents/TGPhotoPaintSettingsView.m index 11c99f2be4..f8380bb730 100644 --- a/LegacyComponents/TGPhotoPaintSettingsView.m +++ b/LegacyComponents/TGPhotoPaintSettingsView.m @@ -147,15 +147,15 @@ const CGFloat TGPhotoPaintSettingsPadPickerWidth = 360.0f; switch (icon) { case TGPhotoPaintSettingsViewIconBrush: - iconImage = [UIImage imageNamed:@"PaintBrushIcon"]; + iconImage = TGComponentsImageNamed(@"PaintBrushIcon"); break; case TGPhotoPaintSettingsViewIconText: - iconImage = [UIImage imageNamed:@"PaintTextSettingsIcon"]; + iconImage = TGComponentsImageNamed(@"PaintTextSettingsIcon"); break; case TGPhotoPaintSettingsViewIconMirror: - iconImage = [UIImage imageNamed:@"PaintMirrorIcon"]; + iconImage = TGComponentsImageNamed(@"PaintMirrorIcon"); break; } @@ -214,7 +214,7 @@ const CGFloat TGPhotoPaintSettingsPadPickerWidth = 360.0f; static UIImage *image; dispatch_once(&onceToken, ^ { - image = [TGTintedImage([UIImage imageNamed:@"PaintPopupLandscapeLeftBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupLandscapeLeftBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; }); return image; } @@ -225,7 +225,7 @@ const CGFloat TGPhotoPaintSettingsPadPickerWidth = 360.0f; static UIImage *image; dispatch_once(&onceToken, ^ { - image = [TGTintedImage([UIImage imageNamed:@"PaintPopupLandscapeRightBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupLandscapeRightBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; }); return image; } @@ -236,7 +236,7 @@ const CGFloat TGPhotoPaintSettingsPadPickerWidth = 360.0f; static UIImage *image; dispatch_once(&onceToken, ^ { - image = [TGTintedImage([UIImage imageNamed:@"PaintPopupPortraitBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupPortraitBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; }); return image; } diff --git a/LegacyComponents/TGPhotoQualityController.h b/LegacyComponents/TGPhotoQualityController.h index 57145d9ae9..0a33e72154 100644 --- a/LegacyComponents/TGPhotoQualityController.h +++ b/LegacyComponents/TGPhotoQualityController.h @@ -10,6 +10,6 @@ @property (nonatomic, readonly) TGMediaVideoConversionPreset preset; -- (instancetype)initWithPhotoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; +- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; @end diff --git a/LegacyComponents/TGPhotoQualityController.m b/LegacyComponents/TGPhotoQualityController.m index 0c4e71ab3f..c31d5acf1e 100644 --- a/LegacyComponents/TGPhotoQualityController.m +++ b/LegacyComponents/TGPhotoQualityController.m @@ -68,9 +68,9 @@ const NSTimeInterval TGPhotoQualityPreviewDuration = 15.0f; @implementation TGPhotoQualityController -- (instancetype)initWithPhotoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView +- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { self.photoEditor = photoEditor; diff --git a/LegacyComponents/TGPhotoStickersView.m b/LegacyComponents/TGPhotoStickersView.m index b9b8f5c8f8..34bcbf7322 100644 --- a/LegacyComponents/TGPhotoStickersView.m +++ b/LegacyComponents/TGPhotoStickersView.m @@ -108,7 +108,7 @@ typedef enum { _backgroundView = [[UIImageView alloc] init]; _backgroundView.alpha = 0.98f; - _backgroundView.image = [TGTintedImage([UIImage imageNamed:@"PaintPopupCenterBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + _backgroundView.image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupCenterBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; [self addSubview:_backgroundView]; } @@ -135,21 +135,21 @@ typedef enum { [_cancelButton sizeToFit]; [_wrapperView addSubview:_cancelButton]; - [_segmentedControl setBackgroundImage:TGTintedImage([UIImage imageNamed:@"ModernSegmentedControlBackground.png"], UIColorRGB(0xafb2b1)) forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - [_segmentedControl setBackgroundImage:TGTintedImage([UIImage imageNamed:@"ModernSegmentedControlSelected.png"], UIColorRGB(0xafb2b1)) forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; - [_segmentedControl setBackgroundImage:TGTintedImage([UIImage imageNamed:@"ModernSegmentedControlSelected.png"], UIColorRGB(0xafb2b1)) forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; - [_segmentedControl setBackgroundImage:[UIImage imageNamed:@"PaintSegmentedControlHighlighted.png"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; - [_segmentedControl setDividerImage:TGTintedImage([UIImage imageNamed:@"ModernSegmentedControlDivider.png"], UIColorRGB(0xafb2b1)) forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGTintedImage(TGComponentsImageNamed(@"ModernSegmentedControlBackground.png"), UIColorRGB(0xafb2b1)) forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGTintedImage(TGComponentsImageNamed(@"ModernSegmentedControlSelected.png"), UIColorRGB(0xafb2b1)) forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGTintedImage(TGComponentsImageNamed(@"ModernSegmentedControlSelected.png"), UIColorRGB(0xafb2b1)) forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGComponentsImageNamed(@"PaintSegmentedControlHighlighted.png") forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; + [_segmentedControl setDividerImage:TGTintedImage(TGComponentsImageNamed(@"ModernSegmentedControlDivider.png"), UIColorRGB(0xafb2b1)) forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [_segmentedControl setTitleTextAttributes:@{UITextAttributeTextColor: UIColorRGB(0xafb2b1), UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeFont: TGSystemFontOfSize(13)} forState:UIControlStateNormal]; [_segmentedControl setTitleTextAttributes:@{UITextAttributeTextColor: [UIColor blackColor], UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeFont: TGSystemFontOfSize(13)} forState:UIControlStateSelected]; } else { - [_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlBackground.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - [_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlSelected.png"] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; - [_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlSelected.png"] forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; - [_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlHighlighted.png"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; - [_segmentedControl setDividerImage:[UIImage imageNamed:@"ModernSegmentedControlDivider.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGComponentsImageNamed(@"ModernSegmentedControlBackground.png") forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGComponentsImageNamed(@"ModernSegmentedControlSelected.png") forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGComponentsImageNamed(@"ModernSegmentedControlSelected.png") forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; + [_segmentedControl setBackgroundImage:TGComponentsImageNamed(@"ModernSegmentedControlHighlighted.png") forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; + [_segmentedControl setDividerImage:TGComponentsImageNamed(@"ModernSegmentedControlDivider.png") forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [_segmentedControl setTitleTextAttributes:@{UITextAttributeTextColor: TGAccentColor(), UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeFont: TGSystemFontOfSize(13)} forState:UIControlStateNormal]; [_segmentedControl setTitleTextAttributes:@{UITextAttributeTextColor: [UIColor whiteColor], UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeFont: TGSystemFontOfSize(13)} forState:UIControlStateSelected]; } @@ -250,13 +250,17 @@ typedef enum { [strongSelf setStickerPacks:reversed maskStickerPacks:reversedMasks recentDocuments:recentStickers]; } - [self updateCurrentSection]; + [strongSelf updateCurrentSection]; } }]; } return self; } +- (void)dealloc { + [_stickerPacksDisposable dispose]; +} + - (CGSize)sizeThatFits:(CGSize)__unused size { return CGSizeMake(375.0f + TGPhotoStickersViewMargin * 2.0f, 568.0f + TGPhotoStickersViewMargin * 2.0f); diff --git a/LegacyComponents/TGPhotoTextSettingsView.m b/LegacyComponents/TGPhotoTextSettingsView.m index 3efd85b3ef..031f18da77 100644 --- a/LegacyComponents/TGPhotoTextSettingsView.m +++ b/LegacyComponents/TGPhotoTextSettingsView.m @@ -92,7 +92,7 @@ const CGFloat TGPhotoTextSettingsItemHeight = 44.0f; _fontViews = fontViews; _fontSeparatorViews = separatorViews; - _selectedCheckView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PaintCheck"]]; + _selectedCheckView = [[UIImageView alloc] initWithImage:TGComponentsImageNamed(@"PaintCheck")]; _selectedCheckView.frame = CGRectMake(15.0f, 16.0f, _selectedCheckView.frame.size.width, _selectedCheckView.frame.size.height); [self setStroke:selectedStroke]; @@ -204,21 +204,21 @@ const CGFloat TGPhotoTextSettingsItemHeight = 44.0f; { case UIInterfaceOrientationLandscapeLeft: { - _backgroundView.image = [TGTintedImage([UIImage imageNamed:@"PaintPopupLandscapeLeftBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + _backgroundView.image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupLandscapeLeftBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; _backgroundView.frame = CGRectMake(TGPhotoTextSettingsViewMargin - 13.0f, TGPhotoTextSettingsViewMargin, self.frame.size.width - TGPhotoTextSettingsViewMargin * 2 + 13.0f, self.frame.size.height - TGPhotoTextSettingsViewMargin * 2); } break; case UIInterfaceOrientationLandscapeRight: { - _backgroundView.image = [TGTintedImage([UIImage imageNamed:@"PaintPopupLandscapeRightBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + _backgroundView.image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupLandscapeRightBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; _backgroundView.frame = CGRectMake(TGPhotoTextSettingsViewMargin, TGPhotoTextSettingsViewMargin, self.frame.size.width - TGPhotoTextSettingsViewMargin * 2 + 13.0f, self.frame.size.height - TGPhotoTextSettingsViewMargin * 2); } break; default: { - _backgroundView.image = [TGTintedImage([UIImage imageNamed:@"PaintPopupPortraitBackground"], UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; + _backgroundView.image = [TGTintedImage(TGComponentsImageNamed(@"PaintPopupPortraitBackground"), UIColorRGB(0xf7f7f7)) resizableImageWithCapInsets:UIEdgeInsetsMake(32.0f, 32.0f, 32.0f, 32.0f)]; _backgroundView.frame = CGRectMake(TGPhotoTextSettingsViewMargin, TGPhotoTextSettingsViewMargin, self.frame.size.width - TGPhotoTextSettingsViewMargin * 2, self.frame.size.height - TGPhotoTextSettingsViewMargin * 2 + 13.0f); } break; diff --git a/LegacyComponents/TGPhotoToolbarView.m b/LegacyComponents/TGPhotoToolbarView.m index 40208545d6..e73ef9b462 100644 --- a/LegacyComponents/TGPhotoToolbarView.m +++ b/LegacyComponents/TGPhotoToolbarView.m @@ -44,11 +44,11 @@ switch (backButton) { case TGPhotoEditorBackButtonCancel: - cancelImage = [UIImage imageNamed:@"PhotoPickerCancelIcon"]; + cancelImage = TGComponentsImageNamed(@"PhotoPickerCancelIcon"); break; default: - cancelImage = [UIImage imageNamed:@"PhotoPickerBackIcon"]; + cancelImage = TGComponentsImageNamed(@"PhotoPickerBackIcon"); break; } [_cancelButton setImage:cancelImage forState:UIControlStateNormal]; @@ -60,11 +60,11 @@ switch (doneButton) { case TGPhotoEditorDoneButtonCheck: - doneImage = [UIImage imageNamed:@"PhotoPickerDoneIcon"]; + doneImage = TGComponentsImageNamed(@"PhotoPickerDoneIcon"); break; default: - doneImage = [UIImage imageNamed:@"PhotoPickerSendIcon"]; + doneImage = TGComponentsImageNamed(@"PhotoPickerSendIcon"); //buttonSize = CGSizeMake(52.0f, 52.0f); break; } diff --git a/LegacyComponents/TGPhotoToolsController.h b/LegacyComponents/TGPhotoToolsController.h index 3aa750a740..559c6a27db 100644 --- a/LegacyComponents/TGPhotoToolsController.h +++ b/LegacyComponents/TGPhotoToolsController.h @@ -6,7 +6,7 @@ @interface TGPhotoToolsController : TGPhotoEditorTabController -- (instancetype)initWithPhotoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; +- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; - (void)updateValues; diff --git a/LegacyComponents/TGPhotoToolsController.m b/LegacyComponents/TGPhotoToolsController.m index e40bfcf3fd..5955492262 100644 --- a/LegacyComponents/TGPhotoToolsController.m +++ b/LegacyComponents/TGPhotoToolsController.m @@ -68,9 +68,9 @@ const CGFloat TGPhotoEditorToolsLandscapePanelSize = TGPhotoEditorToolsPanelSize @implementation TGPhotoToolsController -- (instancetype)initWithPhotoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView +- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView { - self = [super init]; + self = [super initWithContext:context]; if (self != nil) { self.photoEditor = photoEditor; diff --git a/LegacyComponents/TGProgressWindow.m b/LegacyComponents/TGProgressWindow.m index 4efdcb8d05..a3166466de 100644 --- a/LegacyComponents/TGProgressWindow.m +++ b/LegacyComponents/TGProgressWindow.m @@ -2,7 +2,6 @@ #import "LegacyComponentsInternal.h" -#import "TGActivityIndicatorView.h" #import "TGProgressSpinnerView.h" @interface TGProgressWindowController () diff --git a/LegacyComponents/TGStickerCollectionViewCell.m b/LegacyComponents/TGStickerCollectionViewCell.m index bb2c73b857..3d08182b89 100644 --- a/LegacyComponents/TGStickerCollectionViewCell.m +++ b/LegacyComponents/TGStickerCollectionViewCell.m @@ -58,6 +58,7 @@ [uri appendFormat:@"&legacyThumbnailUri=%@", [TGStringUtils stringByEscapingForURL:legacyThumbnailUri]]; [uri appendFormat:@"&width=124&height=124"]; + [uri appendFormat:@"&dimwidth=%d&dimheight=%d", (int)[documentMedia pictureSize].width, (int)[documentMedia pictureSize].height]; [uri appendFormat:@"&highQuality=1"]; [_imageView loadUri:uri withOptions:nil]; diff --git a/LegacyComponents/TGStickerKeyboardTabCell.m b/LegacyComponents/TGStickerKeyboardTabCell.m index 2870dc2c0b..1d46eed6fb 100644 --- a/LegacyComponents/TGStickerKeyboardTabCell.m +++ b/LegacyComponents/TGStickerKeyboardTabCell.m @@ -54,7 +54,7 @@ static void setViewFrame(UIView *view, CGRect frame) - (void)_updateRecentIcon { - UIImage *recentTabImage = [UIImage imageNamed:@"StickerKeyboardRecentTab.png"]; + UIImage *recentTabImage = TGComponentsImageNamed(@"StickerKeyboardRecentTab.png"); if (_style == TGStickerKeyboardViewPaintDarkStyle) { UIColor *color = self.selected ? [UIColor blackColor] : UIColorRGB(0xb4b5b5); diff --git a/LegacyComponents/TGStickerKeyboardTabSettingsCell.m b/LegacyComponents/TGStickerKeyboardTabSettingsCell.m index e964431e28..58e9dc4cb5 100644 --- a/LegacyComponents/TGStickerKeyboardTabSettingsCell.m +++ b/LegacyComponents/TGStickerKeyboardTabSettingsCell.m @@ -45,7 +45,7 @@ static void setViewFrame(UIView *view, CGRect frame) [self.contentView addSubview:_wrapperView]; _imageView = [[UIImageView alloc] init]; - _imageView.image = [UIImage imageNamed:@"StickerKeyboardSettingsIcon.png"]; + _imageView.image = TGComponentsImageNamed(@"StickerKeyboardSettingsIcon.png"); _imageView.userInteractionEnabled = false; _imageView.contentMode = UIViewContentModeCenter; [_wrapperView addSubview:_imageView]; @@ -60,11 +60,11 @@ static void setViewFrame(UIView *view, CGRect frame) _mode = mode; if (mode == TGStickerKeyboardTabSettingsCellSettings) { - _imageView.image = [UIImage imageNamed:@"StickerKeyboardSettingsIcon.png"]; + _imageView.image = TGComponentsImageNamed(@"StickerKeyboardSettingsIcon.png"); } else if (mode == TGStickerKeyboardTabSettingsCellGifs) { - _imageView.image = [UIImage imageNamed:@"StickerKeyboardGifIcon.png"]; + _imageView.image = TGComponentsImageNamed(@"StickerKeyboardGifIcon.png"); } else { - _imageView.image = [UIImage imageNamed:@"StickerKeyboardTrendingIcon.png"]; + _imageView.image = TGComponentsImageNamed(@"StickerKeyboardTrendingIcon.png"); } _button.hidden = mode != TGStickerKeyboardTabSettingsCellSettings; } diff --git a/LegacyComponents/TGViewController.h b/LegacyComponents/TGViewController.h index cfcedd73eb..2c01b6b422 100644 --- a/LegacyComponents/TGViewController.h +++ b/LegacyComponents/TGViewController.h @@ -1,6 +1,8 @@ #import #import +#import + typedef enum { TGViewControllerStyleDefault = 0, TGViewControllerStyleBlack = 1 @@ -37,6 +39,8 @@ typedef enum { @interface TGViewController : UIViewController ++ (void)setDefaultContext:(id)defaultContext; + + (UIFont *)titleFontForStyle:(TGViewControllerStyle)style landscape:(bool)landscape; + (UIFont *)titleTitleFontForStyle:(TGViewControllerStyle)style landscape:(bool)landscape; + (UIFont *)titleSubtitleFontForStyle:(TGViewControllerStyle)style landscape:(bool)landscape; @@ -88,6 +92,8 @@ typedef enum { @property (nonatomic) bool automaticallyManageScrollViewInsets; @property (nonatomic) bool ignoreKeyboardWhenAdjustingScrollViewInsets; +@property (nonatomic) bool customAppearanceMethodsForwarding; + @property (nonatomic, strong) NSArray *scrollViewsForAutomaticInsetsAdjustment; @property (nonatomic, weak) UIViewController *customParentViewController; @@ -99,6 +105,9 @@ typedef enum { @property (nonatomic, readonly) UIUserInterfaceSizeClass currentSizeClass; @property (nonatomic, copy) NSArray> *(^externalPreviewActionItems)(void); +@property (nonatomic, copy) void (^customRemoveFromParentViewController)(); + +- (id)initWithContext:(id)context NS_DESIGNATED_INITIALIZER; - (void)setExplicitTableInset:(UIEdgeInsets)explicitTableInset scrollIndicatorInset:(UIEdgeInsets)scrollIndicatorInset; diff --git a/LegacyComponents/TGViewController.mm b/LegacyComponents/TGViewController.mm index b3b9e6979d..491d28d623 100644 --- a/LegacyComponents/TGViewController.mm +++ b/LegacyComponents/TGViewController.mm @@ -116,6 +116,8 @@ static std::set autorotationLockIds; @interface TGViewController () { + id _context; + bool _hatTargetNavigationItem; id _sizeClassDisposable; @@ -139,6 +141,12 @@ static std::set autorotationLockIds; @implementation TGViewController +static id _defaultContext = nil; + ++ (void)setDefaultContext:(id)defaultContext { + _defaultContext = defaultContext; +} + + (UIFont *)titleFontForStyle:(TGViewControllerStyle)__unused style landscape:(bool)landscape { if (!landscape) @@ -338,28 +346,27 @@ static std::set autorotationLockIds; autorotationEnableTimer = nil; } -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) - { - [self _commonViewControllerInit]; +- (id)initWithNibName:(NSString *)__unused nibNameOrNil bundle:(NSBundle *)__unused nibBundleOrNil { + return [self initWithContext:_defaultContext]; +} + +- (id)init { + return [self initWithContext:_defaultContext]; +} + +- (id)initWithContext:(id)context { + self = [super initWithNibName:nil bundle:nil]; + if (self != nil) { + [self _commonViewControllerInit:context]; } return self; } -- (id)init -{ - self = [super init]; - if (self != nil) - { - [self _commonViewControllerInit]; - } - return self; -} - -- (void)_commonViewControllerInit +- (void)_commonViewControllerInit:(id)context { + assert(context != nil); + _context = context; + self.wantsFullScreenLayout = true; self.automaticallyManageScrollViewInsets = true; self.autoManageStatusBarBackground = true; @@ -367,8 +374,7 @@ static std::set autorotationLockIds; _currentSizeClass = UIUserInterfaceSizeClassCompact; __weak TGViewController *weakSelf = self; - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; - _sizeClassDisposable = [[rootController sizeClass] startWithNext:^(NSNumber *next) { + _sizeClassDisposable = [[_context sizeClassSignal] startWithNext:^(NSNumber *next) { __strong TGViewController *strongSelf = weakSelf; if (strongSelf != nil) { if (strongSelf->_currentSizeClass != [next integerValue]) { @@ -626,6 +632,12 @@ static std::set autorotationLockIds; [self adjustToInterfaceOrientation:self.interfaceOrientation]; [super viewWillAppear:animated]; + + if (self.customAppearanceMethodsForwarding) { + for (UIViewController *controller in self.childViewControllers) { + [controller viewWillAppear:animated]; + } + } } - (void)viewDidAppear:(BOOL)animated @@ -635,6 +647,12 @@ static std::set autorotationLockIds; _viewControllerHasEverAppeared = true; [super viewDidAppear:animated]; + + if (self.customAppearanceMethodsForwarding) { + for (UIViewController *controller in self.childViewControllers) { + [controller viewDidAppear:animated]; + } + } } - (void)viewWillDisappear:(BOOL)animated @@ -643,6 +661,12 @@ static std::set autorotationLockIds; _viewControllerIsAnimatingAppearanceTransition = true; [super viewWillDisappear:animated]; + + if (self.customAppearanceMethodsForwarding) { + for (UIViewController *controller in self.childViewControllers) { + [controller viewWillDisappear:animated]; + } + } } - (void)viewDidDisappear:(BOOL)animated @@ -651,6 +675,12 @@ static std::set autorotationLockIds; _viewControllerIsAnimatingAppearanceTransition = false; [super viewDidDisappear:animated]; + + if (self.customAppearanceMethodsForwarding) { + for (UIViewController *controller in self.childViewControllers) { + [controller viewDidDisappear:animated]; + } + } } - (void)_adjustControllerInsetForRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation @@ -883,8 +913,7 @@ static std::set autorotationLockIds; - (UIStatusBarStyle)preferredStatusBarStyle { - UIViewController *rootController = [[LegacyComponentsGlobals provider] rootController]; - if (![rootController callStatusBarHidden]) + if (![_context rootCallStatusBarHidden]) return UIStatusBarStyleLightContent; else return UIStatusBarStyleDefault; @@ -1342,6 +1371,17 @@ static std::set autorotationLockIds; return [super previewActionItems]; } +- (BOOL)shouldAutomaticallyForwardAppearanceMethods { + return !self.customAppearanceMethodsForwarding; +} + +- (void)removeFromParentViewController { + if (_customRemoveFromParentViewController) { + _customRemoveFromParentViewController(); + } + [super removeFromParentViewController]; +} + @end @interface UINavigationController (DelegateAutomaticDismissKeyboard) diff --git a/TGRootControllerProtocol.h b/TGRootControllerProtocol.h deleted file mode 100644 index 37d15de205..0000000000 --- a/TGRootControllerProtocol.h +++ /dev/null @@ -1,12 +0,0 @@ -#import -#import - -@class SSignal; - -@protocol TGRootControllerProtocol - -- (CGRect)applicationBounds; -- (bool)callStatusBarHidden; -- (SSignal *)sizeClass; - -@end