Compare commits

...

14 commits

Author SHA1 Message Date
Matthew Wild 569afac883 Merge branch 'master' into Updates-Khalid 2021-11-18 09:33:08 +00:00
Muhammad Khalid d077bde41a - Fixed Include Calls In Recents Bug 2021-11-02 15:47:45 +05:00
Muhammad Khalid 0e4cee2887 - #150 CallKit: Configurable reporting of call history 2021-10-29 23:40:06 +05:00
Muhammad Khalid ecf3d733b6 - #149 CallKit: Identify telephony calls using phone number handle type 2021-10-29 21:54:28 +05:00
Muhammad Khalid 453b8dc2b4 - Fixed Account Selection For Invitation Link 2021-10-29 21:33:59 +05:00
Matthew Wild d6b02316f5 AccountSettingsViewController: If no push settings are stored, report success disabling push
If nothing is stored, we likely don't have a registration to remove, so just succeed.
2021-10-29 16:08:19 +01:00
Muhammad Khalid 8c177b260a - #13 Added Invitation Creation 2021-10-29 18:18:00 +05:00
Muhammad Khalid d897d02d8c - Fixed Scroll to Bottom 2021-10-28 23:32:30 +05:00
Muhammad Khalid b029174be5 - Added Scroll To Top Limit 2021-10-28 18:12:34 +05:00
Muhammad Khalid f565c5afcf - Fixed MUC Scroll To Top 2021-10-28 16:41:44 +05:00
Muhammad Khalid a5400ffcd2 - Fixed #133 2021-10-28 00:39:25 +05:00
Muhammad Khalid 4d82de8eef - #146 Allow non-E2EE for configured telephony provider 2021-10-28 00:02:56 +05:00
Muhammad Khalid a83888cb66 - #147 Fixed 2021-10-27 13:10:22 +05:00
Muhammad Khalid 0d47f80db3 - #135 Updated TigaseSwift to 2.1.3 2021-10-27 12:59:45 +05:00
26 changed files with 475 additions and 41 deletions

View file

@ -16,6 +16,7 @@
3759638626F7317D00831F4C /* Account.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3759638826F7317D00831F4C /* Account.storyboard */; };
3759638D26F7320F00831F4C /* MIX.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3759638F26F7320F00831F4C /* MIX.storyboard */; };
3759A58C26F8C7CC002987B2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3759A58E26F8C7CC002987B2 /* Localizable.strings */; };
3763450E272C6CEF000BC01F /* CallsSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3763450D272C6CEF000BC01F /* CallsSettingsViewController.swift */; };
3776C43526EDC5F00047750B /* MessageStyling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3776C43426EDC5F00047750B /* MessageStyling.swift */; };
3795F92426FB69370067361A /* BartyCrouch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3795F92326FB69370067361A /* BartyCrouch.swift */; };
3797D5BD26E9E42E0091DAF8 /* AvatarColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3797D5BC26E9E42E0091DAF8 /* AvatarColors.swift */; };
@ -334,6 +335,7 @@
3759639426F7481200831F4C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Base; path = Base.lproj/Info.plist; sourceTree = "<group>"; };
3759A58D26F8C7CC002987B2 /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
3759A58F26F8C7CF002987B2 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
3763450D272C6CEF000BC01F /* CallsSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallsSettingsViewController.swift; sourceTree = "<group>"; };
3776C43426EDC5F00047750B /* MessageStyling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageStyling.swift; sourceTree = "<group>"; };
3795F92326FB69370067361A /* BartyCrouch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BartyCrouch.swift; sourceTree = "<group>"; };
3797D5BC26E9E42E0091DAF8 /* AvatarColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarColors.swift; sourceTree = "<group>"; };
@ -767,26 +769,27 @@
FE507A0A1CDB7B3B001A015C /* settings */ = {
isa = PBXGroup;
children = (
FE6545611E9E7FDE006A14AC /* AccountDomainTableViewCell.swift */,
FE17808C23EB4C7F00A1EA76 /* AccountQRCodeController.swift */,
FEF80DB11CDBBBFE005645A7 /* AccountSettingsViewController.swift */,
FE507A0B1CDB7B3B001A015C /* AccountTableViewCell.swift */,
FE507A0C1CDB7B3B001A015C /* AddAccountController.swift */,
FE507A0D1CDB7B3B001A015C /* SettingsViewController.swift */,
FEF80DB11CDBBBFE005645A7 /* AccountSettingsViewController.swift */,
FE80BDAA1D953FC4001914B0 /* SetupViewController.swift */,
FE65455F1E9E7B85006A14AC /* RegisterAccountController.swift */,
FE6545611E9E7FDE006A14AC /* AccountDomainTableViewCell.swift */,
FE6545631E9E8B67006A14AC /* ServerSelectorTableViewCell.swift */,
FEDC678F238B05E4005C0FAB /* BlockedContactsController.swift */,
FE9E136C1F25F5F7005C0EE5 /* ChatSettingsViewController.swift */,
FE9E136E1F26049A005C0EE5 /* NotificationSettingsViewController.swift */,
FE9E13701F2606E9005C0EE5 /* ContactsSettingsViewController.swift */,
FE00157E2019090300490340 /* ExperimentalSettingsViewController.swift */,
FE0E31112537288A0030F8C5 /* MediaSettingsVIewController.swift */,
FE9E136E1F26049A005C0EE5 /* NotificationSettingsViewController.swift */,
FE719E7D2274D20D007CEEC9 /* OMEMOFingerprintsController.swift */,
E963721126D79D3A00332482 /* PrivacyPolicyTableViewCell.swift */,
FE65455F1E9E7B85006A14AC /* RegisterAccountController.swift */,
FE2809802167CE18002F5BD0 /* server_features_list.xml */,
FE2809822167CF1B002F5BD0 /* ServerFeaturesViewController.swift */,
FE719E7D2274D20D007CEEC9 /* OMEMOFingerprintsController.swift */,
FEDC678F238B05E4005C0FAB /* BlockedContactsController.swift */,
FE17808C23EB4C7F00A1EA76 /* AccountQRCodeController.swift */,
FE0E31112537288A0030F8C5 /* MediaSettingsVIewController.swift */,
E963721126D79D3A00332482 /* PrivacyPolicyTableViewCell.swift */,
FE6545631E9E8B67006A14AC /* ServerSelectorTableViewCell.swift */,
FE507A0D1CDB7B3B001A015C /* SettingsViewController.swift */,
FE80BDAA1D953FC4001914B0 /* SetupViewController.swift */,
373A801F271063E1000E50FE /* TelephonyProviderViewController.swift */,
3763450D272C6CEF000BC01F /* CallsSettingsViewController.swift */,
);
path = settings;
sourceTree = "<group>";
@ -1448,6 +1451,7 @@
373A8020271063E1000E50FE /* TelephonyProviderViewController.swift in Sources */,
FE3E38862428C21100D3A8E8 /* OSLog.swift in Sources */,
FECEF29423B7933A007EC323 /* MetadataCache.swift in Sources */,
3763450E272C6CEF000BC01F /* CallsSettingsViewController.swift in Sources */,
E9D384B426CA95FF009BEAF3 /* UIDeviceExtension.swift in Sources */,
FEB62C501DA80956001500D5 /* AvatarStore.swift in Sources */,
FE7D293423B919FF001A877D /* DownloadManager.swift in Sources */,

View file

@ -24,8 +24,8 @@
"repositoryURL": "https://github.com/tigase/tigase-swift",
"state": {
"branch": null,
"revision": "028e297fa4de25ac552b9947a8ccd29ade7001e7",
"version": "2.1.2"
"revision": "d3953dcea80010ad433fa96d7ca6b989bf58850c",
"version": "2.1.3"
}
},
{

View file

@ -776,14 +776,14 @@
<scene sceneID="7R8-sh-AnU">
<objects>
<tableViewController id="WDE-Vb-oKK" customClass="RosterItemEditViewController" customModule="Snikket" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" allowsSelection="NO" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="Ock-Af-3IY">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="Ock-Af-3IY">
<rect key="frame" x="0.0" y="0.0" width="428" height="926"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection headerTitle="Account" id="Mfv-HJ-QDO">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="mk1-zp-AU3">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="mk1-zp-AU3">
<rect key="frame" x="0.0" y="49" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mk1-zp-AU3" id="Da1-kS-KYt">
@ -808,7 +808,7 @@
</tableViewSection>
<tableViewSection headerTitle="JID" id="Qgj-eQ-geg">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="ubC-3x-1ej">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="ubC-3x-1ej">
<rect key="frame" x="0.0" y="142.66666603088379" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ubC-3x-1ej" id="6FY-Rq-hWY">
@ -833,7 +833,7 @@
</tableViewSection>
<tableViewSection headerTitle="Name" id="Kfl-J5-hdD">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="bnU-C3-Ei1">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="bnU-C3-Ei1">
<rect key="frame" x="0.0" y="236.33333206176758" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bnU-C3-Ei1" id="sWs-wY-Vy8">
@ -858,7 +858,7 @@
</tableViewSection>
<tableViewSection headerTitle="PRESENCE" id="Q28-Ig-9NP">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="yky-H4-cbk">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="yky-H4-cbk">
<rect key="frame" x="0.0" y="329.99999809265137" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="yky-H4-cbk" id="Qga-yz-bXa">
@ -884,7 +884,7 @@
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="GLY-Pk-gl9">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="GLY-Pk-gl9">
<rect key="frame" x="0.0" y="373.99999809265137" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="GLY-Pk-gl9" id="P7U-6w-pcx">
@ -912,6 +912,37 @@
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="Invite" id="dib-YA-Eiz">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="pth-Xm-NXb">
<rect key="frame" x="0.0" y="467.66666412353516" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="pth-Xm-NXb" id="EmN-0E-Hpp">
<rect key="frame" x="0.0" y="0.0" width="428" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="Send Invitation Link" placeholder="Enter contact name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Rg7-YE-y8H">
<rect key="frame" x="20" y="0.0" width="388" height="44"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
</textField>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="FPK-6B-DCN">
<rect key="frame" x="378" y="12" width="20" height="20"/>
<color key="color" name="AddToContactsBar"/>
</activityIndicatorView>
</subviews>
<constraints>
<constraint firstItem="FPK-6B-DCN" firstAttribute="centerY" secondItem="EmN-0E-Hpp" secondAttribute="centerY" id="HlI-Sf-kPN"/>
<constraint firstItem="Rg7-YE-y8H" firstAttribute="leading" secondItem="EmN-0E-Hpp" secondAttribute="leadingMargin" id="Yid-O7-fNs"/>
<constraint firstItem="Rg7-YE-y8H" firstAttribute="top" secondItem="EmN-0E-Hpp" secondAttribute="top" id="hll-jG-K6h"/>
<constraint firstAttribute="trailingMargin" secondItem="Rg7-YE-y8H" secondAttribute="trailing" id="iO2-ER-q2P"/>
<constraint firstAttribute="trailingMargin" secondItem="FPK-6B-DCN" secondAttribute="trailing" constant="10" id="jQD-5E-6Ad"/>
<constraint firstAttribute="bottom" secondItem="Rg7-YE-y8H" secondAttribute="bottom" id="rnb-WT-t71"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="WDE-Vb-oKK" id="52x-2u-5zh"/>
@ -932,6 +963,7 @@
</navigationItem>
<connections>
<outlet property="accountTextField" destination="gXY-yq-Y2K" id="HAo-5R-FQQ"/>
<outlet property="invitationLinkIndicator" destination="FPK-6B-DCN" id="zl9-LQ-OPw"/>
<outlet property="jidTextField" destination="BM3-28-huR" id="rnA-hS-bcu"/>
<outlet property="nameTextField" destination="OGf-mX-8z3" id="tdd-eS-Ybc"/>
<outlet property="receivePresenceUpdatesSwitch" destination="QIs-qT-dLK" id="y20-Tc-yVK"/>

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@ -485,9 +485,36 @@
<segue destination="FGQ-GL-dYt" kind="show" id="gsA-2D-Fg6"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="aboutSettingsViewCall" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="AboutSettingsViewCell" id="00j-hl-4km" userLabel="AboutSettingsViewCall">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="CallsSettingsViewCell" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="CallsSettingsViewCell" id="k4E-By-FcW">
<rect key="frame" x="0.0" y="445.5" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="k4E-By-FcW" id="u2g-bv-lyd">
<rect key="frame" x="0.0" y="0.0" width="384.5" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Calls" textAlignment="natural" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wfP-Tn-CDA">
<rect key="frame" x="20" y="11" width="356.5" height="22"/>
<accessibility key="accessibilityConfiguration" identifier="accountName"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="wfP-Tn-CDA" firstAttribute="leading" secondItem="u2g-bv-lyd" secondAttribute="leadingMargin" id="0bb-UP-oUQ"/>
<constraint firstAttribute="bottomMargin" secondItem="wfP-Tn-CDA" secondAttribute="bottom" id="7Ss-yP-q7l"/>
<constraint firstAttribute="trailingMargin" secondItem="wfP-Tn-CDA" secondAttribute="trailing" id="KAy-LK-qLI"/>
<constraint firstItem="wfP-Tn-CDA" firstAttribute="top" secondItem="u2g-bv-lyd" secondAttribute="topMargin" id="SJl-yF-XMB"/>
</constraints>
</tableViewCellContentView>
<accessibility key="accessibilityConfiguration" identifier="aboutSettingsViewCall"/>
<connections>
<segue destination="4VG-XN-BdZ" kind="show" id="9J1-2I-oGz"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="aboutSettingsViewCall" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="AboutSettingsViewCell" id="00j-hl-4km" userLabel="AboutSettingsViewCall">
<rect key="frame" x="0.0" y="489.5" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="00j-hl-4km" id="BKo-8a-1ti">
<rect key="frame" x="0.0" y="0.0" width="384.5" height="44"/>
<autoresizingMask key="autoresizingMask"/>
@ -1032,7 +1059,7 @@
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="BlockedContactTableViewCell" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="BlockedContactTableViewCell" textLabel="7tC-Eh-kK5" detailTextLabel="fB5-hb-x8m" style="IBUITableViewCellStyleSubtitle" id="mrW-yD-uKa">
<rect key="frame" x="0.0" y="24.5" width="414" height="55.5"/>
<rect key="frame" x="0.0" y="44.5" width="414" height="55.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="mrW-yD-uKa" id="Ozm-Qg-ImQ">
<rect key="frame" x="0.0" y="0.0" width="414" height="55.5"/>
@ -1056,7 +1083,7 @@
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" restorationIdentifier="BlockedContactTableViewEmptyCell" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="BlockedContactTableViewEmptyCell" textLabel="Aki-gv-qus" style="IBUITableViewCellStyleDefault" id="ycT-Zz-uWc">
<rect key="frame" x="0.0" y="80" width="414" height="43.5"/>
<rect key="frame" x="0.0" y="100" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ycT-Zz-uWc" id="rbP-vZ-Xsn">
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
@ -1136,7 +1163,7 @@
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="h70-11-ntf" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2689" y="1685"/>
<point key="canvasLocation" x="2570" y="1797"/>
</scene>
<!--Experimental Settings Scene-->
<scene sceneID="4hq-he-9by">
@ -1319,7 +1346,7 @@
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Tlr-f3-jiC" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1839" y="1742"/>
<point key="canvasLocation" x="1865" y="1797"/>
</scene>
<!--AboutController-->
<scene sceneID="5Mf-Za-3AY">
@ -1331,9 +1358,63 @@
</objects>
<point key="canvasLocation" x="2050" y="2202"/>
</scene>
<!--Calls settings-->
<scene sceneID="hhD-HQ-XQ1">
<objects>
<tableViewController title="Notification settings" id="4VG-XN-BdZ" userLabel="Calls settings" customClass="CallsSettingsViewController" customModule="Snikket" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="1sU-wb-PeQ">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection headerTitle="TELEPHONY" id="v8T-iN-1IT">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="AddToSystemCallHistoryCell" selectionStyle="default" indentationWidth="10" reuseIdentifier="AddToSystemCallHistoryCell" id="I8r-iy-q2W" userLabel="AddToSystemCallHistoryCell">
<rect key="frame" x="0.0" y="49.5" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="I8r-iy-q2W" id="NJh-pm-678">
<rect key="frame" x="0.0" y="0.0" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Add to system call history" textAlignment="natural" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ngk-vc-zET">
<rect key="frame" x="20" y="12" width="195.5" height="20.5"/>
<accessibility key="accessibilityConfiguration" identifier="accountName"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UL8-Yi-SF4">
<rect key="frame" x="345" y="6.5" width="51" height="31"/>
<connections>
<action selector="valueChanged:" destination="4VG-XN-BdZ" eventType="valueChanged" id="biy-dX-JX4"/>
</connections>
</switch>
</subviews>
<constraints>
<constraint firstAttribute="leadingMargin" secondItem="Ngk-vc-zET" secondAttribute="leading" id="AJa-Ff-gti"/>
<constraint firstItem="Ngk-vc-zET" firstAttribute="centerY" secondItem="NJh-pm-678" secondAttribute="centerY" id="OmK-Xl-nOm"/>
<constraint firstItem="UL8-Yi-SF4" firstAttribute="centerY" secondItem="NJh-pm-678" secondAttribute="centerY" id="SYD-ix-fy4"/>
<constraint firstItem="UL8-Yi-SF4" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Ngk-vc-zET" secondAttribute="trailing" constant="8" id="Xkk-ZF-rBn"/>
<constraint firstAttribute="trailingMargin" secondItem="UL8-Yi-SF4" secondAttribute="trailing" id="aFH-qx-7yp"/>
</constraints>
</tableViewCellContentView>
<accessibility key="accessibilityConfiguration" identifier="AddToSystemCallHistoryCell"/>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
</tableView>
<navigationItem key="navigationItem" id="b0W-ey-5kA"/>
<connections>
<outlet property="callsSwitch" destination="UL8-Yi-SF4" id="Z8U-Y8-fjZ"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="6ji-YQ-XOK" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="445" y="1797"/>
</scene>
</scenes>
<inferredMetricsTieBreakers>
<segue reference="TOL-19-lPZ"/>
<segue reference="cof-sd-KJv"/>
</inferredMetricsTieBreakers>
<resources>
<namedColor name="chatslistBackground">

View file

@ -76,6 +76,31 @@ class ChatViewController : BaseChatViewControllerWithDataSourceAndContextMenuAnd
}
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// scrollViewShouldScrollToTop will not get called if tableview is already at top
guard var contentOffset = self.conversationLogController?.tableView.contentOffset else { return }
if contentOffset.y == 0 {
contentOffset.y = 1
self.conversationLogController?.tableView.setContentOffset(contentOffset, animated: true)
}
}
func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
scrollToTop()
return false
}
func scrollToTop() {
if let count = self.conversationLogController?.dataSource.count, count > 0 {
var currentRow = self.conversationLogController?.tableView.indexPathsForVisibleRows?.first?.row ?? 0
currentRow = count > currentRow + 40 ? currentRow + 40 : count
let indexPath = IndexPath(row: currentRow - 1, section: 0)
DispatchQueue.main.async {
self.conversationLogController?.tableView.scrollToRow(at: indexPath, at: .none, animated: true)
}
}
}
func setupViews() {
let recognizer = UITapGestureRecognizer(target: self, action: #selector(ChatViewController.showBuddyInfo));
self.titleView.isUserInteractionEnabled = true;
@ -97,7 +122,10 @@ class ChatViewController : BaseChatViewControllerWithDataSourceAndContextMenuAnd
@IBAction func scrollToBottomTapped(_ sender: UIButton) {
self.conversationLogController?.tableView.setContentOffset(.zero, animated: true)
self.conversationLogController?.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .none, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.conversationLogController?.tableView.setContentOffset(CGPoint(x: 0, y: 1), animated: true)
}
}
@IBAction func rejectSubscriptionTapped(_ sender: Any) {

View file

@ -45,7 +45,7 @@ class ConversationLogController: UIViewController, ChatViewDataSourceDelegate {
tableView.rowHeight = UITableView.automaticDimension;
tableView.estimatedRowHeight = 160.0;
tableView.separatorStyle = .none;
tableView.scrollsToTop = false
tableView.scrollsToTop = true
tableView.transform = dataSource.inverted ? CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: 0) : CGAffineTransform.identity;
if let refreshControl = self.refreshControl {
@ -72,6 +72,9 @@ class ConversationLogController: UIViewController, ChatViewDataSourceDelegate {
} else {
self.toggleNoMessagesLabel(show: false)
}
DispatchQueue.main.async {
self.tableView.setContentOffset(CGPoint(x: 0, y: 1), animated: false)
}
}
}
}
@ -87,7 +90,10 @@ class ConversationLogController: UIViewController, ChatViewDataSourceDelegate {
label.sizeToFit()
self.tableView.backgroundView = label
} else {
self.tableView.backgroundView = nil
DispatchQueue.main.async {
self.tableView.backgroundView = nil
}
}
}
@ -95,6 +101,9 @@ class ConversationLogController: UIViewController, ChatViewDataSourceDelegate {
guard rows.count > 0 else {
return;
}
if shouldScroll, tableView.contentOffset.y == 1 {
tableView.setContentOffset(.zero, animated: false)
}
if dataSource.count == rows.count && rows.count > 1 {
tableView.reloadData();
} else {
@ -105,8 +114,12 @@ class ConversationLogController: UIViewController, ChatViewDataSourceDelegate {
}
if shouldScroll && rows.contains(0) && (tableView.indexPathsForVisibleRows?.contains(firstRowIndexPath) ?? false) {
print("added items at:", rows, "scrolling to:", firstRowIndexPath);
tableView.scrollToRow(at: firstRowIndexPath, at: .none, animated: true)
tableView.scrollToRow(at: firstRowIndexPath, at: .bottom, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now()+0.2) {
self.tableView.setContentOffset(CGPoint(x: 0, y: 1), animated: false)
}
}
toggleNoMessagesLabel(show: false)
markAsReadUpToNewestVisibleRow();
}

View file

@ -22,6 +22,9 @@
/* Class = "UILabel"; text = "Message Archiving"; ObjectID = "Ckp-Mb-v0c"; */
"Ckp-Mb-v0c.text" = "Message Archiving";
/* Class = "UITableViewSection"; headerTitle = "Invite"; ObjectID = "dib-YA-Eiz"; */
"dib-YA-Eiz.headerTitle" = "Invite";
/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "Dx3-QU-3cN"; */
"Dx3-QU-3cN.title" = "Back";
@ -82,6 +85,12 @@
/* Class = "UILabel"; text = "Chat with"; ObjectID = "Qr0-8H-IJq"; */
"Qr0-8H-IJq.text" = "Chat with";
/* Class = "UITextField"; placeholder = "Enter contact name"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.placeholder" = "Enter contact name";
/* Class = "UITextField"; text = "Send Invitation Link"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.text" = "Send Invitation Link";
/* Class = "UINavigationItem"; title = "Contacts"; ObjectID = "SEz-IM-IWL"; */
"SEz-IM-IWL.title" = "Contacts";

View file

@ -13,6 +13,9 @@
/* Class = "UILabel"; text = "About"; ObjectID = "3vM-ad-4ap"; */
"3vM-ad-4ap.text" = "About";
/* Class = "UITableViewController"; title = "Notification settings"; ObjectID = "4VG-XN-BdZ"; */
"4VG-XN-BdZ.title" = "Notification settings";
/* Class = "UILabel"; text = "Account name"; ObjectID = "7ho-Mu-thd"; */
"7ho-Mu-thd.text" = "Account name";
@ -109,6 +112,9 @@
/* Class = "UILabel"; text = "Blocked contacts"; ObjectID = "MJ0-kw-1Kl"; */
"MJ0-kw-1Kl.text" = "Blocked contacts";
/* Class = "UILabel"; text = "Add to system call history"; ObjectID = "Ngk-vc-zET"; */
"Ngk-vc-zET.text" = "Add to system call history";
/* Class = "UILabel"; text = "\"Hidden\" group"; ObjectID = "P82-B8-768"; */
"P82-B8-768.text" = "\"Hidden\" group";
@ -130,6 +136,12 @@
/* Class = "UILabel"; text = "20 MB"; ObjectID = "UuL-li-3gA"; */
"UuL-li-3gA.text" = "20 MB";
/* Class = "UITableViewSection"; headerTitle = "TELEPHONY"; ObjectID = "v8T-iN-1IT"; */
"v8T-iN-1IT.headerTitle" = "TELEPHONY";
/* Class = "UILabel"; text = "Calls"; ObjectID = "wfP-Tn-CDA"; */
"wfP-Tn-CDA.text" = "Calls";
/* Class = "UITableViewController"; title = "Contacts settings"; ObjectID = "xRS-v5-T5C"; */
"xRS-v5-T5C.title" = "Contacts settings";

View file

@ -22,6 +22,9 @@
/* Class = "UILabel"; text = "Message Archiving"; ObjectID = "Ckp-Mb-v0c"; */
"Ckp-Mb-v0c.text" = "Message Archiving";
/* Class = "UITableViewSection"; headerTitle = "Invite"; ObjectID = "dib-YA-Eiz"; */
"dib-YA-Eiz.headerTitle" = "Invite";
/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "Dx3-QU-3cN"; */
"Dx3-QU-3cN.title" = "Back";
@ -82,6 +85,12 @@
/* Class = "UILabel"; text = "Chat with"; ObjectID = "Qr0-8H-IJq"; */
"Qr0-8H-IJq.text" = "Chat with";
/* Class = "UITextField"; placeholder = "Enter contact name"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.placeholder" = "Enter contact name";
/* Class = "UITextField"; text = "Send Invitation Link"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.text" = "Send Invitation Link";
/* Class = "UINavigationItem"; title = "Contacts"; ObjectID = "SEz-IM-IWL"; */
"SEz-IM-IWL.title" = "Contacts";

View file

@ -13,6 +13,9 @@
/* Class = "UILabel"; text = "About"; ObjectID = "3vM-ad-4ap"; */
"3vM-ad-4ap.text" = "About";
/* Class = "UITableViewController"; title = "Notification settings"; ObjectID = "4VG-XN-BdZ"; */
"4VG-XN-BdZ.title" = "Notification settings";
/* Class = "UILabel"; text = "Account name"; ObjectID = "7ho-Mu-thd"; */
"7ho-Mu-thd.text" = "Account name";
@ -109,6 +112,9 @@
/* Class = "UILabel"; text = "Blocked contacts"; ObjectID = "MJ0-kw-1Kl"; */
"MJ0-kw-1Kl.text" = "Blocked contacts";
/* Class = "UILabel"; text = "Add to system call history"; ObjectID = "Ngk-vc-zET"; */
"Ngk-vc-zET.text" = "Add to system call history";
/* Class = "UILabel"; text = "\"Hidden\" group"; ObjectID = "P82-B8-768"; */
"P82-B8-768.text" = "\"Hidden\" group";
@ -130,6 +136,12 @@
/* Class = "UILabel"; text = "20 MB"; ObjectID = "UuL-li-3gA"; */
"UuL-li-3gA.text" = "20 MB";
/* Class = "UITableViewSection"; headerTitle = "TELEPHONY"; ObjectID = "v8T-iN-1IT"; */
"v8T-iN-1IT.headerTitle" = "TELEPHONY";
/* Class = "UILabel"; text = "Calls"; ObjectID = "wfP-Tn-CDA"; */
"wfP-Tn-CDA.text" = "Calls";
/* Class = "UITableViewController"; title = "Contacts settings"; ObjectID = "xRS-v5-T5C"; */
"xRS-v5-T5C.title" = "Contacts settings";

View file

@ -22,6 +22,9 @@
/* Class = "UILabel"; text = "Message Archiving"; ObjectID = "Ckp-Mb-v0c"; */
"Ckp-Mb-v0c.text" = "Message Archiving";
/* Class = "UITableViewSection"; headerTitle = "Invite"; ObjectID = "dib-YA-Eiz"; */
"dib-YA-Eiz.headerTitle" = "Invite";
/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "Dx3-QU-3cN"; */
"Dx3-QU-3cN.title" = "Back";
@ -82,6 +85,12 @@
/* Class = "UILabel"; text = "Chat with"; ObjectID = "Qr0-8H-IJq"; */
"Qr0-8H-IJq.text" = "Chat with";
/* Class = "UITextField"; placeholder = "Enter contact name"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.placeholder" = "Enter contact name";
/* Class = "UITextField"; text = "Send Invitation Link"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.text" = "Send Invitation Link";
/* Class = "UINavigationItem"; title = "Contacts"; ObjectID = "SEz-IM-IWL"; */
"SEz-IM-IWL.title" = "Contacts";

View file

@ -13,6 +13,9 @@
/* Class = "UILabel"; text = "About"; ObjectID = "3vM-ad-4ap"; */
"3vM-ad-4ap.text" = "About";
/* Class = "UITableViewController"; title = "Notification settings"; ObjectID = "4VG-XN-BdZ"; */
"4VG-XN-BdZ.title" = "Notification settings";
/* Class = "UILabel"; text = "Account name"; ObjectID = "7ho-Mu-thd"; */
"7ho-Mu-thd.text" = "Account name";
@ -109,6 +112,9 @@
/* Class = "UILabel"; text = "Blocked contacts"; ObjectID = "MJ0-kw-1Kl"; */
"MJ0-kw-1Kl.text" = "Blocked contacts";
/* Class = "UILabel"; text = "Add to system call history"; ObjectID = "Ngk-vc-zET"; */
"Ngk-vc-zET.text" = "Add to system call history";
/* Class = "UILabel"; text = "\"Hidden\" group"; ObjectID = "P82-B8-768"; */
"P82-B8-768.text" = "\"Hidden\" group";
@ -130,6 +136,12 @@
/* Class = "UILabel"; text = "20 MB"; ObjectID = "UuL-li-3gA"; */
"UuL-li-3gA.text" = "20 MB";
/* Class = "UITableViewSection"; headerTitle = "TELEPHONY"; ObjectID = "v8T-iN-1IT"; */
"v8T-iN-1IT.headerTitle" = "TELEPHONY";
/* Class = "UILabel"; text = "Calls"; ObjectID = "wfP-Tn-CDA"; */
"wfP-Tn-CDA.text" = "Calls";
/* Class = "UITableViewController"; title = "Contacts settings"; ObjectID = "xRS-v5-T5C"; */
"xRS-v5-T5C.title" = "Contacts settings";

View file

@ -22,6 +22,9 @@
/* Class = "UILabel"; text = "Message Archiving"; ObjectID = "Ckp-Mb-v0c"; */
"Ckp-Mb-v0c.text" = "Message Archiving";
/* Class = "UITableViewSection"; headerTitle = "Invite"; ObjectID = "dib-YA-Eiz"; */
"dib-YA-Eiz.headerTitle" = "Invite";
/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "Dx3-QU-3cN"; */
"Dx3-QU-3cN.title" = "Back";
@ -82,6 +85,12 @@
/* Class = "UILabel"; text = "Chat with"; ObjectID = "Qr0-8H-IJq"; */
"Qr0-8H-IJq.text" = "Chat with";
/* Class = "UITextField"; placeholder = "Enter contact name"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.placeholder" = "Enter contact name";
/* Class = "UITextField"; text = "Send Invitation Link"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.text" = "Send Invitation Link";
/* Class = "UINavigationItem"; title = "Contacts"; ObjectID = "SEz-IM-IWL"; */
"SEz-IM-IWL.title" = "Contacts";

View file

@ -13,6 +13,9 @@
/* Class = "UILabel"; text = "About"; ObjectID = "3vM-ad-4ap"; */
"3vM-ad-4ap.text" = "About";
/* Class = "UITableViewController"; title = "Notification settings"; ObjectID = "4VG-XN-BdZ"; */
"4VG-XN-BdZ.title" = "Notification settings";
/* Class = "UILabel"; text = "Account name"; ObjectID = "7ho-Mu-thd"; */
"7ho-Mu-thd.text" = "Account name";
@ -109,6 +112,9 @@
/* Class = "UILabel"; text = "Blocked contacts"; ObjectID = "MJ0-kw-1Kl"; */
"MJ0-kw-1Kl.text" = "Blocked contacts";
/* Class = "UILabel"; text = "Add to system call history"; ObjectID = "Ngk-vc-zET"; */
"Ngk-vc-zET.text" = "Add to system call history";
/* Class = "UILabel"; text = "\"Hidden\" group"; ObjectID = "P82-B8-768"; */
"P82-B8-768.text" = "\"Hidden\" group";
@ -130,6 +136,12 @@
/* Class = "UILabel"; text = "20 MB"; ObjectID = "UuL-li-3gA"; */
"UuL-li-3gA.text" = "20 MB";
/* Class = "UITableViewSection"; headerTitle = "TELEPHONY"; ObjectID = "v8T-iN-1IT"; */
"v8T-iN-1IT.headerTitle" = "TELEPHONY";
/* Class = "UILabel"; text = "Calls"; ObjectID = "wfP-Tn-CDA"; */
"wfP-Tn-CDA.text" = "Calls";
/* Class = "UITableViewController"; title = "Contacts settings"; ObjectID = "xRS-v5-T5C"; */
"xRS-v5-T5C.title" = "Contacts settings";

View file

@ -22,6 +22,9 @@
/* Class = "UILabel"; text = "Message Archiving"; ObjectID = "Ckp-Mb-v0c"; */
"Ckp-Mb-v0c.text" = "Message Archiving";
/* Class = "UITableViewSection"; headerTitle = "Invite"; ObjectID = "dib-YA-Eiz"; */
"dib-YA-Eiz.headerTitle" = "Invite";
/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "Dx3-QU-3cN"; */
"Dx3-QU-3cN.title" = "Back";
@ -82,6 +85,12 @@
/* Class = "UILabel"; text = "Chat with"; ObjectID = "Qr0-8H-IJq"; */
"Qr0-8H-IJq.text" = "Chat with";
/* Class = "UITextField"; placeholder = "Enter contact name"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.placeholder" = "Enter contact name";
/* Class = "UITextField"; text = "Send Invitation Link"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.text" = "Send Invitation Link";
/* Class = "UINavigationItem"; title = "Contacts"; ObjectID = "SEz-IM-IWL"; */
"SEz-IM-IWL.title" = "Contacts";

View file

@ -13,6 +13,9 @@
/* Class = "UILabel"; text = "About"; ObjectID = "3vM-ad-4ap"; */
"3vM-ad-4ap.text" = "About";
/* Class = "UITableViewController"; title = "Notification settings"; ObjectID = "4VG-XN-BdZ"; */
"4VG-XN-BdZ.title" = "Notification settings";
/* Class = "UILabel"; text = "Account name"; ObjectID = "7ho-Mu-thd"; */
"7ho-Mu-thd.text" = "Account name";
@ -109,6 +112,9 @@
/* Class = "UILabel"; text = "Blocked contacts"; ObjectID = "MJ0-kw-1Kl"; */
"MJ0-kw-1Kl.text" = "Blocked contacts";
/* Class = "UILabel"; text = "Add to system call history"; ObjectID = "Ngk-vc-zET"; */
"Ngk-vc-zET.text" = "Add to system call history";
/* Class = "UILabel"; text = "\"Hidden\" group"; ObjectID = "P82-B8-768"; */
"P82-B8-768.text" = "\"Hidden\" group";
@ -130,6 +136,12 @@
/* Class = "UILabel"; text = "20 MB"; ObjectID = "UuL-li-3gA"; */
"UuL-li-3gA.text" = "20 MB";
/* Class = "UITableViewSection"; headerTitle = "TELEPHONY"; ObjectID = "v8T-iN-1IT"; */
"v8T-iN-1IT.headerTitle" = "TELEPHONY";
/* Class = "UILabel"; text = "Calls"; ObjectID = "wfP-Tn-CDA"; */
"wfP-Tn-CDA.text" = "Calls";
/* Class = "UITableViewController"; title = "Contacts settings"; ObjectID = "xRS-v5-T5C"; */
"xRS-v5-T5C.title" = "Contacts settings";

View file

@ -102,7 +102,35 @@ class MucChatViewController: BaseChatViewControllerWithDataSourceAndContextMenuA
}
@IBAction func scrollToBottomTapped(_ sender: RoundShadowButton) {
self.conversationLogController?.tableView.setContentOffset(.zero, animated: true)
self.conversationLogController?.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .none, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.conversationLogController?.tableView.setContentOffset(CGPoint(x: 0, y: 1), animated: true)
}
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// scrollViewShouldScrollToTop will not get called if tableview is already at top
guard var contentOffset = self.conversationLogController?.tableView.contentOffset else { return }
if contentOffset.y == 0 {
contentOffset.y = 1
self.conversationLogController?.tableView.setContentOffset(contentOffset, animated: true)
}
}
func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
scrollToTop()
return false
}
func scrollToTop() {
if let count = self.conversationLogController?.dataSource.count, count > 0 {
var currentRow = self.conversationLogController?.tableView.indexPathsForVisibleRows?.first?.row ?? 0
currentRow = count > currentRow + 40 ? currentRow + 40 : count
let indexPath = IndexPath(row: currentRow - 1, section: 0)
DispatchQueue.main.async {
self.conversationLogController?.tableView.scrollToRow(at: indexPath, at: .none, animated: true)
}
}
}
func setupGroupName() {

View file

@ -26,6 +26,7 @@ class RosterItemEditViewController: UITableViewController, UIPickerViewDataSourc
var xmppService:XmppService!
@IBOutlet weak var invitationLinkIndicator: UIActivityIndicatorView!
@IBOutlet var accountTextField: UITextField!
@IBOutlet var jidTextField: UITextField!
@IBOutlet var nameTextField: UITextField!
@ -69,6 +70,45 @@ class RosterItemEditViewController: UITableViewController, UIPickerViewDataSourc
self.nameTextField.text = nil;
}
}
func createInvitationLink() {
guard let account = BareJID(self.accountTextField.text), let client = xmppService.getClient(for: account) else { return }
let inviteCommand = "urn:xmpp:invite#invite"
if let adHocModule: AdHocCommandsModule = client.modulesManager.getModule(AdHocCommandsModule.ID) {
adHocModule.execute(on: JID(account.domain), command: inviteCommand, action: .execute, data: nil) { response, data in
if let inviteLink = data?.getField(named: "landing-url")?.element.findChild(name: "value")?.value {
self.presentShareSheet(url: inviteLink)
}
} onError: { error in
self.toggleActivityIndicator(toggle: false)
}
}
}
func presentShareSheet(url: String) {
guard let url = URL(string: url) else {
self.toggleActivityIndicator(toggle: false)
return
}
let items: [Any] = [url]
let ac = UIActivityViewController(activityItems: items, applicationActivities: nil)
DispatchQueue.main.async {
self.present(ac, animated: true) {
self.toggleActivityIndicator(toggle: false)
}
}
}
func toggleActivityIndicator(toggle: Bool) {
DispatchQueue.main.async {
if toggle { self.invitationLinkIndicator.startAnimating() }
else {self.invitationLinkIndicator.stopAnimating() }
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
@ -217,6 +257,13 @@ class RosterItemEditViewController: UITableViewController, UIPickerViewDataSourc
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.accountTextField.text = self.pickerView(pickerView, titleForRow: row, forComponent: component);
self.view.endEditing(true)
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section == 4, indexPath.row == 0, !invitationLinkIndicator.isAnimating {
toggleActivityIndicator(toggle: true)
self.createInvitationLink()
}
}
}

View file

@ -154,7 +154,7 @@ class MessageEventHandler: XmppServiceEventHandler {
return;
}
let encryption = encrypted ?? chat.options.encryption ?? ChatEncryption(rawValue: Settings.messageEncryption.string()!)!;
var encryption = encrypted ?? chat.options.encryption ?? ChatEncryption(rawValue: Settings.messageEncryption.string()!)!;
let message = chat.createMessage(msg);
message.id = stanzaId ?? UUID().uuidString;
@ -163,6 +163,11 @@ class MessageEventHandler: XmppServiceEventHandler {
let account = chat.account;
let jid = chat.jid.bareJid;
// chat.options.encryption == nil means it is set to defualt
if let telephonyProvider = AccountSettings.telephonyProvider(account).getString(), jid.domain.lowercased() == telephonyProvider.lowercased(), (chat.options.encryption == nil || chat.options.encryption == ChatEncryption.none) {
encryption = ChatEncryption.none
}
switch encryption {
case .omemo:

View file

@ -419,11 +419,16 @@ class AccountSettingsViewController: UITableViewController {
}
func disablePushNotifications(completion: @escaping (Bool) -> Void) {
guard let account = self.account, let config = AccountManager.getAccount(for: account), let pushSettings = config.pushSettings else {
guard let account = self.account, let config = AccountManager.getAccount(for: account) else {
completion(false)
return
}
guard let pushSettings = config.pushSettings else {
completion(true)
return
}
if let client = XmppService.instance.getClient(forJid: BareJID(account)), client.state == .connected, let pushModule: SiskinPushNotificationsModule = client.modulesManager.getModule(SiskinPushNotificationsModule.ID) {
pushModule.unregisterDeviceAndDisable(completionHandler: { result in
switch result {

View file

@ -0,0 +1,53 @@
//
// CallsSettingsViewController.swift
// Snikket
//
// Created by Muhammad Khalid on 29/10/2021.
// Copyright © 2021 Snikket. All rights reserved.
//
import UIKit
import CallKit
class CallsSettingsViewController: UITableViewController {
@IBOutlet weak var callsSwitch: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
callsSwitch.isOn = Settings.addCallsToSystem.getBool()
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
@IBAction func valueChanged(_ sender: UISwitch) {
Settings.addCallsToSystem.setValue(sender.isOn)
enableAddCallsToSystem(enable: sender.isOn)
}
func enableAddCallsToSystem(enable: Bool) {
let config = CXProviderConfiguration(localizedName: "Snikket");
if #available(iOS 13.0, *) {
if let image = UIImage(systemName: "message.fill") {
config.iconTemplateImageData = image.pngData();
}
} else {
if let image = UIImage(named: "message.fill") {
config.iconTemplateImageData = image.pngData();
}
}
config.includesCallsInRecents = enable;
config.supportsVideo = true;
config.maximumCallsPerCallGroup = 1;
config.maximumCallGroups = 1;
config.supportedHandleTypes = [.generic];
CallManager.instance?.provider = CXProvider(configuration: config);
CallManager.instance?.provider.setDelegate(CallManager.instance, queue: nil)
}
}

View file

@ -170,6 +170,9 @@ class SettingsViewController: UITableViewController {
let cell = tableView.dequeueReusableCell(withIdentifier: "ExperimentalSettingsViewCell", for: indexPath);
cell.accessoryType = .disclosureIndicator;
return cell;
case .calls:
let cell = tableView.dequeueReusableCell(withIdentifier: "CallsSettingsViewCell", for: indexPath)
return cell
case .about:
let cell = tableView.dequeueReusableCell(withIdentifier: "AboutSettingsViewCell", for: indexPath);
return cell;
@ -396,13 +399,14 @@ class SettingsViewController: UITableViewController {
case notifications
case media
case experimental
case calls
case about
static let groups: [SettingsGroup] = {
if #available(iOS 13.0, *) {
return [.appearance, .chat, .contacts, .media, .about]
return [.appearance, .chat, .contacts, .media, .calls, .about]
} else {
return [.chat, .contacts, .media, .about]
return [.chat, .contacts, .media, .calls, .about]
}
}()
}

View file

@ -22,6 +22,9 @@
/* Class = "UILabel"; text = "Message Archiving"; ObjectID = "Ckp-Mb-v0c"; */
"Ckp-Mb-v0c.text" = "Meddelandearkivering";
/* Class = "UITableViewSection"; headerTitle = "Invite"; ObjectID = "dib-YA-Eiz"; */
"dib-YA-Eiz.headerTitle" = "Invite";
/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "Dx3-QU-3cN"; */
"Dx3-QU-3cN.title" = "Tillbaka";
@ -82,6 +85,12 @@
/* Class = "UILabel"; text = "Chat with"; ObjectID = "Qr0-8H-IJq"; */
"Qr0-8H-IJq.text" = "Chat with";
/* Class = "UITextField"; placeholder = "Enter contact name"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.placeholder" = "Enter contact name";
/* Class = "UITextField"; text = "Send Invitation Link"; ObjectID = "Rg7-YE-y8H"; */
"Rg7-YE-y8H.text" = "Send Invitation Link";
/* Class = "UINavigationItem"; title = "Contacts"; ObjectID = "SEz-IM-IWL"; */
"SEz-IM-IWL.title" = "Contacts";

View file

@ -13,6 +13,9 @@
/* Class = "UILabel"; text = "About"; ObjectID = "3vM-ad-4ap"; */
"3vM-ad-4ap.text" = "Om";
/* Class = "UITableViewController"; title = "Notification settings"; ObjectID = "4VG-XN-BdZ"; */
"4VG-XN-BdZ.title" = "Notification settings";
/* Class = "UILabel"; text = "Account name"; ObjectID = "7ho-Mu-thd"; */
"7ho-Mu-thd.text" = "Namn på kontot";
@ -109,6 +112,9 @@
/* Class = "UILabel"; text = "Blocked contacts"; ObjectID = "MJ0-kw-1Kl"; */
"MJ0-kw-1Kl.text" = "Blockerade kontakter";
/* Class = "UILabel"; text = "Add to system call history"; ObjectID = "Ngk-vc-zET"; */
"Ngk-vc-zET.text" = "Add to system call history";
/* Class = "UILabel"; text = "\"Hidden\" group"; ObjectID = "P82-B8-768"; */
"P82-B8-768.text" = "\"Dold\" grupp";
@ -130,6 +136,12 @@
/* Class = "UILabel"; text = "20 MB"; ObjectID = "UuL-li-3gA"; */
"UuL-li-3gA.text" = "20 MB";
/* Class = "UITableViewSection"; headerTitle = "TELEPHONY"; ObjectID = "v8T-iN-1IT"; */
"v8T-iN-1IT.headerTitle" = "TELEPHONY";
/* Class = "UILabel"; text = "Calls"; ObjectID = "wfP-Tn-CDA"; */
"wfP-Tn-CDA.text" = "Calls";
/* Class = "UITableViewController"; title = "Contacts settings"; ObjectID = "xRS-v5-T5C"; */
"xRS-v5-T5C.title" = "Inställningar för kontakter";

View file

@ -50,6 +50,7 @@ public enum Settings: String {
case EnableMarkdownFormatting = "markdown"
case ShowEmoticons
case messageStyling
case addCallsToSystem
@available(iOS 13.0, *)
case linkPreviews

View file

@ -54,7 +54,7 @@ class CallManager: NSObject, CXProviderDelegate {
private let pushRegistry: PKPushRegistry;
private let provider: CXProvider;
public var provider: CXProvider;
private let callController: CXCallController;
private(set) var currentCall: Call?;
@ -92,7 +92,7 @@ class CallManager: NSObject, CXProviderDelegate {
config.iconTemplateImageData = image.pngData();
}
}
config.includesCallsInRecents = false;
config.includesCallsInRecents = Settings.addCallsToSystem.getBool()
config.supportsVideo = true;
config.maximumCallsPerCallGroup = 1;
config.maximumCallGroups = 1;
@ -125,7 +125,11 @@ class CallManager: NSObject, CXProviderDelegate {
update.supportsHolding = false
provider.configuration.supportsVideo = call.media.contains(.video)
update.hasVideo = AVCaptureDevice.authorizationStatus(for: .video) == .authorized && call.media.contains(.video)
update.remoteHandle = call.media.contains(.video) ? CXHandle(type: .generic, value: call.jid.stringValue) : nil
let telephonyProvider = AccountSettings.telephonyProvider(call.account).getString() ?? ""
let handle = telephonyProvider == call.jid.domain ? CXHandle(type: .phoneNumber, value: (call.jid.localPart ?? "Unknown")) : CXHandle(type: .generic, value: call.jid.stringValue)
update.remoteHandle = handle
configureAudioSession()
provider.reportNewIncomingCall(with: call.uuid, update: update, completion: { err in
guard let error = err else {
@ -168,7 +172,10 @@ class CallManager: NSObject, CXProviderDelegate {
let rosterModule: RosterModule? = XmppService.instance.getClient(for: call.account)?.modulesManager.getModule(RosterModule.ID);
let name = rosterModule?.rosterStore.get(for: JID(call.jid))?.name ?? call.jid.stringValue;
let startCallAction = CXStartCallAction(call: call.uuid, handle: CXHandle(type: .generic, value: call.jid.stringValue));
let telephonyProvider = AccountSettings.telephonyProvider(call.account).getString() ?? ""
let handle = telephonyProvider == call.jid.domain ? CXHandle(type: .phoneNumber, value: (call.jid.localPart ?? "Unknown")) : CXHandle(type: .generic, value: call.jid.stringValue)
let startCallAction = CXStartCallAction(call: call.uuid, handle: handle)
startCallAction.isVideo = call.media.contains(.video);
startCallAction.contactIdentifier = name;
let transaction = CXTransaction(action: startCallAction);