Merge remote-tracking branch 'origin/develop' into develop
17
CHANGES.rst
|
@ -1,3 +1,20 @@
|
||||||
|
Changes in 0.5.3 (2017-08-25)
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
Improvements:
|
||||||
|
* Upgrade MatrixKit version (v0.6.2).
|
||||||
|
* Support dark theme (vector-im/riot-meta#22).
|
||||||
|
* Set the application group identifier to be able to share userDefaults object.
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
* SettingsViewController: Release correctly the pushed view controller.
|
||||||
|
* App have crashed whilst uploading photos (#1445).
|
||||||
|
* Register for remote notifications only if user provides access to notification feature, thanks to @aramsargsyan (#1467).
|
||||||
|
* Improvements in notification registration flow, thanks to @aramsargsyan (#1472).
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
* Enable Russian.
|
||||||
|
|
||||||
Changes in 0.5.2 (2017-08-01)
|
Changes in 0.5.2 (2017-08-01)
|
||||||
===============================================
|
===============================================
|
||||||
|
|
||||||
|
|
37
Podfile
|
@ -8,7 +8,7 @@ target "Riot" do
|
||||||
|
|
||||||
# Different flavours of pods to MatrixKit
|
# Different flavours of pods to MatrixKit
|
||||||
# The tagged version on which this version of Riot has been built
|
# The tagged version on which this version of Riot has been built
|
||||||
pod 'MatrixKit', '0.6.1'
|
pod 'MatrixKit', '0.6.2'
|
||||||
|
|
||||||
# The lastest release available on the CocoaPods repository
|
# The lastest release available on the CocoaPods repository
|
||||||
#pod 'MatrixKit'
|
#pod 'MatrixKit'
|
||||||
|
@ -41,3 +41,38 @@ pod 'DTCoreText', :inhibit_warnings => true
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
target "RiotShareExtension" do
|
||||||
|
|
||||||
|
pod 'GoogleAnalytics'
|
||||||
|
# The Google WebRTC stack
|
||||||
|
pod 'WebRTC', '58.17.16937'
|
||||||
|
# OLMKit for crypto
|
||||||
|
pod 'OLMKit'
|
||||||
|
#pod 'OLMKit', :path => '../olm/OLMKit.podspec'
|
||||||
|
pod 'Realm', '~> 2.8.1'
|
||||||
|
|
||||||
|
# The tagged version on which this version of Riot share extension has been built
|
||||||
|
pod 'MatrixKit/AppExtension', '0.6.2'
|
||||||
|
|
||||||
|
# The lastest release available on the CocoaPods repository
|
||||||
|
#pod 'MatrixKit/AppExtension'
|
||||||
|
|
||||||
|
# The develop branch version
|
||||||
|
#pod 'MatrixSDK', :git => 'https://github.com/matrix-org/matrix-ios-sdk.git', :branch => 'develop'
|
||||||
|
#pod 'MatrixKit/AppExtension', :git => 'https://github.com/matrix-org/matrix-ios-kit.git', :branch => 'develop'
|
||||||
|
|
||||||
|
# The one used for developing both MatrixSDK and MatrixKit
|
||||||
|
# Note that MatrixSDK must be cloned into a folder called matrix-ios-sdk next to the MatrixKit folder
|
||||||
|
#pod 'MatrixSDK', :path => '../matrix-ios-sdk/MatrixSDK.podspec'
|
||||||
|
#pod 'MatrixKit/AppExtension', :path => '../matrix-ios-kit/MatrixKit.podspec'
|
||||||
|
|
||||||
|
# Remove warnings from "bad" pods
|
||||||
|
pod 'OLMKit', :inhibit_warnings => true
|
||||||
|
pod 'cmark', :inhibit_warnings => true
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
36
Podfile.lock
|
@ -26,6 +26,11 @@ PODS:
|
||||||
- DTFoundation/DTAnimatedGIF (~> 1.7.5)
|
- DTFoundation/DTAnimatedGIF (~> 1.7.5)
|
||||||
- DTFoundation/DTHTMLParser (~> 1.7.5)
|
- DTFoundation/DTHTMLParser (~> 1.7.5)
|
||||||
- DTFoundation/UIKit (~> 1.7.5)
|
- DTFoundation/UIKit (~> 1.7.5)
|
||||||
|
- DTCoreText/Extension (1.6.20):
|
||||||
|
- DTFoundation/Core (~> 1.7.5)
|
||||||
|
- DTFoundation/DTAnimatedGIF (~> 1.7.5)
|
||||||
|
- DTFoundation/DTHTMLParser (~> 1.7.5)
|
||||||
|
- DTFoundation/UIKit (~> 1.7.5)
|
||||||
- DTFoundation/Core (1.7.12)
|
- DTFoundation/Core (1.7.12)
|
||||||
- DTFoundation/DTAnimatedGIF (1.7.12)
|
- DTFoundation/DTAnimatedGIF (1.7.12)
|
||||||
- DTFoundation/DTHTMLParser (1.7.12):
|
- DTFoundation/DTHTMLParser (1.7.12):
|
||||||
|
@ -39,13 +44,27 @@ PODS:
|
||||||
- GZIP (1.1.1)
|
- GZIP (1.1.1)
|
||||||
- HPGrowingTextView (1.1)
|
- HPGrowingTextView (1.1)
|
||||||
- libPhoneNumber-iOS (0.9.10)
|
- libPhoneNumber-iOS (0.9.10)
|
||||||
- MatrixKit (0.6.1):
|
- MatrixKit (0.6.2):
|
||||||
- cmark (~> 0.24.1)
|
- cmark (~> 0.24.1)
|
||||||
- DTCoreText (~> 1.6.17)
|
- DTCoreText (~> 1.6.17)
|
||||||
- HPGrowingTextView (~> 1.1)
|
- HPGrowingTextView (~> 1.1)
|
||||||
- libPhoneNumber-iOS (~> 0.9.10)
|
- libPhoneNumber-iOS (~> 0.9.10)
|
||||||
- MatrixSDK (= 0.9.1)
|
- MatrixKit/Core (= 0.6.2)
|
||||||
- MatrixSDK (0.9.1):
|
- MatrixSDK (= 0.9.2)
|
||||||
|
- MatrixKit/AppExtension (0.6.2):
|
||||||
|
- cmark (~> 0.24.1)
|
||||||
|
- DTCoreText (~> 1.6.17)
|
||||||
|
- DTCoreText/Extension
|
||||||
|
- HPGrowingTextView (~> 1.1)
|
||||||
|
- libPhoneNumber-iOS (~> 0.9.10)
|
||||||
|
- MatrixSDK (= 0.9.2)
|
||||||
|
- MatrixKit/Core (0.6.2):
|
||||||
|
- cmark (~> 0.24.1)
|
||||||
|
- DTCoreText (~> 1.6.17)
|
||||||
|
- HPGrowingTextView (~> 1.1)
|
||||||
|
- libPhoneNumber-iOS (~> 0.9.10)
|
||||||
|
- MatrixSDK (= 0.9.2)
|
||||||
|
- MatrixSDK (0.9.2):
|
||||||
- AFNetworking (~> 3.1.0)
|
- AFNetworking (~> 3.1.0)
|
||||||
- GZIP (~> 1.1.1)
|
- GZIP (~> 1.1.1)
|
||||||
- OLMKit (2.2.2):
|
- OLMKit (2.2.2):
|
||||||
|
@ -63,7 +82,8 @@ DEPENDENCIES:
|
||||||
- DTCoreText
|
- DTCoreText
|
||||||
- GBDeviceInfo (~> 4.3.0)
|
- GBDeviceInfo (~> 4.3.0)
|
||||||
- GoogleAnalytics
|
- GoogleAnalytics
|
||||||
- MatrixKit (= 0.6.1)
|
- MatrixKit (= 0.6.2)
|
||||||
|
- MatrixKit/AppExtension (= 0.6.2)
|
||||||
- OLMKit
|
- OLMKit
|
||||||
- Realm (~> 2.8.1)
|
- Realm (~> 2.8.1)
|
||||||
- WebRTC (= 58.17.16937)
|
- WebRTC (= 58.17.16937)
|
||||||
|
@ -78,12 +98,12 @@ SPEC CHECKSUMS:
|
||||||
GZIP: f8beb59597f651e6970a45b816508a9c6d700b77
|
GZIP: f8beb59597f651e6970a45b816508a9c6d700b77
|
||||||
HPGrowingTextView: 88a716d97fb853bcb08a4a08e4727da17efc9b19
|
HPGrowingTextView: 88a716d97fb853bcb08a4a08e4727da17efc9b19
|
||||||
libPhoneNumber-iOS: f721ae4d5854bce60934f9fb9b0b28e8e68913cb
|
libPhoneNumber-iOS: f721ae4d5854bce60934f9fb9b0b28e8e68913cb
|
||||||
MatrixKit: fbf30823fb64604b5f8bb8ef8cbb8d949189525b
|
MatrixKit: 8552ee8abf935b08ae08fc0000f53ab3218ea5a0
|
||||||
MatrixSDK: c5d9b84da5e32b305c5def410f239a7d94c72105
|
MatrixSDK: 0499dd3dbe293ce1e743a7cda181dcf50eda7f10
|
||||||
OLMKit: b9d8c0ffee9ea8c45bc0aaa9afb47f93fba7efbd
|
OLMKit: b9d8c0ffee9ea8c45bc0aaa9afb47f93fba7efbd
|
||||||
Realm: 3601ef091c8c499a31101d8563b991e75546cdce
|
Realm: 3601ef091c8c499a31101d8563b991e75546cdce
|
||||||
WebRTC: 1e9a85bf75509eec44be6478c64e9de65ac82332
|
WebRTC: 1e9a85bf75509eec44be6478c64e9de65ac82332
|
||||||
|
|
||||||
PODFILE CHECKSUM: 76ecd40dee0ff2c3007141b353b385be7e863d6c
|
PODFILE CHECKSUM: db0ae7d6037f7768feb2adf17119ba69d9e1a77b
|
||||||
|
|
||||||
COCOAPODS: 1.2.1
|
COCOAPODS: 1.3.1
|
||||||
|
|
|
@ -7,8 +7,33 @@
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
05D592A32FF1D1877B89F73C /* libPods-Riot.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD9D0BDE9232898950554DD5 /* libPods-Riot.a */; };
|
||||||
|
2435179C1F375B9400D0683E /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2466B7551F2F80B800AE27B0 /* Info.plist */; };
|
||||||
|
2435179F1F375C0F00D0683E /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382C01F276AED00356143 /* Vector.strings */; };
|
||||||
|
245FC3ED1F3D079A00603C6A /* ShareExtensionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 245FC3EB1F3CAF9800603C6A /* ShareExtensionManager.m */; };
|
||||||
|
245FC3EF1F3DD30800603C6A /* RecentCellData.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BC071E7009EC00A9B29C /* RecentCellData.m */; };
|
||||||
|
2466B73E1F2DFAC100AE27B0 /* animatedLogo-4.png in Resources */ = {isa = PBXBuildFile; fileRef = F083BB201E7009EC00A9B29C /* animatedLogo-4.png */; };
|
||||||
24B5103E1EFA7083004C6AD2 /* ReadReceiptsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B5103D1EFA7083004C6AD2 /* ReadReceiptsViewController.m */; };
|
24B5103E1EFA7083004C6AD2 /* ReadReceiptsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B5103D1EFA7083004C6AD2 /* ReadReceiptsViewController.m */; };
|
||||||
24B510401EFA88CC004C6AD2 /* ReadReceiptsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24B5103F1EFA88CC004C6AD2 /* ReadReceiptsViewController.xib */; };
|
24B510401EFA88CC004C6AD2 /* ReadReceiptsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24B5103F1EFA88CC004C6AD2 /* ReadReceiptsViewController.xib */; };
|
||||||
|
24CBEC591F0EAD310093EABB /* RiotShareExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 24CBEC4E1F0EAD310093EABB /* RiotShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
|
24D6B3581F3C90D300FC7A71 /* ShareRecentsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D6B3571F3C90D300FC7A71 /* ShareRecentsDataSource.m */; };
|
||||||
|
24D6B3591F3CA02900FC7A71 /* SharePresentingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D6B34B1F3C8F8A00FC7A71 /* SharePresentingViewController.m */; };
|
||||||
|
24D6B35A1F3CA02C00FC7A71 /* ShareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D6B34D1F3C8F8A00FC7A71 /* ShareViewController.m */; };
|
||||||
|
24D6B35B1F3CA03300FC7A71 /* ShareViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24D6B34E1F3C8F8A00FC7A71 /* ShareViewController.xib */; };
|
||||||
|
24D6B35C1F3CA03600FC7A71 /* RoomsListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D6B3491F3C8F8A00FC7A71 /* RoomsListViewController.m */; };
|
||||||
|
24D6B35D1F3CA03A00FC7A71 /* FallbackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D6B3461F3C8F8A00FC7A71 /* FallbackViewController.m */; };
|
||||||
|
24D6B35E1F3CA03E00FC7A71 /* FallbackViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24D6B3471F3C8F8A00FC7A71 /* FallbackViewController.xib */; };
|
||||||
|
24EEE5A01F23A08900B3C705 /* RoomTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BCED1E7009EC00A9B29C /* RoomTableViewCell.m */; };
|
||||||
|
24EEE5A11F23A09A00B3C705 /* RiotDesignValues.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BC171E7009EC00A9B29C /* RiotDesignValues.m */; };
|
||||||
|
24EEE5A21F23A8B400B3C705 /* MXRoom+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BBE81E7009EC00A9B29C /* MXRoom+Riot.m */; };
|
||||||
|
24EEE5A31F23A8C300B3C705 /* AvatarGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BC111E7009EC00A9B29C /* AvatarGenerator.m */; };
|
||||||
|
24EEE5A41F24C06E00B3C705 /* (null) in Resources */ = {isa = PBXBuildFile; };
|
||||||
|
24EEE5A81F25529600B3C705 /* cancel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0614A121EDEE65000F5DC9A /* cancel@3x.png */; };
|
||||||
|
24EEE5A91F25529900B3C705 /* cancel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0614A111EDEE65000F5DC9A /* cancel@2x.png */; };
|
||||||
|
24EEE5AA1F25529C00B3C705 /* cancel.png in Resources */ = {isa = PBXBuildFile; fileRef = F0614A101EDEE65000F5DC9A /* cancel.png */; };
|
||||||
|
24EEE5AF1F25F0F500B3C705 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F083BBEF1E7009EC00A9B29C /* Images.xcassets */; };
|
||||||
|
24EEE5B41F2607C000B3C705 /* SegmentedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BC4E1E7009EC00A9B29C /* SegmentedViewController.m */; };
|
||||||
|
24EEE5B51F2607C500B3C705 /* SegmentedViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F083BC4F1E7009EC00A9B29C /* SegmentedViewController.xib */; };
|
||||||
3205ED7D1E976C8A003D65FA /* DirectoryServerPickerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3205ED7C1E976C8A003D65FA /* DirectoryServerPickerViewController.m */; };
|
3205ED7D1E976C8A003D65FA /* DirectoryServerPickerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3205ED7C1E976C8A003D65FA /* DirectoryServerPickerViewController.m */; };
|
||||||
3205ED841E97725E003D65FA /* DirectoryServerTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3205ED821E97725E003D65FA /* DirectoryServerTableViewCell.m */; };
|
3205ED841E97725E003D65FA /* DirectoryServerTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3205ED821E97725E003D65FA /* DirectoryServerTableViewCell.m */; };
|
||||||
3205ED851E97725E003D65FA /* DirectoryServerTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3205ED831E97725E003D65FA /* DirectoryServerTableViewCell.xib */; };
|
3205ED851E97725E003D65FA /* DirectoryServerTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3205ED831E97725E003D65FA /* DirectoryServerTableViewCell.xib */; };
|
||||||
|
@ -27,7 +52,6 @@
|
||||||
32471CDD1F1373A100BDF50A /* RoomMembershipCollapsedWithPaginationTitleBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32471CDB1F1373A100BDF50A /* RoomMembershipCollapsedWithPaginationTitleBubbleCell.xib */; };
|
32471CDD1F1373A100BDF50A /* RoomMembershipCollapsedWithPaginationTitleBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32471CDB1F1373A100BDF50A /* RoomMembershipCollapsedWithPaginationTitleBubbleCell.xib */; };
|
||||||
32471CE11F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32471CDF1F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m */; };
|
32471CE11F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32471CDF1F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m */; };
|
||||||
32471CE21F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32471CE01F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib */; };
|
32471CE21F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32471CE01F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib */; };
|
||||||
325072141E8C0AC900A084B6 /* LaunchScreenLogo.png in Resources */ = {isa = PBXBuildFile; fileRef = 325072131E8C0AC900A084B6 /* LaunchScreenLogo.png */; };
|
|
||||||
325E1C151E8D03950018D91E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 325E1C131E8D03950018D91E /* LaunchScreen.storyboard */; };
|
325E1C151E8D03950018D91E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 325E1C131E8D03950018D91E /* LaunchScreen.storyboard */; };
|
||||||
327382B51F276AD200356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382A81F276AD200356143 /* InfoPlist.strings */; };
|
327382B51F276AD200356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382A81F276AD200356143 /* InfoPlist.strings */; };
|
||||||
327382B61F276AD200356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382AA1F276AD200356143 /* Localizable.strings */; };
|
327382B61F276AD200356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382AA1F276AD200356143 /* Localizable.strings */; };
|
||||||
|
@ -38,6 +62,10 @@
|
||||||
327382C21F276AED00356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382BC1F276AED00356143 /* InfoPlist.strings */; };
|
327382C21F276AED00356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382BC1F276AED00356143 /* InfoPlist.strings */; };
|
||||||
327382C31F276AED00356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382BE1F276AED00356143 /* Localizable.strings */; };
|
327382C31F276AED00356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382BE1F276AED00356143 /* Localizable.strings */; };
|
||||||
327382C41F276AED00356143 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382C01F276AED00356143 /* Vector.strings */; };
|
327382C41F276AED00356143 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382C01F276AED00356143 /* Vector.strings */; };
|
||||||
|
32918EA91F473BDB0076CA16 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32918EA51F473BDB0076CA16 /* Localizable.strings */; };
|
||||||
|
32918EAA1F473BDB0076CA16 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32918EA71F473BDB0076CA16 /* Vector.strings */; };
|
||||||
|
32935CB11F6056FD006888C8 /* IntegrationManagerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 32935CB01F6056FD006888C8 /* IntegrationManagerViewController.m */; };
|
||||||
|
32935CB41F628BCE006888C8 /* IntegrationManager.js in Resources */ = {isa = PBXBuildFile; fileRef = 32935CB31F628BCE006888C8 /* IntegrationManager.js */; };
|
||||||
32AE61E41F0A971B007255F4 /* RoomMembershipBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */; };
|
32AE61E41F0A971B007255F4 /* RoomMembershipBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */; };
|
||||||
32AE61E51F0A971B007255F4 /* RoomMembershipBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */; };
|
32AE61E51F0A971B007255F4 /* RoomMembershipBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */; };
|
||||||
32AE61E91F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E71F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m */; };
|
32AE61E91F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E71F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m */; };
|
||||||
|
@ -47,9 +75,15 @@
|
||||||
32AE61F41F0D2183007255F4 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32AE61F01F0D2183007255F4 /* Vector.strings */; };
|
32AE61F41F0D2183007255F4 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32AE61F01F0D2183007255F4 /* Vector.strings */; };
|
||||||
32D392181EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D392161EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.m */; };
|
32D392181EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D392161EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.m */; };
|
||||||
32D392191EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32D392171EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.xib */; };
|
32D392191EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32D392171EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.xib */; };
|
||||||
|
32E84FA11F6BD32700CA0B89 /* apps-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 32E84F9E1F6BD32700CA0B89 /* apps-icon.png */; };
|
||||||
|
32E84FA21F6BD32700CA0B89 /* apps-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 32E84F9F1F6BD32700CA0B89 /* apps-icon@2x.png */; };
|
||||||
|
32E84FA31F6BD32700CA0B89 /* apps-icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 32E84FA01F6BD32700CA0B89 /* apps-icon@3x.png */; };
|
||||||
|
32F3AE1A1F6FF4E600F0F004 /* WidgetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 32F3AE191F6FF4E600F0F004 /* WidgetViewController.m */; };
|
||||||
32FD0A3D1EB0CD9B0072B066 /* BugReportViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 32FD0A3B1EB0CD9B0072B066 /* BugReportViewController.m */; };
|
32FD0A3D1EB0CD9B0072B066 /* BugReportViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 32FD0A3B1EB0CD9B0072B066 /* BugReportViewController.m */; };
|
||||||
32FD0A3E1EB0CD9B0072B066 /* BugReportViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32FD0A3C1EB0CD9B0072B066 /* BugReportViewController.xib */; };
|
32FD0A3E1EB0CD9B0072B066 /* BugReportViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32FD0A3C1EB0CD9B0072B066 /* BugReportViewController.xib */; };
|
||||||
E2EAC1A4FBD6FE5228584591 /* libPods-Riot.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8737F782E108CFD6908691 /* libPods-Riot.a */; };
|
92324BE31F4F66D3009DE194 /* IncomingCallView.m in Sources */ = {isa = PBXBuildFile; fileRef = 92324BE21F4F66D3009DE194 /* IncomingCallView.m */; };
|
||||||
|
92324BE61F4F6A60009DE194 /* CircleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 92324BE51F4F6A60009DE194 /* CircleButton.m */; };
|
||||||
|
A27ECCE3FC4971745D2CB78D /* libPods-RiotShareExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7246451C668D6782166E22EC /* libPods-RiotShareExtension.a */; };
|
||||||
F0131DE51F2200D600CBF707 /* RiotSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F0131DE41F2200D600CBF707 /* RiotSplitViewController.m */; };
|
F0131DE51F2200D600CBF707 /* RiotSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F0131DE41F2200D600CBF707 /* RiotSplitViewController.m */; };
|
||||||
F02C1A861E8EB04C0045A404 /* PeopleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F02C1A841E8EB04C0045A404 /* PeopleViewController.m */; };
|
F02C1A861E8EB04C0045A404 /* PeopleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F02C1A841E8EB04C0045A404 /* PeopleViewController.m */; };
|
||||||
F05BD79E1E7AEBF800C69941 /* UnifiedSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F05BD79D1E7AEBF800C69941 /* UnifiedSearchViewController.m */; };
|
F05BD79E1E7AEBF800C69941 /* UnifiedSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F05BD79D1E7AEBF800C69941 /* UnifiedSearchViewController.m */; };
|
||||||
|
@ -462,9 +496,13 @@
|
||||||
F0B4CBAC1F41F090008E99C5 /* EncryptionInfoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F0B4CBAB1F41F090008E99C5 /* EncryptionInfoView.xib */; };
|
F0B4CBAC1F41F090008E99C5 /* EncryptionInfoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F0B4CBAB1F41F090008E99C5 /* EncryptionInfoView.xib */; };
|
||||||
F0B4CBB11F4215E3008E99C5 /* EventDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = F0B4CBAF1F4215E3008E99C5 /* EventDetailsView.m */; };
|
F0B4CBB11F4215E3008E99C5 /* EventDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = F0B4CBAF1F4215E3008E99C5 /* EventDetailsView.m */; };
|
||||||
F0B4CBB21F4215E3008E99C5 /* EventDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F0B4CBB01F4215E3008E99C5 /* EventDetailsView.xib */; };
|
F0B4CBB21F4215E3008E99C5 /* EventDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F0B4CBB01F4215E3008E99C5 /* EventDetailsView.xib */; };
|
||||||
|
F0B5430A1F70FF8F00D29293 /* back_icon@4x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0B543091F70FF8F00D29293 /* back_icon@4x.png */; };
|
||||||
|
F0B7A8B11F475783006E27D2 /* RoomsListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F0B7A8AF1F4756A5006E27D2 /* RoomsListViewController.xib */; };
|
||||||
|
F0D2ADA11F6AA5FD00A7097D /* MXRoomSummary+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D2ADA01F6AA5FD00A7097D /* MXRoomSummary+Riot.m */; };
|
||||||
F0D869EB1EC455A100BB0A2B /* create_direct_chat.png in Resources */ = {isa = PBXBuildFile; fileRef = F0D869E81EC455A100BB0A2B /* create_direct_chat.png */; };
|
F0D869EB1EC455A100BB0A2B /* create_direct_chat.png in Resources */ = {isa = PBXBuildFile; fileRef = F0D869E81EC455A100BB0A2B /* create_direct_chat.png */; };
|
||||||
F0D869EC1EC455A100BB0A2B /* create_direct_chat@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0D869E91EC455A100BB0A2B /* create_direct_chat@2x.png */; };
|
F0D869EC1EC455A100BB0A2B /* create_direct_chat@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0D869E91EC455A100BB0A2B /* create_direct_chat@2x.png */; };
|
||||||
F0D869ED1EC455A100BB0A2B /* create_direct_chat@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0D869EA1EC455A100BB0A2B /* create_direct_chat@3x.png */; };
|
F0D869ED1EC455A100BB0A2B /* create_direct_chat@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = F0D869EA1EC455A100BB0A2B /* create_direct_chat@3x.png */; };
|
||||||
|
F0DD05D01F615ECF00CB5292 /* LaunchScreenRiot.png in Resources */ = {isa = PBXBuildFile; fileRef = F0DD05CF1F615ECF00CB5292 /* LaunchScreenRiot.png */; };
|
||||||
F0E059FD1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E059FC1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.m */; };
|
F0E059FD1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E059FC1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.m */; };
|
||||||
F0E05A021E963103004B83FB /* FavouritesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E059FF1E963103004B83FB /* FavouritesViewController.m */; };
|
F0E05A021E963103004B83FB /* FavouritesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E059FF1E963103004B83FB /* FavouritesViewController.m */; };
|
||||||
F0E05A031E963103004B83FB /* RoomsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E05A011E963103004B83FB /* RoomsViewController.m */; };
|
F0E05A031E963103004B83FB /* RoomsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E05A011E963103004B83FB /* RoomsViewController.m */; };
|
||||||
|
@ -497,6 +535,13 @@
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
242661F51F12B1BA00D3FC08 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = F094A99A1B78D8F000B1FBBF /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 24CBEC4D1F0EAD310093EABB;
|
||||||
|
remoteInfo = "Riot Share Extension";
|
||||||
|
};
|
||||||
F094A9BF1B78D8F000B1FBBF /* PBXContainerItemProxy */ = {
|
F094A9BF1B78D8F000B1FBBF /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = F094A99A1B78D8F000B1FBBF /* Project object */;
|
containerPortal = F094A99A1B78D8F000B1FBBF /* Project object */;
|
||||||
|
@ -507,6 +552,17 @@
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
24CBEC5D1F0EAD310093EABB /* Embed App Extensions */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 13;
|
||||||
|
files = (
|
||||||
|
24CBEC591F0EAD310093EABB /* RiotShareExtension.appex in Embed App Extensions */,
|
||||||
|
);
|
||||||
|
name = "Embed App Extensions";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
3233F7481F3497E2006ACA81 /* Embed Frameworks */ = {
|
3233F7481F3497E2006ACA81 /* Embed Frameworks */ = {
|
||||||
isa = PBXCopyFilesBuildPhase;
|
isa = PBXCopyFilesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -521,10 +577,27 @@
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
1129C74A281B080432B1A1A1 /* Pods-Riot.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Riot.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Riot/Pods-Riot.debug.xcconfig"; sourceTree = "<group>"; };
|
12AA0005C8B3D8D8162584C5 /* Pods-RiotShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotShareExtension/Pods-RiotShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
245FC3EA1F3CAF9800603C6A /* ShareExtensionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShareExtensionManager.h; sourceTree = "<group>"; };
|
||||||
|
245FC3EB1F3CAF9800603C6A /* ShareExtensionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShareExtensionManager.m; sourceTree = "<group>"; };
|
||||||
|
2466B7551F2F80B800AE27B0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RiotShareExtension/Info.plist; sourceTree = SOURCE_ROOT; };
|
||||||
|
2466B7561F2F80B800AE27B0 /* RiotShareExtension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; name = RiotShareExtension.entitlements; path = RiotShareExtension/RiotShareExtension.entitlements; sourceTree = SOURCE_ROOT; };
|
||||||
24B5103C1EFA7083004C6AD2 /* ReadReceiptsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReadReceiptsViewController.h; sourceTree = "<group>"; };
|
24B5103C1EFA7083004C6AD2 /* ReadReceiptsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReadReceiptsViewController.h; sourceTree = "<group>"; };
|
||||||
24B5103D1EFA7083004C6AD2 /* ReadReceiptsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReadReceiptsViewController.m; sourceTree = "<group>"; };
|
24B5103D1EFA7083004C6AD2 /* ReadReceiptsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReadReceiptsViewController.m; sourceTree = "<group>"; };
|
||||||
24B5103F1EFA88CC004C6AD2 /* ReadReceiptsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ReadReceiptsViewController.xib; sourceTree = "<group>"; };
|
24B5103F1EFA88CC004C6AD2 /* ReadReceiptsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ReadReceiptsViewController.xib; sourceTree = "<group>"; };
|
||||||
|
24CBEC4E1F0EAD310093EABB /* RiotShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = RiotShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
24D6B3451F3C8F8A00FC7A71 /* FallbackViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FallbackViewController.h; sourceTree = "<group>"; };
|
||||||
|
24D6B3461F3C8F8A00FC7A71 /* FallbackViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FallbackViewController.m; sourceTree = "<group>"; };
|
||||||
|
24D6B3471F3C8F8A00FC7A71 /* FallbackViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FallbackViewController.xib; sourceTree = "<group>"; };
|
||||||
|
24D6B3481F3C8F8A00FC7A71 /* RoomsListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomsListViewController.h; sourceTree = "<group>"; };
|
||||||
|
24D6B3491F3C8F8A00FC7A71 /* RoomsListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomsListViewController.m; sourceTree = "<group>"; };
|
||||||
|
24D6B34A1F3C8F8A00FC7A71 /* SharePresentingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharePresentingViewController.h; sourceTree = "<group>"; };
|
||||||
|
24D6B34B1F3C8F8A00FC7A71 /* SharePresentingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SharePresentingViewController.m; sourceTree = "<group>"; };
|
||||||
|
24D6B34C1F3C8F8A00FC7A71 /* ShareViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShareViewController.h; sourceTree = "<group>"; };
|
||||||
|
24D6B34D1F3C8F8A00FC7A71 /* ShareViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShareViewController.m; sourceTree = "<group>"; };
|
||||||
|
24D6B34E1F3C8F8A00FC7A71 /* ShareViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShareViewController.xib; sourceTree = "<group>"; };
|
||||||
|
24D6B3561F3C90D300FC7A71 /* ShareRecentsDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShareRecentsDataSource.h; sourceTree = "<group>"; };
|
||||||
|
24D6B3571F3C90D300FC7A71 /* ShareRecentsDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShareRecentsDataSource.m; sourceTree = "<group>"; };
|
||||||
3205ED7B1E976C8A003D65FA /* DirectoryServerPickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryServerPickerViewController.h; sourceTree = "<group>"; };
|
3205ED7B1E976C8A003D65FA /* DirectoryServerPickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryServerPickerViewController.h; sourceTree = "<group>"; };
|
||||||
3205ED7C1E976C8A003D65FA /* DirectoryServerPickerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DirectoryServerPickerViewController.m; sourceTree = "<group>"; };
|
3205ED7C1E976C8A003D65FA /* DirectoryServerPickerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DirectoryServerPickerViewController.m; sourceTree = "<group>"; };
|
||||||
3205ED811E97725E003D65FA /* DirectoryServerTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryServerTableViewCell.h; sourceTree = "<group>"; };
|
3205ED811E97725E003D65FA /* DirectoryServerTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryServerTableViewCell.h; sourceTree = "<group>"; };
|
||||||
|
@ -552,7 +625,6 @@
|
||||||
32471CDE1F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.h; sourceTree = "<group>"; };
|
32471CDE1F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.h; sourceTree = "<group>"; };
|
||||||
32471CDF1F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.m; sourceTree = "<group>"; };
|
32471CDF1F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.m; sourceTree = "<group>"; };
|
||||||
32471CE01F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.xib; sourceTree = "<group>"; };
|
32471CE01F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.xib; sourceTree = "<group>"; };
|
||||||
325072131E8C0AC900A084B6 /* LaunchScreenLogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LaunchScreenLogo.png; path = Assets/Images/LaunchScreenLogo.png; sourceTree = "<group>"; };
|
|
||||||
325E1C141E8D03950018D91E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
325E1C141E8D03950018D91E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
327382A91F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = InfoPlist.strings; sourceTree = "<group>"; };
|
327382A91F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
327382AB1F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Localizable.strings; sourceTree = "<group>"; };
|
327382AB1F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Localizable.strings; sourceTree = "<group>"; };
|
||||||
|
@ -563,6 +635,11 @@
|
||||||
327382BD1F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = InfoPlist.strings; sourceTree = "<group>"; };
|
327382BD1F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
327382BF1F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Localizable.strings; sourceTree = "<group>"; };
|
327382BF1F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Localizable.strings; sourceTree = "<group>"; };
|
||||||
327382C11F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Vector.strings; sourceTree = "<group>"; };
|
327382C11F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Vector.strings; sourceTree = "<group>"; };
|
||||||
|
32918EA61F473BDB0076CA16 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Localizable.strings; sourceTree = "<group>"; };
|
||||||
|
32918EA81F473BDB0076CA16 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Vector.strings; sourceTree = "<group>"; };
|
||||||
|
32935CAF1F6056FD006888C8 /* IntegrationManagerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntegrationManagerViewController.h; sourceTree = "<group>"; };
|
||||||
|
32935CB01F6056FD006888C8 /* IntegrationManagerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntegrationManagerViewController.m; sourceTree = "<group>"; };
|
||||||
|
32935CB31F628BCE006888C8 /* IntegrationManager.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = IntegrationManager.js; sourceTree = "<group>"; };
|
||||||
32AE61E11F0A971B007255F4 /* RoomMembershipBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMembershipBubbleCell.h; sourceTree = "<group>"; };
|
32AE61E11F0A971B007255F4 /* RoomMembershipBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMembershipBubbleCell.h; sourceTree = "<group>"; };
|
||||||
32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMembershipBubbleCell.m; sourceTree = "<group>"; };
|
32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMembershipBubbleCell.m; sourceTree = "<group>"; };
|
||||||
32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipBubbleCell.xib; sourceTree = "<group>"; };
|
32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipBubbleCell.xib; sourceTree = "<group>"; };
|
||||||
|
@ -575,10 +652,22 @@
|
||||||
32D392151EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryServerDetailTableViewCell.h; sourceTree = "<group>"; };
|
32D392151EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryServerDetailTableViewCell.h; sourceTree = "<group>"; };
|
||||||
32D392161EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DirectoryServerDetailTableViewCell.m; sourceTree = "<group>"; };
|
32D392161EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DirectoryServerDetailTableViewCell.m; sourceTree = "<group>"; };
|
||||||
32D392171EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DirectoryServerDetailTableViewCell.xib; sourceTree = "<group>"; };
|
32D392171EB9B7AB009A2BAF /* DirectoryServerDetailTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DirectoryServerDetailTableViewCell.xib; sourceTree = "<group>"; };
|
||||||
|
32E84F9E1F6BD32700CA0B89 /* apps-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apps-icon.png"; sourceTree = "<group>"; };
|
||||||
|
32E84F9F1F6BD32700CA0B89 /* apps-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apps-icon@2x.png"; sourceTree = "<group>"; };
|
||||||
|
32E84FA01F6BD32700CA0B89 /* apps-icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apps-icon@3x.png"; sourceTree = "<group>"; };
|
||||||
|
32F3AE181F6FF4E600F0F004 /* WidgetViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetViewController.h; sourceTree = "<group>"; };
|
||||||
|
32F3AE191F6FF4E600F0F004 /* WidgetViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WidgetViewController.m; sourceTree = "<group>"; };
|
||||||
32FD0A3A1EB0CD9B0072B066 /* BugReportViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BugReportViewController.h; sourceTree = "<group>"; };
|
32FD0A3A1EB0CD9B0072B066 /* BugReportViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BugReportViewController.h; sourceTree = "<group>"; };
|
||||||
32FD0A3B1EB0CD9B0072B066 /* BugReportViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BugReportViewController.m; sourceTree = "<group>"; };
|
32FD0A3B1EB0CD9B0072B066 /* BugReportViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BugReportViewController.m; sourceTree = "<group>"; };
|
||||||
32FD0A3C1EB0CD9B0072B066 /* BugReportViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BugReportViewController.xib; sourceTree = "<group>"; };
|
32FD0A3C1EB0CD9B0072B066 /* BugReportViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BugReportViewController.xib; sourceTree = "<group>"; };
|
||||||
7D8737F782E108CFD6908691 /* libPods-Riot.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Riot.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
7246451C668D6782166E22EC /* libPods-RiotShareExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RiotShareExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
765F5104DB3EC39713DEB3A4 /* Pods-RiotShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotShareExtension.release.xcconfig"; path = "Pods/Target Support Files/Pods-RiotShareExtension/Pods-RiotShareExtension.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
839BB91240D350D5607D55BA /* Pods-Riot.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Riot.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Riot/Pods-Riot.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
92324BE11F4F66D3009DE194 /* IncomingCallView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncomingCallView.h; sourceTree = "<group>"; };
|
||||||
|
92324BE21F4F66D3009DE194 /* IncomingCallView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomingCallView.m; sourceTree = "<group>"; };
|
||||||
|
92324BE41F4F6A60009DE194 /* CircleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircleButton.h; sourceTree = "<group>"; };
|
||||||
|
92324BE51F4F6A60009DE194 /* CircleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CircleButton.m; sourceTree = "<group>"; };
|
||||||
|
C195C53961EA28E6900AEB68 /* Pods-Riot.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Riot.release.xcconfig"; path = "Pods/Target Support Files/Pods-Riot/Pods-Riot.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
F0131DE31F2200D600CBF707 /* RiotSplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RiotSplitViewController.h; sourceTree = "<group>"; };
|
F0131DE31F2200D600CBF707 /* RiotSplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RiotSplitViewController.h; sourceTree = "<group>"; };
|
||||||
F0131DE41F2200D600CBF707 /* RiotSplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RiotSplitViewController.m; sourceTree = "<group>"; };
|
F0131DE41F2200D600CBF707 /* RiotSplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RiotSplitViewController.m; sourceTree = "<group>"; };
|
||||||
F02C1A831E8EB04C0045A404 /* PeopleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeopleViewController.h; sourceTree = "<group>"; };
|
F02C1A831E8EB04C0045A404 /* PeopleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeopleViewController.h; sourceTree = "<group>"; };
|
||||||
|
@ -1114,9 +1203,14 @@
|
||||||
F0B4CBAE1F4215E3008E99C5 /* EventDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventDetailsView.h; sourceTree = "<group>"; };
|
F0B4CBAE1F4215E3008E99C5 /* EventDetailsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventDetailsView.h; sourceTree = "<group>"; };
|
||||||
F0B4CBAF1F4215E3008E99C5 /* EventDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EventDetailsView.m; sourceTree = "<group>"; };
|
F0B4CBAF1F4215E3008E99C5 /* EventDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EventDetailsView.m; sourceTree = "<group>"; };
|
||||||
F0B4CBB01F4215E3008E99C5 /* EventDetailsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EventDetailsView.xib; sourceTree = "<group>"; };
|
F0B4CBB01F4215E3008E99C5 /* EventDetailsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EventDetailsView.xib; sourceTree = "<group>"; };
|
||||||
|
F0B543091F70FF8F00D29293 /* back_icon@4x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_icon@4x.png"; sourceTree = "<group>"; };
|
||||||
|
F0B7A8AF1F4756A5006E27D2 /* RoomsListViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomsListViewController.xib; sourceTree = "<group>"; };
|
||||||
|
F0D2AD9F1F6AA5FD00A7097D /* MXRoomSummary+Riot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MXRoomSummary+Riot.h"; sourceTree = "<group>"; };
|
||||||
|
F0D2ADA01F6AA5FD00A7097D /* MXRoomSummary+Riot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MXRoomSummary+Riot.m"; sourceTree = "<group>"; };
|
||||||
F0D869E81EC455A100BB0A2B /* create_direct_chat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_direct_chat.png; sourceTree = "<group>"; };
|
F0D869E81EC455A100BB0A2B /* create_direct_chat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_direct_chat.png; sourceTree = "<group>"; };
|
||||||
F0D869E91EC455A100BB0A2B /* create_direct_chat@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "create_direct_chat@2x.png"; sourceTree = "<group>"; };
|
F0D869E91EC455A100BB0A2B /* create_direct_chat@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "create_direct_chat@2x.png"; sourceTree = "<group>"; };
|
||||||
F0D869EA1EC455A100BB0A2B /* create_direct_chat@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "create_direct_chat@3x.png"; sourceTree = "<group>"; };
|
F0D869EA1EC455A100BB0A2B /* create_direct_chat@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "create_direct_chat@3x.png"; sourceTree = "<group>"; };
|
||||||
|
F0DD05CF1F615ECF00CB5292 /* LaunchScreenRiot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LaunchScreenRiot.png; path = Assets/Images/LaunchScreenRiot.png; sourceTree = "<group>"; };
|
||||||
F0E059FB1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnifiedSearchRecentsDataSource.h; sourceTree = "<group>"; };
|
F0E059FB1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnifiedSearchRecentsDataSource.h; sourceTree = "<group>"; };
|
||||||
F0E059FC1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnifiedSearchRecentsDataSource.m; sourceTree = "<group>"; };
|
F0E059FC1E9545BB004B83FB /* UnifiedSearchRecentsDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UnifiedSearchRecentsDataSource.m; sourceTree = "<group>"; };
|
||||||
F0E059FE1E963103004B83FB /* FavouritesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FavouritesViewController.h; sourceTree = "<group>"; };
|
F0E059FE1E963103004B83FB /* FavouritesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FavouritesViewController.h; sourceTree = "<group>"; };
|
||||||
|
@ -1150,15 +1244,23 @@
|
||||||
F0E05A2D1EA0F9EB004B83FB /* tab_rooms.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_rooms.png; sourceTree = "<group>"; };
|
F0E05A2D1EA0F9EB004B83FB /* tab_rooms.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_rooms.png; sourceTree = "<group>"; };
|
||||||
F0E05A2E1EA0F9EB004B83FB /* tab_rooms@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tab_rooms@2x.png"; sourceTree = "<group>"; };
|
F0E05A2E1EA0F9EB004B83FB /* tab_rooms@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tab_rooms@2x.png"; sourceTree = "<group>"; };
|
||||||
F0E05A2F1EA0F9EB004B83FB /* tab_rooms@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tab_rooms@3x.png"; sourceTree = "<group>"; };
|
F0E05A2F1EA0F9EB004B83FB /* tab_rooms@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tab_rooms@3x.png"; sourceTree = "<group>"; };
|
||||||
F9D678EF54918C036FDEDBF9 /* Pods-Riot.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Riot.release.xcconfig"; path = "Pods/Target Support Files/Pods-Riot/Pods-Riot.release.xcconfig"; sourceTree = "<group>"; };
|
FD9D0BDE9232898950554DD5 /* libPods-Riot.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Riot.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
24CBEC4B1F0EAD310093EABB /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
A27ECCE3FC4971745D2CB78D /* libPods-RiotShareExtension.a in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
F094A99F1B78D8F000B1FBBF /* Frameworks */ = {
|
F094A99F1B78D8F000B1FBBF /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
E2EAC1A4FBD6FE5228584591 /* libPods-Riot.a in Frameworks */,
|
05D592A32FF1D1877B89F73C /* libPods-Riot.a in Frameworks */,
|
||||||
3233F7461F3497E2006ACA81 /* JitsiMeet.framework in Frameworks */,
|
3233F7461F3497E2006ACA81 /* JitsiMeet.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -1173,6 +1275,49 @@
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
24CBEC4F1F0EAD310093EABB /* RiotShareExtension */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2466B7551F2F80B800AE27B0 /* Info.plist */,
|
||||||
|
2466B7561F2F80B800AE27B0 /* RiotShareExtension.entitlements */,
|
||||||
|
24D6B3441F3C8F8A00FC7A71 /* ViewController */,
|
||||||
|
24D6B3551F3C8FCC00FC7A71 /* Model */,
|
||||||
|
);
|
||||||
|
name = RiotShareExtension;
|
||||||
|
path = "Riot Share Extension";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
24D6B3441F3C8F8A00FC7A71 /* ViewController */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
24D6B34A1F3C8F8A00FC7A71 /* SharePresentingViewController.h */,
|
||||||
|
24D6B34B1F3C8F8A00FC7A71 /* SharePresentingViewController.m */,
|
||||||
|
24D6B34C1F3C8F8A00FC7A71 /* ShareViewController.h */,
|
||||||
|
24D6B34D1F3C8F8A00FC7A71 /* ShareViewController.m */,
|
||||||
|
24D6B34E1F3C8F8A00FC7A71 /* ShareViewController.xib */,
|
||||||
|
24D6B3481F3C8F8A00FC7A71 /* RoomsListViewController.h */,
|
||||||
|
24D6B3491F3C8F8A00FC7A71 /* RoomsListViewController.m */,
|
||||||
|
F0B7A8AF1F4756A5006E27D2 /* RoomsListViewController.xib */,
|
||||||
|
24D6B3451F3C8F8A00FC7A71 /* FallbackViewController.h */,
|
||||||
|
24D6B3461F3C8F8A00FC7A71 /* FallbackViewController.m */,
|
||||||
|
24D6B3471F3C8F8A00FC7A71 /* FallbackViewController.xib */,
|
||||||
|
);
|
||||||
|
name = ViewController;
|
||||||
|
path = RiotShareExtension/ViewController;
|
||||||
|
sourceTree = SOURCE_ROOT;
|
||||||
|
};
|
||||||
|
24D6B3551F3C8FCC00FC7A71 /* Model */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
245FC3EA1F3CAF9800603C6A /* ShareExtensionManager.h */,
|
||||||
|
245FC3EB1F3CAF9800603C6A /* ShareExtensionManager.m */,
|
||||||
|
24D6B3561F3C90D300FC7A71 /* ShareRecentsDataSource.h */,
|
||||||
|
24D6B3571F3C90D300FC7A71 /* ShareRecentsDataSource.m */,
|
||||||
|
);
|
||||||
|
name = Model;
|
||||||
|
path = RiotShareExtension/Model;
|
||||||
|
sourceTree = SOURCE_ROOT;
|
||||||
|
};
|
||||||
3205ED801E97725E003D65FA /* Directory */ = {
|
3205ED801E97725E003D65FA /* Directory */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -1197,6 +1342,10 @@
|
||||||
3233F72D1F31F47E006ACA81 /* Widgets */ = {
|
3233F72D1F31F47E006ACA81 /* Widgets */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
32F3AE181F6FF4E600F0F004 /* WidgetViewController.h */,
|
||||||
|
32F3AE191F6FF4E600F0F004 /* WidgetViewController.m */,
|
||||||
|
32935CAF1F6056FD006888C8 /* IntegrationManagerViewController.h */,
|
||||||
|
32935CB01F6056FD006888C8 /* IntegrationManagerViewController.m */,
|
||||||
3233F72E1F31F4BF006ACA81 /* JitsiViewController.h */,
|
3233F72E1F31F4BF006ACA81 /* JitsiViewController.h */,
|
||||||
3233F72F1F31F4BF006ACA81 /* JitsiViewController.m */,
|
3233F72F1F31F4BF006ACA81 /* JitsiViewController.m */,
|
||||||
3233F7301F31F4BF006ACA81 /* JitsiViewController.xib */,
|
3233F7301F31F4BF006ACA81 /* JitsiViewController.xib */,
|
||||||
|
@ -1253,6 +1402,23 @@
|
||||||
path = en.lproj;
|
path = en.lproj;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
32918EA41F473BDB0076CA16 /* ru.lproj */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
32918EA51F473BDB0076CA16 /* Localizable.strings */,
|
||||||
|
32918EA71F473BDB0076CA16 /* Vector.strings */,
|
||||||
|
);
|
||||||
|
path = ru.lproj;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
32935CB21F628B98006888C8 /* js */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
32935CB31F628BCE006888C8 /* IntegrationManager.js */,
|
||||||
|
);
|
||||||
|
path = js;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
32AE61EB1F0D2183007255F4 /* nl.lproj */ = {
|
32AE61EB1F0D2183007255F4 /* nl.lproj */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -1263,23 +1429,37 @@
|
||||||
path = nl.lproj;
|
path = nl.lproj;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
6567B0BBF3C05D7F7A7F79CC /* Frameworks */ = {
|
5FC42FA41F5186AFFB6A2404 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
7D8737F782E108CFD6908691 /* libPods-Riot.a */,
|
FD9D0BDE9232898950554DD5 /* libPods-Riot.a */,
|
||||||
|
7246451C668D6782166E22EC /* libPods-RiotShareExtension.a */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
E1451F540F8BC02A7FB7AA31 /* Pods */ = {
|
7471DF3720D498384A068DA7 /* Pods */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
1129C74A281B080432B1A1A1 /* Pods-Riot.debug.xcconfig */,
|
839BB91240D350D5607D55BA /* Pods-Riot.debug.xcconfig */,
|
||||||
F9D678EF54918C036FDEDBF9 /* Pods-Riot.release.xcconfig */,
|
C195C53961EA28E6900AEB68 /* Pods-Riot.release.xcconfig */,
|
||||||
|
12AA0005C8B3D8D8162584C5 /* Pods-RiotShareExtension.debug.xcconfig */,
|
||||||
|
765F5104DB3EC39713DEB3A4 /* Pods-RiotShareExtension.release.xcconfig */,
|
||||||
);
|
);
|
||||||
name = Pods;
|
name = Pods;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
92324BE01F4F668F009DE194 /* Calls */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
92324BE11F4F66D3009DE194 /* IncomingCallView.h */,
|
||||||
|
92324BE21F4F66D3009DE194 /* IncomingCallView.m */,
|
||||||
|
92324BE41F4F6A60009DE194 /* CircleButton.h */,
|
||||||
|
92324BE51F4F6A60009DE194 /* CircleButton.m */,
|
||||||
|
);
|
||||||
|
path = Calls;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
F083BB021E7005FD00A9B29C /* RiotTests */ = {
|
F083BB021E7005FD00A9B29C /* RiotTests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -1331,12 +1511,14 @@
|
||||||
F083BB0E1E7009EC00A9B29C /* Assets */ = {
|
F083BB0E1E7009EC00A9B29C /* Assets */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
32918EA41F473BDB0076CA16 /* ru.lproj */,
|
||||||
327382A71F276AD200356143 /* de.lproj */,
|
327382A71F276AD200356143 /* de.lproj */,
|
||||||
327382BB1F276AED00356143 /* en.lproj */,
|
327382BB1F276AED00356143 /* en.lproj */,
|
||||||
327382AE1F276AD200356143 /* fr.lproj */,
|
327382AE1F276AD200356143 /* fr.lproj */,
|
||||||
32AE61EB1F0D2183007255F4 /* nl.lproj */,
|
32AE61EB1F0D2183007255F4 /* nl.lproj */,
|
||||||
F083BB151E7009EC00A9B29C /* Images */,
|
|
||||||
F083BBDA1E7009EC00A9B29C /* Sounds */,
|
F083BBDA1E7009EC00A9B29C /* Sounds */,
|
||||||
|
F083BB151E7009EC00A9B29C /* Images */,
|
||||||
|
32935CB21F628B98006888C8 /* js */,
|
||||||
);
|
);
|
||||||
path = Assets;
|
path = Assets;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -1344,6 +1526,9 @@
|
||||||
F083BB151E7009EC00A9B29C /* Images */ = {
|
F083BB151E7009EC00A9B29C /* Images */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
32E84F9E1F6BD32700CA0B89 /* apps-icon.png */,
|
||||||
|
32E84F9F1F6BD32700CA0B89 /* apps-icon@2x.png */,
|
||||||
|
32E84FA01F6BD32700CA0B89 /* apps-icon@3x.png */,
|
||||||
F0A4A1641EF7CB66003630DB /* members_list_icon.png */,
|
F0A4A1641EF7CB66003630DB /* members_list_icon.png */,
|
||||||
F0A4A1651EF7CB66003630DB /* members_list_icon@2x.png */,
|
F0A4A1651EF7CB66003630DB /* members_list_icon@2x.png */,
|
||||||
F0A4A1661EF7CB66003630DB /* members_list_icon@3x.png */,
|
F0A4A1661EF7CB66003630DB /* members_list_icon@3x.png */,
|
||||||
|
@ -1394,6 +1579,7 @@
|
||||||
F083BB211E7009EC00A9B29C /* back_icon.png */,
|
F083BB211E7009EC00A9B29C /* back_icon.png */,
|
||||||
F083BB221E7009EC00A9B29C /* back_icon@2x.png */,
|
F083BB221E7009EC00A9B29C /* back_icon@2x.png */,
|
||||||
F083BB231E7009EC00A9B29C /* back_icon@3x.png */,
|
F083BB231E7009EC00A9B29C /* back_icon@3x.png */,
|
||||||
|
F0B543091F70FF8F00D29293 /* back_icon@4x.png */,
|
||||||
F083BB241E7009EC00A9B29C /* bubbles_bg_landscape.png */,
|
F083BB241E7009EC00A9B29C /* bubbles_bg_landscape.png */,
|
||||||
F083BB251E7009EC00A9B29C /* bubbles_bg_landscape@2x.png */,
|
F083BB251E7009EC00A9B29C /* bubbles_bg_landscape@2x.png */,
|
||||||
F083BB261E7009EC00A9B29C /* bubbles_bg_landscape@3x.png */,
|
F083BB261E7009EC00A9B29C /* bubbles_bg_landscape@3x.png */,
|
||||||
|
@ -1599,6 +1785,8 @@
|
||||||
F083BBE61E7009EC00A9B29C /* MXKRoomBubbleTableViewCell+Riot.m */,
|
F083BBE61E7009EC00A9B29C /* MXKRoomBubbleTableViewCell+Riot.m */,
|
||||||
F083BBE71E7009EC00A9B29C /* MXRoom+Riot.h */,
|
F083BBE71E7009EC00A9B29C /* MXRoom+Riot.h */,
|
||||||
F083BBE81E7009EC00A9B29C /* MXRoom+Riot.m */,
|
F083BBE81E7009EC00A9B29C /* MXRoom+Riot.m */,
|
||||||
|
F0D2AD9F1F6AA5FD00A7097D /* MXRoomSummary+Riot.h */,
|
||||||
|
F0D2ADA01F6AA5FD00A7097D /* MXRoomSummary+Riot.m */,
|
||||||
F083BBE91E7009EC00A9B29C /* UINavigationController+Riot.h */,
|
F083BBE91E7009EC00A9B29C /* UINavigationController+Riot.h */,
|
||||||
F083BBEA1E7009EC00A9B29C /* UINavigationController+Riot.m */,
|
F083BBEA1E7009EC00A9B29C /* UINavigationController+Riot.m */,
|
||||||
F083BBEB1E7009EC00A9B29C /* UIViewController+RiotSearch.h */,
|
F083BBEB1E7009EC00A9B29C /* UIViewController+RiotSearch.h */,
|
||||||
|
@ -1787,6 +1975,7 @@
|
||||||
F083BC571E7009EC00A9B29C /* Views */ = {
|
F083BC571E7009EC00A9B29C /* Views */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
92324BE01F4F668F009DE194 /* Calls */,
|
||||||
F0B4CBAD1F4215E3008E99C5 /* Event */,
|
F0B4CBAD1F4215E3008E99C5 /* Event */,
|
||||||
F083BC581E7009EC00A9B29C /* Authentication */,
|
F083BC581E7009EC00A9B29C /* Authentication */,
|
||||||
F083BC5F1E7009EC00A9B29C /* Contact */,
|
F083BC5F1E7009EC00A9B29C /* Contact */,
|
||||||
|
@ -2120,7 +2309,7 @@
|
||||||
F083BEA41E700B2800A9B29C /* Supporting Files */ = {
|
F083BEA41E700B2800A9B29C /* Supporting Files */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
325072131E8C0AC900A084B6 /* LaunchScreenLogo.png */,
|
F0DD05CF1F615ECF00CB5292 /* LaunchScreenRiot.png */,
|
||||||
F083BBED1E7009EC00A9B29C /* empty.mm */,
|
F083BBED1E7009EC00A9B29C /* empty.mm */,
|
||||||
F083BBEE1E7009EC00A9B29C /* GoogleService-Info.plist */,
|
F083BBEE1E7009EC00A9B29C /* GoogleService-Info.plist */,
|
||||||
F083BBF01E7009EC00A9B29C /* Info.plist */,
|
F083BBF01E7009EC00A9B29C /* Info.plist */,
|
||||||
|
@ -2136,9 +2325,10 @@
|
||||||
children = (
|
children = (
|
||||||
F083BB081E7009EC00A9B29C /* Riot */,
|
F083BB081E7009EC00A9B29C /* Riot */,
|
||||||
F083BB021E7005FD00A9B29C /* RiotTests */,
|
F083BB021E7005FD00A9B29C /* RiotTests */,
|
||||||
|
24CBEC4F1F0EAD310093EABB /* RiotShareExtension */,
|
||||||
F094A9A31B78D8F000B1FBBF /* Products */,
|
F094A9A31B78D8F000B1FBBF /* Products */,
|
||||||
E1451F540F8BC02A7FB7AA31 /* Pods */,
|
7471DF3720D498384A068DA7 /* Pods */,
|
||||||
6567B0BBF3C05D7F7A7F79CC /* Frameworks */,
|
5FC42FA41F5186AFFB6A2404 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
@ -2147,6 +2337,7 @@
|
||||||
children = (
|
children = (
|
||||||
F094A9A21B78D8F000B1FBBF /* Riot.app */,
|
F094A9A21B78D8F000B1FBBF /* Riot.app */,
|
||||||
F094A9BE1B78D8F000B1FBBF /* RiotTests.xctest */,
|
F094A9BE1B78D8F000B1FBBF /* RiotTests.xctest */,
|
||||||
|
24CBEC4E1F0EAD310093EABB /* RiotShareExtension.appex */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -2164,21 +2355,42 @@
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
24CBEC4D1F0EAD310093EABB /* RiotShareExtension */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 24CBEC5C1F0EAD310093EABB /* Build configuration list for PBXNativeTarget "RiotShareExtension" */;
|
||||||
|
buildPhases = (
|
||||||
|
3051A9ED306E05F8AE91C906 /* [CP] Check Pods Manifest.lock */,
|
||||||
|
24CBEC4A1F0EAD310093EABB /* Sources */,
|
||||||
|
24CBEC4B1F0EAD310093EABB /* Frameworks */,
|
||||||
|
24CBEC4C1F0EAD310093EABB /* Resources */,
|
||||||
|
8EA19F5011654D3BD5EDAC33 /* [CP] Copy Pods Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = RiotShareExtension;
|
||||||
|
productName = "Riot Share Extension";
|
||||||
|
productReference = 24CBEC4E1F0EAD310093EABB /* RiotShareExtension.appex */;
|
||||||
|
productType = "com.apple.product-type.app-extension";
|
||||||
|
};
|
||||||
F094A9A11B78D8F000B1FBBF /* Riot */ = {
|
F094A9A11B78D8F000B1FBBF /* Riot */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = F094A9C81B78D8F000B1FBBF /* Build configuration list for PBXNativeTarget "Riot" */;
|
buildConfigurationList = F094A9C81B78D8F000B1FBBF /* Build configuration list for PBXNativeTarget "Riot" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
9131C24971B46D743282FCF6 /* [CP] Check Pods Manifest.lock */,
|
2372F8E1A49557FE0072BC56 /* [CP] Check Pods Manifest.lock */,
|
||||||
F094A99E1B78D8F000B1FBBF /* Sources */,
|
F094A99E1B78D8F000B1FBBF /* Sources */,
|
||||||
F094A99F1B78D8F000B1FBBF /* Frameworks */,
|
F094A99F1B78D8F000B1FBBF /* Frameworks */,
|
||||||
F094A9A01B78D8F000B1FBBF /* Resources */,
|
F094A9A01B78D8F000B1FBBF /* Resources */,
|
||||||
44C35695CFA4F9799C449367 /* [CP] Copy Pods Resources */,
|
24CBEC5D1F0EAD310093EABB /* Embed App Extensions */,
|
||||||
381DA4CC07D2104BFA23E45A /* [CP] Embed Pods Frameworks */,
|
7FFD40AA75DB32D83350D225 /* [CP] Embed Pods Frameworks */,
|
||||||
|
68D6013FA64A4507DC9DB95B /* [CP] Copy Pods Resources */,
|
||||||
3233F7481F3497E2006ACA81 /* Embed Frameworks */,
|
3233F7481F3497E2006ACA81 /* Embed Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
|
242661F61F12B1BA00D3FC08 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = Riot;
|
name = Riot;
|
||||||
productName = Vector;
|
productName = Vector;
|
||||||
|
@ -2212,6 +2424,16 @@
|
||||||
LastUpgradeCheck = 0800;
|
LastUpgradeCheck = 0800;
|
||||||
ORGANIZATIONNAME = matrix.org;
|
ORGANIZATIONNAME = matrix.org;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
|
24CBEC4D1F0EAD310093EABB = {
|
||||||
|
CreatedOnToolsVersion = 8.3.2;
|
||||||
|
DevelopmentTeam = 7J4U792NQT;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
SystemCapabilities = {
|
||||||
|
com.apple.ApplicationGroups.iOS = {
|
||||||
|
enabled = 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
F094A9A11B78D8F000B1FBBF = {
|
F094A9A11B78D8F000B1FBBF = {
|
||||||
CreatedOnToolsVersion = 6.2;
|
CreatedOnToolsVersion = 6.2;
|
||||||
DevelopmentTeam = 7J4U792NQT;
|
DevelopmentTeam = 7J4U792NQT;
|
||||||
|
@ -2242,6 +2464,7 @@
|
||||||
nl,
|
nl,
|
||||||
de,
|
de,
|
||||||
fr,
|
fr,
|
||||||
|
ru,
|
||||||
);
|
);
|
||||||
mainGroup = F094A9991B78D8F000B1FBBF;
|
mainGroup = F094A9991B78D8F000B1FBBF;
|
||||||
productRefGroup = F094A9A31B78D8F000B1FBBF /* Products */;
|
productRefGroup = F094A9A31B78D8F000B1FBBF /* Products */;
|
||||||
|
@ -2250,11 +2473,31 @@
|
||||||
targets = (
|
targets = (
|
||||||
F094A9A11B78D8F000B1FBBF /* Riot */,
|
F094A9A11B78D8F000B1FBBF /* Riot */,
|
||||||
F094A9BD1B78D8F000B1FBBF /* RiotTests */,
|
F094A9BD1B78D8F000B1FBBF /* RiotTests */,
|
||||||
|
24CBEC4D1F0EAD310093EABB /* RiotShareExtension */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
24CBEC4C1F0EAD310093EABB /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
24D6B35B1F3CA03300FC7A71 /* ShareViewController.xib in Resources */,
|
||||||
|
24EEE5B51F2607C500B3C705 /* SegmentedViewController.xib in Resources */,
|
||||||
|
24EEE5A91F25529900B3C705 /* cancel@2x.png in Resources */,
|
||||||
|
F0B7A8B11F475783006E27D2 /* RoomsListViewController.xib in Resources */,
|
||||||
|
2435179C1F375B9400D0683E /* Info.plist in Resources */,
|
||||||
|
24EEE5A81F25529600B3C705 /* cancel@3x.png in Resources */,
|
||||||
|
2466B73E1F2DFAC100AE27B0 /* animatedLogo-4.png in Resources */,
|
||||||
|
2435179F1F375C0F00D0683E /* Vector.strings in Resources */,
|
||||||
|
24EEE5AF1F25F0F500B3C705 /* Images.xcassets in Resources */,
|
||||||
|
24EEE5AA1F25529C00B3C705 /* cancel.png in Resources */,
|
||||||
|
24D6B35E1F3CA03E00FC7A71 /* FallbackViewController.xib in Resources */,
|
||||||
|
24EEE5A41F24C06E00B3C705 /* (null) in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
F094A9A01B78D8F000B1FBBF /* Resources */ = {
|
F094A9A01B78D8F000B1FBBF /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -2265,6 +2508,7 @@
|
||||||
F083BE1D1E7009ED00A9B29C /* RoomMemberDetailsViewController.xib in Resources */,
|
F083BE1D1E7009ED00A9B29C /* RoomMemberDetailsViewController.xib in Resources */,
|
||||||
F083BD5B1E7009ED00A9B29C /* chevron@3x.png in Resources */,
|
F083BD5B1E7009ED00A9B29C /* chevron@3x.png in Resources */,
|
||||||
F083BD8A1E7009ED00A9B29C /* file_music_icon@2x.png in Resources */,
|
F083BD8A1E7009ED00A9B29C /* file_music_icon@2x.png in Resources */,
|
||||||
|
32E84FA31F6BD32700CA0B89 /* apps-icon@3x.png in Resources */,
|
||||||
F083BE451E7009ED00A9B29C /* RoomIncomingEncryptedTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
|
F083BE451E7009ED00A9B29C /* RoomIncomingEncryptedTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
|
||||||
F083BD611E7009ED00A9B29C /* details_icon@3x.png in Resources */,
|
F083BD611E7009ED00A9B29C /* details_icon@3x.png in Resources */,
|
||||||
F083BD9D1E7009ED00A9B29C /* main_alias_icon@3x.png in Resources */,
|
F083BD9D1E7009ED00A9B29C /* main_alias_icon@3x.png in Resources */,
|
||||||
|
@ -2284,6 +2528,7 @@
|
||||||
F083BD441E7009ED00A9B29C /* call_speaker_on_icon@3x.png in Resources */,
|
F083BD441E7009ED00A9B29C /* call_speaker_on_icon@3x.png in Resources */,
|
||||||
F0614A0F1EDDCCE700F5DC9A /* jump_to_unread@3x.png in Resources */,
|
F0614A0F1EDDCCE700F5DC9A /* jump_to_unread@3x.png in Resources */,
|
||||||
F083BE511E7009ED00A9B29C /* RoomOutgoingEncryptedTextMsgBubbleCell.xib in Resources */,
|
F083BE511E7009ED00A9B29C /* RoomOutgoingEncryptedTextMsgBubbleCell.xib in Resources */,
|
||||||
|
32918EA91F473BDB0076CA16 /* Localizable.strings in Resources */,
|
||||||
F083BDAE1E7009ED00A9B29C /* plus_icon@2x.png in Resources */,
|
F083BDAE1E7009ED00A9B29C /* plus_icon@2x.png in Resources */,
|
||||||
F0E05A401EA0F9EB004B83FB /* tab_people@2x.png in Resources */,
|
F0E05A401EA0F9EB004B83FB /* tab_people@2x.png in Resources */,
|
||||||
F083BD5A1E7009ED00A9B29C /* chevron@2x.png in Resources */,
|
F083BD5A1E7009ED00A9B29C /* chevron@2x.png in Resources */,
|
||||||
|
@ -2310,6 +2555,7 @@
|
||||||
F083BDA51E7009ED00A9B29C /* notifications@2x.png in Resources */,
|
F083BDA51E7009ED00A9B29C /* notifications@2x.png in Resources */,
|
||||||
F0E05A3F1EA0F9EB004B83FB /* tab_people.png in Resources */,
|
F0E05A3F1EA0F9EB004B83FB /* tab_people.png in Resources */,
|
||||||
F0E05A351EA0F9EB004B83FB /* tab_favourites@3x.png in Resources */,
|
F0E05A351EA0F9EB004B83FB /* tab_favourites@3x.png in Resources */,
|
||||||
|
F0DD05D01F615ECF00CB5292 /* LaunchScreenRiot.png in Resources */,
|
||||||
F083BE611E7009ED00A9B29C /* RoomIncomingTextMsgBubbleCell.xib in Resources */,
|
F083BE611E7009ED00A9B29C /* RoomIncomingTextMsgBubbleCell.xib in Resources */,
|
||||||
F083BE9D1E7009ED00A9B29C /* TableViewCellWithCheckBoxAndLabel.xib in Resources */,
|
F083BE9D1E7009ED00A9B29C /* TableViewCellWithCheckBoxAndLabel.xib in Resources */,
|
||||||
F083BDC41E7009ED00A9B29C /* scrollup@3x.png in Resources */,
|
F083BDC41E7009ED00A9B29C /* scrollup@3x.png in Resources */,
|
||||||
|
@ -2354,7 +2600,6 @@
|
||||||
F0E05A451EA0F9EB004B83FB /* tab_rooms.png in Resources */,
|
F0E05A451EA0F9EB004B83FB /* tab_rooms.png in Resources */,
|
||||||
F083BE751E7009ED00A9B29C /* RoomOutgoingTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
|
F083BE751E7009ED00A9B29C /* RoomOutgoingTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
|
||||||
F083BD261E7009ED00A9B29C /* admin_icon@2x.png in Resources */,
|
F083BD261E7009ED00A9B29C /* admin_icon@2x.png in Resources */,
|
||||||
325072141E8C0AC900A084B6 /* LaunchScreenLogo.png in Resources */,
|
|
||||||
3205ED851E97725E003D65FA /* DirectoryServerTableViewCell.xib in Resources */,
|
3205ED851E97725E003D65FA /* DirectoryServerTableViewCell.xib in Resources */,
|
||||||
F083BD761E7009ED00A9B29C /* e2e_verified@3x.png in Resources */,
|
F083BD761E7009ED00A9B29C /* e2e_verified@3x.png in Resources */,
|
||||||
F083BE181E7009ED00A9B29C /* MediaPickerViewController.xib in Resources */,
|
F083BE181E7009ED00A9B29C /* MediaPickerViewController.xib in Resources */,
|
||||||
|
@ -2381,6 +2626,7 @@
|
||||||
F083BD811E7009ED00A9B29C /* favourite@2x.png in Resources */,
|
F083BD811E7009ED00A9B29C /* favourite@2x.png in Resources */,
|
||||||
F0A4A1681EF7CB66003630DB /* members_list_icon@2x.png in Resources */,
|
F0A4A1681EF7CB66003630DB /* members_list_icon@2x.png in Resources */,
|
||||||
F083BD9F1E7009ED00A9B29C /* mod_icon@2x.png in Resources */,
|
F083BD9F1E7009ED00A9B29C /* mod_icon@2x.png in Resources */,
|
||||||
|
32918EAA1F473BDB0076CA16 /* Vector.strings in Resources */,
|
||||||
F083BD801E7009ED00A9B29C /* favourite.png in Resources */,
|
F083BD801E7009ED00A9B29C /* favourite.png in Resources */,
|
||||||
F083BD4B1E7009ED00A9B29C /* camera_capture.png in Resources */,
|
F083BD4B1E7009ED00A9B29C /* camera_capture.png in Resources */,
|
||||||
F083BD841E7009ED00A9B29C /* favouriteOff@2x.png in Resources */,
|
F083BD841E7009ED00A9B29C /* favouriteOff@2x.png in Resources */,
|
||||||
|
@ -2486,7 +2732,9 @@
|
||||||
F083BD591E7009ED00A9B29C /* chevron.png in Resources */,
|
F083BD591E7009ED00A9B29C /* chevron.png in Resources */,
|
||||||
F0D869EC1EC455A100BB0A2B /* create_direct_chat@2x.png in Resources */,
|
F0D869EC1EC455A100BB0A2B /* create_direct_chat@2x.png in Resources */,
|
||||||
F083BDE11E7009ED00A9B29C /* video_icon@2x.png in Resources */,
|
F083BDE11E7009ED00A9B29C /* video_icon@2x.png in Resources */,
|
||||||
|
32E84FA21F6BD32700CA0B89 /* apps-icon@2x.png in Resources */,
|
||||||
F083BDB51E7009ED00A9B29C /* priorityLow@3x.png in Resources */,
|
F083BDB51E7009ED00A9B29C /* priorityLow@3x.png in Resources */,
|
||||||
|
32E84FA11F6BD32700CA0B89 /* apps-icon.png in Resources */,
|
||||||
F083BE891E7009ED00A9B29C /* RoomMemberTitleView.xib in Resources */,
|
F083BE891E7009ED00A9B29C /* RoomMemberTitleView.xib in Resources */,
|
||||||
F083BE3D1E7009ED00A9B29C /* RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.xib in Resources */,
|
F083BE3D1E7009ED00A9B29C /* RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.xib in Resources */,
|
||||||
F0E05A431EA0F9EB004B83FB /* tab_rooms_selected@2x.png in Resources */,
|
F0E05A431EA0F9EB004B83FB /* tab_rooms_selected@2x.png in Resources */,
|
||||||
|
@ -2547,6 +2795,7 @@
|
||||||
F083BE771E7009ED00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.xib in Resources */,
|
F083BE771E7009ED00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.xib in Resources */,
|
||||||
F083BDA71E7009ED00A9B29C /* notificationsOff.png in Resources */,
|
F083BDA71E7009ED00A9B29C /* notificationsOff.png in Resources */,
|
||||||
F06CDD6A1EF01E3900870B75 /* RoomEmptyBubbleCell.xib in Resources */,
|
F06CDD6A1EF01E3900870B75 /* RoomEmptyBubbleCell.xib in Resources */,
|
||||||
|
F0B5430A1F70FF8F00D29293 /* back_icon@4x.png in Resources */,
|
||||||
F083BDBD1E7009ED00A9B29C /* riot_icon@2x.png in Resources */,
|
F083BDBD1E7009ED00A9B29C /* riot_icon@2x.png in Resources */,
|
||||||
F083BDDE1E7009ED00A9B29C /* upload_icon@2x.png in Resources */,
|
F083BDDE1E7009ED00A9B29C /* upload_icon@2x.png in Resources */,
|
||||||
F083BE8B1E7009ED00A9B29C /* ExpandedRoomTitleView.xib in Resources */,
|
F083BE8B1E7009ED00A9B29C /* ExpandedRoomTitleView.xib in Resources */,
|
||||||
|
@ -2561,6 +2810,7 @@
|
||||||
F083BD961E7009ED00A9B29C /* leave@2x.png in Resources */,
|
F083BD961E7009ED00A9B29C /* leave@2x.png in Resources */,
|
||||||
F0E05A461EA0F9EB004B83FB /* tab_rooms@2x.png in Resources */,
|
F0E05A461EA0F9EB004B83FB /* tab_rooms@2x.png in Resources */,
|
||||||
32AE61F41F0D2183007255F4 /* Vector.strings in Resources */,
|
32AE61F41F0D2183007255F4 /* Vector.strings in Resources */,
|
||||||
|
32935CB41F628BCE006888C8 /* IntegrationManager.js in Resources */,
|
||||||
F083BD851E7009ED00A9B29C /* favouriteOff@3x.png in Resources */,
|
F083BD851E7009ED00A9B29C /* favouriteOff@3x.png in Resources */,
|
||||||
F083BD541E7009ED00A9B29C /* camera_switch@2x.png in Resources */,
|
F083BD541E7009ED00A9B29C /* camera_switch@2x.png in Resources */,
|
||||||
F083BD6A1E7009ED00A9B29C /* directChatOn@3x.png in Resources */,
|
F083BD6A1E7009ED00A9B29C /* directChatOn@3x.png in Resources */,
|
||||||
|
@ -2616,54 +2866,179 @@
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
381DA4CC07D2104BFA23E45A /* [CP] Embed Pods Frameworks */ = {
|
2372F8E1A49557FE0072BC56 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
);
|
);
|
||||||
name = "[CP] Embed Pods Frameworks";
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Riot-checkManifestLockResult.txt",
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Riot/Pods-Riot-frameworks.sh\"\n";
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
44C35695CFA4F9799C449367 /* [CP] Copy Pods Resources */ = {
|
3051A9ED306E05F8AE91C906 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-RiotShareExtension-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
68D6013FA64A4507DC9DB95B /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${SRCROOT}/Pods/Target Support Files/Pods-Riot/Pods-Riot-resources.sh",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKAccountDetailsViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKAttachmentsViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKAuthenticationViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKCallViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKContactDetailsViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKContactListViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKCountryPickerViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKLanguagePickerViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKRecentListViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKRoomMemberDetailsViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKRoomMemberListViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKRoomSettingsViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKRoomViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Controllers/MXKSearchViewController.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/Account/MXKAccountTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/Authentication/MXKAuthInputsEmailCodeBasedView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/Authentication/MXKAuthInputsPasswordBasedView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/Contact/MXKContactTableCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/DeviceView/MXKDeviceView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/EncryptionInfoView/MXKEncryptionInfoView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKCollectionViewCell/MXKMediaCollectionViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKEventDetailsView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKPieChartHUD.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKRoomCreationView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithButton.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndButton.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndImageView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndMXKImageView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndSlider.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndSubLabel.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndSwitch.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelAndTextField.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithLabelTextFieldAndButton.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithPicker.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithSearchBar.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithTextFieldAndButton.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/MXKTableViewCell/MXKTableViewCellWithTextView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/PushRule/MXKPushRuleCreationTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/PushRule/MXKPushRuleTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/ReadReceipts/MXKReadReceiptTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomEmptyBubbleTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomIncomingAttachmentBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomIncomingAttachmentWithoutSenderInfoBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomIncomingTextMsgBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomIncomingTextMsgWithoutSenderInfoBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomIOSOutgoingBubbleTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomOutgoingAttachmentBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomOutgoingAttachmentWithoutSenderInfoBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomOutgoingTextMsgBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomBubbleList/MXKRoomOutgoingTextMsgWithoutSenderInfoBubbleCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomInputToolbar/MXKRoomInputToolbarView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomInputToolbar/MXKRoomInputToolbarViewWithHPGrowingText.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomInputToolbar/MXKRoomInputToolbarViewWithSimpleTextView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomList/MXKInterleavedRecentTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomList/MXKPublicRoomTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomList/MXKRecentTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomMemberList/MXKRoomMemberTableViewCell.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomTitle/MXKRoomTitleView.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/RoomTitle/MXKRoomTitleViewWithTopic.xib",
|
||||||
|
"${PODS_ROOT}/MatrixKit/MatrixKit/Views/Search/MXKSearchTableViewCell.xib",
|
||||||
|
"$PODS_CONFIGURATION_BUILD_DIR/MatrixKit/MatrixKit.bundle",
|
||||||
|
"${PODS_ROOT}/MatrixSDK/MatrixSDK/Data/Store/MXCoreDataStore/MXCoreDataStore.xcdatamodeld",
|
||||||
);
|
);
|
||||||
name = "[CP] Copy Pods Resources";
|
name = "[CP] Copy Pods Resources";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}",
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Riot/Pods-Riot-resources.sh\"\n";
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Riot/Pods-Riot-resources.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
9131C24971B46D743282FCF6 /* [CP] Check Pods Manifest.lock */ = {
|
7FFD40AA75DB32D83350D225 /* [CP] Embed Pods Frameworks */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
|
"${SRCROOT}/Pods/Target Support Files/Pods-Riot/Pods-Riot-frameworks.sh",
|
||||||
|
"${PODS_ROOT}/WebRTC/WebRTC.framework",
|
||||||
);
|
);
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
name = "[CP] Embed Pods Frameworks";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n";
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Riot/Pods-Riot-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
8EA19F5011654D3BD5EDAC33 /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${SRCROOT}/Pods/Target Support Files/Pods-RiotShareExtension/Pods-RiotShareExtension-resources.sh",
|
||||||
|
"${PODS_ROOT}/MatrixSDK/MatrixSDK/Data/Store/MXCoreDataStore/MXCoreDataStore.xcdatamodeld",
|
||||||
|
);
|
||||||
|
name = "[CP] Copy Pods Resources";
|
||||||
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RiotShareExtension/Pods-RiotShareExtension-resources.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
24CBEC4A1F0EAD310093EABB /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
24EEE5A01F23A08900B3C705 /* RoomTableViewCell.m in Sources */,
|
||||||
|
24D6B3581F3C90D300FC7A71 /* ShareRecentsDataSource.m in Sources */,
|
||||||
|
245FC3EF1F3DD30800603C6A /* RecentCellData.m in Sources */,
|
||||||
|
24D6B35C1F3CA03600FC7A71 /* RoomsListViewController.m in Sources */,
|
||||||
|
24D6B35A1F3CA02C00FC7A71 /* ShareViewController.m in Sources */,
|
||||||
|
24D6B3591F3CA02900FC7A71 /* SharePresentingViewController.m in Sources */,
|
||||||
|
24EEE5A31F23A8C300B3C705 /* AvatarGenerator.m in Sources */,
|
||||||
|
24D6B35D1F3CA03A00FC7A71 /* FallbackViewController.m in Sources */,
|
||||||
|
24EEE5A11F23A09A00B3C705 /* RiotDesignValues.m in Sources */,
|
||||||
|
24EEE5A21F23A8B400B3C705 /* MXRoom+Riot.m in Sources */,
|
||||||
|
245FC3ED1F3D079A00603C6A /* ShareExtensionManager.m in Sources */,
|
||||||
|
24EEE5B41F2607C000B3C705 /* SegmentedViewController.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
F094A99E1B78D8F000B1FBBF /* Sources */ = {
|
F094A99E1B78D8F000B1FBBF /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -2679,6 +3054,7 @@
|
||||||
F083BE9C1E7009ED00A9B29C /* TableViewCellWithCheckBoxAndLabel.m in Sources */,
|
F083BE9C1E7009ED00A9B29C /* TableViewCellWithCheckBoxAndLabel.m in Sources */,
|
||||||
32471CE11F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m in Sources */,
|
32471CE11F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.m in Sources */,
|
||||||
F083BDFE1E7009ED00A9B29C /* RecentCellData.m in Sources */,
|
F083BDFE1E7009ED00A9B29C /* RecentCellData.m in Sources */,
|
||||||
|
92324BE61F4F6A60009DE194 /* CircleButton.m in Sources */,
|
||||||
F083BE3A1E7009ED00A9B29C /* RoomIncomingEncryptedAttachmentBubbleCell.m in Sources */,
|
F083BE3A1E7009ED00A9B29C /* RoomIncomingEncryptedAttachmentBubbleCell.m in Sources */,
|
||||||
3205ED841E97725E003D65FA /* DirectoryServerTableViewCell.m in Sources */,
|
3205ED841E97725E003D65FA /* DirectoryServerTableViewCell.m in Sources */,
|
||||||
F083BEA21E7009ED00A9B29C /* TableViewCellWithPhoneNumberTextField.m in Sources */,
|
F083BEA21E7009ED00A9B29C /* TableViewCellWithPhoneNumberTextField.m in Sources */,
|
||||||
|
@ -2712,6 +3088,7 @@
|
||||||
F083BE481E7009ED00A9B29C /* RoomIncomingEncryptedTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.m in Sources */,
|
F083BE481E7009ED00A9B29C /* RoomIncomingEncryptedTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.m in Sources */,
|
||||||
F06CDD691EF01E3900870B75 /* RoomEmptyBubbleCell.m in Sources */,
|
F06CDD691EF01E3900870B75 /* RoomEmptyBubbleCell.m in Sources */,
|
||||||
F083BE041E7009ED00A9B29C /* Tools.m in Sources */,
|
F083BE041E7009ED00A9B29C /* Tools.m in Sources */,
|
||||||
|
92324BE31F4F66D3009DE194 /* IncomingCallView.m in Sources */,
|
||||||
F083BE6A1E7009ED00A9B29C /* RoomOutgoingAttachmentBubbleCell.m in Sources */,
|
F083BE6A1E7009ED00A9B29C /* RoomOutgoingAttachmentBubbleCell.m in Sources */,
|
||||||
F083BDEF1E7009ED00A9B29C /* UINavigationController+Riot.m in Sources */,
|
F083BDEF1E7009ED00A9B29C /* UINavigationController+Riot.m in Sources */,
|
||||||
F083BE761E7009ED00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.m in Sources */,
|
F083BE761E7009ED00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.m in Sources */,
|
||||||
|
@ -2734,6 +3111,8 @@
|
||||||
F083BE6E1E7009ED00A9B29C /* RoomOutgoingAttachmentWithPaginationTitleBubbleCell.m in Sources */,
|
F083BE6E1E7009ED00A9B29C /* RoomOutgoingAttachmentWithPaginationTitleBubbleCell.m in Sources */,
|
||||||
3233F7311F31F4BF006ACA81 /* JitsiViewController.m in Sources */,
|
3233F7311F31F4BF006ACA81 /* JitsiViewController.m in Sources */,
|
||||||
F083BE2A1E7009ED00A9B29C /* UsersDevicesViewController.m in Sources */,
|
F083BE2A1E7009ED00A9B29C /* UsersDevicesViewController.m in Sources */,
|
||||||
|
32F3AE1A1F6FF4E600F0F004 /* WidgetViewController.m in Sources */,
|
||||||
|
F0D2ADA11F6AA5FD00A7097D /* MXRoomSummary+Riot.m in Sources */,
|
||||||
F083BE2D1E7009ED00A9B29C /* ForgotPasswordInputsView.m in Sources */,
|
F083BE2D1E7009ED00A9B29C /* ForgotPasswordInputsView.m in Sources */,
|
||||||
F083BE7E1E7009ED00A9B29C /* InviteRecentTableViewCell.m in Sources */,
|
F083BE7E1E7009ED00A9B29C /* InviteRecentTableViewCell.m in Sources */,
|
||||||
F083BE3C1E7009ED00A9B29C /* RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.m in Sources */,
|
F083BE3C1E7009ED00A9B29C /* RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.m in Sources */,
|
||||||
|
@ -2800,6 +3179,7 @@
|
||||||
F083BE391E7009ED00A9B29C /* RoomEncryptedDataBubbleCell.m in Sources */,
|
F083BE391E7009ED00A9B29C /* RoomEncryptedDataBubbleCell.m in Sources */,
|
||||||
F083BDF01E7009ED00A9B29C /* UIViewController+RiotSearch.m in Sources */,
|
F083BDF01E7009ED00A9B29C /* UIViewController+RiotSearch.m in Sources */,
|
||||||
F083BDF91E7009ED00A9B29C /* RoomEmailInvitation.m in Sources */,
|
F083BDF91E7009ED00A9B29C /* RoomEmailInvitation.m in Sources */,
|
||||||
|
32935CB11F6056FD006888C8 /* IntegrationManagerViewController.m in Sources */,
|
||||||
F083BE341E7009ED00A9B29C /* EncryptionInfoView.m in Sources */,
|
F083BE341E7009ED00A9B29C /* EncryptionInfoView.m in Sources */,
|
||||||
F083BE641E7009ED00A9B29C /* RoomIncomingTextMsgWithoutSenderNameBubbleCell.m in Sources */,
|
F083BE641E7009ED00A9B29C /* RoomIncomingTextMsgWithoutSenderNameBubbleCell.m in Sources */,
|
||||||
F075BED61EBB169C00A7B68A /* RoomCollectionViewCell.m in Sources */,
|
F075BED61EBB169C00A7B68A /* RoomCollectionViewCell.m in Sources */,
|
||||||
|
@ -2821,6 +3201,11 @@
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
/* Begin PBXTargetDependency section */
|
||||||
|
242661F61F12B1BA00D3FC08 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 24CBEC4D1F0EAD310093EABB /* RiotShareExtension */;
|
||||||
|
targetProxy = 242661F51F12B1BA00D3FC08 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
F094A9C01B78D8F000B1FBBF /* PBXTargetDependency */ = {
|
F094A9C01B78D8F000B1FBBF /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = F094A9A11B78D8F000B1FBBF /* Riot */;
|
target = F094A9A11B78D8F000B1FBBF /* Riot */;
|
||||||
|
@ -2909,6 +3294,22 @@
|
||||||
name = Vector.strings;
|
name = Vector.strings;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
32918EA51F473BDB0076CA16 /* Localizable.strings */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
32918EA61F473BDB0076CA16 /* ru */,
|
||||||
|
);
|
||||||
|
name = Localizable.strings;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
32918EA71F473BDB0076CA16 /* Vector.strings */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
32918EA81F473BDB0076CA16 /* ru */,
|
||||||
|
);
|
||||||
|
name = Vector.strings;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
32AE61EC1F0D2183007255F4 /* InfoPlist.strings */ = {
|
32AE61EC1F0D2183007255F4 /* InfoPlist.strings */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -2944,6 +3345,51 @@
|
||||||
/* End PBXVariantGroup section */
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
|
24CBEC5A1F0EAD310093EABB /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 12AA0005C8B3D8D8162584C5 /* Pods-RiotShareExtension.debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = RiotShareExtension/RiotShareExtension.entitlements;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
DEVELOPMENT_TEAM = 7J4U792NQT;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
INFOPLIST_FILE = RiotShareExtension/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = im.vector.app.shareExtension;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
24CBEC5B1F0EAD310093EABB /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 765F5104DB3EC39713DEB3A4 /* Pods-RiotShareExtension.release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = RiotShareExtension/RiotShareExtension.entitlements;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
DEVELOPMENT_TEAM = 7J4U792NQT;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
INFOPLIST_FILE = RiotShareExtension/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = im.vector.app.shareExtension;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
F094A9C61B78D8F000B1FBBF /* Debug */ = {
|
F094A9C61B78D8F000B1FBBF /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
@ -3031,7 +3477,7 @@
|
||||||
};
|
};
|
||||||
F094A9C91B78D8F000B1FBBF /* Debug */ = {
|
F094A9C91B78D8F000B1FBBF /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 1129C74A281B080432B1A1A1 /* Pods-Riot.debug.xcconfig */;
|
baseConfigurationReference = 839BB91240D350D5607D55BA /* Pods-Riot.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_ENTITLEMENTS = Riot/Riot.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Riot/Riot.entitlements;
|
||||||
|
@ -3054,7 +3500,7 @@
|
||||||
};
|
};
|
||||||
F094A9CA1B78D8F000B1FBBF /* Release */ = {
|
F094A9CA1B78D8F000B1FBBF /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = F9D678EF54918C036FDEDBF9 /* Pods-Riot.release.xcconfig */;
|
baseConfigurationReference = C195C53961EA28E6900AEB68 /* Pods-Riot.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_ENTITLEMENTS = Riot/Riot.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Riot/Riot.entitlements;
|
||||||
|
@ -3115,6 +3561,15 @@
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
|
24CBEC5C1F0EAD310093EABB /* Build configuration list for PBXNativeTarget "RiotShareExtension" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
24CBEC5A1F0EAD310093EABB /* Debug */,
|
||||||
|
24CBEC5B1F0EAD310093EABB /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
F094A99D1B78D8F000B1FBBF /* Build configuration list for PBXProject "Riot" */ = {
|
F094A99D1B78D8F000B1FBBF /* Build configuration list for PBXProject "Riot" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
|
|
@ -116,6 +116,13 @@ extern NSString *const kAppDelegateNetworkStatusDidChangeNotification;
|
||||||
|
|
||||||
- (void)registerUserNotificationSettings;
|
- (void)registerUserNotificationSettings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Perform registration for remote notifications.
|
||||||
|
|
||||||
|
@param completion the block to be executed when registration finished.
|
||||||
|
*/
|
||||||
|
- (void)registerForRemoteNotificationsWithCompletion:(void (^)(NSError *))completion;
|
||||||
|
|
||||||
#pragma mark - Matrix Room handling
|
#pragma mark - Matrix Room handling
|
||||||
|
|
||||||
- (void)showRoom:(NSString*)roomId andEventId:(NSString*)eventId withMatrixSession:(MXSession*)mxSession;
|
- (void)showRoom:(NSString*)roomId andEventId:(NSString*)eventId withMatrixSession:(MXSession*)mxSession;
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#import "MatrixSDK/MatrixSDK.h"
|
#import "MatrixSDK/MatrixSDK.h"
|
||||||
|
|
||||||
#import "Tools.h"
|
#import "Tools.h"
|
||||||
#import "MXRoom+Riot.h"
|
|
||||||
#import "WidgetManager.h"
|
#import "WidgetManager.h"
|
||||||
|
|
||||||
#import "AFNetworkReachabilityManager.h"
|
#import "AFNetworkReachabilityManager.h"
|
||||||
|
@ -166,7 +165,8 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
}
|
}
|
||||||
|
|
||||||
@property (strong, nonatomic) UIAlertController *mxInAppNotification;
|
@property (strong, nonatomic) UIAlertController *mxInAppNotification;
|
||||||
@property (strong, nonatomic) UIAlertController *incomingCallNotification;
|
|
||||||
|
@property (nonatomic, nullable, copy) void (^registrationForRemoteNotificationsCompletion)(NSError *);
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -563,13 +563,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
// Enable error notifications
|
// Enable error notifications
|
||||||
isErrorNotificationSuspended = NO;
|
isErrorNotificationSuspended = NO;
|
||||||
|
|
||||||
// Restore call alert if any
|
if (noCallSupportAlert)
|
||||||
if (_incomingCallNotification)
|
|
||||||
{
|
|
||||||
NSLog(@"[AppDelegate] restoreInitialDisplay: keep visible incoming call alert");
|
|
||||||
[self showNotificationAlert:_incomingCallNotification];
|
|
||||||
}
|
|
||||||
else if (noCallSupportAlert)
|
|
||||||
{
|
{
|
||||||
NSLog(@"[AppDelegate] restoreInitialDisplay: keep visible noCall support alert");
|
NSLog(@"[AppDelegate] restoreInitialDisplay: keep visible noCall support alert");
|
||||||
[self showNotificationAlert:noCallSupportAlert];
|
[self showNotificationAlert:noCallSupportAlert];
|
||||||
|
@ -897,9 +891,25 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)registerForRemoteNotificationsWithCompletion:(nullable void (^)(NSError *))completion
|
||||||
|
{
|
||||||
|
self.registrationForRemoteNotificationsCompletion = completion;
|
||||||
|
[[UIApplication sharedApplication] registerForRemoteNotifications];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
|
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
|
||||||
{
|
{
|
||||||
[application registerForRemoteNotifications];
|
// Register for remote notifications only if user provide access to notification feature
|
||||||
|
if (notificationSettings.types != UIUserNotificationTypeNone)
|
||||||
|
{
|
||||||
|
[self registerForRemoteNotificationsWithCompletion:nil];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Clear existing token
|
||||||
|
MXKAccountManager* accountManager = [MXKAccountManager sharedManager];
|
||||||
|
[accountManager setApnsDeviceToken:nil];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
|
- (void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
|
||||||
|
@ -911,11 +921,23 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
[accountManager setApnsDeviceToken:deviceToken];
|
[accountManager setApnsDeviceToken:deviceToken];
|
||||||
|
|
||||||
isAPNSRegistered = YES;
|
isAPNSRegistered = YES;
|
||||||
|
|
||||||
|
if (self.registrationForRemoteNotificationsCompletion)
|
||||||
|
{
|
||||||
|
self.registrationForRemoteNotificationsCompletion(nil);
|
||||||
|
self.registrationForRemoteNotificationsCompletion = nil;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)application:(UIApplication*)app didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
|
- (void)application:(UIApplication*)app didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
|
||||||
{
|
{
|
||||||
NSLog(@"[AppDelegate] Failed to register for APNS: %@", error);
|
NSLog(@"[AppDelegate] Failed to register for APNS: %@", error);
|
||||||
|
|
||||||
|
if (self.registrationForRemoteNotificationsCompletion)
|
||||||
|
{
|
||||||
|
self.registrationForRemoteNotificationsCompletion(error);
|
||||||
|
self.registrationForRemoteNotificationsCompletion = nil;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)cancelBackgroundSync
|
- (void)cancelBackgroundSync
|
||||||
|
@ -1442,6 +1464,9 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
|
|
||||||
MXSDKOptions *sdkOptions = [MXSDKOptions sharedInstance];
|
MXSDKOptions *sdkOptions = [MXSDKOptions sharedInstance];
|
||||||
|
|
||||||
|
// Set the App Group identifier.
|
||||||
|
sdkOptions.applicationGroupIdentifier = @"group.im.vector";
|
||||||
|
|
||||||
// Define the media cache version
|
// Define the media cache version
|
||||||
sdkOptions.mediaCacheAppVersion = 0;
|
sdkOptions.mediaCacheAppVersion = 0;
|
||||||
|
|
||||||
|
@ -1457,6 +1482,9 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
// Use UIKit BackgroundTask for handling background tasks in the SDK
|
// Use UIKit BackgroundTask for handling background tasks in the SDK
|
||||||
sdkOptions.backgroundModeHandler = [[MXUIKitBackgroundModeHandler alloc] init];
|
sdkOptions.backgroundModeHandler = [[MXUIKitBackgroundModeHandler alloc] init];
|
||||||
|
|
||||||
|
// Get modular widget events in rooms histories
|
||||||
|
[[MXKAppSettings standardAppSettings] addSupportedEventTypes:@[kWidgetEventTypeString]];
|
||||||
|
|
||||||
// Disable long press on event in bubble cells
|
// Disable long press on event in bubble cells
|
||||||
[MXKRoomBubbleTableViewCell disableLongPressGestureOnEvent:YES];
|
[MXKRoomBubbleTableViewCell disableLongPressGestureOnEvent:YES];
|
||||||
|
|
||||||
|
@ -1504,6 +1532,11 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
|
|
||||||
// Each room member will be considered as a potential contact.
|
// Each room member will be considered as a potential contact.
|
||||||
[MXKContactManager sharedManager].contactManagerMXRoomSource = MXKContactManagerMXRoomSourceAll;
|
[MXKContactManager sharedManager].contactManagerMXRoomSource = MXKContactManagerMXRoomSourceAll;
|
||||||
|
|
||||||
|
// Send read receipts for modular widgets events too
|
||||||
|
NSMutableArray<MXEventTypeString> *acknowledgableEventTypes = [NSMutableArray arrayWithArray:mxSession.acknowledgableEventTypes];
|
||||||
|
[acknowledgableEventTypes addObject:kWidgetEventTypeString];
|
||||||
|
mxSession.acknowledgableEventTypes = acknowledgableEventTypes;
|
||||||
}
|
}
|
||||||
else if (mxSession.state == MXSessionStateStoreDataReady)
|
else if (mxSession.state == MXSessionStateStoreDataReady)
|
||||||
{
|
{
|
||||||
|
@ -1592,6 +1625,9 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
MXKAccount *account = notif.object;
|
MXKAccount *account = notif.object;
|
||||||
[account removeObserver:self forKeyPath:@"enableInAppNotifications"];
|
[account removeObserver:self forKeyPath:@"enableInAppNotifications"];
|
||||||
|
|
||||||
|
// Clear Modular data
|
||||||
|
[[WidgetManager sharedManager] deleteDataForUser:account.mxCredentials.userId];
|
||||||
|
|
||||||
// Logout the app when there is no available account
|
// Logout the app when there is no available account
|
||||||
if (![MXKAccountManager sharedManager].accounts.count)
|
if (![MXKAccountManager sharedManager].accounts.count)
|
||||||
{
|
{
|
||||||
|
@ -1617,8 +1653,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
|
|
||||||
}];
|
}];
|
||||||
|
|
||||||
// Apply the application group name, and add observer on settings changes.
|
// Add observer on settings changes.
|
||||||
[MXKAppSettings standardAppSettings].applicationGroup = @"group.im.vector";
|
|
||||||
[[MXKAppSettings standardAppSettings] addObserver:self forKeyPath:@"showAllEventsInRoomHistory" options:0 context:nil];
|
[[MXKAppSettings standardAppSettings] addObserver:self forKeyPath:@"showAllEventsInRoomHistory" options:0 context:nil];
|
||||||
|
|
||||||
// Prepare account manager
|
// Prepare account manager
|
||||||
|
@ -1808,81 +1843,8 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
currentCallViewController = [CallViewController callViewController:mxCall];
|
currentCallViewController = [CallViewController callViewController:mxCall];
|
||||||
currentCallViewController.delegate = self;
|
currentCallViewController.delegate = self;
|
||||||
|
|
||||||
if (mxCall.isIncoming)
|
[self presentCallViewController:nil];
|
||||||
{
|
|
||||||
// Prompt user before presenting the call view controller
|
|
||||||
NSString *callPromptFormat = mxCall.isVideoCall ? NSLocalizedStringFromTable(@"call_incoming_video_prompt", @"Vector", nil) : NSLocalizedStringFromTable(@"call_incoming_voice_prompt", @"Vector", nil);
|
|
||||||
NSString *callerName = currentCallViewController.peer.displayname;
|
|
||||||
if (!callerName.length)
|
|
||||||
{
|
|
||||||
callerName = currentCallViewController.peer.userId;
|
|
||||||
}
|
|
||||||
NSString *callPrompt = [NSString stringWithFormat:callPromptFormat, callerName];
|
|
||||||
|
|
||||||
__weak typeof(self) weakSelf = self;
|
|
||||||
|
|
||||||
// Removing existing notification (if any)
|
|
||||||
[_incomingCallNotification dismissViewControllerAnimated:NO completion:nil];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_incomingCallNotification = [UIAlertController alertControllerWithTitle:callPrompt
|
|
||||||
message:nil
|
|
||||||
preferredStyle:UIAlertControllerStyleAlert];
|
|
||||||
|
|
||||||
[_incomingCallNotification addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"decline", @"Vector", nil)
|
|
||||||
style:UIAlertActionStyleDefault
|
|
||||||
handler:^(UIAlertAction * action) {
|
|
||||||
|
|
||||||
if (weakSelf)
|
|
||||||
{
|
|
||||||
typeof(self) self = weakSelf;
|
|
||||||
|
|
||||||
// Reject the call.
|
|
||||||
// Note: Do not reset the incoming call notification before this operation, because it is used to release properly the dismissed call view controller.
|
|
||||||
if (self->currentCallViewController)
|
|
||||||
{
|
|
||||||
[self->currentCallViewController onButtonPressed:self->currentCallViewController.rejectCallButton];
|
|
||||||
|
|
||||||
currentCallViewController = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.incomingCallNotification = nil;
|
|
||||||
|
|
||||||
mxCall.delegate = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
}]];
|
|
||||||
|
|
||||||
[_incomingCallNotification addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"accept", @"Vector", nil)
|
|
||||||
style:UIAlertActionStyleDefault
|
|
||||||
handler:^(UIAlertAction * action) {
|
|
||||||
|
|
||||||
if (weakSelf)
|
|
||||||
{
|
|
||||||
typeof(self) self = weakSelf;
|
|
||||||
|
|
||||||
self.incomingCallNotification = nil;
|
|
||||||
|
|
||||||
if (self->currentCallViewController)
|
|
||||||
{
|
|
||||||
[self->currentCallViewController onButtonPressed:self->currentCallViewController.answerCallButton];
|
|
||||||
|
|
||||||
[self presentCallViewController:nil];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}]];
|
|
||||||
|
|
||||||
[_incomingCallNotification mxk_setAccessibilityIdentifier:@"AppDelegateIncomingCallAlert"];
|
|
||||||
[self showNotificationAlert:_incomingCallNotification];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[self presentCallViewController:nil];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1962,60 +1924,6 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
|
|
||||||
[NSLayoutConstraint activateConstraints:@[widthConstraint, heightConstraint, centerXConstraint, centerYConstraint]];
|
[NSLayoutConstraint activateConstraints:@[widthConstraint, heightConstraint, centerXConstraint, centerYConstraint]];
|
||||||
|
|
||||||
|
|
||||||
// In addition, show a spinner under this giffy animation
|
|
||||||
UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
|
|
||||||
activityIndicator.backgroundColor = [UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1.0];
|
|
||||||
activityIndicator.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
|
|
||||||
activityIndicator.hidesWhenStopped = YES;
|
|
||||||
|
|
||||||
CGRect frame = activityIndicator.frame;
|
|
||||||
frame.size.width += 30;
|
|
||||||
frame.size.height += 30;
|
|
||||||
activityIndicator.bounds = frame;
|
|
||||||
[activityIndicator.layer setCornerRadius:5];
|
|
||||||
|
|
||||||
activityIndicator.center = CGPointMake(launchAnimationContainerView.center.x, 6 * launchAnimationContainerView.center.y / 4);
|
|
||||||
[launchAnimationContainerView addSubview:activityIndicator];
|
|
||||||
|
|
||||||
activityIndicator.translatesAutoresizingMaskIntoConstraints = NO;
|
|
||||||
|
|
||||||
NSLayoutConstraint* widthConstraint2 = [NSLayoutConstraint constraintWithItem:activityIndicator
|
|
||||||
attribute:NSLayoutAttributeWidth
|
|
||||||
relatedBy:NSLayoutRelationEqual
|
|
||||||
toItem:nil
|
|
||||||
attribute:NSLayoutAttributeNotAnAttribute
|
|
||||||
multiplier:1
|
|
||||||
constant:frame.size.width];
|
|
||||||
|
|
||||||
NSLayoutConstraint* heightConstraint2 = [NSLayoutConstraint constraintWithItem:activityIndicator
|
|
||||||
attribute:NSLayoutAttributeHeight
|
|
||||||
relatedBy:NSLayoutRelationEqual
|
|
||||||
toItem:nil
|
|
||||||
attribute:NSLayoutAttributeNotAnAttribute
|
|
||||||
multiplier:1
|
|
||||||
constant:frame.size.height];
|
|
||||||
|
|
||||||
NSLayoutConstraint* centerXConstraint2 = [NSLayoutConstraint constraintWithItem:activityIndicator
|
|
||||||
attribute:NSLayoutAttributeCenterX
|
|
||||||
relatedBy:NSLayoutRelationEqual
|
|
||||||
toItem:launchAnimationContainerView
|
|
||||||
attribute:NSLayoutAttributeCenterX
|
|
||||||
multiplier:1
|
|
||||||
constant:0];
|
|
||||||
|
|
||||||
NSLayoutConstraint* centerYConstraint2 = [NSLayoutConstraint constraintWithItem:activityIndicator
|
|
||||||
attribute:NSLayoutAttributeCenterY
|
|
||||||
relatedBy:NSLayoutRelationEqual
|
|
||||||
toItem:launchAnimationContainerView
|
|
||||||
attribute:NSLayoutAttributeCenterY
|
|
||||||
multiplier:6.0/4.0
|
|
||||||
constant:0];
|
|
||||||
|
|
||||||
[NSLayoutConstraint activateConstraints:@[widthConstraint2, heightConstraint2, centerXConstraint2, centerYConstraint2]];
|
|
||||||
|
|
||||||
[activityIndicator startAnimating];
|
|
||||||
|
|
||||||
launchAnimationStart = [NSDate date];
|
launchAnimationStart = [NSDate date];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2428,22 +2336,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
{
|
{
|
||||||
if (currentCallViewController && callViewController == currentCallViewController)
|
if (currentCallViewController && callViewController == currentCallViewController)
|
||||||
{
|
{
|
||||||
if (_incomingCallNotification)
|
if (callViewController.isBeingPresented)
|
||||||
{
|
|
||||||
// The user was prompted for an incoming call which ended
|
|
||||||
// The call view controller was not presented yet.
|
|
||||||
[_incomingCallNotification dismissViewControllerAnimated:NO completion:nil];
|
|
||||||
_incomingCallNotification = nil;
|
|
||||||
|
|
||||||
// Release properly
|
|
||||||
[currentCallViewController destroy];
|
|
||||||
|
|
||||||
if (completion)
|
|
||||||
{
|
|
||||||
completion();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (callViewController.isBeingPresented)
|
|
||||||
{
|
{
|
||||||
// Here the presentation of the call view controller is in progress
|
// Here the presentation of the call view controller is in progress
|
||||||
// Postpone the dismiss
|
// Postpone the dismiss
|
||||||
|
@ -2568,7 +2461,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
|
||||||
[_jitsiViewController dismissViewControllerAnimated:YES completion:^{
|
[_jitsiViewController dismissViewControllerAnimated:YES completion:^{
|
||||||
|
|
||||||
MXRoom *room = [_jitsiViewController.widget.mxSession roomWithRoomId:_jitsiViewController.widget.roomId];
|
MXRoom *room = [_jitsiViewController.widget.mxSession roomWithRoomId:_jitsiViewController.widget.roomId];
|
||||||
NSString *btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"active_call_details", @"Vector", nil), room.riotDisplayname];
|
NSString *btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"active_call_details", @"Vector", nil), room.summary.displayname];
|
||||||
[self addCallStatusBar:btnTitle];
|
[self addCallStatusBar:btnTitle];
|
||||||
|
|
||||||
if (completion)
|
if (completion)
|
||||||
|
|
Before Width: | Height: | Size: 13 KiB |
BIN
Riot/Assets/Images/LaunchScreenRiot.png
Normal file
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 8 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 9 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 8 KiB |
BIN
Riot/Assets/Images/apps-icon.png
Normal file
After Width: | Height: | Size: 578 B |
BIN
Riot/Assets/Images/apps-icon@2x.png
Normal file
After Width: | Height: | Size: 977 B |
BIN
Riot/Assets/Images/apps-icon@3x.png
Normal file
After Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 3.2 KiB |
BIN
Riot/Assets/Images/back_icon@4x.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
Riot/Assets/Images/e2e_unencrypted.png
Executable file → Normal file
Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 286 B |
BIN
Riot/Assets/Images/e2e_unencrypted@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 345 B After Width: | Height: | Size: 441 B |
BIN
Riot/Assets/Images/e2e_unencrypted@3x.png
Executable file → Normal file
Before Width: | Height: | Size: 420 B After Width: | Height: | Size: 565 B |
|
@ -11,9 +11,9 @@
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@";
|
"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@";
|
||||||
/* New action message from a specific person, not referencing a room. */
|
/* New action message from a specific person, not referencing a room. */
|
||||||
"IMAGE_FROM_USER" = "%@ sandte dir ein Bild";
|
"IMAGE_FROM_USER" = "%@ sandte dir ein Bild %@";
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"IMAGE_FROM_USER_IN_ROOM" = "%@ sandte ein Bild in %@";
|
"IMAGE_FROM_USER_IN_ROOM" = "%@ sandte ein Bild %@ in %@";
|
||||||
/* Multiple unread messages in a room */
|
/* Multiple unread messages in a room */
|
||||||
"UNREAD_IN_ROOM" = "%@ neue Nachrichten in %@";
|
"UNREAD_IN_ROOM" = "%@ neue Nachrichten in %@";
|
||||||
/* Multiple unread messages from a specific person, not referencing a room */
|
/* Multiple unread messages from a specific person, not referencing a room */
|
||||||
|
|
|
@ -39,10 +39,10 @@
|
||||||
/** Image Messages **/
|
/** Image Messages **/
|
||||||
|
|
||||||
/* New action message from a specific person, not referencing a room. */
|
/* New action message from a specific person, not referencing a room. */
|
||||||
"IMAGE_FROM_USER" = "%@ sent you a picture";
|
"IMAGE_FROM_USER" = "%@ sent you a picture %@";
|
||||||
|
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"IMAGE_FROM_USER_IN_ROOM" = "%@ posted a picture in %@";
|
"IMAGE_FROM_USER_IN_ROOM" = "%@ posted a picture %@ in %@";
|
||||||
|
|
||||||
/** Coalesced messages **/
|
/** Coalesced messages **/
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,8 @@
|
||||||
"later" = "Later";
|
"later" = "Later";
|
||||||
"rename" = "Rename";
|
"rename" = "Rename";
|
||||||
"collapse" = "collapse";
|
"collapse" = "collapse";
|
||||||
|
"send_to" = "Send to %@";
|
||||||
|
"sending" = "Sending";
|
||||||
|
|
||||||
// Authentication
|
// Authentication
|
||||||
"auth_login" = "Log in";
|
"auth_login" = "Log in";
|
||||||
|
@ -104,6 +106,7 @@
|
||||||
"auth_reset_password_error_not_found" = "Your email address does not appear to be associated with a Matrix ID on this Homeserver.";
|
"auth_reset_password_error_not_found" = "Your email address does not appear to be associated with a Matrix ID on this Homeserver.";
|
||||||
"auth_reset_password_success_message" = "Your password has been reset.\n\nYou have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, re-log in on each device.";
|
"auth_reset_password_success_message" = "Your password has been reset.\n\nYou have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, re-log in on each device.";
|
||||||
"auth_add_email_and_phone_warning" = "Registration with email and phone number at once is not supported yet until the api exists. Only the phone number will be taken into account. You may add your email to your profile in settings.";
|
"auth_add_email_and_phone_warning" = "Registration with email and phone number at once is not supported yet until the api exists. Only the phone number will be taken into account. You may add your email to your profile in settings.";
|
||||||
|
"auth_share_extension_prompt" = "Login in the main app to share content";
|
||||||
|
|
||||||
// Chat creation
|
// Chat creation
|
||||||
"room_creation_title" = "New Chat";
|
"room_creation_title" = "New Chat";
|
||||||
|
@ -255,6 +258,7 @@
|
||||||
"room_event_action_cancel_download" = "Cancel Download";
|
"room_event_action_cancel_download" = "Cancel Download";
|
||||||
"room_event_action_view_encryption" = "Encryption Information";
|
"room_event_action_view_encryption" = "Encryption Information";
|
||||||
"room_warning_about_encryption" = "End-to-end encryption is in beta and may not be reliable.\n\nYou should not yet trust it to secure data.\n\nDevices will not yet be able to decrypt history from before they joined the room.\n\nEncrypted messages will not be visible on clients that do not yet implement encryption.";
|
"room_warning_about_encryption" = "End-to-end encryption is in beta and may not be reliable.\n\nYou should not yet trust it to secure data.\n\nDevices will not yet be able to decrypt history from before they joined the room.\n\nEncrypted messages will not be visible on clients that do not yet implement encryption.";
|
||||||
|
"room_event_failed_to_send" = "Failed to send";
|
||||||
|
|
||||||
// Unknown devices
|
// Unknown devices
|
||||||
"unknown_devices_alert_title" = "Room contains unknown devices";
|
"unknown_devices_alert_title" = "Room contains unknown devices";
|
||||||
|
@ -346,6 +350,7 @@
|
||||||
|
|
||||||
"settings_labs_e2e_encryption" = "End-to-End Encryption";
|
"settings_labs_e2e_encryption" = "End-to-End Encryption";
|
||||||
"settings_labs_e2e_encryption_prompt_message" = "To finish setting up encryption you must log in again.";
|
"settings_labs_e2e_encryption_prompt_message" = "To finish setting up encryption you must log in again.";
|
||||||
|
"settings_labs_matrix_apps" = "Matrix Apps";
|
||||||
"settings_labs_create_conference_with_jitsi" = "Create conference calls with jitsi";
|
"settings_labs_create_conference_with_jitsi" = "Create conference calls with jitsi";
|
||||||
|
|
||||||
"settings_version" = "Version %@";
|
"settings_version" = "Version %@";
|
||||||
|
@ -384,6 +389,7 @@
|
||||||
"room_details_favourite_tag" = "Favourite";
|
"room_details_favourite_tag" = "Favourite";
|
||||||
"room_details_low_priority_tag" = "Low priority";
|
"room_details_low_priority_tag" = "Low priority";
|
||||||
"room_details_mute_notifs" = "Mute notifications";
|
"room_details_mute_notifs" = "Mute notifications";
|
||||||
|
"room_details_direct_chat" = "Direct Chat";
|
||||||
"room_details_access_section"="Who can access this room?";
|
"room_details_access_section"="Who can access this room?";
|
||||||
"room_details_access_section_invited_only"="Only people who have been invited";
|
"room_details_access_section_invited_only"="Only people who have been invited";
|
||||||
"room_details_access_section_anyone_apart_from_guest"="Anyone who knows the room's link, apart from guests";
|
"room_details_access_section_anyone_apart_from_guest"="Anyone who knows the room's link, apart from guests";
|
||||||
|
@ -423,6 +429,7 @@
|
||||||
"room_details_fail_to_add_room_aliases" = "Fail to add the new room addresses";
|
"room_details_fail_to_add_room_aliases" = "Fail to add the new room addresses";
|
||||||
"room_details_fail_to_remove_room_aliases" = "Fail to remove the room addresses";
|
"room_details_fail_to_remove_room_aliases" = "Fail to remove the room addresses";
|
||||||
"room_details_fail_to_update_room_canonical_alias" = "Fail to update the main address";
|
"room_details_fail_to_update_room_canonical_alias" = "Fail to update the main address";
|
||||||
|
"room_details_fail_to_update_room_direct" = "Fail to update the direct flag of this room";
|
||||||
"room_details_fail_to_enable_encryption" = "Fail to enable encryption in this room";
|
"room_details_fail_to_enable_encryption" = "Fail to enable encryption in this room";
|
||||||
"room_details_save_changes_prompt" = "Do you want to save changes?";
|
"room_details_save_changes_prompt" = "Do you want to save changes?";
|
||||||
"room_details_set_main_address" = "Set as Main Address";
|
"room_details_set_main_address" = "Set as Main Address";
|
||||||
|
@ -449,6 +456,8 @@
|
||||||
|
|
||||||
// Events formatter
|
// Events formatter
|
||||||
"event_formatter_member_updates" = "%tu membership changes";
|
"event_formatter_member_updates" = "%tu membership changes";
|
||||||
|
"event_formatter_jitsi_widget_added" = "VoIP conference added by %@";
|
||||||
|
"event_formatter_jitsi_widget_removed" = "VoIP conference removed by %@";
|
||||||
|
|
||||||
// Others
|
// Others
|
||||||
"or" = "or";
|
"or" = "or";
|
||||||
|
@ -472,6 +481,8 @@
|
||||||
// Call
|
// Call
|
||||||
"call_incoming_voice_prompt" = "Incoming voice call from %@";
|
"call_incoming_voice_prompt" = "Incoming voice call from %@";
|
||||||
"call_incoming_video_prompt" = "Incoming video call from %@";
|
"call_incoming_video_prompt" = "Incoming video call from %@";
|
||||||
|
"call_incoming_voice" = "Incoming call...";
|
||||||
|
"call_incoming_video" = "Incoming video call...";
|
||||||
"call_already_displayed" = "There is already a call in progress.";
|
"call_already_displayed" = "There is already a call in progress.";
|
||||||
"call_jitsi_error" = "Failed to join the conference call.";
|
"call_jitsi_error" = "Failed to join the conference call.";
|
||||||
|
|
||||||
|
@ -502,3 +513,15 @@
|
||||||
"widget_no_power_to_manage" = "You need permission to manage widgets in this room";
|
"widget_no_power_to_manage" = "You need permission to manage widgets in this room";
|
||||||
"widget_creation_failure" = "Widget creation has failed";
|
"widget_creation_failure" = "Widget creation has failed";
|
||||||
|
|
||||||
|
// Widget Integration Manager
|
||||||
|
"widget_integration_need_to_be_able_to_invite" = "You need to be able to invite users to do that.";
|
||||||
|
"widget_integration_unable_to_create" = "Unable to create widget.";
|
||||||
|
"widget_integration_failed_to_send_request" = "Failed to send request.";
|
||||||
|
"widget_integration_room_not_recognised" = "This room is not recognised.";
|
||||||
|
"widget_integration_positive_power_level" = "Power level must be positive integer.";
|
||||||
|
"widget_integration_must_be_in_room" = "You are not in this room.";
|
||||||
|
"widget_integration_no_permission_in_room" = "You do not have permission to do that in this room.";
|
||||||
|
"widget_integration_missing_room_id" = "Missing room_id in request.";
|
||||||
|
"widget_integration_missing_user_id" = "Missing user_id in request.";
|
||||||
|
"widget_integration_room_not_visible" = "Room %@ is not visible.";
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"ACTION_FROM_USER_IN_ROOM" = "%@ : * %@ %@";
|
"ACTION_FROM_USER_IN_ROOM" = "%@ : * %@ %@";
|
||||||
/* New action message from a specific person, not referencing a room. */
|
/* New action message from a specific person, not referencing a room. */
|
||||||
"IMAGE_FROM_USER" = "%@ vous a envoyé une image";
|
"IMAGE_FROM_USER" = "%@ vous a envoyé une image %@";
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"IMAGE_FROM_USER_IN_ROOM" = "%@ a posté une image dans %@";
|
"IMAGE_FROM_USER_IN_ROOM" = "%@ a posté une image %@ dans %@";
|
||||||
/* Multiple unread messages in a room */
|
/* Multiple unread messages in a room */
|
||||||
"UNREAD_IN_ROOM" = "%@ nouveaux messages dans %@";
|
"UNREAD_IN_ROOM" = "%@ nouveaux messages dans %@";
|
||||||
/* Multiple unread messages from a specific person, not referencing a room */
|
/* Multiple unread messages from a specific person, not referencing a room */
|
||||||
|
|
|
@ -313,6 +313,7 @@
|
||||||
"room_details_favourite_tag" = "Favoris";
|
"room_details_favourite_tag" = "Favoris";
|
||||||
"room_details_low_priority_tag" = "Priorité basse";
|
"room_details_low_priority_tag" = "Priorité basse";
|
||||||
"room_details_mute_notifs" = "Désactiver les notifications";
|
"room_details_mute_notifs" = "Désactiver les notifications";
|
||||||
|
"room_details_direct_chat" = "Discussion directe";
|
||||||
"room_details_access_section" = "Qui peut accéder à ce salon ?";
|
"room_details_access_section" = "Qui peut accéder à ce salon ?";
|
||||||
"room_details_access_section_invited_only" = "Seulement les personnes qui ont été invitées";
|
"room_details_access_section_invited_only" = "Seulement les personnes qui ont été invitées";
|
||||||
"room_details_access_section_anyone_apart_from_guest" = "N'importe qui ayant un lien vers le salon, hormis les visiteurs";
|
"room_details_access_section_anyone_apart_from_guest" = "N'importe qui ayant un lien vers le salon, hormis les visiteurs";
|
||||||
|
@ -352,6 +353,7 @@
|
||||||
"room_details_fail_to_add_room_aliases" = "Impossible d'ajouter les nouvelles adresses au salon";
|
"room_details_fail_to_add_room_aliases" = "Impossible d'ajouter les nouvelles adresses au salon";
|
||||||
"room_details_fail_to_remove_room_aliases" = "Impossible de supprimer les adresses du salon";
|
"room_details_fail_to_remove_room_aliases" = "Impossible de supprimer les adresses du salon";
|
||||||
"room_details_fail_to_update_room_canonical_alias" = "Impossible de modifier l'adresse principale";
|
"room_details_fail_to_update_room_canonical_alias" = "Impossible de modifier l'adresse principale";
|
||||||
|
"room_details_fail_to_update_room_direct" = "Impossible de modifier l'état de discussion directe";
|
||||||
"room_details_fail_to_enable_encryption" = "Impossible d'activer le chiffrement sur ce salon";
|
"room_details_fail_to_enable_encryption" = "Impossible d'activer le chiffrement sur ce salon";
|
||||||
"room_details_save_changes_prompt" = "Voulez-vous enregistrer les changements ?";
|
"room_details_save_changes_prompt" = "Voulez-vous enregistrer les changements ?";
|
||||||
"room_details_set_main_address" = "Configurer comme adresse principale";
|
"room_details_set_main_address" = "Configurer comme adresse principale";
|
||||||
|
|
67
Riot/Assets/js/IntegrationManager.js
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
window.riotIOS = {};
|
||||||
|
|
||||||
|
// Generic JS -> ObjC bridge
|
||||||
|
window.riotIOS.sendObjectMessageToObjC = function(parameters) {
|
||||||
|
var iframe = document.createElement('iframe');
|
||||||
|
iframe.setAttribute('src', 'js:' + JSON.stringify(parameters));
|
||||||
|
|
||||||
|
document.documentElement.appendChild(iframe);
|
||||||
|
iframe.parentNode.removeChild(iframe);
|
||||||
|
iframe = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.riotIOS.events = {};
|
||||||
|
|
||||||
|
// Listen to messages posted by Modular
|
||||||
|
window.riotIOS.onMessage = function(event) {
|
||||||
|
|
||||||
|
// Do not SPAM ObjC with event already managed
|
||||||
|
if (riotIOS.events[event.data._id]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!event.origin) { // stupid chrome
|
||||||
|
event.origin = event.originalEvent.origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep this event for future usage
|
||||||
|
riotIOS.events[event.data._id] = event;
|
||||||
|
|
||||||
|
riotIOS.sendObjectMessageToObjC({
|
||||||
|
'event.data': event.data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
window.addEventListener('message', riotIOS.onMessage, false);
|
||||||
|
|
||||||
|
|
||||||
|
// ObjC -> Modular JS bridge
|
||||||
|
window.riotIOS.sendResponse = function(eventId, res) {
|
||||||
|
|
||||||
|
// Retrieve the correspong JS event
|
||||||
|
var event = riotIOS.events[eventId];
|
||||||
|
|
||||||
|
console.log("sendResponse to " + event.data.action + " for "+ eventId + ": " + JSON.stringify(res));
|
||||||
|
|
||||||
|
var data = JSON.parse(JSON.stringify(event.data));
|
||||||
|
data.response = res;
|
||||||
|
event.source.postMessage(data, event.origin);
|
||||||
|
|
||||||
|
// Mark this event as handled
|
||||||
|
riotIOS.events[eventId] = true;
|
||||||
|
}
|
|
@ -39,10 +39,10 @@
|
||||||
/** Image Messages **/
|
/** Image Messages **/
|
||||||
|
|
||||||
/* New action message from a specific person, not referencing a room. */
|
/* New action message from a specific person, not referencing a room. */
|
||||||
"IMAGE_FROM_USER" = "%@ heeft je een afbeelding gestuurd";
|
"IMAGE_FROM_USER" = "%@ heeft je een afbeelding %@ gestuurd";
|
||||||
|
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"IMAGE_FROM_USER_IN_ROOM" = "%@ plaatste een afbeelding in %@";
|
"IMAGE_FROM_USER_IN_ROOM" = "%@ plaatste een afbeelding %@ in %@";
|
||||||
|
|
||||||
/** Coalesced messages **/
|
/** Coalesced messages **/
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@";
|
"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@";
|
||||||
/* New action message from a specific person, not referencing a room. */
|
/* New action message from a specific person, not referencing a room. */
|
||||||
"IMAGE_FROM_USER" = "%@ отправил(а) вам фото";
|
"IMAGE_FROM_USER" = "%@ отправил(а) вам фото %@";
|
||||||
/* New action message from a specific person in a named room. */
|
/* New action message from a specific person in a named room. */
|
||||||
"IMAGE_FROM_USER_IN_ROOM" = "%@ отправил(а) фото в %@";
|
"IMAGE_FROM_USER_IN_ROOM" = "%@ отправил(а) фото %@ в %@";
|
||||||
/* Multiple unread messages in a room */
|
/* Multiple unread messages in a room */
|
||||||
"UNREAD_IN_ROOM" = "%@ новых сообщений в %@";
|
"UNREAD_IN_ROOM" = "%@ новых сообщений в %@";
|
||||||
/* Multiple unread messages from a specific person, not referencing a room */
|
/* Multiple unread messages from a specific person, not referencing a room */
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreenLogo.png" translatesAutoresizingMaskIntoConstraints="NO" id="IcW-17-3Qq">
|
<imageView clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreenRiot.png" translatesAutoresizingMaskIntoConstraints="NO" id="IcW-17-3Qq">
|
||||||
<rect key="frame" x="122" y="192" width="170" height="170"/>
|
<rect key="frame" x="122" y="192" width="170" height="170"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="170" id="Lbo-ar-PiJ"/>
|
<constraint firstAttribute="height" constant="170" id="Lbo-ar-PiJ"/>
|
||||||
|
@ -43,6 +43,6 @@
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
<image name="LaunchScreenLogo.png" width="300" height="300"/>
|
<image name="LaunchScreenRiot.png" width="480" height="480"/>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16F73" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="H1p-Uh-vWS">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="H1p-Uh-vWS">
|
||||||
<device id="retina4_7" orientation="portrait">
|
<device id="retina4_7" orientation="portrait">
|
||||||
<adaptation id="fullscreen"/>
|
<adaptation id="fullscreen"/>
|
||||||
</device>
|
</device>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
||||||
|
<capability name="Navigation items with more than one left or right bar item" minToolsVersion="7.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
@ -36,7 +37,14 @@
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</view>
|
</view>
|
||||||
<barButtonItem key="rightBarButtonItem" image="search_icon.png" id="wyR-qv-IxC" userLabel="Menu Bar Button Item"/>
|
<rightBarButtonItems>
|
||||||
|
<barButtonItem image="search_icon.png" id="wyR-qv-IxC" userLabel="Menu Bar Button Item">
|
||||||
|
<inset key="imageInsets" minX="-5" minY="0.0" maxX="5" maxY="0.0"/>
|
||||||
|
</barButtonItem>
|
||||||
|
<barButtonItem image="apps-icon.png" id="cal-D0-6Fw">
|
||||||
|
<inset key="imageInsets" minX="10" minY="0.0" maxX="-10" maxY="0.0"/>
|
||||||
|
</barButtonItem>
|
||||||
|
</rightBarButtonItems>
|
||||||
</navigationItem>
|
</navigationItem>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="roomTitleViewContainer" destination="aas-th-FW1" id="SFz-1s-ywg"/>
|
<outlet property="roomTitleViewContainer" destination="aas-th-FW1" id="SFz-1s-ywg"/>
|
||||||
|
@ -564,6 +572,7 @@
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
|
<image name="apps-icon.png" width="24" height="24"/>
|
||||||
<image name="logo.png" width="120" height="101"/>
|
<image name="logo.png" width="120" height="101"/>
|
||||||
<image name="search_icon.png" width="22" height="22"/>
|
<image name="search_icon.png" width="22" height="22"/>
|
||||||
<image name="settings_icon.png" width="24" height="24"/>
|
<image name="settings_icon.png" width="24" height="24"/>
|
||||||
|
@ -577,10 +586,10 @@
|
||||||
<image name="tab_rooms_selected.png" width="25" height="25"/>
|
<image name="tab_rooms_selected.png" width="25" height="25"/>
|
||||||
</resources>
|
</resources>
|
||||||
<inferredMetricsTieBreakers>
|
<inferredMetricsTieBreakers>
|
||||||
<segue reference="fNQ-S3-DbZ"/>
|
<segue reference="f5u-Y1-7nt"/>
|
||||||
<segue reference="ziz-Xl-QVg"/>
|
<segue reference="vCz-dl-6xQ"/>
|
||||||
<segue reference="mFs-HA-7Oo"/>
|
<segue reference="cUw-vU-gJq"/>
|
||||||
<segue reference="0ws-cL-0tk"/>
|
<segue reference="tk8-vF-K4T"/>
|
||||||
<segue reference="Tfl-tq-LQp"/>
|
<segue reference="Tfl-tq-LQp"/>
|
||||||
</inferredMetricsTieBreakers>
|
</inferredMetricsTieBreakers>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
@ -22,11 +22,6 @@
|
||||||
*/
|
*/
|
||||||
@interface MXRoom (Riot)
|
@interface MXRoom (Riot)
|
||||||
|
|
||||||
/**
|
|
||||||
The Riot displayname of the room
|
|
||||||
*/
|
|
||||||
@property(nonatomic, readonly) NSString* riotDisplayname;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tell whether all the notifications are disabled for the room.
|
Tell whether all the notifications are disabled for the room.
|
||||||
*/
|
*/
|
||||||
|
@ -47,17 +42,6 @@
|
||||||
*/
|
*/
|
||||||
@property (nonatomic) id notificationCenterDidUpdateObserver;
|
@property (nonatomic) id notificationCenterDidUpdateObserver;
|
||||||
|
|
||||||
/**
|
|
||||||
Set the room avatar in the dedicated MXKImageView.
|
|
||||||
The vector style implies to use in order :
|
|
||||||
1 - the default avatar if there is one
|
|
||||||
2 - the member avatar for < 3 members rooms
|
|
||||||
3 - the first later of the room name.
|
|
||||||
|
|
||||||
@param mxkImageView the destinated MXKImageView.
|
|
||||||
*/
|
|
||||||
- (void)setRoomAvatarImageIn:(MXKImageView*)mxkImageView;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Update the room tag.
|
Update the room tag.
|
||||||
|
|
||||||
|
|
|
@ -23,182 +23,6 @@
|
||||||
|
|
||||||
@implementation MXRoom (Riot)
|
@implementation MXRoom (Riot)
|
||||||
|
|
||||||
#pragma mark - Room avatar
|
|
||||||
|
|
||||||
- (void)setRoomAvatarImageIn:(MXKImageView*)mxkImageView
|
|
||||||
{
|
|
||||||
NSString* roomAvatarUrl = self.state.avatar;
|
|
||||||
|
|
||||||
if (!roomAvatarUrl)
|
|
||||||
{
|
|
||||||
// If the room has only two members, use the avatar of the second member.
|
|
||||||
NSArray* members = self.state.members;
|
|
||||||
|
|
||||||
if (members.count == 2)
|
|
||||||
{
|
|
||||||
NSString* myUserId = self.mxSession.myUser.userId;
|
|
||||||
|
|
||||||
for (MXRoomMember *roomMember in members)
|
|
||||||
{
|
|
||||||
if (![roomMember.userId isEqualToString:myUserId])
|
|
||||||
{
|
|
||||||
// Use the avatar of this member only if he joined or he is invited.
|
|
||||||
if (MXMembershipJoin == roomMember.membership || MXMembershipInvite == roomMember.membership)
|
|
||||||
{
|
|
||||||
roomAvatarUrl = roomMember.avatarUrl;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve the Riot room display name to prepare the default avatar image.
|
|
||||||
// Note: this display name is nil for an "empty room" without display name (We name "empty room" a room in which the current user is the only active member).
|
|
||||||
NSString *avatarDisplayName = self.riotDisplayname;
|
|
||||||
UIImage* avatarImage = [AvatarGenerator generateAvatarForMatrixItem:self.state.roomId withDisplayName:avatarDisplayName];
|
|
||||||
|
|
||||||
if (roomAvatarUrl)
|
|
||||||
{
|
|
||||||
mxkImageView.enableInMemoryCache = YES;
|
|
||||||
|
|
||||||
[mxkImageView setImageURL:[self.mxSession.matrixRestClient urlOfContentThumbnail:roomAvatarUrl toFitViewSize:mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mxkImageView.image = avatarImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
mxkImageView.contentMode = UIViewContentModeScaleAspectFill;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Room display name
|
|
||||||
// @TODO: May worth to refactor to use MXRoomSummary
|
|
||||||
- (NSString *)riotDisplayname
|
|
||||||
{
|
|
||||||
// this algo is the one defined in
|
|
||||||
// https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617
|
|
||||||
// calculateRoomName(room, userId)
|
|
||||||
|
|
||||||
MXRoomState* roomState = self.state;
|
|
||||||
|
|
||||||
if (roomState.name.length > 0)
|
|
||||||
{
|
|
||||||
return roomState.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString *alias = roomState.canonicalAlias;
|
|
||||||
|
|
||||||
if (!alias)
|
|
||||||
{
|
|
||||||
// For rooms where canonical alias is not defined, we use the 1st alias as a workaround
|
|
||||||
NSArray *aliases = roomState.aliases;
|
|
||||||
|
|
||||||
if (aliases.count)
|
|
||||||
{
|
|
||||||
alias = [aliases[0] copy];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if there is non empty alias.
|
|
||||||
if ([alias length] > 0)
|
|
||||||
{
|
|
||||||
return alias;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString* myUserId = self.mxSession.myUser.userId;
|
|
||||||
|
|
||||||
NSArray* members = roomState.members;
|
|
||||||
NSMutableArray* othersActiveMembers = [[NSMutableArray alloc] init];
|
|
||||||
NSMutableArray* activeMembers = [[NSMutableArray alloc] init];
|
|
||||||
|
|
||||||
for(MXRoomMember* member in members)
|
|
||||||
{
|
|
||||||
if (member.membership != MXMembershipLeave)
|
|
||||||
{
|
|
||||||
if (![member.userId isEqualToString:myUserId])
|
|
||||||
{
|
|
||||||
[othersActiveMembers addObject:member];
|
|
||||||
}
|
|
||||||
|
|
||||||
[activeMembers addObject:member];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// sort the members by their creation (oldest first)
|
|
||||||
othersActiveMembers = [[othersActiveMembers sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
|
|
||||||
|
|
||||||
uint64_t originServerTs1 = 0;
|
|
||||||
uint64_t originServerTs2 = 0;
|
|
||||||
|
|
||||||
MXRoomMember* member1 = (MXRoomMember*)obj1;
|
|
||||||
MXRoomMember* member2 = (MXRoomMember*)obj2;
|
|
||||||
|
|
||||||
if (member1.originalEvent)
|
|
||||||
{
|
|
||||||
originServerTs1 = member1.originalEvent.originServerTs;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (member2.originalEvent)
|
|
||||||
{
|
|
||||||
originServerTs2 = member2.originalEvent.originServerTs;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (originServerTs1 == originServerTs2)
|
|
||||||
{
|
|
||||||
return NSOrderedSame;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return originServerTs1 > originServerTs2 ? NSOrderedDescending : NSOrderedAscending;
|
|
||||||
}
|
|
||||||
}] mutableCopy];
|
|
||||||
|
|
||||||
|
|
||||||
NSString* displayName = @"";
|
|
||||||
|
|
||||||
if (othersActiveMembers.count == 0)
|
|
||||||
{
|
|
||||||
if (activeMembers.count == 1)
|
|
||||||
{
|
|
||||||
MXRoomMember* member = [activeMembers objectAtIndex:0];
|
|
||||||
|
|
||||||
if (member.membership == MXMembershipInvite)
|
|
||||||
{
|
|
||||||
if (member.originalEvent.sender)
|
|
||||||
{
|
|
||||||
// extract who invited us to the room
|
|
||||||
displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_invite_from", @"Vector", nil), [roomState memberName:member.originalEvent.sender]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
displayName = NSLocalizedStringFromTable(@"room_displayname_room_invite", @"Vector", nil);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (othersActiveMembers.count == 1)
|
|
||||||
{
|
|
||||||
MXRoomMember* member = [othersActiveMembers objectAtIndex:0];
|
|
||||||
|
|
||||||
displayName = [roomState memberName:member.userId];
|
|
||||||
}
|
|
||||||
else if (othersActiveMembers.count == 2)
|
|
||||||
{
|
|
||||||
MXRoomMember* member1 = [othersActiveMembers objectAtIndex:0];
|
|
||||||
MXRoomMember* member2 = [othersActiveMembers objectAtIndex:1];
|
|
||||||
|
|
||||||
displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_two_members", @"Vector", nil), [roomState memberName:member1.userId], [roomState memberName:member2.userId]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MXRoomMember* member = [othersActiveMembers objectAtIndex:0];
|
|
||||||
displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_more_than_two_members", @"Vector", nil), [roomState memberName:member.userId], othersActiveMembers.count - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
return displayName;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Room tags
|
#pragma mark - Room tags
|
||||||
|
|
||||||
- (void)setRoomTag:(NSString*)tag completion:(void (^)())completion
|
- (void)setRoomTag:(NSString*)tag completion:(void (^)())completion
|
||||||
|
|
35
Riot/Categories/MXRoomSummary+Riot.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <MatrixKit/MatrixKit.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Define a `MXRoomSummary` category at Riot level.
|
||||||
|
*/
|
||||||
|
@interface MXRoomSummary (Riot)
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set the room avatar in the dedicated MXKImageView.
|
||||||
|
The riot style implies to use in order :
|
||||||
|
1 - the default avatar if there is one
|
||||||
|
2 - the member avatar for < 3 members rooms
|
||||||
|
3 - the first letter of the room name.
|
||||||
|
|
||||||
|
@param mxkImageView the destinated MXKImageView.
|
||||||
|
*/
|
||||||
|
- (void)setRoomAvatarImageIn:(MXKImageView*)mxkImageView;
|
||||||
|
|
||||||
|
@end
|
43
Riot/Categories/MXRoomSummary+Riot.m
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "MXRoomSummary+Riot.h"
|
||||||
|
|
||||||
|
#import "AvatarGenerator.h"
|
||||||
|
|
||||||
|
@implementation MXRoomSummary (Riot)
|
||||||
|
|
||||||
|
- (void)setRoomAvatarImageIn:(MXKImageView*)mxkImageView
|
||||||
|
{
|
||||||
|
// Use the room display name to prepare the default avatar image.
|
||||||
|
NSString *avatarDisplayName = self.displayname;
|
||||||
|
UIImage* avatarImage = [AvatarGenerator generateAvatarForMatrixItem:self.roomId withDisplayName:avatarDisplayName];
|
||||||
|
|
||||||
|
if (self.avatar)
|
||||||
|
{
|
||||||
|
mxkImageView.enableInMemoryCache = YES;
|
||||||
|
|
||||||
|
[mxkImageView setImageURL:[self.mxSession.matrixRestClient urlOfContentThumbnail:self.avatar toFitViewSize:mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mxkImageView.image = avatarImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
mxkImageView.contentMode = UIViewContentModeScaleAspectFill;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#import <objc/runtime.h>
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`UIViewControllerRiotSearchInternals` is the internal single point storage for the search feature.
|
`UIViewControllerRiotSearchInternals` is the internal single point storage for the search feature.
|
||||||
|
|
||||||
|
@ -91,6 +93,10 @@
|
||||||
// Reset searches
|
// Reset searches
|
||||||
self.searchBar.text = @"";
|
self.searchBar.text = @"";
|
||||||
|
|
||||||
|
// Customize search bar
|
||||||
|
self.searchBar.barStyle = kRiotDesignSearchBarStyle;
|
||||||
|
self.searchBar.tintColor = kRiotDesignSearchBarTintColor;
|
||||||
|
|
||||||
// Remove navigation buttons
|
// Remove navigation buttons
|
||||||
self.navigationItem.hidesBackButton = YES;
|
self.navigationItem.hidesBackButton = YES;
|
||||||
self.navigationItem.rightBarButtonItem = nil;
|
self.navigationItem.rightBarButtonItem = nil;
|
||||||
|
@ -128,7 +134,8 @@
|
||||||
|
|
||||||
- (void)addBackgroundImageViewToView:(UIView*)view
|
- (void)addBackgroundImageViewToView:(UIView*)view
|
||||||
{
|
{
|
||||||
UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search_bg"]];
|
UIImage *searchBgImage = [MXKTools paintImage:[UIImage imageNamed:@"search_bg"] withColor:kRiotKeyboardColor];
|
||||||
|
UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:searchBgImage];
|
||||||
backgroundImageView.translatesAutoresizingMaskIntoConstraints = NO;
|
backgroundImageView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
|
|
||||||
[view addSubview:backgroundImageView];
|
[view addSubview:backgroundImageView];
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>0.5.2</string>
|
<string>0.5.3</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>0.5.2</string>
|
<string>0.5.3</string>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>ITSEncryptionExportComplianceCode</key>
|
<key>ITSEncryptionExportComplianceCode</key>
|
||||||
|
|
|
@ -746,7 +746,7 @@
|
||||||
attributes:@{NSForegroundColorAttributeName : kRiotPrimaryTextColor,
|
attributes:@{NSForegroundColorAttributeName : kRiotPrimaryTextColor,
|
||||||
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}];
|
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}];
|
||||||
[mutableSectionTitle appendAttributedString:[[NSMutableAttributedString alloc] initWithString:roomCount
|
[mutableSectionTitle appendAttributedString:[[NSMutableAttributedString alloc] initWithString:roomCount
|
||||||
attributes:@{NSForegroundColorAttributeName : kRiotColorSilver,
|
attributes:@{NSForegroundColorAttributeName : kRiotAuxiliaryColor,
|
||||||
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}]];
|
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}]];
|
||||||
|
|
||||||
sectionTitle = mutableSectionTitle;
|
sectionTitle = mutableSectionTitle;
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
|
|
||||||
#import "RoomPreviewData.h"
|
#import "RoomPreviewData.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
|
||||||
|
|
||||||
@implementation RoomPreviewData
|
@implementation RoomPreviewData
|
||||||
|
|
||||||
- (instancetype)initWithRoomId:(NSString *)roomId andSession:(MXSession *)mxSession
|
- (instancetype)initWithRoomId:(NSString *)roomId andSession:(MXSession *)mxSession
|
||||||
|
@ -88,8 +86,8 @@
|
||||||
[_roomDataSource finalizeInitialization];
|
[_roomDataSource finalizeInitialization];
|
||||||
_roomDataSource.markTimelineInitialEvent = YES;
|
_roomDataSource.markTimelineInitialEvent = YES;
|
||||||
|
|
||||||
_roomName = peekingRoom.riotDisplayname;
|
_roomName = peekingRoom.summary.displayname;
|
||||||
_roomAvatarUrl = peekingRoom.state.avatar;
|
_roomAvatarUrl = peekingRoom.summary.avatar;
|
||||||
|
|
||||||
_roomTopic = [MXTools stripNewlineCharacters:peekingRoom.state.topic];;
|
_roomTopic = [MXTools stripNewlineCharacters:peekingRoom.state.topic];;
|
||||||
_roomAliases = peekingRoom.state.aliases;
|
_roomAliases = peekingRoom.state.aliases;
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
- (void)update
|
- (void)update
|
||||||
{
|
{
|
||||||
[super update];
|
[super update];
|
||||||
roomDisplayname = self.roomSummary.room.riotDisplayname;
|
roomDisplayname = self.roomSummary.displayname;
|
||||||
if (!roomDisplayname.length)
|
if (!roomDisplayname.length)
|
||||||
{
|
{
|
||||||
roomDisplayname = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
roomDisplayname = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
||||||
|
|
|
@ -398,7 +398,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||||
attributes:@{NSForegroundColorAttributeName : kRiotPrimaryTextColor,
|
attributes:@{NSForegroundColorAttributeName : kRiotPrimaryTextColor,
|
||||||
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}];
|
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}];
|
||||||
[mutableSectionTitle appendAttributedString:[[NSMutableAttributedString alloc] initWithString:roomCount
|
[mutableSectionTitle appendAttributedString:[[NSMutableAttributedString alloc] initWithString:roomCount
|
||||||
attributes:@{NSForegroundColorAttributeName : kRiotColorSilver,
|
attributes:@{NSForegroundColorAttributeName : kRiotAuxiliaryColor,
|
||||||
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}]];
|
NSFontAttributeName: [UIFont boldSystemFontOfSize:15.0]}]];
|
||||||
|
|
||||||
sectionTitle = mutableSectionTitle;
|
sectionTitle = mutableSectionTitle;
|
||||||
|
@ -463,7 +463,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||||
|
|
||||||
missedNotifAndUnreadBadgeBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bgViewWidth, 20)];
|
missedNotifAndUnreadBadgeBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bgViewWidth, 20)];
|
||||||
[missedNotifAndUnreadBadgeBgView.layer setCornerRadius:10];
|
[missedNotifAndUnreadBadgeBgView.layer setCornerRadius:10];
|
||||||
missedNotifAndUnreadBadgeBgView.backgroundColor = kRiotColorSilver;
|
missedNotifAndUnreadBadgeBgView.backgroundColor = kRiotAuxiliaryColor;
|
||||||
|
|
||||||
[missedNotifAndUnreadBadgeBgView addSubview:missedNotifAndUnreadBadgeLabel];
|
[missedNotifAndUnreadBadgeBgView addSubview:missedNotifAndUnreadBadgeLabel];
|
||||||
missedNotifAndUnreadBadgeLabel.center = missedNotifAndUnreadBadgeBgView.center;
|
missedNotifAndUnreadBadgeLabel.center = missedNotifAndUnreadBadgeBgView.center;
|
||||||
|
@ -1487,7 +1487,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||||
|
|
||||||
NSString* tagOrder = [room.mxSession tagOrderToBeAtIndex:newPath.row from:oldPos withTag:dstRoomTag];
|
NSString* tagOrder = [room.mxSession tagOrderToBeAtIndex:newPath.row from:oldPos withTag:dstRoomTag];
|
||||||
|
|
||||||
NSLog(@"[RecentsDataSource] Update the room %@ [%@] tag from %@ to %@ with tag order %@", room.state.roomId, room.riotDisplayname, oldRoomTag, dstRoomTag, tagOrder);
|
NSLog(@"[RecentsDataSource] Update the room %@ [%@] tag from %@ to %@ with tag order %@", room.state.roomId, room.summary.displayname, oldRoomTag, dstRoomTag, tagOrder);
|
||||||
|
|
||||||
[room replaceTag:oldRoomTag
|
[room replaceTag:oldRoomTag
|
||||||
byTag:dstRoomTag
|
byTag:dstRoomTag
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
|
|
||||||
#import "FilesSearchCellData.h"
|
#import "FilesSearchCellData.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
|
||||||
|
|
||||||
@implementation FilesSearchCellData
|
@implementation FilesSearchCellData
|
||||||
@synthesize roomId, senderDisplayName;
|
@synthesize roomId, senderDisplayName;
|
||||||
@synthesize searchResult, title, message, date, shouldShowRoomDisplayName, roomDisplayName, attachment, isAttachmentWithThumbnail, attachmentIcon;
|
@synthesize searchResult, title, message, date, shouldShowRoomDisplayName, roomDisplayName, attachment, isAttachmentWithThumbnail, attachmentIcon;
|
||||||
|
@ -82,7 +80,7 @@
|
||||||
MXRoom *room = [searchDataSource.mxSession roomWithRoomId:roomId];
|
MXRoom *room = [searchDataSource.mxSession roomWithRoomId:roomId];
|
||||||
if (room)
|
if (room)
|
||||||
{
|
{
|
||||||
roomDisplayName = room.riotDisplayname;
|
roomDisplayName = room.summary.displayname;
|
||||||
if (!roomDisplayName.length)
|
if (!roomDisplayName.length)
|
||||||
{
|
{
|
||||||
roomDisplayName = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
roomDisplayName = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
||||||
|
|
|
@ -24,6 +24,10 @@
|
||||||
<string>https://riot.im/beta</string>
|
<string>https://riot.im/beta</string>
|
||||||
<key>webAppUrl</key>
|
<key>webAppUrl</key>
|
||||||
<string>https://riot.im/app</string>
|
<string>https://riot.im/app</string>
|
||||||
|
<key>integrationsUiUrl</key>
|
||||||
|
<string>https://scalar-staging.riot.im/scalar-web/</string>
|
||||||
|
<key>integrationsRestUrl</key>
|
||||||
|
<string>https://scalar-staging.riot.im/scalar/api</string>
|
||||||
<key>apnsDeviceToken</key>
|
<key>apnsDeviceToken</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>showAllEventsInRoomHistory</key>
|
<key>showAllEventsInRoomHistory</key>
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#import "RiotDesignValues.h"
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
|
#import "WidgetManager.h"
|
||||||
|
|
||||||
@interface EventFormatter ()
|
@interface EventFormatter ()
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -35,6 +37,53 @@
|
||||||
|
|
||||||
@implementation EventFormatter
|
@implementation EventFormatter
|
||||||
|
|
||||||
|
- (NSAttributedString *)attributedStringFromEvent:(MXEvent *)event withRoomState:(MXRoomState *)roomState error:(MXKEventFormatterError *)error
|
||||||
|
{
|
||||||
|
// Build strings for modular widget events
|
||||||
|
// TODO: At the moment, we support only jitsi widgets
|
||||||
|
if (event.eventType == MXEventTypeCustom
|
||||||
|
&& [event.type isEqualToString:kWidgetEventTypeString])
|
||||||
|
{
|
||||||
|
NSString *displayText;
|
||||||
|
|
||||||
|
// Prepare the display name of the sender
|
||||||
|
NSString *senderDisplayName = roomState ? [self senderDisplayNameForEvent:event withRoomState:roomState] : event.sender;
|
||||||
|
|
||||||
|
if ([event.content[@"type"] isEqualToString:kWidgetTypeJitsi])
|
||||||
|
{
|
||||||
|
// This is an alive jitsi widget
|
||||||
|
displayText = [NSString stringWithFormat:NSLocalizedStringFromTable(@"event_formatter_jitsi_widget_added", @"Vector", nil), senderDisplayName];
|
||||||
|
}
|
||||||
|
else if (event.content.count == 0)
|
||||||
|
{
|
||||||
|
// This is a closed widget
|
||||||
|
// Check if it corresponds to a jitsi widget by looking at other state events for
|
||||||
|
// this jitsi widget (widget id = event.stateKey).
|
||||||
|
for (MXEvent *widgetStateEvent in [roomState stateEventsWithType:kWidgetEventTypeString])
|
||||||
|
{
|
||||||
|
if ([widgetStateEvent.stateKey isEqualToString:event.stateKey] && [widgetStateEvent.content[@"type"] isEqualToString:kWidgetTypeJitsi])
|
||||||
|
{
|
||||||
|
displayText = [NSString stringWithFormat:NSLocalizedStringFromTable(@"event_formatter_jitsi_widget_removed", @"Vector", nil), senderDisplayName];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayText)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
*error = MXKEventFormatterErrorNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the attributed string with the right font and color for the events
|
||||||
|
return [self renderString:displayText forEvent:event];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [super attributedStringFromEvent:event withRoomState:roomState error:error];
|
||||||
|
}
|
||||||
|
|
||||||
- (NSAttributedString*)attributedStringFromEvents:(NSArray<MXEvent*>*)events withRoomState:(MXRoomState*)roomState error:(MXKEventFormatterError*)error
|
- (NSAttributedString*)attributedStringFromEvents:(NSArray<MXEvent*>*)events withRoomState:(MXRoomState*)roomState error:(MXKEventFormatterError*)error
|
||||||
{
|
{
|
||||||
NSString *displayText;
|
NSString *displayText;
|
||||||
|
@ -79,7 +128,7 @@
|
||||||
white-space: pre; \
|
white-space: pre; \
|
||||||
-coretext-fontname: Menlo-Regular; \
|
-coretext-fontname: Menlo-Regular; \
|
||||||
font-size: small; \
|
font-size: small; \
|
||||||
}", bgColor];
|
}", (unsigned long)bgColor];
|
||||||
|
|
||||||
self.defaultTextColor = kRiotPrimaryTextColor;
|
self.defaultTextColor = kRiotPrimaryTextColor;
|
||||||
self.subTitleTextColor = kRiotSecondaryTextColor;
|
self.subTitleTextColor = kRiotSecondaryTextColor;
|
||||||
|
@ -141,6 +190,225 @@
|
||||||
return senderAvatarUrl;
|
return senderAvatarUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - MXRoomSummaryUpdating
|
||||||
|
|
||||||
|
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withStateEvents:(NSArray<MXEvent *> *)stateEvents
|
||||||
|
{
|
||||||
|
BOOL ret = [super session:session updateRoomSummary:summary withStateEvents:stateEvents];
|
||||||
|
|
||||||
|
// Check whether the room display name and/or the room avatar url should be updated at Riot level.
|
||||||
|
NSString *riotRoomDisplayName;
|
||||||
|
NSString *riotRoomAvatarURL;
|
||||||
|
|
||||||
|
for (MXEvent *event in stateEvents)
|
||||||
|
{
|
||||||
|
switch (event.eventType)
|
||||||
|
{
|
||||||
|
case MXEventTypeRoomName:
|
||||||
|
case MXEventTypeRoomAliases:
|
||||||
|
case MXEventTypeRoomCanonicalAlias:
|
||||||
|
{
|
||||||
|
if (!riotRoomDisplayName.length)
|
||||||
|
{
|
||||||
|
riotRoomDisplayName = [self riotRoomDisplayNameFromRoomState:summary.room.state];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MXEventTypeRoomMember:
|
||||||
|
{
|
||||||
|
if (!riotRoomDisplayName.length)
|
||||||
|
{
|
||||||
|
riotRoomDisplayName = [self riotRoomDisplayNameFromRoomState:summary.room.state];
|
||||||
|
}
|
||||||
|
// Do not break here to check avatar url too.
|
||||||
|
}
|
||||||
|
case MXEventTypeRoomAvatar:
|
||||||
|
{
|
||||||
|
if (!riotRoomAvatarURL.length)
|
||||||
|
{
|
||||||
|
riotRoomAvatarURL = [self riotRoomAvatarURLFromRoomState:summary.room.state];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (riotRoomDisplayName.length && ![summary.displayname isEqualToString:riotRoomDisplayName])
|
||||||
|
{
|
||||||
|
summary.displayname = riotRoomDisplayName;
|
||||||
|
ret = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (riotRoomAvatarURL.length && ![summary.avatar isEqualToString:riotRoomAvatarURL])
|
||||||
|
{
|
||||||
|
summary.avatar = riotRoomAvatarURL;
|
||||||
|
ret = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Riot room display name
|
||||||
|
|
||||||
|
- (NSString *)riotRoomDisplayNameFromRoomState:(MXRoomState *)roomState
|
||||||
|
{
|
||||||
|
// this algo is the one defined in
|
||||||
|
// https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617
|
||||||
|
// calculateRoomName(room, userId)
|
||||||
|
|
||||||
|
// This display name is @"" for an "empty room" without display name (We name "empty room" a room in which the current user is the only active member).
|
||||||
|
|
||||||
|
if (roomState.name.length > 0)
|
||||||
|
{
|
||||||
|
return roomState.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *alias = roomState.canonicalAlias;
|
||||||
|
|
||||||
|
if (!alias)
|
||||||
|
{
|
||||||
|
// For rooms where canonical alias is not defined, we use the 1st alias as a workaround
|
||||||
|
NSArray *aliases = roomState.aliases;
|
||||||
|
|
||||||
|
if (aliases.count)
|
||||||
|
{
|
||||||
|
alias = [aliases[0] copy];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if there is non empty alias.
|
||||||
|
if ([alias length] > 0)
|
||||||
|
{
|
||||||
|
return alias;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString* myUserId = mxSession.myUser.userId;
|
||||||
|
|
||||||
|
NSArray* members = roomState.members;
|
||||||
|
NSMutableArray* othersActiveMembers = [[NSMutableArray alloc] init];
|
||||||
|
NSMutableArray* activeMembers = [[NSMutableArray alloc] init];
|
||||||
|
|
||||||
|
for(MXRoomMember* member in members)
|
||||||
|
{
|
||||||
|
if (member.membership != MXMembershipLeave)
|
||||||
|
{
|
||||||
|
if (![member.userId isEqualToString:myUserId])
|
||||||
|
{
|
||||||
|
[othersActiveMembers addObject:member];
|
||||||
|
}
|
||||||
|
|
||||||
|
[activeMembers addObject:member];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort the members by their creation (oldest first)
|
||||||
|
othersActiveMembers = [[othersActiveMembers sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
|
||||||
|
|
||||||
|
uint64_t originServerTs1 = 0;
|
||||||
|
uint64_t originServerTs2 = 0;
|
||||||
|
|
||||||
|
MXRoomMember* member1 = (MXRoomMember*)obj1;
|
||||||
|
MXRoomMember* member2 = (MXRoomMember*)obj2;
|
||||||
|
|
||||||
|
if (member1.originalEvent)
|
||||||
|
{
|
||||||
|
originServerTs1 = member1.originalEvent.originServerTs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (member2.originalEvent)
|
||||||
|
{
|
||||||
|
originServerTs2 = member2.originalEvent.originServerTs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originServerTs1 == originServerTs2)
|
||||||
|
{
|
||||||
|
return NSOrderedSame;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return originServerTs1 > originServerTs2 ? NSOrderedDescending : NSOrderedAscending;
|
||||||
|
}
|
||||||
|
}] mutableCopy];
|
||||||
|
|
||||||
|
|
||||||
|
NSString* displayName = @"";
|
||||||
|
|
||||||
|
if (othersActiveMembers.count == 0)
|
||||||
|
{
|
||||||
|
if (activeMembers.count == 1)
|
||||||
|
{
|
||||||
|
MXRoomMember* member = [activeMembers objectAtIndex:0];
|
||||||
|
|
||||||
|
if (member.membership == MXMembershipInvite)
|
||||||
|
{
|
||||||
|
if (member.originalEvent.sender)
|
||||||
|
{
|
||||||
|
// extract who invited us to the room
|
||||||
|
displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_invite_from", @"Vector", nil), [roomState memberName:member.originalEvent.sender]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
displayName = NSLocalizedStringFromTable(@"room_displayname_room_invite", @"Vector", nil);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (othersActiveMembers.count == 1)
|
||||||
|
{
|
||||||
|
MXRoomMember* member = [othersActiveMembers objectAtIndex:0];
|
||||||
|
|
||||||
|
displayName = [roomState memberName:member.userId];
|
||||||
|
}
|
||||||
|
else if (othersActiveMembers.count == 2)
|
||||||
|
{
|
||||||
|
MXRoomMember* member1 = [othersActiveMembers objectAtIndex:0];
|
||||||
|
MXRoomMember* member2 = [othersActiveMembers objectAtIndex:1];
|
||||||
|
|
||||||
|
displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_two_members", @"Vector", nil), [roomState memberName:member1.userId], [roomState memberName:member2.userId]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MXRoomMember* member = [othersActiveMembers objectAtIndex:0];
|
||||||
|
displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_more_than_two_members", @"Vector", nil), [roomState memberName:member.userId], othersActiveMembers.count - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Riot room avatar url
|
||||||
|
|
||||||
|
- (NSString *)riotRoomAvatarURLFromRoomState:(MXRoomState *)roomState
|
||||||
|
{
|
||||||
|
NSString* roomAvatarUrl = roomState.avatar;
|
||||||
|
|
||||||
|
if (!roomAvatarUrl)
|
||||||
|
{
|
||||||
|
// If the room has only two members, use the avatar of the second member.
|
||||||
|
NSArray* members = roomState.members;
|
||||||
|
|
||||||
|
if (members.count == 2)
|
||||||
|
{
|
||||||
|
NSString* myUserId = mxSession.myUser.userId;
|
||||||
|
|
||||||
|
for (MXRoomMember *roomMember in members)
|
||||||
|
{
|
||||||
|
if (![roomMember.userId isEqualToString:myUserId])
|
||||||
|
{
|
||||||
|
// Use the avatar of this member only if he joined or he is invited.
|
||||||
|
if (MXMembershipJoin == roomMember.membership || MXMembershipInvite == roomMember.membership)
|
||||||
|
{
|
||||||
|
roomAvatarUrl = roomMember.avatarUrl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return roomAvatarUrl;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Timestamp formatting
|
#pragma mark - Timestamp formatting
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,9 @@ extern UIColor *kRiotSecondaryTextColor; //subtitle, sending messages color.
|
||||||
extern UIColor *kRiotPlaceholderTextColor; // nil is used to keep the default color.
|
extern UIColor *kRiotPlaceholderTextColor; // nil is used to keep the default color.
|
||||||
extern UIColor *kRiotTopicTextColor;
|
extern UIColor *kRiotTopicTextColor;
|
||||||
extern UIColor *kRiotSelectedBgColor; // nil is used to keep the default color.
|
extern UIColor *kRiotSelectedBgColor; // nil is used to keep the default color.
|
||||||
|
extern UIColor *kRiotAuxiliaryColor; // kRiotColorSilver by default.
|
||||||
|
extern UIColor *kRiotOverlayColor; // fading behind dialog modals. This color includes the transparency value.
|
||||||
|
extern UIColor *kRiotKeyboardColor;
|
||||||
|
|
||||||
#pragma mark - Riot Colors
|
#pragma mark - Riot Colors
|
||||||
extern UIColor *kRiotColorGreen;
|
extern UIColor *kRiotColorGreen;
|
||||||
|
|
|
@ -26,6 +26,9 @@ UIColor *kRiotSecondaryTextColor;
|
||||||
UIColor *kRiotPlaceholderTextColor;
|
UIColor *kRiotPlaceholderTextColor;
|
||||||
UIColor *kRiotTopicTextColor;
|
UIColor *kRiotTopicTextColor;
|
||||||
UIColor *kRiotSelectedBgColor;
|
UIColor *kRiotSelectedBgColor;
|
||||||
|
UIColor *kRiotAuxiliaryColor;
|
||||||
|
UIColor *kRiotOverlayColor;
|
||||||
|
UIColor *kRiotKeyboardColor;
|
||||||
|
|
||||||
// Riot Colors
|
// Riot Colors
|
||||||
UIColor *kRiotColorGreen;
|
UIColor *kRiotColorGreen;
|
||||||
|
@ -42,6 +45,8 @@ UIColor *kRiotBgColorWhite;
|
||||||
UIColor *kRiotBgColorBlack;
|
UIColor *kRiotBgColorBlack;
|
||||||
UIColor *kRiotColorLightGrey;
|
UIColor *kRiotColorLightGrey;
|
||||||
UIColor *kRiotColorLightBlack;
|
UIColor *kRiotColorLightBlack;
|
||||||
|
UIColor *kRiotColorLightKeyboard;
|
||||||
|
UIColor *kRiotColorDarkKeyboard;
|
||||||
|
|
||||||
// Riot Text Colors
|
// Riot Text Colors
|
||||||
UIColor *kRiotTextColorBlack;
|
UIColor *kRiotTextColorBlack;
|
||||||
|
@ -91,6 +96,9 @@ UIColor *kRiotDesignSearchBarTintColor = nil;
|
||||||
kRiotColorLightGrey = UIColorFromRGB(0xF2F2F2);
|
kRiotColorLightGrey = UIColorFromRGB(0xF2F2F2);
|
||||||
kRiotColorLightBlack = UIColorFromRGB(0x353535);
|
kRiotColorLightBlack = UIColorFromRGB(0x353535);
|
||||||
|
|
||||||
|
kRiotColorLightKeyboard = UIColorFromRGB(0xE7E7E7);
|
||||||
|
kRiotColorDarkKeyboard = UIColorFromRGB(0x7E7E7E);
|
||||||
|
|
||||||
kRiotTextColorBlack = UIColorFromRGB(0x3C3C3C);
|
kRiotTextColorBlack = UIColorFromRGB(0x3C3C3C);
|
||||||
kRiotTextColorDarkGray = UIColorFromRGB(0x4A4A4A);
|
kRiotTextColorDarkGray = UIColorFromRGB(0x4A4A4A);
|
||||||
kRiotTextColorGray = UIColorFromRGB(0x9D9D9D);
|
kRiotTextColorGray = UIColorFromRGB(0x9D9D9D);
|
||||||
|
@ -135,6 +143,10 @@ UIColor *kRiotDesignSearchBarTintColor = nil;
|
||||||
kRiotDesignStatusBarStyle = UIStatusBarStyleLightContent;
|
kRiotDesignStatusBarStyle = UIStatusBarStyleLightContent;
|
||||||
kRiotDesignSearchBarStyle = UIBarStyleBlack;
|
kRiotDesignSearchBarStyle = UIBarStyleBlack;
|
||||||
kRiotDesignSearchBarTintColor = kRiotColorGreen;
|
kRiotDesignSearchBarTintColor = kRiotColorGreen;
|
||||||
|
|
||||||
|
kRiotAuxiliaryColor = kRiotTextColorGray;
|
||||||
|
kRiotOverlayColor = [UIColor colorWithWhite:0.3 alpha:0.5];
|
||||||
|
kRiotKeyboardColor = kRiotColorDarkKeyboard;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -150,6 +162,10 @@ UIColor *kRiotDesignSearchBarTintColor = nil;
|
||||||
kRiotDesignStatusBarStyle = UIStatusBarStyleDefault;
|
kRiotDesignStatusBarStyle = UIStatusBarStyleDefault;
|
||||||
kRiotDesignSearchBarStyle = UIBarStyleDefault;
|
kRiotDesignSearchBarStyle = UIBarStyleDefault;
|
||||||
kRiotDesignSearchBarTintColor = nil; // Default tint color.
|
kRiotDesignSearchBarTintColor = nil; // Default tint color.
|
||||||
|
|
||||||
|
kRiotAuxiliaryColor = kRiotColorSilver;
|
||||||
|
kRiotOverlayColor = [UIColor colorWithWhite:0.7 alpha:0.5];
|
||||||
|
kRiotKeyboardColor = kRiotColorLightKeyboard;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:kRiotDesignValuesDidChangeThemeNotification object:nil];
|
[[NSNotificationCenter defaultCenter] postNotificationName:kRiotDesignValuesDidChangeThemeNotification object:nil];
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#import <MatrixSDK/MatrixSDK.h>
|
#import <MatrixSDK/MatrixSDK.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `Widget` class represents scalar widget information.
|
The `Widget` class represents modular widget information.
|
||||||
*/
|
*/
|
||||||
@interface Widget : NSObject
|
@interface Widget : NSObject
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
{
|
{
|
||||||
if (![widgetEvent.type isEqualToString:kWidgetEventTypeString])
|
if (![widgetEvent.type isEqualToString:kWidgetEventTypeString])
|
||||||
{
|
{
|
||||||
// The Widget class works only with scalar, aka "im.vector.modular.widgets", widgets
|
// The Widget class works only with modular, aka "im.vector.modular.widgets", widgets
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,18 @@
|
||||||
withString:mxSession.myUser.displayname ? mxSession.myUser.displayname : mxSession.myUser.userId];
|
withString:mxSession.myUser.displayname ? mxSession.myUser.displayname : mxSession.myUser.userId];
|
||||||
_url = [_url stringByReplacingOccurrencesOfString:@"$matrix_avatar_url"
|
_url = [_url stringByReplacingOccurrencesOfString:@"$matrix_avatar_url"
|
||||||
withString:mxSession.myUser.avatarUrl ? mxSession.myUser.avatarUrl : @""];
|
withString:mxSession.myUser.avatarUrl ? mxSession.myUser.avatarUrl : @""];
|
||||||
|
|
||||||
|
// And their scalar token
|
||||||
|
NSString *scalarToken = [[WidgetManager sharedManager] scalarTokenForMXSession:mxSession];
|
||||||
|
if (scalarToken)
|
||||||
|
{
|
||||||
|
_url = [_url stringByAppendingString:[NSString stringWithFormat:@"&scalar_token=%@", scalarToken]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Some widget can live without scalar token (ex: Jitsi widget)
|
||||||
|
NSLog(@"[Widget] Note: There is no scalar token for %@", self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#import "Widget.h"
|
#import "Widget.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The type of matrix event used for scalar widgets.
|
The type of matrix event used for modular widgets.
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSString *const kWidgetEventTypeString;
|
FOUNDATION_EXPORT NSString *const kWidgetEventTypeString;
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ WidgetManagerErrorCode;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `WidgetManager` helps to handle scalar widgets.
|
The `WidgetManager` helps to handle modular widgets.
|
||||||
*/
|
*/
|
||||||
@interface WidgetManager : NSObject
|
@interface WidgetManager : NSObject
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ WidgetManagerErrorCode;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add a scalar widget to a room.
|
Add a modular widget to a room.
|
||||||
|
|
||||||
@param widgetId the id of the widget.
|
@param widgetId the id of the widget.
|
||||||
@param widgetContent the widget content.
|
@param widgetContent the widget content.
|
||||||
|
@ -139,4 +139,38 @@ WidgetManagerErrorCode;
|
||||||
- (void)addMatrixSession:(MXSession*)mxSession;
|
- (void)addMatrixSession:(MXSession*)mxSession;
|
||||||
- (void)removeMatrixSession:(MXSession*)mxSession;
|
- (void)removeMatrixSession:(MXSession*)mxSession;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Delete the data associated with an user.
|
||||||
|
|
||||||
|
@param userId the id of the user.
|
||||||
|
*/
|
||||||
|
- (void)deleteDataForUser:(NSString*)userId;
|
||||||
|
|
||||||
|
#pragma mark - Modular interface
|
||||||
|
|
||||||
|
/**
|
||||||
|
Make sure there is a scalar token for the given Matrix session.
|
||||||
|
|
||||||
|
If no token was gotten and stored before, the operation will make http requests
|
||||||
|
to get one.
|
||||||
|
|
||||||
|
@param mxSession the session to check.
|
||||||
|
|
||||||
|
@param success A block object called when the operation succeeds.
|
||||||
|
@param failure A block object called when the operation fails.
|
||||||
|
*/
|
||||||
|
- (MXHTTPOperation *)getScalarTokenForMXSession:(MXSession*)mxSession
|
||||||
|
success:(void (^)(NSString *scalarToken))success
|
||||||
|
failure:(void (^)(NSError *error))failure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The current scalar token for the given Matrix session.
|
||||||
|
|
||||||
|
It may be nil if `getScalarTokenForMXSession` was never called before.
|
||||||
|
|
||||||
|
@param mxSession the session to check.
|
||||||
|
@return the current scalar token .
|
||||||
|
*/
|
||||||
|
- (NSString *)scalarTokenForMXSession:(MXSession*)mxSession;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#import "WidgetManager.h"
|
#import "WidgetManager.h"
|
||||||
|
|
||||||
|
#import "MXKAppSettings.h"
|
||||||
|
|
||||||
#pragma mark - Contants
|
#pragma mark - Contants
|
||||||
|
|
||||||
NSString *const kWidgetEventTypeString = @"im.vector.modular.widgets";
|
NSString *const kWidgetEventTypeString = @"im.vector.modular.widgets";
|
||||||
|
@ -40,6 +42,9 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain";
|
||||||
// MXSession kind of hash -> (Widget id -> `createWidget:` failure block).
|
// MXSession kind of hash -> (Widget id -> `createWidget:` failure block).
|
||||||
NSMutableDictionary<NSString*,
|
NSMutableDictionary<NSString*,
|
||||||
NSMutableDictionary<NSString*, void (^)(NSError *error)>*> *failureBlockForWidgetCreation;
|
NSMutableDictionary<NSString*, void (^)(NSError *error)>*> *failureBlockForWidgetCreation;
|
||||||
|
|
||||||
|
// User id -> scalar token
|
||||||
|
NSMutableDictionary<NSString*, NSString*> *scalarTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -66,6 +71,13 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain";
|
||||||
widgetEventListener = [NSMutableDictionary dictionary];
|
widgetEventListener = [NSMutableDictionary dictionary];
|
||||||
successBlockForWidgetCreation = [NSMutableDictionary dictionary];
|
successBlockForWidgetCreation = [NSMutableDictionary dictionary];
|
||||||
failureBlockForWidgetCreation = [NSMutableDictionary dictionary];
|
failureBlockForWidgetCreation = [NSMutableDictionary dictionary];
|
||||||
|
|
||||||
|
[self load];
|
||||||
|
|
||||||
|
if (!scalarTokens)
|
||||||
|
{
|
||||||
|
scalarTokens = [NSMutableDictionary dictionary];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -157,8 +169,12 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain";
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NSString *hash = [NSString stringWithFormat:@"%p", room.mxSession];
|
||||||
|
successBlockForWidgetCreation[hash][widgetId] = success;
|
||||||
|
failureBlockForWidgetCreation[hash][widgetId] = failure;
|
||||||
|
|
||||||
// Send a state event with the widget data
|
// Send a state event with the widget data
|
||||||
// TODO: This API will be shortly replaced by a pure scalar API
|
// TODO: This API will be shortly replaced by a pure modular API
|
||||||
return [room sendStateEventOfType:kWidgetEventTypeString
|
return [room sendStateEventOfType:kWidgetEventTypeString
|
||||||
content:widgetContent
|
content:widgetContent
|
||||||
stateKey:widgetId
|
stateKey:widgetId
|
||||||
|
@ -181,14 +197,11 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain";
|
||||||
NSString *confId = [room.roomId substringWithRange:NSMakeRange(1, [room.roomId rangeOfString:@":"].location - 1)];
|
NSString *confId = [room.roomId substringWithRange:NSMakeRange(1, [room.roomId rangeOfString:@":"].location - 1)];
|
||||||
confId = [confId stringByAppendingString:widgetSessionId];
|
confId = [confId stringByAppendingString:widgetSessionId];
|
||||||
|
|
||||||
// TODO: This url may come from scalar API
|
// TODO: This url should come from modular API
|
||||||
// Note: this url can be used as is inside a web container (like iframe for Riot-web)
|
// Note: this url can be used as is inside a web container (like iframe for Riot-web)
|
||||||
// Riot-iOS does not directly use it but extracts params from it (see `[JitsiViewController openWidget:withVideo:]`)
|
// Riot-iOS does not directly use it but extracts params from it (see `[JitsiViewController openWidget:withVideo:]`)
|
||||||
NSString *url = [NSString stringWithFormat:@"https://scalar-staging.riot.im/scalar/api/widgets/jitsi.html?confId=%@&isAudioConf=%@&displayName=$matrix_display_name&avatarUrl=$matrix_avatar_url&email=$matrix_user_id@", confId, video ? @"false" : @"true"];
|
NSString *modularRestUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsRestUrl"];
|
||||||
|
NSString *url = [NSString stringWithFormat:@"%@/widgets/jitsi.html?confId=%@&isAudioConf=%@&displayName=$matrix_display_name&avatarUrl=$matrix_avatar_url&email=$matrix_user_id@", modularRestUrl, confId, video ? @"false" : @"true"];
|
||||||
NSString *hash = [NSString stringWithFormat:@"%p", room.mxSession];
|
|
||||||
successBlockForWidgetCreation[hash][widgetId] = success;
|
|
||||||
failureBlockForWidgetCreation[hash][widgetId] = failure;
|
|
||||||
|
|
||||||
return [self createWidget:widgetId
|
return [self createWidget:widgetId
|
||||||
withContent:@{
|
withContent:@{
|
||||||
|
@ -216,7 +229,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send a state event with an empty content to disable the widget
|
// Send a state event with an empty content to disable the widget
|
||||||
// TODO: This API will be shortly replaced by a pure scalar API
|
// TODO: This API will be shortly replaced by a pure modular API
|
||||||
return [room sendStateEventOfType:kWidgetEventTypeString
|
return [room sendStateEventOfType:kWidgetEventTypeString
|
||||||
content:@{}
|
content:@{}
|
||||||
stateKey:widgetId
|
stateKey:widgetId
|
||||||
|
@ -326,4 +339,100 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain";
|
||||||
[failureBlockForWidgetCreation removeObjectForKey:hash];
|
[failureBlockForWidgetCreation removeObjectForKey:hash];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)deleteDataForUser:(NSString *)userId
|
||||||
|
{
|
||||||
|
[scalarTokens removeObjectForKey:userId];
|
||||||
|
[self save];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Modular interface
|
||||||
|
|
||||||
|
- (NSString *)scalarTokenForMXSession:(MXSession *)mxSession
|
||||||
|
{
|
||||||
|
return scalarTokens[mxSession.myUser.userId];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (MXHTTPOperation *)getScalarTokenForMXSession:(MXSession*)mxSession
|
||||||
|
success:(void (^)(NSString *scalarToken))success
|
||||||
|
failure:(void (^)(NSError *error))failure;
|
||||||
|
{
|
||||||
|
MXHTTPOperation *operation;
|
||||||
|
|
||||||
|
__block NSString *scalarToken = [self scalarTokenForMXSession:mxSession];
|
||||||
|
if (scalarToken)
|
||||||
|
{
|
||||||
|
success(scalarToken);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
operation = [mxSession.matrixRestClient openIdToken:^(MXOpenIdToken *tokenObject) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
// Exchange the token for a scalar token
|
||||||
|
NSString *modularRestUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsRestUrl"];
|
||||||
|
|
||||||
|
MXHTTPClient *httpClient = [[MXHTTPClient alloc] initWithBaseURL:modularRestUrl andOnUnrecognizedCertificateBlock:nil];
|
||||||
|
|
||||||
|
MXHTTPOperation *operation2 = [httpClient requestWithMethod:@"POST"
|
||||||
|
path:@"register"
|
||||||
|
parameters:tokenObject.JSONDictionary
|
||||||
|
success:^(NSDictionary *JSONResponse) {
|
||||||
|
|
||||||
|
MXJSONModelSetString(scalarToken, JSONResponse[@"scalar_token"])
|
||||||
|
self->scalarTokens[mxSession.myUser.userId] = scalarToken;
|
||||||
|
|
||||||
|
[self save];
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
success(scalarToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
NSLog(@"[WidgetManager] getScalarTokenForMXSession. Error in modular/register request");
|
||||||
|
|
||||||
|
if (failure)
|
||||||
|
{
|
||||||
|
failure(error);
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
[operation mutateTo:operation2];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
NSLog(@"[WidgetManager] getScalarTokenForMXSession. Error in openIdToken request");
|
||||||
|
|
||||||
|
if (failure)
|
||||||
|
{
|
||||||
|
failure(error);
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Private methods
|
||||||
|
|
||||||
|
- (void)load
|
||||||
|
{
|
||||||
|
NSUserDefaults *userDefaults = [MXKAppSettings standardAppSettings].sharedUserDefaults;
|
||||||
|
scalarTokens = [NSMutableDictionary dictionaryWithDictionary:[userDefaults objectForKey:@"scalarTokens"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)save
|
||||||
|
{
|
||||||
|
NSUserDefaults *userDefaults = [MXKAppSettings standardAppSettings].sharedUserDefaults;
|
||||||
|
|
||||||
|
[userDefaults setObject:scalarTokens forKey:@"scalarTokens"];
|
||||||
|
[userDefaults synchronize];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -61,6 +61,11 @@
|
||||||
self.view.backgroundColor = kRiotPrimaryBgColor;
|
self.view.backgroundColor = kRiotPrimaryBgColor;
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
|
self.navigationBar.tintColor = kRiotSecondaryBgColor;
|
||||||
|
self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: kRiotPrimaryTextColor};
|
||||||
|
self.backButton.tintColor = kRiotColorGreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated
|
- (void)viewWillAppear:(BOOL)animated
|
||||||
|
|
|
@ -176,6 +176,7 @@
|
||||||
|
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
[self.authInputsView customizeViewRendering];
|
[self.authInputsView customizeViewRendering];
|
||||||
|
|
||||||
|
@ -722,6 +723,27 @@
|
||||||
// Hide the custom server details in order to save customized inputs
|
// Hide the custom server details in order to save customized inputs
|
||||||
[self hideCustomServers:YES];
|
[self hideCustomServers:YES];
|
||||||
|
|
||||||
|
// Create DM with Riot-bot on new account creation.
|
||||||
|
if (self.authType == MXKAuthenticationTypeRegister)
|
||||||
|
{
|
||||||
|
MXKAccount *account = [[MXKAccountManager sharedManager] accountForUserId:userId];
|
||||||
|
|
||||||
|
[account.mxSession createRoom:nil
|
||||||
|
visibility:kMXRoomDirectoryVisibilityPrivate
|
||||||
|
roomAlias:nil
|
||||||
|
topic:nil
|
||||||
|
invite:@[@"@riot-bot:matrix.org"]
|
||||||
|
invite3PID:nil
|
||||||
|
isDirect:YES
|
||||||
|
preset:kMXRoomPresetTrustedPrivateChat
|
||||||
|
success:nil
|
||||||
|
failure:^(NSError *error) {
|
||||||
|
|
||||||
|
NSLog(@"[AuthenticationVC] Create chat with riot-bot failed");
|
||||||
|
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
// Remove auth view controller on successful login
|
// Remove auth view controller on successful login
|
||||||
if (self.navigationController)
|
if (self.navigationController)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
@property (nonatomic) BOOL sendLogs;
|
@property (nonatomic) BOOL sendLogs;
|
||||||
@property (nonatomic) BOOL sendScreenshot;
|
@property (nonatomic) BOOL sendScreenshot;
|
||||||
|
|
||||||
|
@property (weak, nonatomic) IBOutlet UIView *overlayView;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation BugReportViewController
|
@implementation BugReportViewController
|
||||||
|
@ -87,9 +89,6 @@
|
||||||
{
|
{
|
||||||
_titleLabel.text = NSLocalizedStringFromTable(@"bug_report_title", @"Vector", nil);
|
_titleLabel.text = NSLocalizedStringFromTable(@"bug_report_title", @"Vector", nil);
|
||||||
_descriptionLabel.text = NSLocalizedStringFromTable(@"bug_report_description", @"Vector", nil);
|
_descriptionLabel.text = NSLocalizedStringFromTable(@"bug_report_description", @"Vector", nil);
|
||||||
|
|
||||||
// Allow to send empty description for crash report but not for bug report
|
|
||||||
_sendButton.enabled = NO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[_cancelButton setTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] forState:UIControlStateNormal];
|
[_cancelButton setTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] forState:UIControlStateNormal];
|
||||||
|
@ -137,6 +136,10 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
|
self.overlayView.backgroundColor = kRiotOverlayColor;
|
||||||
|
self.overlayView.alpha = 1.0;
|
||||||
|
|
||||||
self.containerView.backgroundColor = kRiotPrimaryBgColor;
|
self.containerView.backgroundColor = kRiotPrimaryBgColor;
|
||||||
self.sendingContainer.backgroundColor = kRiotPrimaryBgColor;
|
self.sendingContainer.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16F73" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
|
||||||
<device id="retina5_5" orientation="portrait">
|
<device id="retina5_5" orientation="portrait">
|
||||||
<adaptation id="fullscreen"/>
|
<adaptation id="fullscreen"/>
|
||||||
</device>
|
</device>
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
<outlet property="containerView" destination="7U4-br-xRl" id="kJI-mL-pkw"/>
|
<outlet property="containerView" destination="7U4-br-xRl" id="kJI-mL-pkw"/>
|
||||||
<outlet property="descriptionLabel" destination="Q2l-Yi-SlQ" id="VPO-0N-huQ"/>
|
<outlet property="descriptionLabel" destination="Q2l-Yi-SlQ" id="VPO-0N-huQ"/>
|
||||||
<outlet property="logsDescriptionLabel" destination="ggt-kq-Zy9" id="3Nl-m3-1EE"/>
|
<outlet property="logsDescriptionLabel" destination="ggt-kq-Zy9" id="3Nl-m3-1EE"/>
|
||||||
|
<outlet property="overlayView" destination="CXZ-fI-kPd" id="ZJb-0n-Tmf"/>
|
||||||
<outlet property="scrollView" destination="4fS-3N-tbW" id="Dsn-gw-VuW"/>
|
<outlet property="scrollView" destination="4fS-3N-tbW" id="Dsn-gw-VuW"/>
|
||||||
<outlet property="scrollViewBottomConstraint" destination="fnt-1e-ZW4" id="W1B-1m-h13"/>
|
<outlet property="scrollViewBottomConstraint" destination="fnt-1e-ZW4" id="W1B-1m-h13"/>
|
||||||
<outlet property="sendButton" destination="z8A-7B-jAi" id="VSX-a9-yfs"/>
|
<outlet property="sendButton" destination="z8A-7B-jAi" id="VSX-a9-yfs"/>
|
||||||
|
|
|
@ -21,12 +21,12 @@
|
||||||
|
|
||||||
#import "AvatarGenerator.h"
|
#import "AvatarGenerator.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
|
||||||
|
|
||||||
#import "UsersDevicesViewController.h"
|
#import "UsersDevicesViewController.h"
|
||||||
|
|
||||||
#import "RiotNavigationController.h"
|
#import "RiotNavigationController.h"
|
||||||
|
|
||||||
|
#import "IncomingCallView.h"
|
||||||
|
|
||||||
@interface CallViewController ()
|
@interface CallViewController ()
|
||||||
{
|
{
|
||||||
// Display a gradient view above the screen
|
// Display a gradient view above the screen
|
||||||
|
@ -99,6 +99,7 @@
|
||||||
self.view.backgroundColor = kRiotPrimaryBgColor;
|
self.view.backgroundColor = kRiotPrimaryBgColor;
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.callerNameLabel.textColor = kRiotPrimaryTextColor;
|
self.callerNameLabel.textColor = kRiotPrimaryTextColor;
|
||||||
self.callStatusLabel.textColor = kRiotTopicTextColor;
|
self.callStatusLabel.textColor = kRiotTopicTextColor;
|
||||||
|
@ -196,6 +197,37 @@
|
||||||
gradientMaskLayer = nil;
|
gradientMaskLayer = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (UIView *)createIncomingCallView
|
||||||
|
{
|
||||||
|
NSString *avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.peer.avatarUrl
|
||||||
|
toFitViewSize:IncomingCallView.callerAvatarSize
|
||||||
|
withMethod:MXThumbnailingMethodCrop];
|
||||||
|
|
||||||
|
NSString *callInfo;
|
||||||
|
if (self.mxCall.isVideoCall)
|
||||||
|
callInfo = NSLocalizedStringFromTable(@"call_incoming_video", @"Vector", nil);
|
||||||
|
else
|
||||||
|
callInfo = NSLocalizedStringFromTable(@"call_incoming_voice", @"Vector", nil);
|
||||||
|
|
||||||
|
IncomingCallView *incomingCallView = [[IncomingCallView alloc] initWithCallerAvatarURL:avatarThumbURL
|
||||||
|
placeholderImage:self.picturePlaceholder
|
||||||
|
callerName:self.peer.displayname
|
||||||
|
callInfo:callInfo];
|
||||||
|
|
||||||
|
// Incoming call is retained by call vc so use weak to avoid retain cycle
|
||||||
|
__weak typeof(self) weakSelf = self;
|
||||||
|
|
||||||
|
incomingCallView.onAnswer = ^{
|
||||||
|
[weakSelf onButtonPressed:weakSelf.answerCallButton];
|
||||||
|
};
|
||||||
|
|
||||||
|
incomingCallView.onReject = ^{
|
||||||
|
[weakSelf onButtonPressed:weakSelf.rejectCallButton];
|
||||||
|
};
|
||||||
|
|
||||||
|
return incomingCallView;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - MXCallDelegate
|
#pragma mark - MXCallDelegate
|
||||||
|
|
||||||
- (void)call:(MXCall *)call didEncounterError:(NSError *)error
|
- (void)call:(MXCall *)call didEncounterError:(NSError *)error
|
||||||
|
@ -325,7 +357,7 @@
|
||||||
}
|
}
|
||||||
else if (self.mxCall.room)
|
else if (self.mxCall.room)
|
||||||
{
|
{
|
||||||
return [AvatarGenerator generateAvatarForMatrixItem:self.mxCall.room.roomId withDisplayName:self.mxCall.room.riotDisplayname size:self.callerImageViewWidthConstraint.constant andFontSize:fontSize];
|
return [AvatarGenerator generateAvatarForMatrixItem:self.mxCall.room.roomId withDisplayName:self.mxCall.room.summary.displayname size:self.callerImageViewWidthConstraint.constant andFontSize:fontSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [UIImage imageNamed:@"placeholder"];
|
return [UIImage imageNamed:@"placeholder"];
|
||||||
|
@ -354,7 +386,7 @@
|
||||||
}
|
}
|
||||||
else if (self.mxCall.isConferenceCall)
|
else if (self.mxCall.isConferenceCall)
|
||||||
{
|
{
|
||||||
peerDisplayName = self.mxCall.room.riotDisplayname;
|
peerDisplayName = self.mxCall.room.summary.displayname;
|
||||||
peerAvatarURL = self.mxCall.room.state.avatar;
|
peerAvatarURL = self.mxCall.room.state.avatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.headerView.backgroundColor = kRiotSecondaryBgColor;
|
self.headerView.backgroundColor = kRiotSecondaryBgColor;
|
||||||
self.contactNameLabel.textColor = kRiotPrimaryTextColor;
|
self.contactNameLabel.textColor = kRiotPrimaryTextColor;
|
||||||
|
|
|
@ -105,6 +105,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.contactsTableView.backgroundColor = ((self.contactsTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.contactsTableView.backgroundColor = ((self.contactsTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.searchBar.barStyle = kRiotDesignSearchBarStyle;
|
self.searchBar.barStyle = kRiotDesignSearchBarStyle;
|
||||||
self.searchBar.tintColor = kRiotDesignSearchBarTintColor;
|
self.searchBar.tintColor = kRiotDesignSearchBarTintColor;
|
||||||
|
|
|
@ -121,6 +121,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -79,6 +79,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -70,6 +70,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.searchBar.barStyle = kRiotDesignSearchBarStyle;
|
self.searchBar.barStyle = kRiotDesignSearchBarStyle;
|
||||||
self.searchBar.tintColor = kRiotDesignSearchBarTintColor;
|
self.searchBar.tintColor = kRiotDesignSearchBarTintColor;
|
||||||
|
|
|
@ -114,6 +114,7 @@
|
||||||
self.assetsCollectionView.backgroundColor = kRiotPrimaryBgColor;
|
self.assetsCollectionView.backgroundColor = kRiotPrimaryBgColor;
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (UIStatusBarStyle)preferredStatusBarStyle
|
- (UIStatusBarStyle)preferredStatusBarStyle
|
||||||
|
|
|
@ -183,6 +183,7 @@ static void *RecordingContext = &RecordingContext;
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.cameraVideoCaptureProgressView.progressColor = kRiotPrimaryBgColor;
|
self.cameraVideoCaptureProgressView.progressColor = kRiotPrimaryBgColor;
|
||||||
self.cameraVideoCaptureProgressView.unprogressColor = [UIColor clearColor];
|
self.cameraVideoCaptureProgressView.unprogressColor = [UIColor clearColor];
|
||||||
|
|
|
@ -96,6 +96,10 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
|
self.overlayView.backgroundColor = kRiotOverlayColor;
|
||||||
|
self.overlayView.alpha = 1.0;
|
||||||
|
|
||||||
self.titleLabel.textColor = kRiotPrimaryTextColor;
|
self.titleLabel.textColor = kRiotPrimaryTextColor;
|
||||||
self.containerView.backgroundColor = kRiotPrimaryBgColor;
|
self.containerView.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
|
|
@ -159,6 +159,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Use the primary bg color for the recents table view in plain style.
|
// Use the primary bg color for the recents table view in plain style.
|
||||||
self.recentsTableView.backgroundColor = kRiotPrimaryBgColor;
|
self.recentsTableView.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -111,6 +111,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.bubblesTableView.backgroundColor = ((self.bubblesTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.bubblesTableView.backgroundColor = ((self.bubblesTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -209,6 +209,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.memberHeaderView.backgroundColor = kRiotSecondaryBgColor;
|
self.memberHeaderView.backgroundColor = kRiotSecondaryBgColor;
|
||||||
self.roomMemberNameLabel.textColor = kRiotPrimaryTextColor;
|
self.roomMemberNameLabel.textColor = kRiotPrimaryTextColor;
|
||||||
|
|
|
@ -74,6 +74,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.searchTableView.backgroundColor = ((self.searchTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -158,10 +158,11 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
[self refreshSearchBarItemsColor:_searchBarView];
|
[self refreshSearchBarItemsColor:_searchBarView];
|
||||||
|
|
||||||
_searchBarHeaderBorder.backgroundColor = kRiotColorSilver;
|
_searchBarHeaderBorder.backgroundColor = kRiotAuxiliaryColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
|
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
|
||||||
// Add the Vector background image when search bar is empty
|
// Add the Riot background image when search bar is empty
|
||||||
[self addBackgroundImageViewToView:self.view];
|
[self addBackgroundImageViewToView:self.view];
|
||||||
|
|
||||||
// Initialize here the data sources if a matrix session has been already set.
|
// Initialize here the data sources if a matrix session has been already set.
|
||||||
|
@ -72,6 +72,18 @@
|
||||||
self.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
self.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)userInterfaceThemeDidChange
|
||||||
|
{
|
||||||
|
[super userInterfaceThemeDidChange];
|
||||||
|
|
||||||
|
UIImageView *backgroundImageView = self.backgroundImageView;
|
||||||
|
if (backgroundImageView)
|
||||||
|
{
|
||||||
|
UIImage *image = [MXKTools paintImage:backgroundImageView.image withColor:kRiotKeyboardColor];
|
||||||
|
backgroundImageView.image = image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)destroy
|
- (void)destroy
|
||||||
{
|
{
|
||||||
[super destroy];
|
[super destroy];
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#import "Tools.h"
|
#import "Tools.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
#import "MXRoom+Riot.h"
|
||||||
|
#import "MXRoomSummary+Riot.h"
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
@ -45,9 +46,10 @@
|
||||||
#define ROOM_SETTINGS_MAIN_SECTION_ROW_NAME 1
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_NAME 1
|
||||||
#define ROOM_SETTINGS_MAIN_SECTION_ROW_TOPIC 2
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_TOPIC 2
|
||||||
#define ROOM_SETTINGS_MAIN_SECTION_ROW_TAG 3
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_TAG 3
|
||||||
#define ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS 4
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_DIRECT_CHAT 4
|
||||||
#define ROOM_SETTINGS_MAIN_SECTION_ROW_LEAVE 5
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS 5
|
||||||
#define ROOM_SETTINGS_MAIN_SECTION_ROW_COUNT 6
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_LEAVE 6
|
||||||
|
#define ROOM_SETTINGS_MAIN_SECTION_ROW_COUNT 7
|
||||||
|
|
||||||
#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_INVITED_ONLY 0
|
#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_INVITED_ONLY 0
|
||||||
#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_ANYONE_APART_FROM_GUEST 1
|
#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_ANYONE_APART_FROM_GUEST 1
|
||||||
|
@ -70,6 +72,7 @@ NSString *const kRoomSettingsNameKey = @"kRoomSettingsNameKey";
|
||||||
NSString *const kRoomSettingsTopicKey = @"kRoomSettingsTopicKey";
|
NSString *const kRoomSettingsTopicKey = @"kRoomSettingsTopicKey";
|
||||||
NSString *const kRoomSettingsTagKey = @"kRoomSettingsTagKey";
|
NSString *const kRoomSettingsTagKey = @"kRoomSettingsTagKey";
|
||||||
NSString *const kRoomSettingsMuteNotifKey = @"kRoomSettingsMuteNotifKey";
|
NSString *const kRoomSettingsMuteNotifKey = @"kRoomSettingsMuteNotifKey";
|
||||||
|
NSString *const kRoomSettingsDirectChatKey = @"kRoomSettingsDirectChatKey";
|
||||||
NSString *const kRoomSettingsJoinRuleKey = @"kRoomSettingsJoinRuleKey";
|
NSString *const kRoomSettingsJoinRuleKey = @"kRoomSettingsJoinRuleKey";
|
||||||
NSString *const kRoomSettingsGuestAccessKey = @"kRoomSettingsGuestAccessKey";
|
NSString *const kRoomSettingsGuestAccessKey = @"kRoomSettingsGuestAccessKey";
|
||||||
NSString *const kRoomSettingsDirectoryKey = @"kRoomSettingsDirectoryKey";
|
NSString *const kRoomSettingsDirectoryKey = @"kRoomSettingsDirectoryKey";
|
||||||
|
@ -137,11 +140,6 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
// picker
|
// picker
|
||||||
MediaPickerViewController* mediaPicker;
|
MediaPickerViewController* mediaPicker;
|
||||||
|
|
||||||
// switches
|
|
||||||
UISwitch *roomNotifSwitch;
|
|
||||||
UISwitch *roomEncryptionSwitch;
|
|
||||||
UISwitch *roomEncryptionBlacklistUnverifiedDevicesSwitch;
|
|
||||||
|
|
||||||
// Observe kAppDelegateDidTapStatusBarNotification to handle tap on clock status bar.
|
// Observe kAppDelegateDidTapStatusBarNotification to handle tap on clock status bar.
|
||||||
id appDelegateDidTapStatusBarNotificationObserver;
|
id appDelegateDidTapStatusBarNotificationObserver;
|
||||||
|
|
||||||
|
@ -246,6 +244,7 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
@ -1596,7 +1595,7 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
|
|
||||||
if ([updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey])
|
if ([updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey])
|
||||||
{
|
{
|
||||||
if (roomNotifSwitch.on)
|
if (((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey]).boolValue)
|
||||||
{
|
{
|
||||||
[mxRoom mentionsOnly:^{
|
[mxRoom mentionsOnly:^{
|
||||||
|
|
||||||
|
@ -1627,6 +1626,45 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ([updatedItemsDict objectForKey:kRoomSettingsDirectChatKey])
|
||||||
|
{
|
||||||
|
pendingOperation = [mxRoom setIsDirect:((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsDirectChatKey]).boolValue withUserId:nil success:^{
|
||||||
|
|
||||||
|
if (weakSelf)
|
||||||
|
{
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
|
self->pendingOperation = nil;
|
||||||
|
[self->updatedItemsDict removeObjectForKey:kRoomSettingsDirectChatKey];
|
||||||
|
[self onSave:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
|
||||||
|
NSLog(@"[RoomSettingsViewController] Altering DMness failed");
|
||||||
|
|
||||||
|
if (weakSelf)
|
||||||
|
{
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
|
self->pendingOperation = nil;
|
||||||
|
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
|
||||||
|
NSString* message = error.localizedDescription;
|
||||||
|
if (!message.length)
|
||||||
|
{
|
||||||
|
message = NSLocalizedStringFromTable(@"room_details_fail_to_update_room_direct", @"Vector", nil);
|
||||||
|
}
|
||||||
|
[self onSaveFailed:message withKey:kRoomSettingsDirectChatKey];
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Room directory visibility
|
// Room directory visibility
|
||||||
MXRoomDirectoryVisibility directoryVisibility = [updatedItemsDict objectForKey:kRoomSettingsDirectoryKey];
|
MXRoomDirectoryVisibility directoryVisibility = [updatedItemsDict objectForKey:kRoomSettingsDirectoryKey];
|
||||||
if (directoryVisibility)
|
if (directoryVisibility)
|
||||||
|
@ -1942,29 +1980,42 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
{
|
{
|
||||||
if (row == ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS)
|
if (row == ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS)
|
||||||
{
|
{
|
||||||
MXKTableViewCellWithLabelAndSwitch *roomNotifCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier] forIndexPath:indexPath];
|
MXKTableViewCellWithLabelAndSwitch *roomNotifCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
roomNotifCell.mxkLabelLeadingConstraint.constant = roomNotifCell.separatorInset.left;
|
[roomNotifCell.mxkSwitch addTarget:self action:@selector(toggleRoomNotification:) forControlEvents:UIControlEventValueChanged];
|
||||||
roomNotifCell.mxkSwitchTrailingConstraint.constant = 15;
|
|
||||||
|
|
||||||
[roomNotifCell.mxkSwitch addTarget:self action:@selector(onSwitchUpdate:) forControlEvents:UIControlEventValueChanged];
|
|
||||||
roomNotifCell.mxkSwitch.onTintColor = kRiotColorGreen;
|
|
||||||
|
|
||||||
roomNotifCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_mute_notifs", @"Vector", nil);
|
roomNotifCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_mute_notifs", @"Vector", nil);
|
||||||
roomNotifCell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
|
||||||
roomNotifSwitch = roomNotifCell.mxkSwitch;
|
|
||||||
|
|
||||||
if ([updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey])
|
if ([updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey])
|
||||||
{
|
{
|
||||||
roomNotifSwitch.on = ((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey]).boolValue;
|
roomNotifCell.mxkSwitch.on = ((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsMuteNotifKey]).boolValue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
roomNotifSwitch.on = mxRoom.isMute || mxRoom.isMentionsOnly;
|
roomNotifCell.mxkSwitch.on = mxRoom.isMute || mxRoom.isMentionsOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell = roomNotifCell;
|
cell = roomNotifCell;
|
||||||
}
|
}
|
||||||
|
else if (row == ROOM_SETTINGS_MAIN_SECTION_ROW_DIRECT_CHAT)
|
||||||
|
{
|
||||||
|
MXKTableViewCellWithLabelAndSwitch *roomDirectChat = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
|
[roomDirectChat.mxkSwitch addTarget:self action:@selector(toggleDirectChat:) forControlEvents:UIControlEventValueChanged];
|
||||||
|
|
||||||
|
roomDirectChat.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_direct_chat", @"Vector", nil);
|
||||||
|
|
||||||
|
if ([updatedItemsDict objectForKey:kRoomSettingsDirectChatKey])
|
||||||
|
{
|
||||||
|
roomDirectChat.mxkSwitch.on = ((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsDirectChatKey]).boolValue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
roomDirectChat.mxkSwitch.on = mxRoom.isDirect;
|
||||||
|
}
|
||||||
|
|
||||||
|
cell = roomDirectChat;
|
||||||
|
}
|
||||||
else if (row == ROOM_SETTINGS_MAIN_SECTION_ROW_PHOTO)
|
else if (row == ROOM_SETTINGS_MAIN_SECTION_ROW_PHOTO)
|
||||||
{
|
{
|
||||||
MXKTableViewCellWithLabelAndMXKImageView *roomPhotoCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndMXKImageView defaultReuseIdentifier] forIndexPath:indexPath];
|
MXKTableViewCellWithLabelAndMXKImageView *roomPhotoCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndMXKImageView defaultReuseIdentifier] forIndexPath:indexPath];
|
||||||
|
@ -1994,7 +2045,7 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[mxRoom setRoomAvatarImageIn:roomPhotoCell.mxkImageView];
|
[mxRoom.summary setRoomAvatarImageIn:roomPhotoCell.mxkImageView];
|
||||||
|
|
||||||
roomPhotoCell.userInteractionEnabled = (oneSelfPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kMXEventTypeStringRoomAvatar]);
|
roomPhotoCell.userInteractionEnabled = (oneSelfPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kMXEventTypeStringRoomAvatar]);
|
||||||
roomPhotoCell.mxkImageView.alpha = roomPhotoCell.userInteractionEnabled ? 1.0f : 0.5f;
|
roomPhotoCell.mxkImageView.alpha = roomPhotoCell.userInteractionEnabled ? 1.0f : 0.5f;
|
||||||
|
@ -2139,46 +2190,27 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
{
|
{
|
||||||
if (indexPath.row == directoryVisibilityIndex)
|
if (indexPath.row == directoryVisibilityIndex)
|
||||||
{
|
{
|
||||||
MXKTableViewCellWithLabelAndSwitch *directoryToggleCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier] forIndexPath:indexPath];
|
MXKTableViewCellWithLabelAndSwitch *directoryToggleCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
directoryToggleCell.mxkLabelLeadingConstraint.constant = directoryToggleCell.separatorInset.left;
|
|
||||||
directoryToggleCell.mxkSwitchTrailingConstraint.constant = 15;
|
|
||||||
|
|
||||||
directoryToggleCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_access_section_directory_toggle", @"Vector", nil);
|
directoryToggleCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_access_section_directory_toggle", @"Vector", nil);
|
||||||
directoryToggleCell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
|
||||||
|
|
||||||
directoryVisibilitySwitch = directoryToggleCell.mxkSwitch;
|
[directoryToggleCell.mxkSwitch addTarget:self action:@selector(toggleDirectoryVisibility:) forControlEvents:UIControlEventValueChanged];
|
||||||
|
|
||||||
// Workaround to avoid mixing between switches
|
|
||||||
// TODO: this is a design issue with switch within UITableViewCell that must fix everywhere
|
|
||||||
if (roomEncryptionSwitch == directoryVisibilitySwitch)
|
|
||||||
{
|
|
||||||
roomEncryptionSwitch = nil;
|
|
||||||
}
|
|
||||||
else if (roomNotifSwitch == directoryVisibilitySwitch)
|
|
||||||
{
|
|
||||||
roomNotifSwitch = nil;
|
|
||||||
}
|
|
||||||
else if (roomEncryptionBlacklistUnverifiedDevicesSwitch == directoryVisibilitySwitch)
|
|
||||||
{
|
|
||||||
roomEncryptionBlacklistUnverifiedDevicesSwitch = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
[directoryVisibilitySwitch addTarget:self action:@selector(onSwitchUpdate:) forControlEvents:UIControlEventValueChanged];
|
|
||||||
directoryVisibilitySwitch.onTintColor = kRiotColorGreen;
|
|
||||||
|
|
||||||
if ([updatedItemsDict objectForKey:kRoomSettingsDirectoryKey])
|
if ([updatedItemsDict objectForKey:kRoomSettingsDirectoryKey])
|
||||||
{
|
{
|
||||||
directoryVisibilitySwitch.on = ((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsDirectoryKey]).boolValue;
|
directoryToggleCell.mxkSwitch.on = ((NSNumber*)[updatedItemsDict objectForKey:kRoomSettingsDirectoryKey]).boolValue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Use the last retrieved value if any
|
// Use the last retrieved value if any
|
||||||
directoryVisibilitySwitch.on = actualDirectoryVisibility ? [actualDirectoryVisibility isEqualToString:kMXRoomDirectoryVisibilityPublic] : NO;
|
directoryToggleCell.mxkSwitch.on = actualDirectoryVisibility ? [actualDirectoryVisibility isEqualToString:kMXRoomDirectoryVisibilityPublic] : NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether the user can change this option
|
// Check whether the user can change this option
|
||||||
directoryVisibilitySwitch.enabled = (oneSelfPowerLevel >= powerLevels.stateDefault);
|
directoryToggleCell.mxkSwitch.enabled = (oneSelfPowerLevel >= powerLevels.stateDefault);
|
||||||
|
|
||||||
|
// Store the switch to be able to update it
|
||||||
|
directoryVisibilitySwitch = directoryToggleCell.mxkSwitch;
|
||||||
|
|
||||||
cell = directoryToggleCell;
|
cell = directoryToggleCell;
|
||||||
}
|
}
|
||||||
|
@ -2435,33 +2467,12 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
{
|
{
|
||||||
if (indexPath.row == 1)
|
if (indexPath.row == 1)
|
||||||
{
|
{
|
||||||
MXKTableViewCellWithLabelAndSwitch *roomBlacklistUnverifiedDevicesCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier] forIndexPath:indexPath];
|
MXKTableViewCellWithLabelAndSwitch *roomBlacklistUnverifiedDevicesCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
roomBlacklistUnverifiedDevicesCell.mxkLabelLeadingConstraint.constant = roomBlacklistUnverifiedDevicesCell.separatorInset.left;
|
[roomBlacklistUnverifiedDevicesCell.mxkSwitch addTarget:self action:@selector(toggleBlacklistUnverifiedDevice:) forControlEvents:UIControlEventValueChanged];
|
||||||
roomBlacklistUnverifiedDevicesCell.mxkSwitchTrailingConstraint.constant = 15;
|
|
||||||
|
|
||||||
[roomBlacklistUnverifiedDevicesCell.mxkSwitch addTarget:self action:@selector(onSwitchUpdate:) forControlEvents:UIControlEventValueChanged];
|
|
||||||
roomBlacklistUnverifiedDevicesCell.mxkSwitch.onTintColor = kRiotColorGreen;
|
roomBlacklistUnverifiedDevicesCell.mxkSwitch.onTintColor = kRiotColorGreen;
|
||||||
|
|
||||||
roomBlacklistUnverifiedDevicesCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_advanced_e2e_encryption_blacklist_unverified_devices", @"Vector", nil);
|
roomBlacklistUnverifiedDevicesCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_advanced_e2e_encryption_blacklist_unverified_devices", @"Vector", nil);
|
||||||
roomBlacklistUnverifiedDevicesCell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
|
||||||
|
|
||||||
roomEncryptionBlacklistUnverifiedDevicesSwitch = roomBlacklistUnverifiedDevicesCell.mxkSwitch;
|
|
||||||
|
|
||||||
// Workaround to avoid mixing between switches
|
|
||||||
// TODO: this is a design issue with switch within UITableViewCell that must fix everywhere
|
|
||||||
if (directoryVisibilitySwitch == roomEncryptionBlacklistUnverifiedDevicesSwitch)
|
|
||||||
{
|
|
||||||
directoryVisibilitySwitch = nil;
|
|
||||||
}
|
|
||||||
else if (roomNotifSwitch == roomEncryptionBlacklistUnverifiedDevicesSwitch)
|
|
||||||
{
|
|
||||||
roomNotifSwitch = nil;
|
|
||||||
}
|
|
||||||
else if (roomEncryptionSwitch == roomEncryptionBlacklistUnverifiedDevicesSwitch)
|
|
||||||
{
|
|
||||||
roomEncryptionSwitch = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For the switch value, use by order:
|
// For the switch value, use by order:
|
||||||
// - the MXCrypto.globalBlacklistUnverifiedDevices if its value is YES
|
// - the MXCrypto.globalBlacklistUnverifiedDevices if its value is YES
|
||||||
|
@ -2472,11 +2483,11 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
if (mxRoom.mxSession.crypto.globalBlacklistUnverifiedDevices)
|
if (mxRoom.mxSession.crypto.globalBlacklistUnverifiedDevices)
|
||||||
{
|
{
|
||||||
blacklistUnverifiedDevices = YES;
|
blacklistUnverifiedDevices = YES;
|
||||||
roomEncryptionBlacklistUnverifiedDevicesSwitch.enabled = NO;
|
roomBlacklistUnverifiedDevicesCell.mxkSwitch.enabled = NO;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
roomEncryptionBlacklistUnverifiedDevicesSwitch.enabled = YES;
|
roomBlacklistUnverifiedDevicesCell.mxkSwitch.enabled = YES;
|
||||||
|
|
||||||
if ([updatedItemsDict objectForKey:kRoomSettingsEncryptionBlacklistUnverifiedDevicesKey])
|
if ([updatedItemsDict objectForKey:kRoomSettingsEncryptionBlacklistUnverifiedDevicesKey])
|
||||||
{
|
{
|
||||||
|
@ -2488,9 +2499,12 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
roomEncryptionBlacklistUnverifiedDevicesSwitch.on = blacklistUnverifiedDevices;
|
roomBlacklistUnverifiedDevicesCell.mxkSwitch.on = blacklistUnverifiedDevices;
|
||||||
|
|
||||||
cell = roomBlacklistUnverifiedDevicesCell;
|
cell = roomBlacklistUnverifiedDevicesCell;
|
||||||
|
|
||||||
|
// Force layout before reusing a cell (fix switch displayed outside the screen)
|
||||||
|
[cell layoutIfNeeded];
|
||||||
}
|
}
|
||||||
else if (indexPath.row == 2)
|
else if (indexPath.row == 2)
|
||||||
{
|
{
|
||||||
|
@ -2516,35 +2530,13 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
|
|
||||||
if (oneSelfPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kMXEventTypeStringRoomEncryption])
|
if (oneSelfPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kMXEventTypeStringRoomEncryption])
|
||||||
{
|
{
|
||||||
MXKTableViewCellWithLabelAndSwitch *roomEncryptionCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier] forIndexPath:indexPath];
|
MXKTableViewCellWithLabelAndSwitch *roomEncryptionCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
roomEncryptionCell.mxkLabelLeadingConstraint.constant = roomEncryptionCell.separatorInset.left;
|
[roomEncryptionCell.mxkSwitch addTarget:self action:@selector(toggleEncryption:) forControlEvents:UIControlEventValueChanged];
|
||||||
roomEncryptionCell.mxkSwitchTrailingConstraint.constant = 15;
|
|
||||||
|
|
||||||
[roomEncryptionCell.mxkSwitch addTarget:self action:@selector(onSwitchUpdate:) forControlEvents:UIControlEventValueChanged];
|
|
||||||
roomEncryptionCell.mxkSwitch.onTintColor = kRiotColorGreen;
|
|
||||||
|
|
||||||
roomEncryptionCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_advanced_enable_e2e_encryption", @"Vector", nil);
|
roomEncryptionCell.mxkLabel.text = NSLocalizedStringFromTable(@"room_details_advanced_enable_e2e_encryption", @"Vector", nil);
|
||||||
roomEncryptionCell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
|
||||||
|
|
||||||
roomEncryptionSwitch = roomEncryptionCell.mxkSwitch;
|
roomEncryptionCell.mxkSwitch.on = ([updatedItemsDict objectForKey:kRoomSettingsEncryptionKey] != nil);
|
||||||
|
|
||||||
// Workaround to avoid mixing between switches
|
|
||||||
// TODO: this is a design issue with switch within UITableViewCell that must fix everywhere
|
|
||||||
if (directoryVisibilitySwitch == roomEncryptionSwitch)
|
|
||||||
{
|
|
||||||
directoryVisibilitySwitch = nil;
|
|
||||||
}
|
|
||||||
else if (roomNotifSwitch == roomEncryptionSwitch)
|
|
||||||
{
|
|
||||||
roomNotifSwitch = nil;
|
|
||||||
}
|
|
||||||
else if (roomEncryptionBlacklistUnverifiedDevicesSwitch == roomEncryptionSwitch)
|
|
||||||
{
|
|
||||||
roomEncryptionBlacklistUnverifiedDevicesSwitch = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
roomEncryptionSwitch.on = ([updatedItemsDict objectForKey:kRoomSettingsEncryptionKey] != nil);
|
|
||||||
|
|
||||||
cell = roomEncryptionCell;
|
cell = roomEncryptionCell;
|
||||||
}
|
}
|
||||||
|
@ -2594,6 +2586,30 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
// iOS8 requires this method to enable editing (see editActionsForRowAtIndexPath).
|
// iOS8 requires this method to enable editing (see editActionsForRowAtIndexPath).
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (MXKTableViewCellWithLabelAndSwitch*)getLabelAndSwitchCell:(UITableView*)tableview forIndexPath:(NSIndexPath *)indexPath
|
||||||
|
{
|
||||||
|
MXKTableViewCellWithLabelAndSwitch *cell = [tableview dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier] forIndexPath:indexPath];
|
||||||
|
|
||||||
|
cell.mxkLabelLeadingConstraint.constant = cell.separatorInset.left;
|
||||||
|
cell.mxkSwitchTrailingConstraint.constant = 15;
|
||||||
|
|
||||||
|
cell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
||||||
|
|
||||||
|
cell.mxkSwitch.onTintColor = kRiotColorGreen;
|
||||||
|
[cell.mxkSwitch removeTarget:self action:nil forControlEvents:UIControlEventValueChanged];
|
||||||
|
|
||||||
|
// Reset the stored `directoryVisibilitySwitch` if the corresponding cell is reused.
|
||||||
|
if (cell.mxkSwitch == directoryVisibilitySwitch)
|
||||||
|
{
|
||||||
|
directoryVisibilitySwitch = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force layout before reusing a cell (fix switch displayed outside the screen)
|
||||||
|
[cell layoutIfNeeded];
|
||||||
|
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - UITableViewDelegate
|
#pragma mark - UITableViewDelegate
|
||||||
|
|
||||||
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
|
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
|
||||||
|
@ -3122,102 +3138,123 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti
|
||||||
[self presentViewController:navigationController animated:YES completion:nil];
|
[self presentViewController:navigationController animated:YES completion:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)onSwitchUpdate:(UISwitch*)theSwitch
|
- (void)toggleRoomNotification:(UISwitch*)theSwitch
|
||||||
{
|
{
|
||||||
if (theSwitch == roomNotifSwitch)
|
if (theSwitch.on == (mxRoom.isMute || mxRoom.isMentionsOnly))
|
||||||
{
|
{
|
||||||
if (roomNotifSwitch.on == (mxRoom.isMute || mxRoom.isMentionsOnly))
|
[updatedItemsDict removeObjectForKey:kRoomSettingsMuteNotifKey];
|
||||||
{
|
|
||||||
[updatedItemsDict removeObjectForKey:kRoomSettingsMuteNotifKey];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[updatedItemsDict setObject:[NSNumber numberWithBool:roomNotifSwitch.on] forKey:kRoomSettingsMuteNotifKey];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (theSwitch == directoryVisibilitySwitch)
|
else
|
||||||
{
|
{
|
||||||
MXRoomDirectoryVisibility visibility = directoryVisibilitySwitch.on ? kMXRoomDirectoryVisibilityPublic : kMXRoomDirectoryVisibilityPrivate;
|
[updatedItemsDict setObject:[NSNumber numberWithBool:theSwitch.on] forKey:kRoomSettingsMuteNotifKey];
|
||||||
|
}
|
||||||
|
|
||||||
// Check whether the actual settings has been retrieved
|
[self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);
|
||||||
if (actualDirectoryVisibility)
|
}
|
||||||
|
|
||||||
|
- (void)toggleDirectChat:(UISwitch*)theSwitch
|
||||||
|
{
|
||||||
|
if (theSwitch.on == mxRoom.isDirect)
|
||||||
|
{
|
||||||
|
[updatedItemsDict removeObjectForKey:kRoomSettingsDirectChatKey];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[updatedItemsDict setObject:[NSNumber numberWithBool:theSwitch.on] forKey:kRoomSettingsDirectChatKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)toggleEncryption:(UISwitch*)theSwitch
|
||||||
|
{
|
||||||
|
if (theSwitch.on)
|
||||||
|
{
|
||||||
|
// Prompt here user before turning on the data encryption
|
||||||
|
__weak typeof(self) weakSelf = self;
|
||||||
|
|
||||||
|
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
||||||
|
|
||||||
|
currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"warning", @"Vector", nil)
|
||||||
|
message:NSLocalizedStringFromTable(@"room_details_advanced_e2e_encryption_prompt_message", @"Vector", nil)
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
|
||||||
|
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
|
||||||
|
style:UIAlertActionStyleDefault
|
||||||
|
handler:^(UIAlertAction * action) {
|
||||||
|
|
||||||
|
if (weakSelf)
|
||||||
|
{
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
self->currentAlert = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset switch change
|
||||||
|
theSwitch.on = NO;
|
||||||
|
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"]
|
||||||
|
style:UIAlertActionStyleDefault
|
||||||
|
handler:^(UIAlertAction * action) {
|
||||||
|
|
||||||
|
if (weakSelf)
|
||||||
|
{
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
self->currentAlert = nil;
|
||||||
|
|
||||||
|
[self->updatedItemsDict setObject:@(YES) forKey:kRoomSettingsEncryptionKey];
|
||||||
|
|
||||||
|
[self getNavigationItem].rightBarButtonItem.enabled = self->updatedItemsDict.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[currentAlert mxk_setAccessibilityIdentifier:@"RoomSettingsVCEnableEncryptionAlert"];
|
||||||
|
[self presentViewController:currentAlert animated:YES completion:nil];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[updatedItemsDict removeObjectForKey:kRoomSettingsEncryptionKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)toggleBlacklistUnverifiedDevice:(UISwitch*)theSwitch
|
||||||
|
{
|
||||||
|
if ([mxRoom.mxSession.crypto isBlacklistUnverifiedDevicesInRoom:mxRoom.roomId] != theSwitch.on)
|
||||||
|
{
|
||||||
|
updatedItemsDict[kRoomSettingsEncryptionBlacklistUnverifiedDevicesKey] = @(theSwitch.on);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[updatedItemsDict removeObjectForKey:kRoomSettingsEncryptionBlacklistUnverifiedDevicesKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)toggleDirectoryVisibility:(UISwitch*)theSwitch
|
||||||
|
{
|
||||||
|
MXRoomDirectoryVisibility visibility = theSwitch.on ? kMXRoomDirectoryVisibilityPublic : kMXRoomDirectoryVisibilityPrivate;
|
||||||
|
|
||||||
|
// Check whether the actual settings has been retrieved
|
||||||
|
if (actualDirectoryVisibility)
|
||||||
|
{
|
||||||
|
if ([visibility isEqualToString:actualDirectoryVisibility])
|
||||||
{
|
{
|
||||||
if ([visibility isEqualToString:actualDirectoryVisibility])
|
[updatedItemsDict removeObjectForKey:kRoomSettingsDirectoryKey];
|
||||||
{
|
|
||||||
[updatedItemsDict removeObjectForKey:kRoomSettingsDirectoryKey];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[updatedItemsDict setObject:visibility forKey:kRoomSettingsDirectoryKey];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[updatedItemsDict setObject:visibility forKey:kRoomSettingsDirectoryKey];
|
[updatedItemsDict setObject:visibility forKey:kRoomSettingsDirectoryKey];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (theSwitch == roomEncryptionSwitch)
|
else
|
||||||
{
|
{
|
||||||
if (roomEncryptionSwitch.on)
|
[updatedItemsDict setObject:visibility forKey:kRoomSettingsDirectoryKey];
|
||||||
{
|
|
||||||
// Prompt here user before turning on the data encryption
|
|
||||||
__weak typeof(self) weakSelf = self;
|
|
||||||
|
|
||||||
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
|
||||||
|
|
||||||
currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"warning", @"Vector", nil)
|
|
||||||
message:NSLocalizedStringFromTable(@"room_details_advanced_e2e_encryption_prompt_message", @"Vector", nil)
|
|
||||||
preferredStyle:UIAlertControllerStyleAlert];
|
|
||||||
|
|
||||||
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
|
|
||||||
style:UIAlertActionStyleDefault
|
|
||||||
handler:^(UIAlertAction * action) {
|
|
||||||
|
|
||||||
if (weakSelf)
|
|
||||||
{
|
|
||||||
typeof(self) self = weakSelf;
|
|
||||||
self->currentAlert = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset switch change
|
|
||||||
theSwitch.on = NO;
|
|
||||||
|
|
||||||
}]];
|
|
||||||
|
|
||||||
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"]
|
|
||||||
style:UIAlertActionStyleDefault
|
|
||||||
handler:^(UIAlertAction * action) {
|
|
||||||
|
|
||||||
if (weakSelf)
|
|
||||||
{
|
|
||||||
typeof(self) self = weakSelf;
|
|
||||||
self->currentAlert = nil;
|
|
||||||
|
|
||||||
[self->updatedItemsDict setObject:@(YES) forKey:kRoomSettingsEncryptionKey];
|
|
||||||
|
|
||||||
[self getNavigationItem].rightBarButtonItem.enabled = self->updatedItemsDict.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
}]];
|
|
||||||
|
|
||||||
[currentAlert mxk_setAccessibilityIdentifier:@"RoomSettingsVCEnableEncryptionAlert"];
|
|
||||||
[self presentViewController:currentAlert animated:YES completion:nil];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[updatedItemsDict removeObjectForKey:kRoomSettingsEncryptionKey];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (theSwitch == roomEncryptionBlacklistUnverifiedDevicesSwitch)
|
|
||||||
{
|
|
||||||
if ([mxRoom.mxSession.crypto isBlacklistUnverifiedDevicesInRoom:mxRoom.roomId] != roomEncryptionBlacklistUnverifiedDevicesSwitch.on)
|
|
||||||
{
|
|
||||||
updatedItemsDict[kRoomSettingsEncryptionBlacklistUnverifiedDevicesKey] = @(roomEncryptionBlacklistUnverifiedDevicesSwitch.on);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[updatedItemsDict removeObjectForKey:kRoomSettingsEncryptionBlacklistUnverifiedDevicesKey];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);
|
[self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);
|
||||||
|
|
|
@ -109,6 +109,9 @@
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
#import "MXRoom+Riot.h"
|
||||||
|
|
||||||
|
#import "IntegrationManagerViewController.h"
|
||||||
|
#import "WidgetViewController.h"
|
||||||
|
|
||||||
@interface RoomViewController ()
|
@interface RoomViewController ()
|
||||||
{
|
{
|
||||||
// The expanded header
|
// The expanded header
|
||||||
|
@ -180,8 +183,8 @@
|
||||||
// Tell whether the view controller is appeared or not.
|
// Tell whether the view controller is appeared or not.
|
||||||
BOOL isAppeared;
|
BOOL isAppeared;
|
||||||
|
|
||||||
// The search bar buttom item back up.
|
// The right bar button items back up.
|
||||||
UIBarButtonItem *searchBarButtonItem;
|
NSArray<UIBarButtonItem *> *rightBarButtonItems;
|
||||||
|
|
||||||
// Observe kRiotDesignValuesDidChangeThemeNotification to handle user interface theme change.
|
// Observe kRiotDesignValuesDidChangeThemeNotification to handle user interface theme change.
|
||||||
id kRiotDesignValuesDidChangeThemeNotificationObserver;
|
id kRiotDesignValuesDidChangeThemeNotificationObserver;
|
||||||
|
@ -360,8 +363,11 @@
|
||||||
[self setEventDetailsViewClass:EventDetailsView.class];
|
[self setEventDetailsViewClass:EventDetailsView.class];
|
||||||
|
|
||||||
// Update navigation bar items
|
// Update navigation bar items
|
||||||
self.navigationItem.rightBarButtonItem.target = self;
|
for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems)
|
||||||
self.navigationItem.rightBarButtonItem.action = @selector(onButtonPressed:);
|
{
|
||||||
|
barButtonItem.target = self;
|
||||||
|
barButtonItem.action = @selector(onButtonPressed:);
|
||||||
|
}
|
||||||
|
|
||||||
// Prepare missed dicussion badge
|
// Prepare missed dicussion badge
|
||||||
missedDiscussionsBarButtonCustomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 21)];
|
missedDiscussionsBarButtonCustomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 21)];
|
||||||
|
@ -417,6 +423,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Prepare jump to last unread banner
|
// Prepare jump to last unread banner
|
||||||
self.jumpToLastUnreadBannerContainer.backgroundColor = kRiotPrimaryBgColor;
|
self.jumpToLastUnreadBannerContainer.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
@ -1046,8 +1053,11 @@
|
||||||
|
|
||||||
- (void)destroy
|
- (void)destroy
|
||||||
{
|
{
|
||||||
searchBarButtonItem = nil;
|
rightBarButtonItems = nil;
|
||||||
self.navigationItem.rightBarButtonItem.enabled = NO;
|
for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems)
|
||||||
|
{
|
||||||
|
barButtonItem.enabled = NO;
|
||||||
|
}
|
||||||
|
|
||||||
if (currentAlert)
|
if (currentAlert)
|
||||||
{
|
{
|
||||||
|
@ -1150,17 +1160,20 @@
|
||||||
|
|
||||||
- (void)refreshRoomTitle
|
- (void)refreshRoomTitle
|
||||||
{
|
{
|
||||||
if (searchBarButtonItem && !self.navigationItem.rightBarButtonItem)
|
if (rightBarButtonItems && !self.navigationItem.rightBarButtonItems)
|
||||||
{
|
{
|
||||||
// Restore by default the search bar button.
|
// Restore by default the search bar button.
|
||||||
self.navigationItem.rightBarButtonItem = searchBarButtonItem;
|
self.navigationItem.rightBarButtonItems = rightBarButtonItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the right room title view
|
// Set the right room title view
|
||||||
if (self.isRoomPreview)
|
if (self.isRoomPreview)
|
||||||
{
|
{
|
||||||
// Disable the search button
|
// Disable the right buttons
|
||||||
self.navigationItem.rightBarButtonItem.enabled = NO;
|
for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems)
|
||||||
|
{
|
||||||
|
barButtonItem.enabled = NO;
|
||||||
|
}
|
||||||
|
|
||||||
[self showPreviewHeader:YES];
|
[self showPreviewHeader:YES];
|
||||||
}
|
}
|
||||||
|
@ -1170,8 +1183,18 @@
|
||||||
|
|
||||||
if (self.roomDataSource.isLive)
|
if (self.roomDataSource.isLive)
|
||||||
{
|
{
|
||||||
// Enable the search button
|
// Enable the right buttons (Search and Integrations)
|
||||||
self.navigationItem.rightBarButtonItem.enabled = YES;
|
for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems)
|
||||||
|
{
|
||||||
|
barButtonItem.enabled = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL matrixAppsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"matrixApps"];
|
||||||
|
if (!matrixAppsEnabled && self.navigationItem.rightBarButtonItems.count == 2)
|
||||||
|
{
|
||||||
|
// If the setting is disabled, do not show the icon
|
||||||
|
self.navigationItem.rightBarButtonItems = @[self.navigationItem.rightBarButtonItem];
|
||||||
|
}
|
||||||
|
|
||||||
// Do not change title view class here if the expanded header is visible.
|
// Do not change title view class here if the expanded header is visible.
|
||||||
if (self.expandedHeaderContainer.hidden)
|
if (self.expandedHeaderContainer.hidden)
|
||||||
|
@ -1191,8 +1214,8 @@
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Remove the search button temporarily
|
// Remove the search button temporarily
|
||||||
searchBarButtonItem = self.navigationItem.rightBarButtonItem;
|
rightBarButtonItems = self.navigationItem.rightBarButtonItems;
|
||||||
self.navigationItem.rightBarButtonItem = nil;
|
self.navigationItem.rightBarButtonItems = nil;
|
||||||
|
|
||||||
[self setRoomTitleViewClass:SimpleRoomTitleView.class];
|
[self setRoomTitleViewClass:SimpleRoomTitleView.class];
|
||||||
self.titleView.editable = NO;
|
self.titleView.editable = NO;
|
||||||
|
@ -2850,10 +2873,35 @@
|
||||||
|
|
||||||
- (IBAction)onButtonPressed:(id)sender
|
- (IBAction)onButtonPressed:(id)sender
|
||||||
{
|
{
|
||||||
|
// Search button
|
||||||
if (sender == self.navigationItem.rightBarButtonItem)
|
if (sender == self.navigationItem.rightBarButtonItem)
|
||||||
{
|
{
|
||||||
[self performSegueWithIdentifier:@"showRoomSearch" sender:self];
|
[self performSegueWithIdentifier:@"showRoomSearch" sender:self];
|
||||||
}
|
}
|
||||||
|
// Matrix Apps button
|
||||||
|
else if (self.navigationItem.rightBarButtonItems.count == 2 && sender == self.navigationItem.rightBarButtonItems[1])
|
||||||
|
{
|
||||||
|
// Temporary code to test `WidgetViewController`
|
||||||
|
// TODO: remove it
|
||||||
|
// NSArray<Widget *> *widgets = [[WidgetManager sharedManager] widgetsInRoom:self.roomDataSource.room];
|
||||||
|
// if (widgets.count)
|
||||||
|
// {
|
||||||
|
// // Hide back button title
|
||||||
|
// self.navigationItem.backBarButtonItem =[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
|
||||||
|
//
|
||||||
|
// WidgetViewController *widgetVC = [[WidgetViewController alloc] initForWidget:widgets[0]];
|
||||||
|
// [self.navigationController pushViewController:widgetVC animated:YES];
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
{
|
||||||
|
IntegrationManagerViewController *modularVC = [[IntegrationManagerViewController alloc] initForMXSession:self.roomDataSource.mxSession
|
||||||
|
inRoom:self.roomDataSource.roomId
|
||||||
|
screen:kIntegrationManagerMainScreen
|
||||||
|
widgetId:nil];
|
||||||
|
|
||||||
|
[self presentViewController:modularVC animated:NO completion:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (sender == self.jumpToLastUnreadButton)
|
else if (sender == self.jumpToLastUnreadButton)
|
||||||
{
|
{
|
||||||
// Hide expanded header to restore navigation bar settings.
|
// Hide expanded header to restore navigation bar settings.
|
||||||
|
|
|
@ -20,7 +20,7 @@ limitations under the License.
|
||||||
#import "UIViewController+RiotSearch.h"
|
#import "UIViewController+RiotSearch.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This view controller manages several uiviewcontrollers like UISegmentedControlled manages uiTableView
|
This view controller manages several uiviewcontrollers like UISegmentedController manages uiTableView
|
||||||
except that the managed items are custom UIViewControllers.
|
except that the managed items are custom UIViewControllers.
|
||||||
It uses a Vector design.
|
It uses a Vector design.
|
||||||
*/
|
*/
|
||||||
|
@ -77,6 +77,11 @@ limitations under the License.
|
||||||
@param viewControllers the list of viewControllers to display.
|
@param viewControllers the list of viewControllers to display.
|
||||||
@param defaultSelected index of the default selected UIViewController in the list.
|
@param defaultSelected index of the default selected UIViewController in the list.
|
||||||
*/
|
*/
|
||||||
- (void)initWithTitles:(NSArray*)titles viewControllers:(NSArray*)viewControllers defaultSelected:(NSUInteger)index;
|
- (void)initWithTitles:(NSArray*)titles viewControllers:(NSArray*)viewControllers defaultSelected:(NSUInteger)defaultSelected;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Callback used to take into account the change of the user interface theme.
|
||||||
|
*/
|
||||||
|
- (void)userInterfaceThemeDidChange;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#import "SegmentedViewController.h"
|
#import "SegmentedViewController.h"
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
@interface SegmentedViewController ()
|
@interface SegmentedViewController ()
|
||||||
{
|
{
|
||||||
|
@ -71,11 +71,11 @@
|
||||||
@param viewControllers the list of viewControllers to display.
|
@param viewControllers the list of viewControllers to display.
|
||||||
@param defaultSelected index of the default selected UIViewController in the list.
|
@param defaultSelected index of the default selected UIViewController in the list.
|
||||||
*/
|
*/
|
||||||
- (void)initWithTitles:(NSArray*)titles viewControllers:(NSArray*)someViewControllers defaultSelected:(NSUInteger)index
|
- (void)initWithTitles:(NSArray*)titles viewControllers:(NSArray*)someViewControllers defaultSelected:(NSUInteger)defaultSelected
|
||||||
{
|
{
|
||||||
viewControllers = someViewControllers;
|
viewControllers = someViewControllers;
|
||||||
sectionTitles = titles;
|
sectionTitles = titles;
|
||||||
_selectedIndex = index;
|
_selectedIndex = defaultSelected;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)destroy
|
- (void)destroy
|
||||||
|
@ -129,7 +129,6 @@
|
||||||
|
|
||||||
// Setup `MXKViewControllerHandling` properties
|
// Setup `MXKViewControllerHandling` properties
|
||||||
self.enableBarTintColorStatusChange = NO;
|
self.enableBarTintColorStatusChange = NO;
|
||||||
self.rageShakeManager = [RageShakeManager sharedManager];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidLoad
|
- (void)viewDidLoad
|
||||||
|
@ -173,6 +172,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
self.view.backgroundColor = kRiotPrimaryBgColor;
|
self.view.backgroundColor = kRiotPrimaryBgColor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,8 +98,9 @@ enum
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
#ifdef USE_JITSI_WIDGET
|
|
||||||
LABS_MATRIX_APPS_INDEX = 0,
|
LABS_MATRIX_APPS_INDEX = 0,
|
||||||
|
#ifdef USE_JITSI_WIDGET
|
||||||
|
LABS_USE_JITSI_WIDGET_INDEX,
|
||||||
#endif
|
#endif
|
||||||
LABS_CRYPTO_INDEX,
|
LABS_CRYPTO_INDEX,
|
||||||
LABS_COUNT
|
LABS_COUNT
|
||||||
|
@ -307,6 +308,7 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
@ -1255,6 +1257,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
cell.alpha = 1.0f;
|
cell.alpha = 1.0f;
|
||||||
cell.userInteractionEnabled = YES;
|
cell.userInteractionEnabled = YES;
|
||||||
|
|
||||||
|
[cell layoutIfNeeded];
|
||||||
|
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1267,6 +1271,9 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
|
|
||||||
cell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
cell.mxkLabel.textColor = kRiotPrimaryTextColor;
|
||||||
|
|
||||||
|
// Force layout before reusing a cell (fix switch displayed outside the screen)
|
||||||
|
[cell layoutIfNeeded];
|
||||||
|
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1317,6 +1324,12 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
signOutCell = [[MXKTableViewCellWithButton alloc] init];
|
signOutCell = [[MXKTableViewCellWithButton alloc] init];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fix https://github.com/vector-im/riot-ios/issues/1354
|
||||||
|
// Do not move this line in prepareForReuse because of https://github.com/vector-im/riot-ios/issues/1323
|
||||||
|
signOutCell.mxkButton.titleLabel.text = nil;
|
||||||
|
}
|
||||||
|
|
||||||
NSString* title = NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil);
|
NSString* title = NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil);
|
||||||
|
|
||||||
|
@ -1860,6 +1873,11 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
markAllBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
markAllBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fix https://github.com/vector-im/riot-ios/issues/1354
|
||||||
|
markAllBtnCell.mxkButton.titleLabel.text = nil;
|
||||||
|
}
|
||||||
|
|
||||||
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_mark_all_as_read", @"Vector", nil);
|
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_mark_all_as_read", @"Vector", nil);
|
||||||
[markAllBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
[markAllBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
||||||
|
@ -1880,6 +1898,11 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
clearCacheBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
clearCacheBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fix https://github.com/vector-im/riot-ios/issues/1354
|
||||||
|
clearCacheBtnCell.mxkButton.titleLabel.text = nil;
|
||||||
|
}
|
||||||
|
|
||||||
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_clear_cache", @"Vector", nil);
|
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_clear_cache", @"Vector", nil);
|
||||||
[clearCacheBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
[clearCacheBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
||||||
|
@ -1900,6 +1923,11 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
reportBugBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
reportBugBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fix https://github.com/vector-im/riot-ios/issues/1354
|
||||||
|
reportBugBtnCell.mxkButton.titleLabel.text = nil;
|
||||||
|
}
|
||||||
|
|
||||||
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_report_bug", @"Vector", nil);
|
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_report_bug", @"Vector", nil);
|
||||||
[reportBugBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
[reportBugBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
||||||
|
@ -1916,11 +1944,23 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
}
|
}
|
||||||
else if (section == SETTINGS_SECTION_LABS_INDEX)
|
else if (section == SETTINGS_SECTION_LABS_INDEX)
|
||||||
{
|
{
|
||||||
#ifdef USE_JITSI_WIDGET
|
|
||||||
if (row == LABS_MATRIX_APPS_INDEX)
|
if (row == LABS_MATRIX_APPS_INDEX)
|
||||||
{
|
{
|
||||||
MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
|
labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_labs_matrix_apps", @"Vector", nil);
|
||||||
|
labelAndSwitchCell.mxkSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"matrixApps"];
|
||||||
|
|
||||||
|
[labelAndSwitchCell.mxkSwitch removeTarget:self action:nil forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
[labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleLabsMatrixApps:) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
|
||||||
|
cell = labelAndSwitchCell;
|
||||||
|
}
|
||||||
|
#ifdef USE_JITSI_WIDGET
|
||||||
|
else if (row == LABS_USE_JITSI_WIDGET_INDEX)
|
||||||
|
{
|
||||||
|
MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||||
|
|
||||||
labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_labs_create_conference_with_jitsi", @"Vector", nil);
|
labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_labs_create_conference_with_jitsi", @"Vector", nil);
|
||||||
labelAndSwitchCell.mxkSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"createConferenceCallsWithJitsi"];
|
labelAndSwitchCell.mxkSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"createConferenceCallsWithJitsi"];
|
||||||
|
|
||||||
|
@ -2003,6 +2043,11 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
exportKeysBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
exportKeysBtnCell = [[MXKTableViewCellWithButton alloc] init];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fix https://github.com/vector-im/riot-ios/issues/1354
|
||||||
|
exportKeysBtnCell.mxkButton.titleLabel.text = nil;
|
||||||
|
}
|
||||||
|
|
||||||
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_crypto_export", @"Vector", nil);
|
NSString *btnTitle = NSLocalizedStringFromTable(@"settings_crypto_export", @"Vector", nil);
|
||||||
[exportKeysBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
[exportKeysBtnCell.mxkButton setTitle:btnTitle forState:UIControlStateNormal];
|
||||||
|
@ -2562,7 +2607,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
- (void)togglePushNotifications:(id)sender
|
- (void)togglePushNotifications:(id)sender
|
||||||
{
|
{
|
||||||
// Check first whether the user allow notification from device settings
|
// Check first whether the user allow notification from device settings
|
||||||
if ([[MXKAccountManager sharedManager] isAPNSAvailable] == NO)
|
UIUserNotificationType currentUserNotificationTypes = UIApplication.sharedApplication.currentUserNotificationSettings.types;
|
||||||
|
if (currentUserNotificationTypes == UIUserNotificationTypeNone)
|
||||||
{
|
{
|
||||||
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
||||||
|
|
||||||
|
@ -2594,10 +2640,28 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
{
|
{
|
||||||
[self startActivityIndicator];
|
[self startActivityIndicator];
|
||||||
|
|
||||||
MXKAccount* account = [MXKAccountManager sharedManager].activeAccounts.firstObject;
|
MXKAccountManager *accountManager = [MXKAccountManager sharedManager];
|
||||||
|
MXKAccount* account = accountManager.activeAccounts.firstObject;
|
||||||
|
|
||||||
// toggle the pushes
|
if (accountManager.apnsDeviceToken)
|
||||||
[account setEnablePushNotifications:!account.pushNotificationServiceIsActive];
|
{
|
||||||
|
[account setEnablePushNotifications:!account.pushNotificationServiceIsActive];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Obtain device token when user has just enabled access to notifications from system settings
|
||||||
|
[[AppDelegate theDelegate] registerForRemoteNotificationsWithCompletion:^(NSError * error) {
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
[(UISwitch *)sender setOn:NO animated:YES];
|
||||||
|
[self stopActivityIndicator];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[account setEnablePushNotifications:YES];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2646,6 +2710,19 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)toggleLabsMatrixApps:(id)sender
|
||||||
|
{
|
||||||
|
if (sender && [sender isKindOfClass:UISwitch.class])
|
||||||
|
{
|
||||||
|
UISwitch *switchButton = (UISwitch*)sender;
|
||||||
|
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:switchButton.isOn forKey:@"matrixApps"];
|
||||||
|
[[NSUserDefaults standardUserDefaults] synchronize];
|
||||||
|
|
||||||
|
[self.tableView reloadData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)toggleJitsiForConference:(id)sender
|
- (void)toggleJitsiForConference:(id)sender
|
||||||
{
|
{
|
||||||
if (sender && [sender isKindOfClass:UISwitch.class])
|
if (sender && [sender isKindOfClass:UISwitch.class])
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
|
|
||||||
[self refreshSearchBarItemsColor:_searchBarView];
|
[self refreshSearchBarItemsColor:_searchBarView];
|
||||||
|
|
||||||
_searchBarHeaderBorder.backgroundColor = kRiotColorSilver;
|
_searchBarHeaderBorder.backgroundColor = kRiotAuxiliaryColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.contactsTableView.backgroundColor = ((self.contactsTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.contactsTableView.backgroundColor = ((self.contactsTableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -95,7 +95,7 @@
|
||||||
|
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
|
||||||
// Add the Vector background image when search bar is empty
|
// Add the Riot background image when search bar is empty
|
||||||
[self addBackgroundImageViewToView:self.view];
|
[self addBackgroundImageViewToView:self.view];
|
||||||
|
|
||||||
// Initialize here the data sources if a matrix session has been already set.
|
// Initialize here the data sources if a matrix session has been already set.
|
||||||
|
@ -107,6 +107,18 @@
|
||||||
[super showSearch:NO];
|
[super showSearch:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)userInterfaceThemeDidChange
|
||||||
|
{
|
||||||
|
[super userInterfaceThemeDidChange];
|
||||||
|
|
||||||
|
UIImageView *backgroundImageView = self.backgroundImageView;
|
||||||
|
if (backgroundImageView)
|
||||||
|
{
|
||||||
|
UIImage *image = [MXKTools paintImage:backgroundImageView.image withColor:kRiotKeyboardColor];
|
||||||
|
backgroundImageView.image = image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)destroy
|
- (void)destroy
|
||||||
{
|
{
|
||||||
[super destroy];
|
[super destroy];
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
{
|
{
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
// Check the table view style to select its bg color.
|
// Check the table view style to select its bg color.
|
||||||
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
self.tableView.backgroundColor = ((self.tableView.style == UITableViewStylePlain) ? kRiotPrimaryBgColor : kRiotSecondaryBgColor);
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
self.view.backgroundColor = kRiotPrimaryBgColor;
|
self.view.backgroundColor = kRiotPrimaryBgColor;
|
||||||
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
self.defaultBarTintColor = kRiotSecondaryBgColor;
|
||||||
self.barTitleColor = kRiotPrimaryTextColor;
|
self.barTitleColor = kRiotPrimaryTextColor;
|
||||||
|
self.activityIndicator.backgroundColor = kRiotOverlayColor;
|
||||||
|
|
||||||
webView.backgroundColor = kRiotPrimaryBgColor;
|
webView.backgroundColor = kRiotPrimaryBgColor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "WebViewViewController.h"
|
||||||
|
|
||||||
|
#import <MatrixSDK/MatrixSDK.h>
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const kIntegrationManagerMainScreen;
|
||||||
|
FOUNDATION_EXPORT NSString *const kIntegrationManagerAddIntegrationScreen;
|
||||||
|
|
||||||
|
/**
|
||||||
|
`IntegrationManagerViewController` displays the Modular integration manager webapp
|
||||||
|
into a webview.
|
||||||
|
*/
|
||||||
|
@interface IntegrationManagerViewController : WebViewViewController <UIWebViewDelegate>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initialise with params for the Modular interface webapp.
|
||||||
|
|
||||||
|
@param mxSession the session to use.
|
||||||
|
@param roomId the room where to set up widgets.
|
||||||
|
@param screen the screen to display in the Modular interface webapp. Can be nil.
|
||||||
|
@param widgetId the id of the widget in case of widget configuration edition. Can be nil.
|
||||||
|
*/
|
||||||
|
- (instancetype)initForMXSession:(MXSession*)mxSession inRoom:(NSString*)roomId screen:(NSString*)screen widgetId:(NSString*)widgetId;
|
||||||
|
|
||||||
|
@end
|
822
Riot/ViewController/Widgets/IntegrationManagerViewController.m
Normal file
|
@ -0,0 +1,822 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "IntegrationManagerViewController.h"
|
||||||
|
|
||||||
|
#import "WidgetManager.h"
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
#import <JavaScriptCore/JavaScriptCore.h>
|
||||||
|
|
||||||
|
NSString *const kIntegrationManagerMainScreen = nil;
|
||||||
|
NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ";
|
||||||
|
|
||||||
|
NSString *const kJavascriptSendResponseToModular = @"riotIOS.sendResponse('%@', %@);";
|
||||||
|
|
||||||
|
|
||||||
|
@interface IntegrationManagerViewController ()
|
||||||
|
{
|
||||||
|
MXSession *mxSession;
|
||||||
|
NSString *roomId;
|
||||||
|
NSString *screen;
|
||||||
|
NSString *widgetId;
|
||||||
|
NSString *scalarToken;
|
||||||
|
|
||||||
|
MXHTTPOperation *operation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation IntegrationManagerViewController
|
||||||
|
|
||||||
|
- (instancetype)initForMXSession:(MXSession *)theMXSession inRoom:(NSString *)theRoomId screen:(NSString *)theScreen widgetId:(NSString *)theWidgetId
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
mxSession = theMXSession;
|
||||||
|
roomId = theRoomId;
|
||||||
|
screen = theScreen;
|
||||||
|
widgetId = theWidgetId;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)destroy
|
||||||
|
{
|
||||||
|
[super destroy];
|
||||||
|
|
||||||
|
[operation cancel];
|
||||||
|
operation = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewDidLoad
|
||||||
|
{
|
||||||
|
[super viewDidLoad];
|
||||||
|
|
||||||
|
webView.scalesPageToFit = NO;
|
||||||
|
webView.scrollView.bounces = NO;
|
||||||
|
|
||||||
|
// Disable opacity so that the webview background uses the current interface theme
|
||||||
|
webView.opaque = NO;
|
||||||
|
|
||||||
|
webView.delegate = self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewWillAppear:(BOOL)animated
|
||||||
|
{
|
||||||
|
[super viewWillAppear:animated];
|
||||||
|
|
||||||
|
if (!self.URL && !operation)
|
||||||
|
{
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
[self startActivityIndicator];
|
||||||
|
|
||||||
|
// Make sure we a scalar token
|
||||||
|
operation = [[WidgetManager sharedManager] getScalarTokenForMXSession:mxSession success:^(NSString *theScalarToken) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
self->operation = nil;
|
||||||
|
|
||||||
|
scalarToken = theScalarToken;
|
||||||
|
|
||||||
|
// Launch the webview on the right modular webapp page
|
||||||
|
self.URL = [self interfaceUrl];
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
self->operation = nil;
|
||||||
|
[self stopActivityIndicator];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Private methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
Build the URL to use in the Modular interface webapp.
|
||||||
|
*/
|
||||||
|
- (NSString *)interfaceUrl
|
||||||
|
{
|
||||||
|
NSMutableString *url;
|
||||||
|
|
||||||
|
if (scalarToken)
|
||||||
|
{
|
||||||
|
url = [NSMutableString stringWithFormat:@"%@?scalar_token=%@&room_id=%@",
|
||||||
|
[[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsUiUrl"],
|
||||||
|
[scalarToken stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
|
||||||
|
[roomId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
|
||||||
|
];
|
||||||
|
|
||||||
|
if (screen)
|
||||||
|
{
|
||||||
|
[url appendString:@"&screen="];
|
||||||
|
[url appendString:[screen stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (widgetId)
|
||||||
|
{
|
||||||
|
[url appendString:@"&integ_id="];
|
||||||
|
[url appendString:[widgetId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)enableDebug
|
||||||
|
{
|
||||||
|
// Setup console.log() -> NSLog() route
|
||||||
|
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
|
||||||
|
ctx[@"console"][@"log"] = ^(JSValue * msg) {
|
||||||
|
NSLog(@"-- JavaScript: %@", msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Redirect all console.* logging methods to console.log
|
||||||
|
[webView stringByEvaluatingJavaScriptFromString:@"console.debug = console.log; console.info = console.log; console.warn = console.log; console.error = console.log;"];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)showErrorAsAlert:(NSError*)error
|
||||||
|
{
|
||||||
|
NSString *title = [error.userInfo valueForKey:NSLocalizedFailureReasonErrorKey];
|
||||||
|
NSString *msg = [error.userInfo valueForKey:NSLocalizedDescriptionKey];
|
||||||
|
if (!title)
|
||||||
|
{
|
||||||
|
if (msg)
|
||||||
|
{
|
||||||
|
title = msg;
|
||||||
|
msg = nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
title = [NSBundle mxk_localizedStringForKey:@"error"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
[alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"]
|
||||||
|
style:UIAlertActionStyleDefault
|
||||||
|
handler:^(UIAlertAction * action) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
// Leave this Intergrations Manager VC
|
||||||
|
[self withdrawViewControllerAnimated:YES completion:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
}]];
|
||||||
|
|
||||||
|
[self presentViewController:alert animated:YES completion:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - UIWebViewDelegate
|
||||||
|
|
||||||
|
-(void)webViewDidFinishLoad:(UIWebView *)theWebView
|
||||||
|
{
|
||||||
|
[self enableDebug];
|
||||||
|
|
||||||
|
// Setup js code
|
||||||
|
NSString *path = [[NSBundle mainBundle] pathForResource:@"IntegrationManager" ofType:@"js"];
|
||||||
|
NSString *js = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
|
||||||
|
[webView stringByEvaluatingJavaScriptFromString:js];
|
||||||
|
|
||||||
|
[self stopActivityIndicator];
|
||||||
|
|
||||||
|
// Check connectivity
|
||||||
|
if ([AppDelegate theDelegate].isOffline)
|
||||||
|
{
|
||||||
|
// The web page may be in the cache, so its loading will be successful
|
||||||
|
// but we cannot go further, it often leads to a blank screen.
|
||||||
|
// So, display an error so that the user can escape.
|
||||||
|
NSError *error = [NSError errorWithDomain:NSURLErrorDomain
|
||||||
|
code:NSURLErrorNotConnectedToInternet
|
||||||
|
userInfo:@{
|
||||||
|
NSLocalizedDescriptionKey : NSLocalizedStringFromTable(@"network_offline_prompt", @"Vector", nil)
|
||||||
|
}];
|
||||||
|
[self showErrorAsAlert:error];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
|
||||||
|
{
|
||||||
|
NSString *urlString = [[request URL] absoluteString];
|
||||||
|
|
||||||
|
if ([urlString hasPrefix:@"js:"])
|
||||||
|
{
|
||||||
|
// Listen only to scheme of the JS-UIWebView bridge
|
||||||
|
NSString *jsonString = [[[urlString componentsSeparatedByString:@"js:"] lastObject] stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
|
||||||
|
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
|
NSError *error;
|
||||||
|
NSDictionary *parameters = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers
|
||||||
|
error:&error];
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
[self onMessage:parameters];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (navigationType == UIWebViewNavigationTypeLinkClicked )
|
||||||
|
{
|
||||||
|
// Open links outside the app
|
||||||
|
[[UIApplication sharedApplication] openURL:[request URL]];
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
|
||||||
|
{
|
||||||
|
// Filter out the users's scalar token
|
||||||
|
NSString *errorDescription = error.description;
|
||||||
|
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"scalar_token=\\w*"
|
||||||
|
options:NSRegularExpressionCaseInsensitive error:nil];
|
||||||
|
errorDescription = [regex stringByReplacingMatchesInString:errorDescription
|
||||||
|
options:0
|
||||||
|
range:NSMakeRange(0, errorDescription.length)
|
||||||
|
withTemplate:@"scalar_token=..."];
|
||||||
|
|
||||||
|
NSLog(@"[IntegrationManagerVC] didFailLoadWithError: %@", errorDescription);
|
||||||
|
|
||||||
|
[self stopActivityIndicator];
|
||||||
|
[self showErrorAsAlert:error];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Modular postMessage API
|
||||||
|
|
||||||
|
- (void)onMessage:(NSDictionary*)JSData
|
||||||
|
{
|
||||||
|
NSDictionary *eventData;
|
||||||
|
MXJSONModelSetDictionary(eventData, JSData[@"event.data"]);
|
||||||
|
|
||||||
|
NSString *roomIdInEvent, *userId, *action;
|
||||||
|
|
||||||
|
MXJSONModelSetString(roomIdInEvent, eventData[@"room_id"]);
|
||||||
|
MXJSONModelSetString(userId, eventData[@"user_id"]);
|
||||||
|
MXJSONModelSetString(action, eventData[@"action"]);
|
||||||
|
|
||||||
|
if ([action isEqualToString:@"close_scalar"])
|
||||||
|
{
|
||||||
|
[self withdrawViewControllerAnimated:YES completion:nil];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!roomIdInEvent)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_missing_room_id" toEvent:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (![roomIdInEvent isEqualToString:roomId])
|
||||||
|
{
|
||||||
|
[self sendError:[NSString stringWithFormat:NSLocalizedStringFromTable(@"widget_integration_room_not_visible", @"Vector", nil), roomIdInEvent] toEvent:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// These APIs don't require userId
|
||||||
|
if ([@"join_rules_state" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self getJoinRules:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ([@"set_plumbing_state" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self setPlumbingState:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ([@"get_membership_count" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self getMembershipCount:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ([@"set_widget" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self setWidget:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ([@"get_widgets" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self getWidgets:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ([@"can_send_event" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self canSendEvent:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!userId)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_missing_user_id" toEvent:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([@"membership_state" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self getMembershipState:userId eventData:eventData];
|
||||||
|
}
|
||||||
|
else if ([@"invite" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self inviteUser:userId eventData:eventData];
|
||||||
|
}
|
||||||
|
else if ([@"bot_options" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self getBotOptions:userId eventData:eventData];
|
||||||
|
}
|
||||||
|
else if ([@"set_bot_options" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self setBotOptions:userId eventData:eventData];
|
||||||
|
}
|
||||||
|
else if ([@"set_bot_power" isEqualToString:action])
|
||||||
|
{
|
||||||
|
[self setBotPower:userId eventData:eventData];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerViewControllerVC] Unhandled postMessage event with action %@: %@", action, JSData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)sendBoolResponse:(BOOL)response toEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
// Convert BOOL to "true" or "false"
|
||||||
|
NSString *js = [NSString stringWithFormat:kJavascriptSendResponseToModular,
|
||||||
|
eventData[@"_id"],
|
||||||
|
response ? @"true" : @"false"];
|
||||||
|
|
||||||
|
[webView stringByEvaluatingJavaScriptFromString:js];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)sendIntegerResponse:(NSUInteger)response toEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSString *js = [NSString stringWithFormat:kJavascriptSendResponseToModular,
|
||||||
|
eventData[@"_id"],
|
||||||
|
@(response)];
|
||||||
|
|
||||||
|
[webView stringByEvaluatingJavaScriptFromString:js];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)sendNSObjectResponse:(NSObject*)response toEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSString *jsString;
|
||||||
|
|
||||||
|
if (response)
|
||||||
|
{
|
||||||
|
// Convert response into a JS object through a JSON string
|
||||||
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:response
|
||||||
|
options:0
|
||||||
|
error:0];
|
||||||
|
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
|
jsString = [NSString stringWithFormat:@"JSON.parse('%@')", jsonString];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
jsString = @"null";
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *js = [NSString stringWithFormat:kJavascriptSendResponseToModular,
|
||||||
|
eventData[@"_id"],
|
||||||
|
jsString];
|
||||||
|
|
||||||
|
[webView stringByEvaluatingJavaScriptFromString:js];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)sendError:(NSString*)message toEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] sendError: Action %@ failed with message: %@", eventData[@"action"], message);
|
||||||
|
|
||||||
|
// TODO: JS has an additional optional parameter: nestedError
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"error": @{
|
||||||
|
@"message": message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)sendLocalisedError:(NSString*)errorKey toEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
[self sendError:NSLocalizedStringFromTable(errorKey, @"Vector", nil) toEvent:eventData];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Modular postMessage Implementation
|
||||||
|
|
||||||
|
- (MXRoom *)roomCheckWithEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
MXRoom *room = [mxSession roomWithRoomId:roomId];
|
||||||
|
if (!room)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_room_not_recognised" toEvent:eventData];
|
||||||
|
}
|
||||||
|
|
||||||
|
return room;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)inviteUser:(NSString*)userId eventData:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] Received request to invite %@ into room %@.", userId, roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
MXRoomMember *member = [room.state memberWithUserId:userId];
|
||||||
|
if (member && member.membership == MXMembershipJoin)
|
||||||
|
{
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"success": @(YES)
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
[room inviteUser:userId success:^{
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"success": @(YES)
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_need_to_be_able_to_invite" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setWidget:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] Received request to set widget in room %@.", roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSString *widget_id, *widgetType, *widgetUrl;
|
||||||
|
NSString *widgetName; // optional
|
||||||
|
NSDictionary *widgetData ; // optional
|
||||||
|
|
||||||
|
MXJSONModelSetString(widget_id, eventData[@"widget_id"]);
|
||||||
|
MXJSONModelSetString(widgetType, eventData[@"type"]);
|
||||||
|
MXJSONModelSetString(widgetUrl, eventData[@"url"]);
|
||||||
|
MXJSONModelSetString(widgetName, eventData[@"name"]);
|
||||||
|
MXJSONModelSetDictionary(widgetData, eventData[@"data"]);
|
||||||
|
|
||||||
|
if (!widget_id)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_unable_to_create" toEvent:eventData]; // new Error("Missing required widget fields."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *widgetEventContent = [NSMutableDictionary dictionary];
|
||||||
|
if (widgetUrl)
|
||||||
|
{
|
||||||
|
if (!widgetType)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_unable_to_create" toEvent:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
widgetEventContent[@"type"] = widgetType;
|
||||||
|
widgetEventContent[@"url"] = widgetUrl;
|
||||||
|
|
||||||
|
if (widgetName)
|
||||||
|
{
|
||||||
|
widgetEventContent[@"name"] = widgetName;
|
||||||
|
}
|
||||||
|
if (widgetData)
|
||||||
|
{
|
||||||
|
widgetEventContent[@"data"] = widgetData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
[room sendStateEventOfType:kWidgetEventTypeString
|
||||||
|
content:widgetEventContent
|
||||||
|
stateKey:widget_id
|
||||||
|
success:^(NSString *eventId) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"success": @(YES)
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure:^(NSError *error) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_failed_to_send_request" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)getWidgets:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSArray<Widget*> *widgets = [[WidgetManager sharedManager] widgetsInRoom:room];
|
||||||
|
|
||||||
|
NSMutableArray<NSDictionary*> *widgetStateEvents = [NSMutableArray arrayWithCapacity:widgets.count];
|
||||||
|
|
||||||
|
for (Widget *widget in widgets)
|
||||||
|
{
|
||||||
|
[widgetStateEvents addObject:widget.widgetEvent.JSONDictionary];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self sendNSObjectResponse:widgetStateEvents toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)canSendEvent:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSString *eventType;
|
||||||
|
BOOL isState = NO;
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
if (room.state.membership != MXMembershipJoin)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_must_be_in_room" toEvent:eventData];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MXJSONModelSetString(eventType, eventData[@"event_type"]);
|
||||||
|
MXJSONModelSetBoolean(isState, eventData[@"is_state"]);
|
||||||
|
|
||||||
|
MXRoomPowerLevels *powerLevels = room.state.powerLevels;
|
||||||
|
NSInteger userPowerLevel = [powerLevels powerLevelOfUserWithUserID:mxSession.myUser.userId];
|
||||||
|
|
||||||
|
BOOL canSend = NO;
|
||||||
|
|
||||||
|
if (isState)
|
||||||
|
{
|
||||||
|
canSend = (userPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:eventType]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
canSend = (userPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsMessage:eventType]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canSend)
|
||||||
|
{
|
||||||
|
[self sendBoolResponse:YES toEvent:eventData];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_no_permission_in_room" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)getMembershipState:(NSString*)userId eventData:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] membership_state of %@ in room %@ requested.", userId, roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
MXRoomMember *member = [room.state memberWithUserId:userId];
|
||||||
|
[self sendNSObjectResponse:member.originalEvent.content toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)getJoinRules:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] join_rules of %@ requested.", roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
MXEvent *event = [room.state stateEventsWithType:kMXEventTypeStringRoomJoinRules].lastObject;
|
||||||
|
[self sendNSObjectResponse:event.JSONDictionary toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setPlumbingState:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] Received request to set plumbing state to status %@ in room %@.", eventData[@"status"], roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSString *status;
|
||||||
|
MXJSONModelSetString(status, eventData[@"status"]);
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
{
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
[room sendStateEventOfType:kMXEventTypeStringRoomPlumbing
|
||||||
|
content:@{
|
||||||
|
@"status": status
|
||||||
|
}
|
||||||
|
stateKey:nil
|
||||||
|
success:^(NSString *eventId) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"success": @(YES)
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure:^(NSError *error) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_failed_to_send_request" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] setPlumbingState. Error: Plumbing state status should be a string.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)getBotOptions:(NSString*)userId eventData:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] Received request to get options for bot %@ in room %@", userId, roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSString *stateKey = [NSString stringWithFormat:@"_%@", userId];
|
||||||
|
|
||||||
|
NSArray<MXEvent*> *stateEvents = [room.state stateEventsWithType:kMXEventTypeStringRoomBotOptions];
|
||||||
|
|
||||||
|
MXEvent *botOptionsEvent;
|
||||||
|
|
||||||
|
for (MXEvent *stateEvent in stateEvents)
|
||||||
|
{
|
||||||
|
if ([stateEvent.stateKey isEqualToString:stateKey])
|
||||||
|
{
|
||||||
|
if (!botOptionsEvent || stateEvent.ageLocalTs > botOptionsEvent.ageLocalTs)
|
||||||
|
{
|
||||||
|
botOptionsEvent = stateEvent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[self sendNSObjectResponse:botOptionsEvent.JSONDictionary toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setBotOptions:(NSString*)userId eventData:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] Received request to set options for bot %@ in room %@", userId, roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSDictionary *content;
|
||||||
|
MXJSONModelSetDictionary(content, eventData[@"content"]);
|
||||||
|
|
||||||
|
if (content)
|
||||||
|
{
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
NSString *stateKey = [NSString stringWithFormat:@"_%@", userId];
|
||||||
|
|
||||||
|
[room sendStateEventOfType:kMXEventTypeStringRoomBotOptions
|
||||||
|
content:content
|
||||||
|
stateKey:stateKey
|
||||||
|
success:^(NSString *eventId) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"success": @(YES)
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure:^(NSError *error) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_failed_to_send_request" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] setBotOptions. Error: options should be a dict.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setBotPower:(NSString*)userId eventData:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] Received request to set power level to %@ for bot %@ in room %@.", eventData[@"level"], userId, roomId);
|
||||||
|
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSInteger level = -1;
|
||||||
|
MXJSONModelSetInteger(level, eventData[@"level"]);
|
||||||
|
|
||||||
|
if (level >= 0)
|
||||||
|
{
|
||||||
|
__weak __typeof__(self) weakSelf = self;
|
||||||
|
|
||||||
|
[room setPowerLevelOfUserWithUserID:userId powerLevel:level success:^{
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendNSObjectResponse:@{
|
||||||
|
@"success": @(YES)
|
||||||
|
}
|
||||||
|
toEvent:eventData];
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
|
||||||
|
typeof(self) self = weakSelf;
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
[self sendLocalisedError:@"widget_integration_failed_to_send_request" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSLog(@"[IntegrationManagerVC] setBotPower. Power level must be positive integer.");
|
||||||
|
[self sendLocalisedError:@"widget_integration_positive_power_level" toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)getMembershipCount:(NSDictionary*)eventData
|
||||||
|
{
|
||||||
|
MXRoom *room = [self roomCheckWithEvent:eventData];
|
||||||
|
if (room)
|
||||||
|
{
|
||||||
|
NSUInteger membershipCount = room.state.joinedMembers.count;
|
||||||
|
[self sendIntegerResponse:membershipCount toEvent:eventData];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `JitsiViewController` is a VC for specifically handling a jitsi widget using the
|
The `JitsiViewController` is a VC for specifically handling a jitsi widget using the
|
||||||
jitsi-meet iOS SDK instead of displaying it in a webview like other scalar widgets.
|
jitsi-meet iOS SDK instead of displaying it in a webview like other modular widgets.
|
||||||
|
|
||||||
https://github.com/jitsi/jitsi-meet/tree/master/ios
|
https://github.com/jitsi/jitsi-meet/tree/master/ios
|
||||||
*/
|
*/
|
||||||
|
|
33
Riot/ViewController/Widgets/WidgetViewController.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "WebViewViewController.h"
|
||||||
|
|
||||||
|
#import "WidgetManager.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
`WidgetViewController` displays widget within a webview.
|
||||||
|
*/
|
||||||
|
@interface WidgetViewController : WebViewViewController
|
||||||
|
|
||||||
|
/**
|
||||||
|
Init 'WidgetViewController' instance with a widget.
|
||||||
|
|
||||||
|
@param widget the widget to open.
|
||||||
|
*/
|
||||||
|
- (instancetype)initForWidget:(Widget*)widget;
|
||||||
|
|
||||||
|
@end
|
48
Riot/ViewController/Widgets/WidgetViewController.m
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "WidgetViewController.h"
|
||||||
|
|
||||||
|
@interface WidgetViewController ()
|
||||||
|
{
|
||||||
|
Widget *widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation WidgetViewController
|
||||||
|
|
||||||
|
- (instancetype)initForWidget:(Widget*)theWidget
|
||||||
|
{
|
||||||
|
self = [super initWithURL:theWidget.url];
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
widget = theWidget;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewDidLoad
|
||||||
|
{
|
||||||
|
[super viewDidLoad];
|
||||||
|
|
||||||
|
webView.scalesPageToFit = NO;
|
||||||
|
webView.scrollView.bounces = NO;
|
||||||
|
|
||||||
|
self.navigationItem.title = widget.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
55
Riot/Views/Calls/CircleButton.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface CircleButton : UIButton
|
||||||
|
|
||||||
|
/**
|
||||||
|
Background color that is used for highlighted state
|
||||||
|
|
||||||
|
By default the same as borderColor
|
||||||
|
*/
|
||||||
|
@property (nonatomic) UIColor *highlightBackgroundColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Background color that is used for normal state
|
||||||
|
|
||||||
|
By default white
|
||||||
|
*/
|
||||||
|
@property (nonatomic) UIColor *defaultBackgroundColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Tint color that is used for highlighted state
|
||||||
|
|
||||||
|
By default is white
|
||||||
|
*/
|
||||||
|
@property (nonatomic) UIColor *highlightTintColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Tint color that is used for normal state
|
||||||
|
|
||||||
|
By default is the same as borderColor
|
||||||
|
*/
|
||||||
|
@property (nonatomic) UIColor *defaultTintColor;
|
||||||
|
|
||||||
|
- (instancetype)initWithImage:(UIImage *)image borderColor:(UIColor *)borderColor;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
86
Riot/Views/Calls/CircleButton.m
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "CircleButton.h"
|
||||||
|
|
||||||
|
@implementation CircleButton
|
||||||
|
|
||||||
|
- (instancetype)initWithImage:(UIImage *)image borderColor:(UIColor *)borderColor
|
||||||
|
{
|
||||||
|
self = [[super class] buttonWithType:UIButtonTypeCustom];
|
||||||
|
|
||||||
|
self.adjustsImageWhenDisabled = NO;
|
||||||
|
self.adjustsImageWhenHighlighted = NO;
|
||||||
|
|
||||||
|
self.layer.borderWidth = 1.0;
|
||||||
|
self.layer.borderColor = borderColor.CGColor;
|
||||||
|
|
||||||
|
self.defaultBackgroundColor = [UIColor whiteColor];
|
||||||
|
self.highlightTintColor = [UIColor whiteColor];
|
||||||
|
|
||||||
|
self.highlightBackgroundColor = borderColor;
|
||||||
|
self.defaultTintColor = borderColor;
|
||||||
|
self.tintColor = borderColor;
|
||||||
|
|
||||||
|
[self setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setDefaultBackgroundColor:(UIColor *)defaultBackgroundColor
|
||||||
|
{
|
||||||
|
_defaultBackgroundColor = defaultBackgroundColor;
|
||||||
|
self.backgroundColor = defaultBackgroundColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)layoutSubviews
|
||||||
|
{
|
||||||
|
[super layoutSubviews];
|
||||||
|
|
||||||
|
self.layer.cornerRadius = CGRectGetWidth(self.bounds) / 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
|
||||||
|
{
|
||||||
|
[super touchesBegan:touches withEvent:event];
|
||||||
|
[self animateBackgroundColor:self.highlightBackgroundColor tintColor:self.highlightTintColor];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
|
||||||
|
{
|
||||||
|
[super touchesEnded:touches withEvent:event];
|
||||||
|
[self animateBackgroundColor:self.defaultBackgroundColor tintColor:self.defaultTintColor];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
|
||||||
|
{
|
||||||
|
[super touchesCancelled:touches withEvent:event];
|
||||||
|
[self animateBackgroundColor:self.defaultBackgroundColor tintColor:self.defaultTintColor];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)animateBackgroundColor:(UIColor *)color tintColor:(UIColor *)tintColor
|
||||||
|
{
|
||||||
|
[UIView animateWithDuration:0.25
|
||||||
|
delay:0.0
|
||||||
|
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
|
||||||
|
animations:^{
|
||||||
|
self.backgroundColor = color;
|
||||||
|
self.tintColor = tintColor;
|
||||||
|
}
|
||||||
|
completion:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
47
Riot/Views/Calls/IncomingCallView.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
typedef void (^IncomingCallViewAction)();
|
||||||
|
|
||||||
|
@interface IncomingCallView : UIView
|
||||||
|
|
||||||
|
/**
|
||||||
|
Size that is applied to displayed user avatar
|
||||||
|
*/
|
||||||
|
@property (class, readonly) CGSize callerAvatarSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Block which is performed on call answer action
|
||||||
|
*/
|
||||||
|
@property (nonatomic, nullable, copy) IncomingCallViewAction onAnswer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Block which is performed on call reject
|
||||||
|
*/
|
||||||
|
@property (nonatomic, nullable, copy) IncomingCallViewAction onReject;
|
||||||
|
|
||||||
|
- (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL
|
||||||
|
placeholderImage:(UIImage *)placeholderImage
|
||||||
|
callerName:(NSString *)callerName
|
||||||
|
callInfo:(NSString *)callInfo;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
326
Riot/Views/Calls/IncomingCallView.m
Normal file
|
@ -0,0 +1,326 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Vector Creations Ltd
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "IncomingCallView.h"
|
||||||
|
|
||||||
|
#import <MatrixKit/MXKImageView.h>
|
||||||
|
#import <MatrixSDK/MXMediaManager.h>
|
||||||
|
|
||||||
|
#import "CircleButton.h"
|
||||||
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
|
static const CGFloat kAvatarSize = 100.0;
|
||||||
|
static const CGFloat kButtonSize = 80.0;
|
||||||
|
|
||||||
|
@interface IncomingCallView ()
|
||||||
|
|
||||||
|
@property (nonatomic) MXKImageView *callerImageView;
|
||||||
|
@property (nonatomic) UILabel *callerNameLabel;
|
||||||
|
@property (nonatomic) UILabel *callInfoLabel;
|
||||||
|
|
||||||
|
@property (nonatomic) CircleButton *answerButton;
|
||||||
|
@property (nonatomic) UILabel *answerTitleLabel;
|
||||||
|
|
||||||
|
@property (nonatomic) CircleButton *rejectButton;
|
||||||
|
@property (nonatomic) UILabel *rejectTitleLabel;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation IncomingCallView
|
||||||
|
|
||||||
|
+ (CGSize)callerAvatarSize
|
||||||
|
{
|
||||||
|
return CGSizeMake(kAvatarSize, kAvatarSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL placeholderImage:(UIImage *)placeholderImage callerName:(NSString *)callerName callInfo:(NSString *)callInfo
|
||||||
|
{
|
||||||
|
self = [super initWithFrame:CGRectZero];
|
||||||
|
if (self)
|
||||||
|
{
|
||||||
|
self.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
self.opaque = YES;
|
||||||
|
|
||||||
|
self.callerImageView = [[MXKImageView alloc] init];
|
||||||
|
self.callerImageView.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
self.callerImageView.clipsToBounds = YES;
|
||||||
|
self.callerImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder;
|
||||||
|
self.callerImageView.enableInMemoryCache = YES;
|
||||||
|
[self.callerImageView setImageURL:callerAvatarURL
|
||||||
|
withType:nil
|
||||||
|
andImageOrientation:UIImageOrientationUp
|
||||||
|
previewImage:placeholderImage];
|
||||||
|
|
||||||
|
self.callerNameLabel = [[UILabel alloc] init];
|
||||||
|
self.callerNameLabel.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
self.callerNameLabel.textColor = kRiotPrimaryTextColor;
|
||||||
|
self.callerNameLabel.font = [UIFont systemFontOfSize:24.0 weight:UIFontWeightMedium];
|
||||||
|
self.callerNameLabel.text = callerName;
|
||||||
|
self.callerNameLabel.textAlignment = NSTextAlignmentCenter;
|
||||||
|
|
||||||
|
self.callInfoLabel = [[UILabel alloc] init];
|
||||||
|
self.callInfoLabel.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
self.callInfoLabel.textColor = kRiotSecondaryTextColor;
|
||||||
|
self.callInfoLabel.font = [UIFont systemFontOfSize:18.0 weight:UIFontWeightRegular];
|
||||||
|
self.callInfoLabel.text = callInfo;
|
||||||
|
self.callInfoLabel.textAlignment = NSTextAlignmentCenter;
|
||||||
|
|
||||||
|
UIColor *answerButtonBorderColor = kRiotColorGreen;
|
||||||
|
|
||||||
|
self.answerButton = [[CircleButton alloc] initWithImage:[UIImage imageNamed:@"voice_call_icon"]
|
||||||
|
borderColor:answerButtonBorderColor];
|
||||||
|
self.answerButton.defaultBackgroundColor = kRiotPrimaryBgColor;
|
||||||
|
[self.answerButton addTarget:self action:@selector(didTapAnswerButton) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
|
||||||
|
self.answerTitleLabel = [[UILabel alloc] init];
|
||||||
|
self.answerTitleLabel.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
self.answerTitleLabel.textColor = answerButtonBorderColor;
|
||||||
|
self.answerTitleLabel.font = [UIFont systemFontOfSize:18.0 weight:UIFontWeightRegular];
|
||||||
|
self.answerTitleLabel.text = NSLocalizedStringFromTable(@"accept", @"Vector", nil);
|
||||||
|
|
||||||
|
UIColor *rejectButtonBorderColor = kRiotColorPinkRed;
|
||||||
|
|
||||||
|
self.rejectButton = [[CircleButton alloc] initWithImage:[UIImage imageNamed:@"call_hangup_icon"]
|
||||||
|
borderColor:rejectButtonBorderColor];
|
||||||
|
self.rejectButton.defaultBackgroundColor = kRiotPrimaryBgColor;
|
||||||
|
[self.rejectButton addTarget:self action:@selector(didTapRejectButton) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
|
||||||
|
self.rejectTitleLabel = [[UILabel alloc] init];
|
||||||
|
self.rejectTitleLabel.backgroundColor = kRiotPrimaryBgColor;
|
||||||
|
self.rejectTitleLabel.textColor = rejectButtonBorderColor;
|
||||||
|
self.rejectTitleLabel.font = [UIFont systemFontOfSize:18.0 weight:UIFontWeightRegular];
|
||||||
|
self.rejectTitleLabel.text = NSLocalizedStringFromTable(@"decline", @"Vector", nil);
|
||||||
|
|
||||||
|
[self setupLayout];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)layoutSubviews
|
||||||
|
{
|
||||||
|
[super layoutSubviews];
|
||||||
|
|
||||||
|
self.callerImageView.layer.cornerRadius = CGRectGetWidth(self.callerImageView.bounds) / 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setupLayout
|
||||||
|
{
|
||||||
|
NSArray *views = @[self.callerImageView, self.callerNameLabel, self.callInfoLabel, self.answerButton, self.answerTitleLabel, self.rejectButton, self.rejectTitleLabel];
|
||||||
|
for (UIView *view in views)
|
||||||
|
{
|
||||||
|
view.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
|
[self addSubview:view];
|
||||||
|
}
|
||||||
|
|
||||||
|
[NSLayoutConstraint activateConstraints:@[
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerImageView
|
||||||
|
attribute:NSLayoutAttributeTop
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeTop
|
||||||
|
multiplier:1.0
|
||||||
|
constant:62.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerImageView
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerImageView
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:nil
|
||||||
|
attribute:NSLayoutAttributeNotAnAttribute
|
||||||
|
multiplier:1.0
|
||||||
|
constant:kAvatarSize],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerImageView
|
||||||
|
attribute:NSLayoutAttributeHeight
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.callerImageView
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerNameLabel
|
||||||
|
attribute:NSLayoutAttributeTop
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.callerImageView
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
multiplier:1.0
|
||||||
|
constant:18.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerNameLabel
|
||||||
|
attribute:NSLayoutAttributeLeading
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeLeading
|
||||||
|
multiplier:1.0
|
||||||
|
constant:15.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callerNameLabel
|
||||||
|
attribute:NSLayoutAttributeTrailing
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeTrailing
|
||||||
|
multiplier:1.0
|
||||||
|
constant:-15.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callInfoLabel
|
||||||
|
attribute:NSLayoutAttributeTop
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.callerNameLabel
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
multiplier:1.0
|
||||||
|
constant:7.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callInfoLabel
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.callInfoLabel
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.callerNameLabel
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.rejectButton
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:nil
|
||||||
|
attribute:NSLayoutAttributeNotAnAttribute
|
||||||
|
multiplier:1.0
|
||||||
|
constant:kButtonSize],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.rejectButton
|
||||||
|
attribute:NSLayoutAttributeHeight
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.rejectButton
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.rejectButton
|
||||||
|
attribute:NSLayoutAttributeTrailing
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
multiplier:1.0
|
||||||
|
constant:-22.5],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.rejectTitleLabel
|
||||||
|
attribute:NSLayoutAttributeTop
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.rejectButton
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
multiplier:1.0
|
||||||
|
constant:8.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.rejectTitleLabel
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.rejectButton
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.rejectTitleLabel
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
multiplier:1.0
|
||||||
|
constant:-16.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.answerButton
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:nil
|
||||||
|
attribute:NSLayoutAttributeNotAnAttribute
|
||||||
|
multiplier:1.0
|
||||||
|
constant:kButtonSize],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.answerButton
|
||||||
|
attribute:NSLayoutAttributeHeight
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.answerButton
|
||||||
|
attribute:NSLayoutAttributeWidth
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.answerButton
|
||||||
|
attribute:NSLayoutAttributeLeading
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
multiplier:1.0
|
||||||
|
constant:22.5],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.answerTitleLabel
|
||||||
|
attribute:NSLayoutAttributeTop
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.answerButton
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
multiplier:1.0
|
||||||
|
constant:8.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.answerTitleLabel
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self.answerButton
|
||||||
|
attribute:NSLayoutAttributeCenterX
|
||||||
|
multiplier:1.0
|
||||||
|
constant:0.0],
|
||||||
|
|
||||||
|
[NSLayoutConstraint constraintWithItem:self.answerTitleLabel
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:self
|
||||||
|
attribute:NSLayoutAttributeBottom
|
||||||
|
multiplier:1.0
|
||||||
|
constant:-16.0]
|
||||||
|
]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Actions
|
||||||
|
|
||||||
|
- (void)didTapAnswerButton
|
||||||
|
{
|
||||||
|
if (self.onAnswer)
|
||||||
|
{
|
||||||
|
self.onAnswer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)didTapRejectButton
|
||||||
|
{
|
||||||
|
if (self.onReject)
|
||||||
|
{
|
||||||
|
self.onReject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -82,7 +82,7 @@
|
||||||
// Remove default toolbar background color
|
// Remove default toolbar background color
|
||||||
self.backgroundColor = [UIColor clearColor];
|
self.backgroundColor = [UIColor clearColor];
|
||||||
|
|
||||||
self.separatorView.backgroundColor = kRiotColorSilver;
|
self.separatorView.backgroundColor = kRiotAuxiliaryColor;
|
||||||
|
|
||||||
// Custom the growingTextView display
|
// Custom the growingTextView display
|
||||||
growingTextView.layer.cornerRadius = 0;
|
growingTextView.layer.cornerRadius = 0;
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#import "RiotDesignValues.h"
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
#import "MXRoomSummary+Riot.h"
|
||||||
|
|
||||||
@implementation RecentTableViewCell
|
@implementation RecentTableViewCell
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self.missedNotifAndUnreadIndicator.backgroundColor = kRiotColorSilver;
|
self.missedNotifAndUnreadIndicator.backgroundColor = kRiotAuxiliaryColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use bold font for the room title
|
// Use bold font for the room title
|
||||||
|
@ -143,7 +143,7 @@
|
||||||
|
|
||||||
self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted;
|
self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted;
|
||||||
|
|
||||||
[roomCellData.roomSummary.room setRoomAvatarImageIn:self.roomAvatar];
|
[roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#import "RiotDesignValues.h"
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
#import "MXRoomSummary+Riot.h"
|
||||||
|
|
||||||
#import "MXTools.h"
|
#import "MXTools.h"
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@
|
||||||
|
|
||||||
self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted;
|
self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted;
|
||||||
|
|
||||||
[roomCellData.roomSummary.room setRoomAvatarImageIn:self.roomAvatar];
|
[roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
/**
|
/**
|
||||||
Update the information displayed by the cell.
|
Update the information displayed by the cell.
|
||||||
|
|
||||||
@param rooom the room to render.
|
@param room the room to render.
|
||||||
*/
|
*/
|
||||||
- (void)render:(MXRoom *)room;
|
- (void)render:(MXRoom *)room;
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#import "RoomTableViewCell.h"
|
#import "RoomTableViewCell.h"
|
||||||
|
|
||||||
#import "RiotDesignValues.h"
|
#import "RiotDesignValues.h"
|
||||||
#import "MXRoom+Riot.h"
|
#import "MXRoomSummary+Riot.h"
|
||||||
|
|
||||||
@implementation RoomTableViewCell
|
@implementation RoomTableViewCell
|
||||||
|
|
||||||
|
@ -50,9 +50,9 @@
|
||||||
|
|
||||||
- (void)render:(MXRoom *)room
|
- (void)render:(MXRoom *)room
|
||||||
{
|
{
|
||||||
[room setRoomAvatarImageIn:self.avatarImageView];
|
[room.summary setRoomAvatarImageIn:self.avatarImageView];
|
||||||
|
|
||||||
self.titleLabel.text = room.riotDisplayname;
|
self.titleLabel.text = room.summary.displayname;
|
||||||
|
|
||||||
self.directRoomBorderView.hidden = !room.isDirect;
|
self.directRoomBorderView.hidden = !room.isDirect;
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
|
|
||||||
#import "RiotDesignValues.h"
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
|
||||||
|
|
||||||
@implementation ExpandedRoomTitleView
|
@implementation ExpandedRoomTitleView
|
||||||
|
|
||||||
+ (UINib *)nib
|
+ (UINib *)nib
|
||||||
|
@ -38,7 +36,7 @@
|
||||||
{
|
{
|
||||||
[super customizeViewRendering];
|
[super customizeViewRendering];
|
||||||
|
|
||||||
self.displayNameTextField.textColor = (self.mxRoom.riotDisplayname.length ? kRiotPrimaryTextColor : kRiotSecondaryTextColor);
|
self.displayNameTextField.textColor = (self.mxRoom.summary.displayname.length ? kRiotPrimaryTextColor : kRiotSecondaryTextColor);
|
||||||
self.roomTopic.textColor = kRiotTopicTextColor;
|
self.roomTopic.textColor = kRiotTopicTextColor;
|
||||||
self.roomMembers.textColor = kRiotColorGreen;
|
self.roomMembers.textColor = kRiotColorGreen;
|
||||||
}
|
}
|
||||||
|
@ -49,7 +47,7 @@
|
||||||
|
|
||||||
if (self.mxRoom)
|
if (self.mxRoom)
|
||||||
{
|
{
|
||||||
self.displayNameTextField.text = self.mxRoom.riotDisplayname;
|
self.displayNameTextField.text = self.mxRoom.summary.displayname;
|
||||||
if (!self.displayNameTextField.text.length)
|
if (!self.displayNameTextField.text.length)
|
||||||
{
|
{
|
||||||
self.displayNameTextField.text = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
self.displayNameTextField.text = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
|
|
||||||
#import "RiotDesignValues.h"
|
#import "RiotDesignValues.h"
|
||||||
|
|
||||||
#import "MXRoom+Riot.h"
|
|
||||||
|
|
||||||
@implementation PreviewRoomTitleView
|
@implementation PreviewRoomTitleView
|
||||||
|
|
||||||
+ (UINib *)nib
|
+ (UINib *)nib
|
||||||
|
@ -64,7 +62,7 @@
|
||||||
self.backgroundColor = kRiotPrimaryBgColor;
|
self.backgroundColor = kRiotPrimaryBgColor;
|
||||||
self.mainHeaderBackground.backgroundColor = kRiotSecondaryBgColor;
|
self.mainHeaderBackground.backgroundColor = kRiotSecondaryBgColor;
|
||||||
|
|
||||||
self.displayNameTextField.textColor = (self.mxRoom.riotDisplayname.length ? kRiotPrimaryTextColor : kRiotSecondaryTextColor);
|
self.displayNameTextField.textColor = (self.mxRoom.summary.displayname.length ? kRiotPrimaryTextColor : kRiotSecondaryTextColor);
|
||||||
|
|
||||||
self.roomTopic.textColor = kRiotTopicTextColor;
|
self.roomTopic.textColor = kRiotTopicTextColor;
|
||||||
self.roomTopic.numberOfLines = 0;
|
self.roomTopic.numberOfLines = 0;
|
||||||
|
@ -145,7 +143,7 @@
|
||||||
else if (self.mxRoom)
|
else if (self.mxRoom)
|
||||||
{
|
{
|
||||||
// The user is here invited to join a room (This invitation has been received from server sync)
|
// The user is here invited to join a room (This invitation has been received from server sync)
|
||||||
self.displayNameTextField.text = self.mxRoom.riotDisplayname;
|
self.displayNameTextField.text = self.mxRoom.summary.displayname;
|
||||||
if (!self.displayNameTextField.text.length)
|
if (!self.displayNameTextField.text.length)
|
||||||
{
|
{
|
||||||
self.displayNameTextField.text = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
self.displayNameTextField.text = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil);
|
||||||
|
|