mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-28 08:30:11 +00:00
Merge commit '416b3aff167a6aaa93961e5d0f11ae8886e73ea2'
This commit is contained in:
commit
d442361ab2
@ -33,6 +33,17 @@
|
||||
0941A9A0210B057200EBE194 /* OpenInActionSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A99F210B057200EBE194 /* OpenInActionSheetController.swift */; };
|
||||
0941A9A4210B0E2E00EBE194 /* OpenInAppIconResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A9A3210B0E2E00EBE194 /* OpenInAppIconResources.swift */; };
|
||||
0941A9A6210B822D00EBE194 /* OpenInOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0941A9A5210B822D00EBE194 /* OpenInOptions.swift */; };
|
||||
094735032275B62B00EA2312 /* PasscodeLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094735022275B62B00EA2312 /* PasscodeLayout.swift */; };
|
||||
0947350E2275D72100EA2312 /* anim_hide.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735042275D71F00EA2312 /* anim_hide.json */; };
|
||||
0947350F2275D72100EA2312 /* anim_unread.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735052275D72000EA2312 /* anim_unread.json */; };
|
||||
094735102275D72100EA2312 /* anim_read.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735062275D72000EA2312 /* anim_read.json */; };
|
||||
094735112275D72100EA2312 /* anim_archive.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735072275D72000EA2312 /* anim_archive.json */; };
|
||||
094735122275D72100EA2312 /* anim_mute.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735082275D72000EA2312 /* anim_mute.json */; };
|
||||
094735132275D72100EA2312 /* anim_delete.json in Resources */ = {isa = PBXBuildFile; fileRef = 094735092275D72000EA2312 /* anim_delete.json */; };
|
||||
094735142275D72100EA2312 /* anim_unarchive.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350A2275D72000EA2312 /* anim_unarchive.json */; };
|
||||
094735152275D72100EA2312 /* anim_unpin.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350B2275D72000EA2312 /* anim_unpin.json */; };
|
||||
094735162275D72100EA2312 /* anim_unmute.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350C2275D72100EA2312 /* anim_unmute.json */; };
|
||||
094735172275D72100EA2312 /* anim_pin.json in Resources */ = {isa = PBXBuildFile; fileRef = 0947350D2275D72100EA2312 /* anim_pin.json */; };
|
||||
0947FCAE224043450086741C /* SettingsSearchRecentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */; };
|
||||
0947FCB0224055990086741C /* StringHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947FCAF224055990086741C /* StringHash.swift */; };
|
||||
0952D1752176DEB500194860 /* NotificationMuteSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0952D1742176DEB500194860 /* NotificationMuteSettingsController.swift */; };
|
||||
@ -129,16 +140,6 @@
|
||||
09DE2F292269D5E30045E975 /* PrivacyIntroControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DE2F282269D5E30045E975 /* PrivacyIntroControllerNode.swift */; };
|
||||
09E2D9EF226F1AFA00EA0AA4 /* Emoji.mapping in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9ED226F1AF300EA0AA4 /* Emoji.mapping */; };
|
||||
09E2D9F1226F214000EA0AA4 /* EmojiResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E2D9F0226F214000EA0AA4 /* EmojiResources.swift */; };
|
||||
09E2DA0422720C4400EA0AA4 /* archive.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9FA22720A6000EA0AA4 /* archive.json */; };
|
||||
09E2DA0522720C4400EA0AA4 /* delete.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F522720A5F00EA0AA4 /* delete.json */; };
|
||||
09E2DA0622720C4400EA0AA4 /* mute.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F922720A6000EA0AA4 /* mute.json */; };
|
||||
09E2DA0722720C4400EA0AA4 /* pin.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F822720A5F00EA0AA4 /* pin.json */; };
|
||||
09E2DA0822720C4400EA0AA4 /* read.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F722720A5F00EA0AA4 /* read.json */; };
|
||||
09E2DA0922720C4400EA0AA4 /* unarchive.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F422720A5F00EA0AA4 /* unarchive.json */; };
|
||||
09E2DA0A22720C4400EA0AA4 /* unmute.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F622720A5F00EA0AA4 /* unmute.json */; };
|
||||
09E2DA0B22720C4400EA0AA4 /* unpin.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F222720A5E00EA0AA4 /* unpin.json */; };
|
||||
09E2DA0C22720C4400EA0AA4 /* unread.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2D9F322720A5E00EA0AA4 /* unread.json */; };
|
||||
09E2DA0F2273258700EA0AA4 /* hide.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2DA0D2273245300EA0AA4 /* hide.json */; };
|
||||
09E2DA112273340E00EA0AA4 /* AnimationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E2DA102273340E00EA0AA4 /* AnimationNode.swift */; };
|
||||
09E2DA132273367900EA0AA4 /* archiveAvatar.json in Resources */ = {isa = PBXBuildFile; fileRef = 09E2DA122273367900EA0AA4 /* archiveAvatar.json */; };
|
||||
09E4A801223AE1B30038140F /* PeerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E4A800223AE1B30038140F /* PeerType.swift */; };
|
||||
@ -1215,6 +1216,17 @@
|
||||
0941A99F210B057200EBE194 /* OpenInActionSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInActionSheetController.swift; sourceTree = "<group>"; };
|
||||
0941A9A3210B0E2E00EBE194 /* OpenInAppIconResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInAppIconResources.swift; sourceTree = "<group>"; };
|
||||
0941A9A5210B822D00EBE194 /* OpenInOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenInOptions.swift; sourceTree = "<group>"; };
|
||||
094735022275B62B00EA2312 /* PasscodeLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasscodeLayout.swift; sourceTree = "<group>"; };
|
||||
094735042275D71F00EA2312 /* anim_hide.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_hide.json; sourceTree = "<group>"; };
|
||||
094735052275D72000EA2312 /* anim_unread.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_unread.json; sourceTree = "<group>"; };
|
||||
094735062275D72000EA2312 /* anim_read.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_read.json; sourceTree = "<group>"; };
|
||||
094735072275D72000EA2312 /* anim_archive.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_archive.json; sourceTree = "<group>"; };
|
||||
094735082275D72000EA2312 /* anim_mute.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_mute.json; sourceTree = "<group>"; };
|
||||
094735092275D72000EA2312 /* anim_delete.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_delete.json; sourceTree = "<group>"; };
|
||||
0947350A2275D72000EA2312 /* anim_unarchive.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_unarchive.json; sourceTree = "<group>"; };
|
||||
0947350B2275D72000EA2312 /* anim_unpin.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_unpin.json; sourceTree = "<group>"; };
|
||||
0947350C2275D72100EA2312 /* anim_unmute.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_unmute.json; sourceTree = "<group>"; };
|
||||
0947350D2275D72100EA2312 /* anim_pin.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = anim_pin.json; sourceTree = "<group>"; };
|
||||
0947FCAD224043450086741C /* SettingsSearchRecentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSearchRecentItem.swift; sourceTree = "<group>"; };
|
||||
0947FCAF224055990086741C /* StringHash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringHash.swift; sourceTree = "<group>"; };
|
||||
0952D1742176DEB500194860 /* NotificationMuteSettingsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationMuteSettingsController.swift; sourceTree = "<group>"; };
|
||||
@ -1315,16 +1327,6 @@
|
||||
09DE2F282269D5E30045E975 /* PrivacyIntroControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyIntroControllerNode.swift; sourceTree = "<group>"; };
|
||||
09E2D9ED226F1AF300EA0AA4 /* Emoji.mapping */ = {isa = PBXFileReference; lastKnownFileType = file; name = Emoji.mapping; path = TelegramUI/Resources/Emoji.mapping; sourceTree = "<group>"; };
|
||||
09E2D9F0226F214000EA0AA4 /* EmojiResources.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiResources.swift; sourceTree = "<group>"; };
|
||||
09E2D9F222720A5E00EA0AA4 /* unpin.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = unpin.json; sourceTree = "<group>"; };
|
||||
09E2D9F322720A5E00EA0AA4 /* unread.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = unread.json; sourceTree = "<group>"; };
|
||||
09E2D9F422720A5F00EA0AA4 /* unarchive.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = unarchive.json; sourceTree = "<group>"; };
|
||||
09E2D9F522720A5F00EA0AA4 /* delete.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = delete.json; sourceTree = "<group>"; };
|
||||
09E2D9F622720A5F00EA0AA4 /* unmute.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = unmute.json; sourceTree = "<group>"; };
|
||||
09E2D9F722720A5F00EA0AA4 /* read.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = read.json; sourceTree = "<group>"; };
|
||||
09E2D9F822720A5F00EA0AA4 /* pin.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = pin.json; sourceTree = "<group>"; };
|
||||
09E2D9F922720A6000EA0AA4 /* mute.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = mute.json; sourceTree = "<group>"; };
|
||||
09E2D9FA22720A6000EA0AA4 /* archive.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = archive.json; sourceTree = "<group>"; };
|
||||
09E2DA0D2273245300EA0AA4 /* hide.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = hide.json; sourceTree = "<group>"; };
|
||||
09E2DA102273340E00EA0AA4 /* AnimationNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationNode.swift; sourceTree = "<group>"; };
|
||||
09E2DA122273367900EA0AA4 /* archiveAvatar.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = archiveAvatar.json; sourceTree = "<group>"; };
|
||||
09E4A800223AE1B30038140F /* PeerType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerType.swift; sourceTree = "<group>"; };
|
||||
@ -2522,17 +2524,17 @@
|
||||
09310D13213BC5DE0020033A /* Animations */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
094735072275D72000EA2312 /* anim_archive.json */,
|
||||
094735092275D72000EA2312 /* anim_delete.json */,
|
||||
094735042275D71F00EA2312 /* anim_hide.json */,
|
||||
094735082275D72000EA2312 /* anim_mute.json */,
|
||||
0947350D2275D72100EA2312 /* anim_pin.json */,
|
||||
094735062275D72000EA2312 /* anim_read.json */,
|
||||
0947350A2275D72000EA2312 /* anim_unarchive.json */,
|
||||
0947350C2275D72100EA2312 /* anim_unmute.json */,
|
||||
0947350B2275D72000EA2312 /* anim_unpin.json */,
|
||||
094735052275D72000EA2312 /* anim_unread.json */,
|
||||
09E2DA122273367900EA0AA4 /* archiveAvatar.json */,
|
||||
09E2D9FA22720A6000EA0AA4 /* archive.json */,
|
||||
09E2D9F522720A5F00EA0AA4 /* delete.json */,
|
||||
09E2DA0D2273245300EA0AA4 /* hide.json */,
|
||||
09E2D9F922720A6000EA0AA4 /* mute.json */,
|
||||
09E2D9F822720A5F00EA0AA4 /* pin.json */,
|
||||
09E2D9F722720A5F00EA0AA4 /* read.json */,
|
||||
09E2D9F422720A5F00EA0AA4 /* unarchive.json */,
|
||||
09E2D9F622720A5F00EA0AA4 /* unmute.json */,
|
||||
09E2D9F222720A5E00EA0AA4 /* unpin.json */,
|
||||
09E2D9F322720A5E00EA0AA4 /* unread.json */,
|
||||
09310D1A213BC5DE0020033A /* anim_ungroup.json */,
|
||||
09310D1B213BC5DE0020033A /* anim_group.json */,
|
||||
);
|
||||
@ -2743,6 +2745,7 @@
|
||||
09F215A522649C3000AEDF6D /* PasscodeLockIconNode.swift */,
|
||||
09F215AC2264DC4500AEDF6D /* PasscodeSetupController.swift */,
|
||||
09DE2F242269B7E80045E975 /* PasscodeSetupControllerNode.swift */,
|
||||
094735022275B62B00EA2312 /* PasscodeLayout.swift */,
|
||||
);
|
||||
name = Passcode;
|
||||
sourceTree = "<group>";
|
||||
@ -5223,28 +5226,32 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
09874E4F21078FA100E190B8 /* Generic.html in Resources */,
|
||||
09E2DA0822720C4400EA0AA4 /* read.json in Resources */,
|
||||
09874E5021078FA100E190B8 /* GenericUserScript.js in Resources */,
|
||||
09874E5121078FA100E190B8 /* Instagram.html in Resources */,
|
||||
09874E5221078FA100E190B8 /* Twitch.html in Resources */,
|
||||
09874E5321078FA100E190B8 /* TwitchUserScript.js in Resources */,
|
||||
094735122275D72100EA2312 /* anim_mute.json in Resources */,
|
||||
09874E5421078FA100E190B8 /* Vimeo.html in Resources */,
|
||||
09874E5521078FA100E190B8 /* VimeoUserScript.js in Resources */,
|
||||
09E2DA0422720C4400EA0AA4 /* archive.json in Resources */,
|
||||
09874E5621078FA100E190B8 /* Youtube.html in Resources */,
|
||||
09874E5721078FA100E190B8 /* YoutubeUserScript.js in Resources */,
|
||||
094735172275D72100EA2312 /* anim_pin.json in Resources */,
|
||||
094735112275D72100EA2312 /* anim_archive.json in Resources */,
|
||||
D0EB42051F3143AB00838FE6 /* LegacyComponentsResources.bundle in Resources */,
|
||||
D0E9BAA21F056F4C00F079A4 /* stp_card_discover@3x.png in Resources */,
|
||||
D0E9BAB01F056F4C00F079A4 /* stp_card_mastercard@3x.png in Resources */,
|
||||
09310D32213ED5FC0020033A /* anim_ungroup.json in Resources */,
|
||||
09E2D9EF226F1AFA00EA0AA4 /* Emoji.mapping in Resources */,
|
||||
D0955FB521912B6000F89427 /* PresentationStrings.mapping in Resources */,
|
||||
0947350F2275D72100EA2312 /* anim_unread.json in Resources */,
|
||||
D0E9BAA31F056F4C00F079A4 /* stp_card_discover_template@2x.png in Resources */,
|
||||
D0E9BAB51F056F4C00F079A4 /* stp_card_visa@2x.png in Resources */,
|
||||
D0E9BA941F056F4C00F079A4 /* stp_card_amex_template@3x.png in Resources */,
|
||||
D0E9BA961F056F4C00F079A4 /* stp_card_applepay@3x.png in Resources */,
|
||||
D0F9720F1FFE4BD5002595C8 /* notification.caf in Resources */,
|
||||
09310D33213ED5FC0020033A /* anim_group.json in Resources */,
|
||||
094735162275D72100EA2312 /* anim_unmute.json in Resources */,
|
||||
094735102275D72100EA2312 /* anim_read.json in Resources */,
|
||||
D0E9BA9A1F056F4C00F079A4 /* stp_card_cvc@3x.png in Resources */,
|
||||
D0E9BA921F056F4C00F079A4 /* stp_card_amex@3x.png in Resources */,
|
||||
D0E9BA9F1F056F4C00F079A4 /* stp_card_diners_template@2x.png in Resources */,
|
||||
@ -5255,30 +5262,25 @@
|
||||
D0E9BAB71F056F4C00F079A4 /* stp_card_visa_template@2x.png in Resources */,
|
||||
D0E9BA951F056F4C00F079A4 /* stp_card_applepay@2x.png in Resources */,
|
||||
D0E9BAA01F056F4C00F079A4 /* stp_card_diners_template@3x.png in Resources */,
|
||||
094735132275D72100EA2312 /* anim_delete.json in Resources */,
|
||||
094735142275D72100EA2312 /* anim_unarchive.json in Resources */,
|
||||
D0E9BAAA1F056F4C00F079A4 /* stp_card_form_front@3x.png in Resources */,
|
||||
D0E9BA971F056F4C00F079A4 /* stp_card_applepay_template@2x.png in Resources */,
|
||||
D0E9BAB41F056F4C00F079A4 /* stp_card_placeholder_template@3x.png in Resources */,
|
||||
09E2DA0B22720C4400EA0AA4 /* unpin.json in Resources */,
|
||||
D0E9BAA71F056F4C00F079A4 /* stp_card_form_back@2x.png in Resources */,
|
||||
D0E9BAB11F056F4C00F079A4 /* stp_card_mastercard_template@2x.png in Resources */,
|
||||
09E2DA0522720C4400EA0AA4 /* delete.json in Resources */,
|
||||
09E2DA0C22720C4400EA0AA4 /* unread.json in Resources */,
|
||||
09E2DA0622720C4400EA0AA4 /* mute.json in Resources */,
|
||||
D0E9BA9D1F056F4C00F079A4 /* stp_card_diners@2x.png in Resources */,
|
||||
D0E9BAAF1F056F4C00F079A4 /* stp_card_mastercard@2x.png in Resources */,
|
||||
09E2DA0922720C4400EA0AA4 /* unarchive.json in Resources */,
|
||||
D0C12A1D1F33A85600B3F66D /* ChatWallpaperBuiltin0.jpg in Resources */,
|
||||
D0E9BAAC1F056F4C00F079A4 /* stp_card_jcb@3x.png in Resources */,
|
||||
D0E9BA911F056F4C00F079A4 /* stp_card_amex@2x.png in Resources */,
|
||||
09E2DA0A22720C4400EA0AA4 /* unmute.json in Resources */,
|
||||
D0E9BA931F056F4C00F079A4 /* stp_card_amex_template@2x.png in Resources */,
|
||||
D0E9BAA91F056F4C00F079A4 /* stp_card_form_front@2x.png in Resources */,
|
||||
09E2DA0722720C4400EA0AA4 /* pin.json in Resources */,
|
||||
D0E9BAA41F056F4C00F079A4 /* stp_card_discover_template@3x.png in Resources */,
|
||||
D0E9BAA81F056F4C00F079A4 /* stp_card_form_back@3x.png in Resources */,
|
||||
D0E9BAA11F056F4C00F079A4 /* stp_card_discover@2x.png in Resources */,
|
||||
09E2DA0F2273258700EA0AA4 /* hide.json in Resources */,
|
||||
D0E9B9EA1F00853C00F079A4 /* PhoneCountries.txt in Resources */,
|
||||
094735152275D72100EA2312 /* anim_unpin.json in Resources */,
|
||||
D0E9BAB31F056F4C00F079A4 /* stp_card_placeholder_template@2x.png in Resources */,
|
||||
D0E9BAAE1F056F4C00F079A4 /* stp_card_jcb_template@3x.png in Resources */,
|
||||
D0E9BAAB1F056F4C00F079A4 /* stp_card_jcb@2x.png in Resources */,
|
||||
@ -5286,6 +5288,7 @@
|
||||
D0E9BA9C1F056F4C00F079A4 /* stp_card_cvc_amex@3x.png in Resources */,
|
||||
D0E9BA991F056F4C00F079A4 /* stp_card_cvc@2x.png in Resources */,
|
||||
D0471B541EFD8ECA0074D609 /* currencies.json in Resources */,
|
||||
0947350E2275D72100EA2312 /* anim_hide.json in Resources */,
|
||||
D0E9BAB21F056F4C00F079A4 /* stp_card_mastercard_template@3x.png in Resources */,
|
||||
D0E9BA981F056F4C00F079A4 /* stp_card_applepay_template@3x.png in Resources */,
|
||||
D0E9BAA51F056F4C00F079A4 /* stp_card_form_applepay@2x.png in Resources */,
|
||||
@ -5978,6 +5981,7 @@
|
||||
D00701A22029F6D0006B9E34 /* TGMimeTypeMap.m in Sources */,
|
||||
D0BE30412061B80100FBE6D8 /* SecureIdAuthController.swift in Sources */,
|
||||
D0EC6DD31EB9F58900EBF1C3 /* MentionChatInputPanelItem.swift in Sources */,
|
||||
094735032275B62B00EA2312 /* PasscodeLayout.swift in Sources */,
|
||||
D0EC6DD41EB9F58900EBF1C3 /* CommandChatInputContextPanelNode.swift in Sources */,
|
||||
D0EC6DD51EB9F58900EBF1C3 /* CommandChatInputPanelItem.swift in Sources */,
|
||||
D0EC6DD61EB9F58900EBF1C3 /* VerticalListContextResultsChatInputContextPanelNode.swift in Sources */,
|
||||
|
@ -12,6 +12,8 @@ final class AnimationNode : ASDisplayNode {
|
||||
}
|
||||
}
|
||||
|
||||
private var colorCallbacks: [LOTColorValueCallback] = []
|
||||
|
||||
var played = false
|
||||
var completion: (() -> Void)?
|
||||
|
||||
@ -27,7 +29,10 @@ final class AnimationNode : ASDisplayNode {
|
||||
view.backgroundColor = .clear
|
||||
view.isOpaque = false
|
||||
|
||||
view.logHierarchyKeypaths()
|
||||
|
||||
let colorCallback = LOTColorValueCallback(color: color.cgColor)
|
||||
self.colorCallbacks.append(colorCallback)
|
||||
if let keysToColor = keysToColor {
|
||||
for key in keysToColor {
|
||||
view.setValueDelegate(colorCallback, for: LOTKeypath(string: "\(key).Color"))
|
||||
|
@ -4207,7 +4207,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: editMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: {
|
||||
self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals in
|
||||
if !inputText.string.isEmpty {
|
||||
strongSelf.clearInputText()
|
||||
//strongSelf.clearInputText()
|
||||
}
|
||||
if editMediaOptions != nil {
|
||||
self?.editMessageMediaWithLegacySignals(signals)
|
||||
@ -4225,7 +4225,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
strongSelf.enqueueMediaMessages(signals: signals)
|
||||
}
|
||||
if !inputText.string.isEmpty {
|
||||
strongSelf.clearInputText()
|
||||
//strongSelf.clearInputText()
|
||||
}
|
||||
}
|
||||
}, recognizedQRCode: { [weak self] code in
|
||||
@ -4246,7 +4246,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
self?.presentPollCreation()
|
||||
}, sendMessagesWithSignals: { [weak self] signals in
|
||||
if !inputText.string.isEmpty {
|
||||
strongSelf.clearInputText()
|
||||
//strongSelf.clearInputText()
|
||||
}
|
||||
if editMediaOptions != nil {
|
||||
self?.editMessageMediaWithLegacySignals(signals!)
|
||||
@ -4399,7 +4399,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
|
||||
controller.completionBlock = { [weak legacyController, weak self] signals in
|
||||
if let strongSelf = self {
|
||||
if !inputText.string.isEmpty {
|
||||
strongSelf.clearInputText()
|
||||
//strongSelf.clearInputText()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,19 +151,19 @@ private let textFont = Font.regular(15.0)
|
||||
private let dateFont = Font.regular(14.0)
|
||||
private let badgeFont = Font.regular(14.0)
|
||||
|
||||
private let pinIcon = ItemListRevealOptionIcon.animation(animation: "pin", offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let unpinIcon = ItemListRevealOptionIcon.animation(animation: "unpin", offset: 0.0, keysToColor: ["close.close.Stroke 2"], flip: false)
|
||||
private let muteIcon = ItemListRevealOptionIcon.animation(animation: "mute", offset: 0.0, keysToColor: ["close.close.Stroke 2"], flip: false)
|
||||
private let unmuteIcon = ItemListRevealOptionIcon.animation(animation: "unmute", offset: 0.0, keysToColor: ["close.close.Stroke 2"], flip: false)
|
||||
private let deleteIcon = ItemListRevealOptionIcon.animation(animation: "delete", offset: 0.0, keysToColor: ["BinTex1.BinTex1.Fill 1", "BinTex2.BinTex2.Fill 1", "BinTex3.BinTex3.Fill 1"], flip: false)
|
||||
private let groupIcon = ItemListRevealOptionIcon.animation(animation: "anim_group", offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let ungroupIcon = ItemListRevealOptionIcon.animation(animation: "anim_ungroup", offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let readIcon = ItemListRevealOptionIcon.animation(animation: "read", offset: 0.0, keysToColor: ["Oval.Oval.Stroke 1"], flip: false)
|
||||
private let unreadIcon = ItemListRevealOptionIcon.animation(animation: "unread", offset: 0.0, keysToColor: ["Oval.Oval.Stroke 1"], flip: false)
|
||||
private let archiveIcon = ItemListRevealOptionIcon.animation(animation: "archive", offset: 1.0, keysToColor: ["box2.box2.Fill 1"], flip: false)
|
||||
private let unarchiveIcon = ItemListRevealOptionIcon.animation(animation: "unarchive", offset: 1.0, keysToColor: ["box2.box2.Fill 1"], flip: false)
|
||||
private let hideIcon = ItemListRevealOptionIcon.animation(animation: "hide", offset: 0.0, keysToColor: ["Rectangle.Rectangle.Fill 1"], flip: false)
|
||||
private let unhideIcon = ItemListRevealOptionIcon.animation(animation: "hide", offset: 0.0, keysToColor: ["Rectangle.Rectangle.Fill 1"], flip: true)
|
||||
private let pinIcon = ItemListRevealOptionIcon.animation(animation: "anim_pin", scale: 0.33333, offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let unpinIcon = ItemListRevealOptionIcon.animation(animation: "anim_unpin", scale: 0.33333, offset: 0.0, keysToColor: ["un Outlines.Group 1.Stroke 1"], flip: false)
|
||||
private let muteIcon = ItemListRevealOptionIcon.animation(animation: "anim_mute", scale: 0.33333, offset: 0.0, keysToColor: ["un Outlines.Group 1.Stroke 1"], flip: false)
|
||||
private let unmuteIcon = ItemListRevealOptionIcon.animation(animation: "anim_unmute", scale: 0.33333, offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let deleteIcon = ItemListRevealOptionIcon.animation(animation: "anim_delete", scale: 0.33333, offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let groupIcon = ItemListRevealOptionIcon.animation(animation: "anim_group", scale: 0.33333, offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let ungroupIcon = ItemListRevealOptionIcon.animation(animation: "anim_ungroup", scale: 0.33333, offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let readIcon = ItemListRevealOptionIcon.animation(animation: "anim_read", scale: 0.33333, offset: 0.0, keysToColor: nil, flip: false)
|
||||
private let unreadIcon = ItemListRevealOptionIcon.animation(animation: "anim_unread", scale: 0.33333, offset: 0.0, keysToColor: ["Oval.Oval.Stroke 1"], flip: false)
|
||||
private let archiveIcon = ItemListRevealOptionIcon.animation(animation: "anim_archive", scale: 0.33333, offset: 2.0, keysToColor: ["box2.box2.Fill 1"], flip: false)
|
||||
private let unarchiveIcon = ItemListRevealOptionIcon.animation(animation: "anim_unarchive", scale: 0.16214, offset: -9.0, keysToColor: ["box2.box2.Fill 1"], flip: false)
|
||||
private let hideIcon = ItemListRevealOptionIcon.animation(animation: "anim_hide", scale: 0.33333, offset: 0.0, keysToColor: ["Path 2.Path 2.Fill 1"], flip: false)
|
||||
private let unhideIcon = ItemListRevealOptionIcon.animation(animation: "anim_hide", scale: 0.33333, offset: 0.0, keysToColor: ["Path 2.Path 2.Fill 1"], flip: true)
|
||||
|
||||
private enum RevealOptionKey: Int32 {
|
||||
case pin
|
||||
|
@ -137,7 +137,6 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
||||
var textLayoutAndApply: (TextNodeLayout, () -> TextNode)?
|
||||
var isEmoji = false
|
||||
if !item.message.text.isEmpty && item.message.text.containsOnlyEmoji && item.presentationData.largeEmoji {
|
||||
//imageSize = CGSize(width: CGFloat(item.message.text.emojis) * 52.0 + CGFloat(item.message.text.emojis - 1) * 12.0)
|
||||
let attributedText = NSAttributedString(string: item.message.text, font: item.presentationData.messageEmojiFont1, textColor: .black)
|
||||
textLayoutAndApply = textLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: 180.0, height: 90.0), alignment: .natural))
|
||||
|
||||
@ -372,6 +371,19 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
||||
transition.updateFrame(node: strongSelf.imageNode, frame: updatedImageFrame)
|
||||
imageApply()
|
||||
|
||||
dateAndStatusApply(false)
|
||||
|
||||
var dateOffset = CGPoint(x: dateAndStatusSize.width + 4.0, y: dateAndStatusSize.height + 16.0)
|
||||
if isEmoji {
|
||||
if incoming {
|
||||
dateOffset.x = 12.0
|
||||
} else {
|
||||
dateOffset.y = 12.0
|
||||
}
|
||||
}
|
||||
let dateAndStatusFrame = CGRect(origin: CGPoint(x: max(displayLeftInset, updatedImageFrame.maxX - dateOffset.x), y: updatedImageFrame.maxY - dateOffset.y), size: dateAndStatusSize)
|
||||
transition.updateFrame(node: strongSelf.dateAndStatusNode, frame: dateAndStatusFrame)
|
||||
|
||||
if let updatedShareButtonNode = updatedShareButtonNode {
|
||||
if updatedShareButtonNode !== strongSelf.shareButtonNode {
|
||||
if let shareButtonNode = strongSelf.shareButtonNode {
|
||||
@ -390,19 +402,12 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
||||
}
|
||||
|
||||
if let shareButtonNode = strongSelf.shareButtonNode {
|
||||
transition.updateFrame(node: shareButtonNode, frame: CGRect(origin: CGPoint(x: updatedImageFrame.maxX + 8.0, y: updatedImageFrame.maxY - 30.0 - 10.0), size: CGSize(width: 29.0, height: 29.0)))
|
||||
}
|
||||
|
||||
dateAndStatusApply(false)
|
||||
var dateOffset: CGPoint = CGPoint(x: dateAndStatusSize.width + 4.0, y: dateAndStatusSize.height + 16.0)
|
||||
if isEmoji {
|
||||
if incoming {
|
||||
dateOffset.x = 12.0
|
||||
} else {
|
||||
dateOffset.y = 12.0
|
||||
var shareButtonFrame = CGRect(origin: CGPoint(x: updatedImageFrame.maxX + 8.0, y: updatedImageFrame.maxY - 30.0 - 10.0), size: CGSize(width: 29.0, height: 29.0))
|
||||
if isEmoji && incoming {
|
||||
shareButtonFrame.origin.x = dateAndStatusFrame.maxX + 8.0
|
||||
}
|
||||
transition.updateFrame(node: shareButtonNode, frame: shareButtonFrame)
|
||||
}
|
||||
transition.updateFrame(node: strongSelf.dateAndStatusNode, frame: CGRect(origin: CGPoint(x: max(displayLeftInset, updatedImageFrame.maxX - dateOffset.x), y: updatedImageFrame.maxY - dateOffset.y), size: dateAndStatusSize))
|
||||
|
||||
if let updatedReplyBackgroundNode = updatedReplyBackgroundNode {
|
||||
if strongSelf.replyBackgroundNode == nil {
|
||||
|
@ -3,7 +3,7 @@ import UIKit
|
||||
|
||||
private func makeDefaultPresentationTheme(accentColor: UIColor, serviceBackgroundColor: UIColor, day: Bool) -> PresentationTheme {
|
||||
let destructiveColor: UIColor = UIColor(rgb: 0xff3b30)
|
||||
let constructiveColor: UIColor = UIColor(rgb: 0x00d740)
|
||||
let constructiveColor: UIColor = UIColor(rgb: 0x2bb443)
|
||||
let secretColor: UIColor = UIColor(rgb: 0x00B12C)
|
||||
|
||||
let rootStatusBar = PresentationThemeRootNavigationStatusBar(
|
||||
|
@ -320,7 +320,7 @@ class GalleryController: ViewController {
|
||||
private let centralItemTitle = Promise<String>()
|
||||
private let centralItemTitleView = Promise<UIView?>()
|
||||
private let centralItemRightBarButtonItem = Promise<UIBarButtonItem?>()
|
||||
private let centralItemRightBarButtonItems = Promise<[UIBarButtonItem]?>()
|
||||
private let centralItemRightBarButtonItems = Promise<[UIBarButtonItem]?>(nil)
|
||||
private let centralItemNavigationStyle = Promise<GalleryItemNodeNavigationStyle>()
|
||||
private let centralItemFooterContentNode = Promise<GalleryFooterContentNode?>()
|
||||
private let centralItemAttributesDisposable = DisposableSet();
|
||||
@ -501,12 +501,15 @@ class GalleryController: ViewController {
|
||||
self?.navigationItem.titleView = titleView
|
||||
}))
|
||||
|
||||
self.centralItemAttributesDisposable.add(self.centralItemRightBarButtonItem.get().start(next: { [weak self] rightBarButtonItem in
|
||||
self?.navigationItem.rightBarButtonItem = rightBarButtonItem
|
||||
}))
|
||||
|
||||
self.centralItemAttributesDisposable.add(self.centralItemRightBarButtonItems.get().start(next: { [weak self] rightBarButtonItems in
|
||||
self?.navigationItem.rightBarButtonItems = rightBarButtonItems
|
||||
self.centralItemAttributesDisposable.add(combineLatest(self.centralItemRightBarButtonItem.get(), self.centralItemRightBarButtonItems.get()).start(next: { [weak self] rightBarButtonItem, rightBarButtonItems in
|
||||
if let rightBarButtonItem = rightBarButtonItem {
|
||||
self?.navigationItem.rightBarButtonItem = rightBarButtonItem
|
||||
} else if let rightBarButtonItems = rightBarButtonItems {
|
||||
self?.navigationItem.rightBarButtonItems = rightBarButtonItems
|
||||
} else {
|
||||
self?.navigationItem.rightBarButtonItem = nil
|
||||
self?.navigationItem.rightBarButtonItems = nil
|
||||
}
|
||||
}))
|
||||
|
||||
self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode in
|
||||
|
@ -5,7 +5,7 @@ import Display
|
||||
enum ItemListRevealOptionIcon: Equatable {
|
||||
case none
|
||||
case image(image: UIImage)
|
||||
case animation(animation: String, offset: CGFloat, keysToColor: [String]?, flip: Bool)
|
||||
case animation(animation: String, scale: CGFloat, offset: CGFloat, keysToColor: [String]?, flip: Bool)
|
||||
|
||||
public static func ==(lhs: ItemListRevealOptionIcon, rhs: ItemListRevealOptionIcon) -> Bool {
|
||||
switch lhs {
|
||||
@ -21,8 +21,8 @@ enum ItemListRevealOptionIcon: Equatable {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .animation(lhsAnimation, lhsOffset, lhsKeysToColor, lhsFlip):
|
||||
if case let .animation(rhsAnimation, rhsOffset, rhsKeysToColor, rhsFlip) = rhs, lhsAnimation == rhsAnimation, lhsOffset == rhsOffset, lhsKeysToColor == rhsKeysToColor, lhsFlip == rhsFlip {
|
||||
case let .animation(lhsAnimation, lhsScale, lhsOffset, lhsKeysToColor, lhsFlip):
|
||||
if case let .animation(rhsAnimation, rhsScale, rhsOffset, rhsKeysToColor, rhsFlip) = rhs, lhsAnimation == rhsAnimation, lhsScale == rhsScale, lhsOffset == rhsOffset, lhsKeysToColor == rhsKeysToColor, lhsFlip == rhsFlip {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@ -91,9 +91,9 @@ private final class ItemListRevealOptionNode: ASDisplayNode {
|
||||
self.iconNode = iconNode
|
||||
self.animationNode = nil
|
||||
|
||||
case let .animation(animation, offset, keysToColor, flip):
|
||||
case let .animation(animation, scale, offset, keysToColor, flip):
|
||||
self.iconNode = nil
|
||||
self.animationNode = AnimationNode(animation: animation, keysToColor: keysToColor, color: color, scale: 0.16214)
|
||||
self.animationNode = AnimationNode(animation: animation, keysToColor: keysToColor, color: color, scale: scale)
|
||||
if flip {
|
||||
self.animationNode!.transform = CATransform3DMakeScale(1.0, -1.0, 1.0)
|
||||
}
|
||||
@ -175,7 +175,7 @@ private final class ItemListRevealOptionNode: ASDisplayNode {
|
||||
}
|
||||
|
||||
if let animationNode = self.animationNode, let imageSize = animationNode.preferredSize() {
|
||||
let iconOffset: CGFloat = -11.0 + self.animationNodeOffset
|
||||
let iconOffset: CGFloat = -2.0 + self.animationNodeOffset
|
||||
let titleIconSpacing: CGFloat = 11.0
|
||||
let iconFrame = CGRect(origin: CGPoint(x: contentRect.minX + floor((baseSize.width - imageSize.width + sideInset) / 2.0), y: contentRect.midY - imageSize.height / 2.0 + iconOffset), size: imageSize)
|
||||
if animateAdditive {
|
||||
|
@ -108,6 +108,9 @@ func parseMarkdownIntoAttributedString(_ string: String, attributes: MarkdownAtt
|
||||
remainingRange = NSMakeRange(range.location + 1, remainingRange.length - 1)
|
||||
}
|
||||
} else {
|
||||
if result.string.hasSuffix("\\") {
|
||||
result.deleteCharacters(in: NSMakeRange(result.string.count - 1, 1))
|
||||
}
|
||||
result.append(NSAttributedString(string: nsString.substring(with: NSMakeRange(remainingRange.location, 1)), attributes: bodyAttributes))
|
||||
remainingRange = NSMakeRange(range.location + 1, remainingRange.length - 1)
|
||||
}
|
||||
|
@ -64,11 +64,7 @@ final public class PasscodeEntryController: ViewController {
|
||||
let passcodeType: PasscodeEntryFieldType
|
||||
switch self.challengeData {
|
||||
case let .numericalPassword(value, _, _):
|
||||
if value.count == 6 {
|
||||
passcodeType = .digits6
|
||||
} else {
|
||||
passcodeType = .digits4
|
||||
}
|
||||
passcodeType = value.count == 6 ? .digits6 : .digits4
|
||||
default:
|
||||
passcodeType = .alphanumeric
|
||||
}
|
||||
@ -81,6 +77,15 @@ final public class PasscodeEntryController: ViewController {
|
||||
self.displayNode = PasscodeEntryControllerNode(context: self.context, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, passcodeType: passcodeType, biometricsType: biometricsType, statusBar: self.statusBar)
|
||||
self.displayNodeDidLoad()
|
||||
|
||||
let _ = (self.context.sharedContext.accountManager.transaction({ transaction -> AccessChallengeAttempts? in
|
||||
return transaction.getAccessChallengeData().attempts
|
||||
}) |> deliverOnMainQueue).start(next: { [weak self] attempts in
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
strongSelf.controllerNode.updateInvalidAttempts(attempts)
|
||||
})
|
||||
|
||||
self.controllerNode.checkPasscode = { [weak self] passcode in
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
@ -98,26 +103,47 @@ final public class PasscodeEntryController: ViewController {
|
||||
|
||||
if succeed {
|
||||
let _ = (strongSelf.context.sharedContext.accountManager.transaction { transaction -> Void in
|
||||
let data = transaction.getAccessChallengeData().withUpdatedAutolockDeadline(nil)
|
||||
var data = transaction.getAccessChallengeData().withUpdatedAutolockDeadline(nil)
|
||||
switch data {
|
||||
case .none:
|
||||
break
|
||||
case let .numericalPassword(value, timeout, _):
|
||||
data = .numericalPassword(value: value, timeout: timeout, attempts: nil)
|
||||
case let .plaintextPassword(value, timeout, _):
|
||||
data = .plaintextPassword(value: value, timeout: timeout, attempts: nil)
|
||||
}
|
||||
transaction.setAccessChallengeData(data)
|
||||
}).start()
|
||||
} else {
|
||||
// let _ = strongSelf.context.sharedContext.accountManager.transaction({ transaction -> Void in
|
||||
// var attempts: AccessChallengeAttempts?
|
||||
// if let attemptData = attemptData {
|
||||
// attempts = AccessChallengeAttempts(count: Int32(attemptData.numberOfInvalidAttempts), timestamp: Int32(attemptData.dateOfLastInvalidAttempt))
|
||||
// }
|
||||
// var data = transaction.getAccessChallengeData()
|
||||
// switch data {
|
||||
// case .none:
|
||||
// break
|
||||
// case let .numericalPassword(value, timeout, _):
|
||||
// data = .numericalPassword(value: value, timeout: timeout, attempts: attempts)
|
||||
// case let .plaintextPassword(value, timeout, _):
|
||||
// data = .plaintextPassword(value: value, timeout: timeout, attempts: attempts)
|
||||
// }
|
||||
// transaction.setAccessChallengeData(data)
|
||||
// }).start()
|
||||
let _ = (strongSelf.context.sharedContext.accountManager.transaction({ transaction -> AccessChallengeAttempts in
|
||||
var data = transaction.getAccessChallengeData()
|
||||
let updatedAttempts: AccessChallengeAttempts
|
||||
if let attempts = data.attempts {
|
||||
var count = attempts.count + 1
|
||||
if count > 6 {
|
||||
count = 1
|
||||
}
|
||||
updatedAttempts = AccessChallengeAttempts(count: count, timestamp: Int32(CFAbsoluteTimeGetCurrent()))
|
||||
} else {
|
||||
updatedAttempts = AccessChallengeAttempts(count: 1, timestamp: Int32(CFAbsoluteTimeGetCurrent()))
|
||||
}
|
||||
switch data {
|
||||
case .none:
|
||||
break
|
||||
case let .numericalPassword(value, timeout, _):
|
||||
data = .numericalPassword(value: value, timeout: timeout, attempts: updatedAttempts)
|
||||
case let .plaintextPassword(value, timeout, _):
|
||||
data = .plaintextPassword(value: value, timeout: timeout, attempts: updatedAttempts)
|
||||
}
|
||||
transaction.setAccessChallengeData(data)
|
||||
|
||||
return updatedAttempts
|
||||
})
|
||||
|> deliverOnMainQueue).start(next: { [weak self] attempts in
|
||||
if let strongSelf = self {
|
||||
strongSelf.controllerNode.updateInvalidAttempts(attempts, animated: true)
|
||||
}
|
||||
})
|
||||
|
||||
strongSelf.controllerNode.animateError()
|
||||
}
|
||||
|
@ -2,9 +2,11 @@ import Foundation
|
||||
import Display
|
||||
import AsyncDisplayKit
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
|
||||
private let titleFont = Font.regular(20.0)
|
||||
private let subtitleFont = Font.regular(17.0)
|
||||
private let buttonFont = Font.regular(17.0)
|
||||
|
||||
final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
@ -28,6 +30,8 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
private let biometricButtonNode: HighlightableButtonNode
|
||||
private let effectView: UIVisualEffectView
|
||||
|
||||
private var invalidAttempts: AccessChallengeAttempts?
|
||||
|
||||
private let hapticFeedback = HapticFeedback()
|
||||
|
||||
private var validLayout: ContainerViewLayout?
|
||||
@ -67,7 +71,14 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
self?.inputFieldNode.append(character)
|
||||
}
|
||||
self.inputFieldNode.complete = { [weak self] passcode in
|
||||
self?.checkPasscode?(passcode)
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
if strongSelf.shouldWaitBeforeNextAttempt() {
|
||||
strongSelf.animateError()
|
||||
} else {
|
||||
strongSelf.checkPasscode?(passcode)
|
||||
}
|
||||
}
|
||||
|
||||
self.deleteButtonNode.setTitle(strings.Common_Delete, with: buttonFont, with: .white, for: .normal)
|
||||
@ -146,6 +157,43 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
}
|
||||
}
|
||||
|
||||
private func shouldWaitBeforeNextAttempt() -> Bool {
|
||||
if let attempts = self.invalidAttempts {
|
||||
let waitInterval: Int32 = 60
|
||||
if attempts.count >= 6 {
|
||||
if Int32(CFAbsoluteTimeGetCurrent()) - attempts.timestamp < waitInterval {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func updateInvalidAttempts(_ attempts: AccessChallengeAttempts?, animated: Bool = false) {
|
||||
self.invalidAttempts = attempts
|
||||
if let attempts = attempts {
|
||||
let text: NSAttributedString
|
||||
if attempts.count >= 6 {
|
||||
if self.shouldWaitBeforeNextAttempt() {
|
||||
text = NSAttributedString(string: self.strings.PasscodeSettings_TryAgainIn1Minute, font: subtitleFont, textColor: .white)
|
||||
} else {
|
||||
text = NSAttributedString(string: "")
|
||||
}
|
||||
} else {
|
||||
text = NSAttributedString(string: self.strings.PasscodeSettings_FailedAttempts(attempts.count), font: subtitleFont, textColor: .white)
|
||||
}
|
||||
|
||||
self.subtitleNode.setAttributedText(text, animation: animated ? .crossFade : .none, completion: {})
|
||||
} else {
|
||||
self.subtitleNode.setAttributedText(NSAttributedString(string: ""), animation: animated ? .crossFade : .none, completion: {})
|
||||
}
|
||||
}
|
||||
|
||||
func initialAppearance() {
|
||||
self.titleNode.setAttributedText(NSAttributedString(string: self.strings.Passcode_AppLockedAlert.replacingOccurrences(of: "\n", with: " "), font: titleFont, textColor: .white), animation: .none, completion: {
|
||||
Queue.mainQueue().after(2.0, {
|
||||
@ -170,17 +218,21 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
self.statusBar.layer.removeAnimation(forKey: "opacity")
|
||||
self.statusBar.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
|
||||
|
||||
self.subtitleNode.isHidden = true
|
||||
self.inputFieldNode.isHidden = true
|
||||
self.keyboardNode.isHidden = true
|
||||
self.deleteButtonNode.isHidden = true
|
||||
self.biometricButtonNode.isHidden = true
|
||||
|
||||
self.titleNode.setAttributedText(NSAttributedString(string: self.strings.Passcode_AppLockedAlert.replacingOccurrences(of: "\n", with: " "), font: titleFont, textColor: .white), animation: .slideIn, completion: {
|
||||
self.subtitleNode.isHidden = false
|
||||
self.inputFieldNode.isHidden = false
|
||||
self.keyboardNode.isHidden = false
|
||||
self.deleteButtonNode.isHidden = false
|
||||
self.biometricButtonNode.isHidden = false
|
||||
|
||||
self.subtitleNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
|
||||
|
||||
self.inputFieldNode.animateIn()
|
||||
self.keyboardNode.animateIn()
|
||||
var biometricDelay = 0.3
|
||||
@ -229,13 +281,18 @@ final class PasscodeEntryControllerNode: ASDisplayNode {
|
||||
let iconSize = CGSize(width: 35.0, height: 37.0)
|
||||
transition.updateFrame(node: self.iconNode, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0) + 6.0, y: layout.insets(options: .statusBar).top + 15.0), size: iconSize))
|
||||
|
||||
let inputFieldFrame = self.inputFieldNode.updateLayout(layout: layout, transition: transition)
|
||||
let passcodeLayout = PasscodeLayout(layout: layout)
|
||||
|
||||
let inputFieldFrame = self.inputFieldNode.updateLayout(layout: passcodeLayout, transition: transition)
|
||||
transition.updateFrame(node: self.inputFieldNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
||||
|
||||
let titleSize = self.titleNode.updateLayout(layout: layout, transition: transition)
|
||||
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 162.0), size: titleSize))
|
||||
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: 0.0, y: passcodeLayout.titleOffset), size: titleSize))
|
||||
|
||||
let (keyboardFrame, keyboardButtonSize) = self.keyboardNode.updateLayout(layout: layout, transition: transition)
|
||||
let subtitleSize = self.subtitleNode.updateLayout(layout: layout, transition: transition)
|
||||
transition.updateFrame(node: self.subtitleNode, frame: CGRect(origin: CGPoint(x: 0.0, y: inputFieldFrame.maxY + passcodeLayout.subtitleOffset), size: subtitleSize))
|
||||
|
||||
let (keyboardFrame, keyboardButtonSize) = self.keyboardNode.updateLayout(layout: passcodeLayout, transition: transition)
|
||||
transition.updateFrame(node: self.keyboardNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
||||
|
||||
switch self.passcodeType {
|
||||
|
@ -126,7 +126,7 @@ final class PasscodeEntryInputFieldNode: ASDisplayNode, UITextFieldDelegate {
|
||||
private let borderNode: ASImageNode
|
||||
private let dotNodes: [PasscodeEntryDotNode]
|
||||
|
||||
private var validLayout: ContainerViewLayout?
|
||||
private var validLayout: PasscodeLayout?
|
||||
|
||||
var complete: ((String) -> Void)?
|
||||
|
||||
@ -277,7 +277,7 @@ final class PasscodeEntryInputFieldNode: ASDisplayNode, UITextFieldDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
func updateLayout(layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) -> CGRect {
|
||||
func updateLayout(layout: PasscodeLayout, transition: ContainedViewLayoutTransition) -> CGRect {
|
||||
self.validLayout = layout
|
||||
|
||||
let fieldAlpha: CGFloat
|
||||
@ -291,7 +291,7 @@ final class PasscodeEntryInputFieldNode: ASDisplayNode, UITextFieldDelegate {
|
||||
transition.updateAlpha(node: self.textFieldNode, alpha: fieldAlpha)
|
||||
transition.updateAlpha(node: self.borderNode, alpha: fieldAlpha)
|
||||
|
||||
let origin = CGPoint(x: floor((layout.size.width - dotDiameter * 6 - dotSpacing * 5) / 2.0), y: 206.0)
|
||||
let origin = CGPoint(x: floor((layout.layout.size.width - dotDiameter * 6 - dotSpacing * 5) / 2.0), y: layout.inputFieldOffset)
|
||||
for i in 0 ..< self.dotNodes.count {
|
||||
let node = self.dotNodes[i]
|
||||
let dotAlpha: CGFloat
|
||||
@ -310,7 +310,7 @@ final class PasscodeEntryInputFieldNode: ASDisplayNode, UITextFieldDelegate {
|
||||
}
|
||||
|
||||
let inset: CGFloat = 50.0
|
||||
let fieldFrame = CGRect(x: inset, y: origin.y, width: layout.size.width - inset * 2.0, height: fieldHeight)
|
||||
let fieldFrame = CGRect(x: inset, y: origin.y, width: layout.layout.size.width - inset * 2.0, height: fieldHeight)
|
||||
transition.updateFrame(node: self.borderNode, frame: fieldFrame)
|
||||
transition.updateFrame(node: self.textFieldNode, frame: fieldFrame.insetBy(dx: 13.0, dy: 0.0))
|
||||
if let background = self.background {
|
||||
|
@ -238,124 +238,37 @@ final class PasscodeEntryKeyboardNode: ASDisplayNode {
|
||||
}
|
||||
}
|
||||
|
||||
func updateLayout(layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) -> (CGRect, CGSize) {
|
||||
let buttonSize: CGFloat
|
||||
let horizontalSecond: CGFloat
|
||||
let horizontalThird: CGFloat
|
||||
let verticalSecond: CGFloat
|
||||
let verticalThird: CGFloat
|
||||
let verticalFourth: CGFloat
|
||||
let size: CGSize
|
||||
let offset: CGFloat
|
||||
|
||||
let metrics = DeviceMetrics.forScreenSize(layout.size)
|
||||
if let metrics = metrics {
|
||||
switch metrics {
|
||||
case .iPhone4:
|
||||
buttonSize = 75.0
|
||||
horizontalSecond = 95.0
|
||||
horizontalThird = 190.0
|
||||
verticalSecond = 88.0
|
||||
verticalThird = 176.0
|
||||
verticalFourth = 264.0
|
||||
size = CGSize(width: 265.0, height: 339.0)
|
||||
offset = 0.0
|
||||
case .iPhone5:
|
||||
buttonSize = 75.0
|
||||
horizontalSecond = 95.0
|
||||
horizontalThird = 190.0
|
||||
verticalSecond = 88.0
|
||||
verticalThird = 176.0
|
||||
verticalFourth = 264.0
|
||||
size = CGSize(width: 265.0, height: 339.0)
|
||||
offset = 0.0
|
||||
case .iPhone6:
|
||||
buttonSize = 75.0
|
||||
horizontalSecond = 103.0
|
||||
horizontalThird = 206.0
|
||||
verticalSecond = 90.0
|
||||
verticalThird = 180.0
|
||||
verticalFourth = 270.0
|
||||
size = CGSize(width: 281.0, height: 345.0)
|
||||
offset = 0.0
|
||||
case .iPhone6Plus:
|
||||
buttonSize = 75.0
|
||||
horizontalSecond = 103.0
|
||||
horizontalThird = 206.0
|
||||
verticalSecond = 90.0
|
||||
verticalThird = 180.0
|
||||
verticalFourth = 270.0
|
||||
size = CGSize(width: 281.0, height: 345.0)
|
||||
offset = 0.0
|
||||
case .iPhoneX:
|
||||
buttonSize = 75.0
|
||||
horizontalSecond = 103.0
|
||||
horizontalThird = 206.0
|
||||
verticalSecond = 91.0
|
||||
verticalThird = 182.0
|
||||
verticalFourth = 273.0
|
||||
size = CGSize(width: 281.0, height: 348.0)
|
||||
offset = 294.0
|
||||
case .iPhoneXSMax:
|
||||
buttonSize = 85.0
|
||||
horizontalSecond = 115.0
|
||||
horizontalThird = 230.0
|
||||
verticalSecond = 100.0
|
||||
verticalThird = 200.0
|
||||
verticalFourth = 300.0
|
||||
size = CGSize(width: 315.0, height: 385.0)
|
||||
offset = 329.0
|
||||
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
|
||||
buttonSize = 81.0
|
||||
horizontalSecond = 106.0
|
||||
horizontalThird = 212.0
|
||||
verticalSecond = 101.0
|
||||
verticalThird = 202.0
|
||||
verticalFourth = 303.0
|
||||
size = CGSize(width: 293.0, height: 384.0)
|
||||
offset = 0.0
|
||||
}
|
||||
} else {
|
||||
buttonSize = 75.0
|
||||
horizontalSecond = 95.0
|
||||
horizontalThird = 190.0
|
||||
verticalSecond = 88.0
|
||||
verticalThird = 176.0
|
||||
verticalFourth = 264.0
|
||||
size = CGSize(width: 265.0, height: 339.0)
|
||||
offset = 0.0
|
||||
}
|
||||
|
||||
let origin = CGPoint(x: floor((layout.size.width - size.width) / 2.0), y: offset)
|
||||
func updateLayout(layout: PasscodeLayout, transition: ContainedViewLayoutTransition) -> (CGRect, CGSize) {
|
||||
let origin = CGPoint(x: floor((layout.layout.size.width - layout.keyboard.size.width) / 2.0), y: layout.keyboard.topOffset)
|
||||
if let subnodes = self.subnodes {
|
||||
for i in 0 ..< subnodes.count {
|
||||
var origin = origin
|
||||
if i % 3 == 0 {
|
||||
origin.x += 0.0
|
||||
} else if (i % 3 == 1) {
|
||||
origin.x += horizontalSecond
|
||||
origin.x += layout.keyboard.horizontalSecond
|
||||
}
|
||||
else {
|
||||
origin.x += horizontalThird
|
||||
origin.x += layout.keyboard.horizontalThird
|
||||
}
|
||||
|
||||
if i / 3 == 0 {
|
||||
origin.y += 0.0
|
||||
}
|
||||
else if i / 3 == 1 {
|
||||
origin.y += verticalSecond
|
||||
origin.y += layout.keyboard.verticalSecond
|
||||
}
|
||||
else if i / 3 == 2 {
|
||||
origin.y += verticalThird
|
||||
origin.y += layout.keyboard.verticalThird
|
||||
}
|
||||
else if i / 3 == 3 {
|
||||
origin.x += horizontalSecond
|
||||
origin.y += verticalFourth
|
||||
origin.x += layout.keyboard.horizontalSecond
|
||||
origin.y += layout.keyboard.verticalFourth
|
||||
}
|
||||
transition.updateFrame(node: subnodes[i], frame: CGRect(origin: origin, size: CGSize(width: buttonSize, height: buttonSize)))
|
||||
transition.updateFrame(node: subnodes[i], frame: CGRect(origin: origin, size: CGSize(width: layout.keyboard.buttonSize, height: layout.keyboard.buttonSize)))
|
||||
}
|
||||
}
|
||||
return (CGRect(origin: origin, size: size), CGSize(width: buttonSize, height: buttonSize))
|
||||
return (CGRect(origin: origin, size: layout.keyboard.size), CGSize(width: layout.keyboard.buttonSize, height: layout.keyboard.buttonSize))
|
||||
}
|
||||
|
||||
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
|
||||
|
153
TelegramUI/PasscodeLayout.swift
Normal file
153
TelegramUI/PasscodeLayout.swift
Normal file
@ -0,0 +1,153 @@
|
||||
import Foundation
|
||||
import Display
|
||||
|
||||
struct PasscodeKeyboardLayout {
|
||||
let buttonSize: CGFloat
|
||||
let horizontalSecond: CGFloat
|
||||
let horizontalThird: CGFloat
|
||||
let verticalSecond: CGFloat
|
||||
let verticalThird: CGFloat
|
||||
let verticalFourth: CGFloat
|
||||
let size: CGSize
|
||||
let topOffset: CGFloat
|
||||
|
||||
fileprivate init(metrics: DeviceMetrics?) {
|
||||
if let metrics = metrics {
|
||||
switch metrics {
|
||||
case .iPhone4:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 95.0
|
||||
self.horizontalThird = 190.0
|
||||
self.verticalSecond = 88.0
|
||||
self.verticalThird = 176.0
|
||||
self.verticalFourth = 264.0
|
||||
self.size = CGSize(width: 265.0, height: 339.0)
|
||||
self.topOffset = 0.0
|
||||
case .iPhone5:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 95.0
|
||||
self.horizontalThird = 190.0
|
||||
self.verticalSecond = 88.0
|
||||
self.verticalThird = 176.0
|
||||
self.verticalFourth = 264.0
|
||||
self.size = CGSize(width: 265.0, height: 339.0)
|
||||
self.topOffset = 0.0
|
||||
case .iPhone6:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 103.0
|
||||
self.horizontalThird = 206.0
|
||||
self.verticalSecond = 90.0
|
||||
self.verticalThird = 180.0
|
||||
self.verticalFourth = 270.0
|
||||
self.size = CGSize(width: 281.0, height: 348.0)
|
||||
self.topOffset = 0.0
|
||||
case .iPhone6Plus:
|
||||
self.buttonSize = 85.0
|
||||
self.horizontalSecond = 115.0
|
||||
self.horizontalThird = 230.0
|
||||
self.verticalSecond = 100.0
|
||||
self.verticalThird = 200.0
|
||||
self.verticalFourth = 300.0
|
||||
self.size = CGSize(width: 315.0, height: 385.0)
|
||||
self.topOffset = 226.0
|
||||
case .iPhoneX:
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 103.0
|
||||
self.horizontalThird = 206.0
|
||||
self.verticalSecond = 91.0
|
||||
self.verticalThird = 182.0
|
||||
self.verticalFourth = 273.0
|
||||
self.size = CGSize(width: 281.0, height: 348.0)
|
||||
self.topOffset = 294.0
|
||||
case .iPhoneXSMax:
|
||||
self.buttonSize = 85.0
|
||||
self.horizontalSecond = 115.0
|
||||
self.horizontalThird = 230.0
|
||||
self.verticalSecond = 100.0
|
||||
self.verticalThird = 200.0
|
||||
self.verticalFourth = 300.0
|
||||
self.size = CGSize(width: 315.0, height: 385.0)
|
||||
self.topOffset = 329.0
|
||||
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
|
||||
self.buttonSize = 81.0
|
||||
self.horizontalSecond = 106.0
|
||||
self.horizontalThird = 212.0
|
||||
self.verticalSecond = 101.0
|
||||
self.verticalThird = 202.0
|
||||
self.verticalFourth = 303.0
|
||||
self.size = CGSize(width: 293.0, height: 384.0)
|
||||
self.topOffset = 0.0
|
||||
}
|
||||
} else {
|
||||
self.buttonSize = 75.0
|
||||
self.horizontalSecond = 95.0
|
||||
self.horizontalThird = 190.0
|
||||
self.verticalSecond = 88.0
|
||||
self.verticalThird = 176.0
|
||||
self.verticalFourth = 264.0
|
||||
self.size = CGSize(width: 265.0, height: 339.0)
|
||||
self.topOffset = 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct PasscodeLayout {
|
||||
let layout: ContainerViewLayout
|
||||
let keyboard: PasscodeKeyboardLayout
|
||||
let titleOffset: CGFloat
|
||||
let subtitleOffset: CGFloat
|
||||
let inputFieldOffset: CGFloat
|
||||
|
||||
init(layout: ContainerViewLayout) {
|
||||
self.layout = layout
|
||||
|
||||
let metrics = DeviceMetrics.forScreenSize(layout.size)
|
||||
self.keyboard = PasscodeKeyboardLayout(metrics: metrics)
|
||||
if let metrics = metrics {
|
||||
switch metrics {
|
||||
case .iPhone4:
|
||||
self.titleOffset = 0.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 0.0
|
||||
case .iPhone5:
|
||||
self.titleOffset = 0.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 0.0
|
||||
case .iPhone6:
|
||||
self.titleOffset = 0.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 0.0
|
||||
case .iPhone6Plus:
|
||||
self.titleOffset = 112.0
|
||||
self.subtitleOffset = -6.0
|
||||
self.inputFieldOffset = 156.0
|
||||
case .iPhoneX:
|
||||
self.titleOffset = 162.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 206.0
|
||||
case .iPhoneXSMax:
|
||||
self.titleOffset = 180.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 226.0
|
||||
case .iPad, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen:
|
||||
self.titleOffset = 0.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 0.0
|
||||
}
|
||||
} else {
|
||||
self.titleOffset = 100.0
|
||||
self.subtitleOffset = 0.0
|
||||
self.inputFieldOffset = 140.0
|
||||
}
|
||||
}
|
||||
|
||||
init(layout: ContainerViewLayout, titleOffset: CGFloat, subtitleOffset: CGFloat, inputFieldOffset: CGFloat) {
|
||||
self.layout = layout
|
||||
|
||||
let metrics = DeviceMetrics.forScreenSize(layout.size)
|
||||
self.keyboard = PasscodeKeyboardLayout(metrics: metrics)
|
||||
self.titleOffset = titleOffset
|
||||
self.subtitleOffset = subtitleOffset
|
||||
self.inputFieldOffset = inputFieldOffset
|
||||
}
|
||||
}
|
@ -497,72 +497,23 @@ public func passcodeOptionsAccessController(context: AccountContext, animateIn:
|
||||
})
|
||||
return controller
|
||||
} else {
|
||||
completion(true)
|
||||
return nil
|
||||
// let controller = PasscodeSetupController(context: context, mode: .entry(challenge))
|
||||
// return controller
|
||||
|
||||
var attemptData: TGPasscodeEntryAttemptData?
|
||||
if let attempts = challenge.attempts {
|
||||
attemptData = TGPasscodeEntryAttemptData(numberOfInvalidAttempts: Int(attempts.count), dateOfLastInvalidAttempt: Double(attempts.timestamp))
|
||||
}
|
||||
var dismissImpl: (() -> Void)?
|
||||
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
|
||||
let legacyController = LegacyController(presentation: LegacyControllerPresentation.modal(animateIn: true), theme: presentationData.theme)
|
||||
let mode: TGPasscodeEntryControllerMode
|
||||
switch challenge {
|
||||
case .none, .numericalPassword:
|
||||
mode = TGPasscodeEntryControllerModeVerifySimple
|
||||
case .plaintextPassword:
|
||||
mode = TGPasscodeEntryControllerModeVerifyComplex
|
||||
}
|
||||
let controller = TGPasscodeEntryController(context: legacyController.context, style: TGPasscodeEntryControllerStyleDefault, mode: mode, cancelEnabled: true, allowTouchId: false, attemptData: attemptData, completion: { value in
|
||||
if value != nil {
|
||||
completion(false)
|
||||
}
|
||||
dismissImpl?()
|
||||
})!
|
||||
controller.checkCurrentPasscode = { value in
|
||||
if let value = value {
|
||||
switch challenge {
|
||||
let controller = PasscodeSetupController(context: context, mode: .entry(challenge))
|
||||
controller.check = { passcode in
|
||||
var succeed = false
|
||||
switch challenge {
|
||||
case .none:
|
||||
return true
|
||||
succeed = true
|
||||
case let .numericalPassword(code, _, _):
|
||||
return value == code
|
||||
succeed = passcode == code
|
||||
case let .plaintextPassword(code, _, _):
|
||||
return value == code
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
succeed = passcode == code
|
||||
}
|
||||
if succeed {
|
||||
completion(true)
|
||||
}
|
||||
return succeed
|
||||
}
|
||||
controller.updateAttemptData = { attemptData in
|
||||
let _ = context.sharedContext.accountManager.transaction({ transaction -> Void in
|
||||
var attempts: AccessChallengeAttempts?
|
||||
if let attemptData = attemptData {
|
||||
attempts = AccessChallengeAttempts(count: Int32(attemptData.numberOfInvalidAttempts), timestamp: Int32(attemptData.dateOfLastInvalidAttempt))
|
||||
}
|
||||
var data = transaction.getAccessChallengeData()
|
||||
switch data {
|
||||
case .none:
|
||||
break
|
||||
case let .numericalPassword(value, timeout, _):
|
||||
data = .numericalPassword(value: value, timeout: timeout, attempts: attempts)
|
||||
case let .plaintextPassword(value, timeout, _):
|
||||
data = .plaintextPassword(value: value, timeout: timeout, attempts: attempts)
|
||||
}
|
||||
transaction.setAccessChallengeData(data)
|
||||
}).start()
|
||||
}
|
||||
legacyController.bind(controller: controller)
|
||||
legacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait)
|
||||
legacyController.statusBar.statusBarStyle = .White
|
||||
dismissImpl = { [weak legacyController] in
|
||||
legacyController?.dismiss()
|
||||
}
|
||||
return legacyController
|
||||
return controller
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ final class PasscodeSetupController: ViewController {
|
||||
private var mode: PasscodeSetupControllerMode
|
||||
|
||||
var complete: ((String, Bool) -> Void)?
|
||||
var check: ((String) -> Bool)?
|
||||
|
||||
private let hapticFeedback = HapticFeedback()
|
||||
|
||||
@ -116,6 +117,9 @@ final class PasscodeSetupController: ViewController {
|
||||
strongSelf.complete?(passcode, numerical)
|
||||
}
|
||||
}
|
||||
self.controllerNode.checkPasscode = { [weak self] passcode in
|
||||
return self?.check?(passcode) ?? false
|
||||
}
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
|
@ -43,6 +43,7 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
}
|
||||
|
||||
var selectPasscodeMode: (() -> Void)?
|
||||
var checkPasscode: ((String) -> Bool)?
|
||||
var complete: ((String, Bool) -> Void)?
|
||||
var updateNextAction: ((Bool) -> Void)?
|
||||
|
||||
@ -59,11 +60,23 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
self.titleNode = ASTextNode()
|
||||
self.titleNode.isUserInteractionEnabled = false
|
||||
self.titleNode.displaysAsynchronously = false
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.EnterPasscode_EnterNewPasscodeNew, font: Font.regular(17.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.inputFieldNode = PasscodeEntryInputFieldNode(color: self.presentationData.theme.list.itemPrimaryTextColor, fieldType: .digits6, keyboardAppearance: self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance)
|
||||
let passcodeType: PasscodeEntryFieldType
|
||||
switch self.mode {
|
||||
case let .entry(challenge):
|
||||
switch challenge {
|
||||
case let .numericalPassword(value, _, _):
|
||||
passcodeType = value.count == 6 ? .digits6 : .digits4
|
||||
default:
|
||||
passcodeType = .alphanumeric
|
||||
}
|
||||
case .setup:
|
||||
passcodeType = .digits6
|
||||
}
|
||||
|
||||
self.inputFieldNode = PasscodeEntryInputFieldNode(color: self.presentationData.theme.list.itemPrimaryTextColor, fieldType: passcodeType, keyboardAppearance: self.presentationData.theme.chatList.searchBarKeyboardColor.keyboardAppearance)
|
||||
self.inputFieldBackgroundNode = ASImageNode()
|
||||
self.inputFieldBackgroundNode.alpha = 0.0
|
||||
self.inputFieldBackgroundNode.alpha = passcodeType == .alphanumeric ? 1.0 : 0.0
|
||||
self.inputFieldBackgroundNode.contentMode = .scaleToFill
|
||||
self.inputFieldBackgroundNode.image = generateFieldBackground(backgroundColor: self.presentationData.theme.list.itemBlocksBackgroundColor, borderColor: self.presentationData.theme.list.itemBlocksSeparatorColor)
|
||||
|
||||
@ -85,6 +98,16 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
self.wrapperNode.addSubnode(self.inputFieldNode)
|
||||
self.wrapperNode.addSubnode(self.modeButtonNode)
|
||||
|
||||
let text: String
|
||||
switch self.mode {
|
||||
case .entry:
|
||||
self.modeButtonNode.isHidden = true
|
||||
text = self.presentationData.strings.EnterPasscode_EnterPasscode
|
||||
case .setup:
|
||||
text = self.presentationData.strings.EnterPasscode_EnterNewPasscodeNew
|
||||
}
|
||||
self.titleNode.attributedText = NSAttributedString(string: text, font: Font.regular(17.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor)
|
||||
|
||||
self.inputFieldNode.complete = { [weak self] passcode in
|
||||
self?.activateNext()
|
||||
}
|
||||
@ -99,7 +122,8 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
|
||||
self.wrapperNode.frame = CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: layout.size.height)
|
||||
|
||||
let inputFieldFrame = self.inputFieldNode.updateLayout(layout: layout, transition: transition)
|
||||
let passcodeLayout = PasscodeLayout(layout: layout, titleOffset: 0.0, subtitleOffset: 0.0, inputFieldOffset: floor(insets.top + navigationBarHeight + (layout.size.height - navigationBarHeight - insets.top - insets.bottom - 38.0) / 2.0))
|
||||
let inputFieldFrame = self.inputFieldNode.updateLayout(layout: passcodeLayout, transition: transition)
|
||||
transition.updateFrame(node: self.inputFieldNode, frame: CGRect(origin: CGPoint(), size: layout.size))
|
||||
|
||||
transition.updateFrame(node: self.inputFieldBackgroundNode, frame: CGRect(x: 0.0, y: inputFieldFrame.minY - 6.0, width: layout.size.width, height: 48.0))
|
||||
@ -137,38 +161,45 @@ final class PasscodeSetupControllerNode: ASDisplayNode {
|
||||
return
|
||||
}
|
||||
|
||||
if let previousPasscode = self.previousPasscode {
|
||||
if self.currentPasscode == previousPasscode {
|
||||
var numerical = false
|
||||
if case let .setup(type) = mode {
|
||||
if case .alphanumeric = type {
|
||||
switch self.mode {
|
||||
case .entry:
|
||||
if !(self.checkPasscode?(self.currentPasscode) ?? false) {
|
||||
self.animateError()
|
||||
}
|
||||
case .setup:
|
||||
if let previousPasscode = self.previousPasscode {
|
||||
if self.currentPasscode == previousPasscode {
|
||||
var numerical = false
|
||||
if case let .setup(type) = mode {
|
||||
if case .alphanumeric = type {
|
||||
} else {
|
||||
numerical = true
|
||||
}
|
||||
}
|
||||
self.complete?(self.currentPasscode, numerical)
|
||||
} else {
|
||||
numerical = true
|
||||
self.animateError()
|
||||
}
|
||||
} else {
|
||||
self.previousPasscode = self.currentPasscode
|
||||
|
||||
if let snapshotView = self.wrapperNode.view.snapshotContentTree() {
|
||||
snapshotView.frame = self.wrapperNode.frame
|
||||
self.wrapperNode.view.superview?.insertSubview(snapshotView, aboveSubview: self.wrapperNode.view)
|
||||
snapshotView.layer.animatePosition(from: CGPoint(), to: CGPoint(x: -self.wrapperNode.bounds.width, y: 0.0), duration: 0.25, removeOnCompletion: false, additive: true, completion : { [weak snapshotView] _ in
|
||||
snapshotView?.removeFromSuperview()
|
||||
})
|
||||
self.wrapperNode.layer.animatePosition(from: CGPoint(x: self.wrapperNode.bounds.width, y: 0.0), to: CGPoint(), duration: 0.25, additive: true)
|
||||
|
||||
self.inputFieldNode.reset(animated: false)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.EnterPasscode_RepeatNewPasscode, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor)
|
||||
self.modeButtonNode.isHidden = true
|
||||
|
||||
if let validLayout = self.validLayout {
|
||||
self.containerLayoutUpdated(validLayout, navigationBarHeight: 0.0, transition: .immediate)
|
||||
}
|
||||
}
|
||||
}
|
||||
self.complete?(self.currentPasscode, numerical)
|
||||
} else {
|
||||
self.animateError()
|
||||
}
|
||||
} else {
|
||||
self.previousPasscode = self.currentPasscode
|
||||
|
||||
if let snapshotView = self.wrapperNode.view.snapshotContentTree() {
|
||||
snapshotView.frame = self.wrapperNode.frame
|
||||
self.wrapperNode.view.superview?.insertSubview(snapshotView, aboveSubview: self.wrapperNode.view)
|
||||
snapshotView.layer.animatePosition(from: CGPoint(), to: CGPoint(x: -self.wrapperNode.bounds.width, y: 0.0), duration: 0.25, removeOnCompletion: false, additive: true, completion : { [weak snapshotView] _ in
|
||||
snapshotView?.removeFromSuperview()
|
||||
})
|
||||
self.wrapperNode.layer.animatePosition(from: CGPoint(x: self.wrapperNode.bounds.width, y: 0.0), to: CGPoint(), duration: 0.25, additive: true)
|
||||
|
||||
self.inputFieldNode.reset(animated: false)
|
||||
self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.EnterPasscode_RepeatNewPasscode, font: Font.regular(16.0), textColor: self.presentationData.theme.list.itemPrimaryTextColor)
|
||||
self.modeButtonNode.isHidden = true
|
||||
|
||||
if let validLayout = self.validLayout {
|
||||
self.containerLayoutUpdated(validLayout, navigationBarHeight: 0.0, transition: .immediate)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
1
TelegramUI/Resources/Animations/anim_archive.json
Normal file
1
TelegramUI/Resources/Animations/anim_archive.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":30,"w":228,"h":228,"nm":"Archiveic","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"box3","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[30]},{"t":20,"s":[0]}],"ix":10},"p":{"a":0,"k":[30.5,-39,0],"ix":2},"a":{"a":0,"k":[30.5,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.1,0],[0,0],[0,-1.1],[0,0],[0,0],[0,0]],"o":[[0,0],[1.1,0],[0,0],[0,0],[0,0],[0,-1.1]],"v":[[-11,-3],[11,-3],[13,-1],[13,3],[-13,3],[-13,-1]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"box2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-13.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10,3],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":1,"ix":4},"nm":"Rectangle Outline 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662744998932,0.662744998932,0.678430974483,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"box1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114,93,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[110,110,100]},{"t":20,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.1,0],[0,0],[0,1.1]],"o":[[0,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,0]],"v":[[-12,-9],[12,-9],[12,7],[10,9],[-10,9],[-12,7]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0}],"markers":[]}
|
1
TelegramUI/Resources/Animations/anim_delete.json
Normal file
1
TelegramUI/Resources/Animations/anim_delete.json
Normal file
File diff suppressed because one or more lines are too long
1
TelegramUI/Resources/Animations/anim_hide.json
Normal file
1
TelegramUI/Resources/Animations/anim_hide.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":30,"w":228,"h":228,"nm":"Hide","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114,79.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[110,110,100]},{"t":20,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11,0],[11,0]],"c":false},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.57,0],[0.06,-0.56],[0,0],[0,0],[0,0],[-0.56,0],[-0.07,0.56]],"o":[[0,0],[0,0],[0,0],[-0.06,-0.56],[-0.57,0],[0,0],[0,0],[0,0],[0.07,0.56],[0.56,0],[0,0]],"v":[[1.09,-3.5],[12,-3.5],[12,3.5],[1.1,3.5],[0,2.5],[-1.1,3.5],[-12,3.5],[-12,-3.5],[-1.09,-3.5],[0,-2.5],[1.09,-3.5]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176470588,0.741176470588,0.760784313725,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,-4,0],"to":[0,-0.167,0],"ti":[0,-1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[0,-5,0],"to":[0,1.167,0],"ti":[0,-1.333,0]},{"t":20,"s":[0,3,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.6,0],[0,0.61],[0,0],[0,0],[0.41,0.45],[-0.45,0.41],[0,0],[-0.42,-0.39],[0,0],[0.41,-0.45],[0.45,0.41]],"o":[[0,0],[0,0.61],[-0.61,0],[0,0],[0,0],[-0.44,0.41],[-0.41,-0.45],[0,0],[0.42,-0.39],[0,0],[0.44,0.41],[-0.41,0.45],[0,0]],"v":[[1.103,-8],[1.103,10.5],[0.003,11.6],[-1.097,10.5],[-1.097,-8],[-3.927,-5.4],[-5.477,-5.47],[-5.407,-7.02],[-0.747,-11.31],[0.743,-11.31],[5.413,-7.02],[5.473,-5.47],[3.923,-5.4]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0}],"markers":[]}
|
1
TelegramUI/Resources/Animations/anim_mute.json
Normal file
1
TelegramUI/Resources/Animations/anim_mute.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.1.2","fr":60,"ip":0,"op":3600,"w":228,"h":228,"nm":"mute","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"un Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[117.875,88.875,0],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.863,0.863,-0.19]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_0p863_0p333_0","0p833_0p863_0p333_0","0p833_-0p19_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.365,0.365,0.476]},"n":["0p667_1_0p167_0p365","0p667_1_0p167_0p365","0p667_1_0p167_0p476"],"t":10,"s":[100,100,100],"e":[115,115,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":14,"s":[115,115,100],"e":[100,100,100]},{"t":25}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34,-34],[-33.992,-34]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34,-34],[34,34]],"c":false}]},{"t":15}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Group 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.584313750267,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[256,256],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"mute Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111,88.781,0],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.863,0.863,-12.69]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_0p863_0p333_0","0p833_0p863_0p333_0","0p833_-12p69_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.365,0.365,5.476]},"n":["0p667_1_0p167_0p365","0p667_1_0p167_0p365","0p667_1_0p167_5p476"],"t":10,"s":[100,100,100],"e":[115,115,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":14,"s":[115,115,100],"e":[100,100,100]},{"t":25}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.995,-0.904],[0,0],[0.746,0],[0,0],[0,-3.866],[0,0],[-3.866,0],[0,0],[-0.552,-0.503],[0,0],[-2.006,2.207],[0,1.343],[0,0],[2.982,0]],"o":[[0,0],[-0.552,0.502],[0,0],[-3.866,0],[0,0],[0,3.866],[0,0],[0.746,0],[0,0],[2.207,2.007],[0.903,-0.995],[0,0],[0,-2.982],[-1.343,0]],"v":[[16.967,-36.589],[-6.142,-15.581],[-8.16,-14.801],[-19,-14.801],[-26,-7.801],[-26,7.199],[-19,14.199],[-8.16,14.199],[-6.142,14.98],[16.967,35.987],[24.596,35.625],[26,31.992],[26,-32.594],[20.6,-37.994]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[256,256.994],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]}
|
1
TelegramUI/Resources/Animations/anim_pin.json
Normal file
1
TelegramUI/Resources/Animations/anim_pin.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.1.2","fr":60,"ip":0,"op":3600,"w":228,"h":228,"nm":"pinchat","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"pin Outlines","sr":1,"ks":{"o":{"a":0,"k":99,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.656,86.516,0],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.872,0.872,-10.015]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_0p872_0p333_0","0p833_0p872_0p333_0","0p833_-10p015_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.426,0.426,5.508]},"n":["0p667_1_0p167_0p426","0p667_1_0p167_0p426","0p667_1_0p167_5p508"],"t":10,"s":[100,100,100],"e":[115,115,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":15,"s":[115,115,100],"e":[100,100,100]},{"t":24}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.682,-2.385],[0,0],[7.227,-5.009],[0.494,-0.402],[0.078,-0.079],[-1.265,-1.266],[0,0],[-0.087,-0.07],[-1.129,1.388],[-0.211,0.297],[2.361,8.281],[0,0],[3.76,3.76],[0,0],[2.035,0]],"o":[[0,0],[-8.176,-2.331],[-0.37,0.258],[-0.086,0.07],[-1.265,1.265],[0,0],[0.079,0.078],[1.388,1.129],[0.312,-0.384],[5.172,-7.273],[0,0],[4.348,-3.067],[0,0],[-1.701,-1.701],[-2.465,0]],"v":[[10.943,-36.491],[-1.24,-19.219],[-25.643,-15.202],[-26.94,-14.213],[-27.187,-13.99],[-27.187,-9.408],[8.801,26.579],[9.049,26.802],[13.607,26.332],[14.391,25.311],[18.607,0.628],[35.879,-11.556],[36.955,-23.925],[23.313,-37.567],[17.514,-40.1]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-40.714,40.1],[-7.985,15.793],[-16.406,7.372]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[256.714,257.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]}
|
1
TelegramUI/Resources/Animations/anim_read.json
Normal file
1
TelegramUI/Resources/Animations/anim_read.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"4.5.6","fr":60,"ip":0,"op":30,"w":228,"h":228,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Combined Shape","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[114,89.499,0]},"a":{"a":0,"k":[40,38.499,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p667_1_0p167_0p167","0p667_1_0p167_0p167","0p667_0p667_0p167_0p167"],"t":0,"s":[0,0,100],"e":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":15,"s":[110,110,100],"e":[100,100,100]},{"t":20}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.39,0],[0,19.29],[22.09,0],[0,-19.28],[-9.1,-6.4],[2.59,-3.82],[-1.62,-0.65],[-4.27,2.3],[-1.31,-0.29]],"o":[[22.09,0],[0,-19.28],[-22.09,0],[0,11],[1.17,0.82],[-2.6,3.82],[1,0.4],[6.1,-3.28],[3.14,0.69]],"v":[[40,69.85],[80,34.92],[40,0],[0,34.92],[14.45,61.34],[14.1,70.53],[9.89,76.75],[21.07,75.05],[30.18,68.79]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"mn":"ADBE Vector Group"}],"ip":0,"op":30,"st":0,"bm":0,"sr":1}]}
|
1
TelegramUI/Resources/Animations/anim_unarchive.json
Normal file
1
TelegramUI/Resources/Animations/anim_unarchive.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Unarchive","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"box2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,-9,0],"to":[0,3.833,0],"ti":[0,-3.833,0]},{"t":15,"s":[0,14,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10,3],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":1,"ix":4},"nm":"Rectangle Outline 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.662745098039,0.678431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"box1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,18,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[1.1,0],[0,0],[0,1.1]],"o":[[0,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,0]],"v":[[-12,-9],[12,-9],[12,7],[10,9],[-10,9],[-12,7]],"c":true}]},{"t":15,"s":[{"i":[[0,0],[0,0],[0,0],[1.1,0],[0,0],[0,1.1]],"o":[[0,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,0]],"v":[[-12,-5.167],[12,-5.167],[12,7],[10,9],[-10,9],[-12,7]],"c":true}]}],"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path 2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.067,"y":1},"o":{"x":0.936,"y":0},"t":0,"s":[0,28.621,0],"to":[0,-13.167,0],"ti":[0,13.167,0]},{"t":15,"s":[0,-50.379,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.1,0.09],[0,0],[-0.2,-0.2],[0,0],[0.19,-0.2],[0.13,0],[0,0],[0,0],[0.28,0],[0,0],[0,0.28],[0,0],[0,0],[0,0.28]],"o":[[0,0],[0.19,-0.2],[0,0],[0.19,0.19],[-0.09,0.09],[0,0],[0,0],[0,0.28],[0,0],[-0.27,0],[0,0],[0,0],[-0.28,0],[0,-0.13]],"v":[[-5.143,0.544],[-0.353,-4.246],[0.357,-4.246],[5.147,0.544],[5.147,1.254],[4.797,1.394],[1.997,1.394],[1.997,3.894],[1.497,4.394],[-1.503,4.394],[-2.003,3.894],[-2.003,1.394],[-4.793,1.394],[-5.293,0.894]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[110,110,100]},{"t":20,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
1
TelegramUI/Resources/Animations/anim_unmute.json
Normal file
1
TelegramUI/Resources/Animations/anim_unmute.json
Normal file
File diff suppressed because one or more lines are too long
1
TelegramUI/Resources/Animations/anim_unpin.json
Normal file
1
TelegramUI/Resources/Animations/anim_unpin.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.1.2","fr":60,"ip":0,"op":3600,"w":228,"h":228,"nm":"unpinpinchat","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"un Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118,84.062,0],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.872,0.872,-11.778]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_0p872_0p333_0","0p833_0p872_0p333_0","0p833_-11p778_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.426,0.426,6.389]},"n":["0p667_1_0p167_0p426","0p667_1_0p167_0p426","0p667_1_0p167_6p389"],"t":10,"s":[100,100,100],"e":[115,115,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":15,"s":[115,115,100],"e":[100,100,100]},{"t":24}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34,-34],[-33.992,-34]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34,-34],[34,34]],"c":false}]},{"t":15}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"st","c":{"a":0,"k":[0.097999999102,0.57599995931,0.980000035903,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[256,256],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"pin Outlines","sr":1,"ks":{"o":{"a":0,"k":99,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.656,86.516,0],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.859,0.859,-13.056]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_0p859_0p333_0","0p833_0p859_0p333_0","0p833_-13p056_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.341,0.341,5.111]},"n":["0p667_1_0p167_0p341","0p667_1_0p167_0p341","0p667_1_0p167_5p111"],"t":11,"s":[100,100,100],"e":[115,115,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":15,"s":[115,115,100],"e":[100,100,100]},{"t":24}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.682,-2.385],[0,0],[7.227,-5.009],[0.494,-0.402],[0.078,-0.079],[-1.265,-1.266],[0,0],[-0.087,-0.07],[-1.129,1.388],[-0.211,0.297],[2.361,8.281],[0,0],[3.76,3.76],[0,0],[2.035,0]],"o":[[0,0],[-8.176,-2.331],[-0.37,0.258],[-0.086,0.07],[-1.265,1.265],[0,0],[0.079,0.078],[1.388,1.129],[0.312,-0.384],[5.172,-7.273],[0,0],[4.348,-3.067],[0,0],[-1.701,-1.701],[-2.465,0]],"v":[[10.943,-36.491],[-1.24,-19.219],[-25.643,-15.202],[-26.94,-14.213],[-27.187,-13.99],[-27.187,-9.408],[8.801,26.579],[9.049,26.802],[13.607,26.332],[14.391,25.311],[18.607,0.628],[35.879,-11.556],[36.955,-23.925],[23.313,-37.567],[17.514,-40.1]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-40.714,40.1],[-7.985,15.793],[-16.406,7.372]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[256.714,257.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]}
|
1
TelegramUI/Resources/Animations/anim_unread.json
Normal file
1
TelegramUI/Resources/Animations/anim_unread.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"4.5.6","fr":60,"ip":0,"op":30,"w":228,"h":228,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Oval","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[144,60,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p667_1_0p167_0p167","0p667_1_0p167_0p167","0p667_0p667_0p167_0p167"],"t":10,"s":[0,0,100],"e":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":19,"s":[110,110,100],"e":[100,100,100]},{"t":24}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0.13,0.58,0.98,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5.333},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":30,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"Combined Shape","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[114,89.499,0]},"a":{"a":0,"k":[40,38.499,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p667_1_0p167_0p167","0p667_1_0p167_0p167","0p667_0p667_0p167_0p167"],"t":0,"s":[0,0,100],"e":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":15,"s":[110,110,100],"e":[100,100,100]},{"t":20}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.39,0],[0,19.29],[22.09,0],[0,-19.28],[-9.1,-6.4],[2.59,-3.82],[-1.62,-0.65],[-4.27,2.3],[-1.31,-0.29]],"o":[[22.09,0],[0,-19.28],[-22.09,0],[0,11],[1.17,0.82],[-2.6,3.82],[1,0.4],[6.1,-3.28],[3.14,0.69]],"v":[[40,69.85],[80,34.92],[40,0],[0,34.92],[14.45,61.34],[14.1,70.53],[9.89,76.75],[21.07,75.05],[30.18,68.79]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"mn":"ADBE Vector Group"}],"ip":0,"op":30,"st":0,"bm":0,"sr":1}]}
|
@ -1 +0,0 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Archive","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"box3","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[-10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":28,"s":[5]},{"t":36,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,-65,0],"to":[0,0.932,0],"ti":[0,-2.239,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[0,-85,0],"to":[0,0.817,0],"ti":[0,-1.967,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[0,-60,0],"to":[0,0.838,0],"ti":[0,-0.449,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":22,"s":[0,-75,0],"to":[0,1.429,0],"ti":[0,-2.755,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[0,-60,0],"to":[0,1.416,0],"ti":[0,0.204,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[0,-65,0],"to":[0,-0.33,0],"ti":[0,-0.384,0]},{"t":36,"s":[0,-60,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.086,0.086,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.183]},"t":0,"s":[92,92,100]},{"t":12,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.1,0],[0,0],[0,-1.1],[0,0],[0,0],[0,0]],"o":[[0,0],[1.1,0],[0,0],[0,0],[0,0],[0,-1.1]],"v":[[-11,-3],[11,-3],[13,-1],[13,3],[-13,3],[-13,-1]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"box2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-9,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.086,0.086,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,15.476]},"t":0,"s":[50,50,100]},{"t":12,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[10,3],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":1,"ix":4},"nm":"Rect Outline 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.662745098039,0.678431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"box1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,18,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.1,0],[0,0],[0,1.1]],"o":[[0,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,0]],"v":[[-12,-9],[12,-9],[12,7],[10,9],[-10,9],[-12,7]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.203,0.203,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[50,50,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Hide","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path 22","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-12,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10,0],[10,0]],"c":false},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 22","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle","parent":4,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-12,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.28,0],[0,0],[0,0.28],[0,0],[0,0],[0,0],[0.28,0],[0,0],[0,-0.28],[0,0]],"o":[[0,0],[0,0.28],[0,0],[0.28,0],[0,0],[0,0],[0,0],[0,-0.28],[0,0],[-0.28,0],[0,0],[0,0]],"v":[[-7,-3],[-2,-3],[-1.5,-2.5],[1.5,-2.5],[2,-3],[7,-3],[7,3],[2,3],[1.5,2.5],[-1.5,2.5],[-2,3],[-7,3]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847000002861,0.847000002861,0.847000002861,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path 19","parent":4,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.551,"y":0},"t":5,"s":[0,85.639,0],"to":[0,-15.667,0],"ti":[0,15.667,0]},{"t":35,"s":[0,-8.361,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,-100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.27,0],[0,0],[0,-0.28],[0,0],[0,0],[-0.09,-0.1],[0.19,-0.19],[0,0],[0.19,0.19],[0,0],[0,0.13],[-0.28,0],[0,0]],"o":[[0,-0.28],[0,0],[0.28,0],[0,0],[0,0],[0.13,0],[0.19,0.19],[0,0],[-0.2,0.19],[0,0],[-0.1,-0.09],[0,-0.28],[0,0],[0,0]],"v":[[-2.003,-10.896],[-1.503,-11.396],[1.497,-11.396],[1.997,-10.896],[1.997,5.604],[4.797,5.604],[5.147,5.754],[5.147,6.454],[0.357,11.254],[-0.353,11.254],[-5.143,6.454],[-5.293,6.104],[-4.793,5.604],[-2.003,5.604]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 19","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.203,0.203,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[50,50,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Pin","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"pin","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.9,-0.911,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-5.36,2.422],[-2.42,5.362],[-13.85,13.852]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.49,0.34],[-2.85,-0.81],[0,0],[-1.31,-1.31],[0,0],[1.52,-1.08],[0,0],[1.8,-2.54],[0,0]],"o":[[0,0],[2.52,-1.75],[0,0],[1.08,-1.52],[0,0],[1.32,1.31],[0,0],[0.82,2.89],[-0.33,0.45],[0,0]],"v":[[-10.289,-3.988],[-8.889,-5.158],[-0.369,-6.558],[3.881,-12.588],[8.201,-12.968],[12.961,-8.198],[12.591,-3.878],[6.561,0.372],[5.091,8.992],[3.991,10.282]],"c":true},"ix":2},"nm":"Outline 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":2,"nm":"Combine 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"pin","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.203,0.203,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[50,50,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
@ -1 +0,0 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Read","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Oval","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,-63,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.736,0.736,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-6.667]},"t":0,"s":[70,70,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.891,0.891,0.333],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"t":24,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Outline 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.125489994884,0.580392003059,0.980391979218,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,3,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.98,1.32],[-0.17,1.31],[0,4.1],[-7.73,0],[0,-6.73],[7.73,0],[0.97,0.19]],"o":[[0,0],[0,0],[0.7,-0.95],[-3.57,-2.2],[0,-6.73],[7.73,0],[0,6.73],[-1.03,0],[-2.52,2.92]],"v":[[-10.09,13.5],[-10.42,13.5],[-9.44,12.18],[-8.11,8.61],[-14,-1.32],[0,-13.5],[14,-1.32],[0,10.87],[-3.01,10.58]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.203,0.203,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[50,50,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Unpin","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"close","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[147,141,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-12.5,-12.5],[12.5,12.5]],"c":false},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"st","c":{"a":0,"k":[0.239215999842,0.823529005051,0.341176003218,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"close","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.084],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[0]},{"t":24,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Cut 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"pin","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.9,-0.911,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-5.36,2.422],[-2.42,5.362],[-13.85,13.852]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.49,0.34],[-2.85,-0.81],[0,0],[-1.31,-1.31],[0,0],[1.52,-1.08],[0,0],[1.8,-2.54],[0,0]],"o":[[0,0],[2.52,-1.75],[0,0],[1.08,-1.52],[0,0],[1.32,1.31],[0,0],[0.82,2.89],[-0.33,0.45],[0,0]],"v":[[-10.289,-3.988],[-8.889,-5.158],[-0.369,-6.558],[3.881,-12.588],[8.201,-12.968],[12.961,-8.198],[12.591,-3.878],[6.561,0.372],[5.091,8.992],[3.991,10.282]],"c":true},"ix":2},"nm":"Outline 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":2,"nm":"Combine 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"pin","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.203,0.203,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,4.762]},"t":0,"s":[50,50,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
@ -1 +0,0 @@
|
||||
{"v":"5.5.1","fr":60,"ip":0,"op":60,"w":288,"h":288,"nm":"Unread","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Oval","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204,84,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,18.333]},"t":12,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":27,"s":[95,95,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Outline 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.125489994884,0.580392003059,0.980391979218,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,3,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.98,1.32],[-0.17,1.31],[0,4.1],[-7.73,0],[0,-6.73],[7.73,0],[0.97,0.19]],"o":[[0,0],[0,0],[0.7,-0.95],[-3.57,-2.2],[0,-6.73],[7.73,0],[0,6.73],[-1.03,0],[-2.52,2.92]],"v":[[-10.09,13.5],[-10.42,13.5],[-9.44,12.18],[-8.11,8.61],[-14,-1.32],[0,-13.5],[14,-1.32],[0,10.87],[-3.01,10.58]],"c":true},"ix":2},"nm":"Outline 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[144,144,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.203,0.203,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":0,"s":[50,50,100]},{"t":35,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]}
|
@ -155,6 +155,12 @@ class SearchBarPlaceholderNode: ASDisplayNode {
|
||||
|
||||
let outerAlpha = min(0.3, expansionProgress) / 0.3
|
||||
let cornerRadius = min(strongSelf.fieldStyle.cornerDiameter / 2.0, height / 2.0)
|
||||
if !transition.isAnimated {
|
||||
strongSelf.backgroundNode.layer.removeAnimation(forKey: "cornerRadius")
|
||||
strongSelf.backgroundNode.layer.removeAnimation(forKey: "position")
|
||||
strongSelf.backgroundNode.layer.removeAnimation(forKey: "bounds")
|
||||
strongSelf.backgroundNode.layer.removeAnimation(forKey: "opacity")
|
||||
}
|
||||
transition.updateCornerRadius(node: strongSelf.backgroundNode, cornerRadius: cornerRadius)
|
||||
transition.updateAlpha(node: strongSelf.backgroundNode, alpha: outerAlpha)
|
||||
transition.updateFrame(node: strongSelf.backgroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: constrainedSize.width, height: height)))
|
||||
|
@ -423,14 +423,20 @@ public class TelegramController: ViewController {
|
||||
mediaAccessoryPanelHidden = size != layout.metrics.widthClass
|
||||
}
|
||||
|
||||
if let (item, previousItem, nextItem, _, type, _) = self.playlistStateAndType, !mediaAccessoryPanelHidden {
|
||||
if let (item, previousItem, nextItem, order, type, _) = self.playlistStateAndType, !mediaAccessoryPanelHidden {
|
||||
let panelHeight = MediaNavigationAccessoryHeaderNode.minimizedHeight
|
||||
let panelFrame = CGRect(origin: CGPoint(x: 0.0, y: navigationHeight.isZero ? -panelHeight : (navigationHeight + additionalHeight + UIScreenPixel)), size: CGSize(width: layout.size.width, height: panelHeight))
|
||||
if let (mediaAccessoryPanel, mediaType) = self.mediaAccessoryPanel, mediaType == type {
|
||||
transition.updateFrame(layer: mediaAccessoryPanel.layer, frame: panelFrame)
|
||||
mediaAccessoryPanel.updateLayout(size: panelFrame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition)
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, previousItem, nextItem)
|
||||
|
||||
switch order {
|
||||
case .regular:
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, previousItem, nextItem)
|
||||
case .reversed:
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, nextItem, previousItem)
|
||||
case .random:
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, nil, nil)
|
||||
}
|
||||
let delayedStatus = self.context.sharedContext.mediaManager.globalMediaPlayerState
|
||||
|> mapToSignal { value -> Signal<(Account, SharedMediaPlayerItemPlaybackStateOrLoading, MediaManagerPlayerType)?, NoError> in
|
||||
guard let value = value else {
|
||||
@ -596,7 +602,14 @@ public class TelegramController: ViewController {
|
||||
}
|
||||
self.mediaAccessoryPanel = (mediaAccessoryPanel, type)
|
||||
mediaAccessoryPanel.updateLayout(size: panelFrame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: .immediate)
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, previousItem, nextItem)
|
||||
switch order {
|
||||
case .regular:
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, previousItem, nextItem)
|
||||
case .reversed:
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, nextItem, previousItem)
|
||||
case .random:
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackItems = (item, nil, nil)
|
||||
}
|
||||
mediaAccessoryPanel.containerNode.headerNode.playbackStatus = self.context.sharedContext.mediaManager.globalMediaPlayerState
|
||||
|> map { state -> MediaPlayerStatus in
|
||||
if let stateOrLoading = state?.1, case let .state(state) = stateOrLoading {
|
||||
|
Loading…
x
Reference in New Issue
Block a user