Merge pull request #4508 from vector-im/release/1.4.4/release

Release 1.4.4
This commit is contained in:
manuroe
2021-06-30 16:54:29 +02:00
committed by GitHub
67 changed files with 1256 additions and 319 deletions
+30
View File
@@ -1,3 +1,33 @@
Changes in 1.4.4 (2021-06-30)
=================================================
✨ Features
*
🙌 Improvements
* DesignKit: Add Fonts (#4356).
* VoIP: Implement audio output router menu in call screen.
🐛 Bugfix
* SSO: Handle login callback URL with HTML entities (#4129).
* Share extension: Fix theme in dark mode (#4486).
* Theme: Fix authentication activity indicator colour when using a dark theme (#4485).
⚠️ API Changes
*
🗣 Translations
*
🧱 Build
*
Others
*
Improvements:
* Upgrade MatrixKit version ([v0.15.3](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.15.3)).
Changes in 1.4.3 (2021-06-24)
=================================================
+2 -2
View File
@@ -22,8 +22,8 @@ APPLICATION_GROUP_IDENTIFIER = group.im.vector
APPLICATION_SCHEME = element
// Version
MARKETING_VERSION = 1.4.3
CURRENT_PROJECT_VERSION = 1.4.3
MARKETING_VERSION = 1.4.4
CURRENT_PROJECT_VERSION = 1.4.4
// Team
+55
View File
@@ -0,0 +1,55 @@
//
// Copyright 2021 New Vector 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
public extension UIFont {
// MARK: - Convenient methods
/// Update current font with a SymbolicTraits
func vc_withTraits(_ traits: UIFontDescriptor.SymbolicTraits) -> UIFont {
guard let descriptor = fontDescriptor.withSymbolicTraits(traits) else {
return self
}
return UIFont(descriptor: descriptor, size: 0) // Size 0 means keep the size as it is
}
/// Update current font with a given Weight
func vc_withWeight(weight: Weight) -> UIFont {
// Add the font weight to the descriptor
let weightedFontDescriptor = fontDescriptor.addingAttributes([
UIFontDescriptor.AttributeName.traits: [
UIFontDescriptor.TraitKey.weight: weight
]
])
return UIFont(descriptor: weightedFontDescriptor, size: 0)
}
// MARK: - Shortcuts
var vc_bold: UIFont {
return self.vc_withTraits(.traitBold)
}
var vc_semiBold: UIFont {
return self.vc_withWeight(weight: .semibold)
}
var vc_italic: UIFont {
return self.vc_withTraits(.traitItalic)
}
}
+83
View File
@@ -0,0 +1,83 @@
//
// Copyright 2021 New Vector 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
/// Describe fonts used in the application.
/// Font names are based on Element typograhy https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=1362%3A0 which is based on Apple font text styles (UIFont.TextStyle): https://developer.apple.com/documentation/uikit/uifonttextstyle
/// Create a custom TextStyle enum (like DesignKit.Fonts.TextStyle) is also a possiblity
@objc public protocol Fonts {
/// The font for large titles.
var largeTitle: UIFont { get }
/// `largeTitle` with a Bold weight.
var largeTitleB: UIFont { get }
/// The font for first-level hierarchical headings.
var title1: UIFont { get }
/// `title1` with a Bold weight.
var title1B: UIFont { get }
/// The font for second-level hierarchical headings.
var title2: UIFont { get }
/// `title2` with a Bold weight.
var title2B: UIFont { get }
/// The font for third-level hierarchical headings.
var title3: UIFont { get }
/// `title3` with a Semi Bold weight.
var title3SB: UIFont { get }
/// The font for headings.
var headline: UIFont { get }
/// The font for subheadings.
var subheadline: UIFont { get }
/// The font for body text.
var body: UIFont { get }
/// `body` with a Semi Bold weight.
var bodySB: UIFont { get }
/// The font for callouts.
var callout: UIFont { get }
/// `callout` with a Semi Bold weight.
var calloutSB: UIFont { get }
/// The font for footnotes.
var footnote: UIFont { get }
/// `footnote` with a Semi Bold weight.
var footnoteSB: UIFont { get }
/// The font for standard captions.
var caption1: UIFont { get }
/// `caption1` with a Semi Bold weight.
var caption1SB: UIFont { get }
/// The font for alternate captions.
var caption2: UIFont { get }
/// `caption2` with a Semi Bold weight.
var caption2SB: UIFont { get }
}
+3
View File
@@ -23,6 +23,9 @@ import UIKit
/// Colors object
var colors: Colors { get }
/// Fonts object
var fonts: Fonts { get }
/// may contain more design components in future, like icons, audio files etc.
}
+119
View File
@@ -0,0 +1,119 @@
//
// Copyright 2021 New Vector 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
/// Fonts at https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=1362%3A0
@objcMembers
public class ElementFonts {
// MARK: - Setup
public init() {
}
// MARK: - Private
/// Returns an instance of the font associated with the text style and scaled appropriately for the content size category defined in the trait collection.
/// Keep this method private method at the moment and create a DesignKit.Fonts.TextStyle if needed.
fileprivate func font(forTextStyle textStyle: UIFont.TextStyle, compatibleWith traitCollection: UITraitCollection? = nil) -> UIFont {
return UIFont.preferredFont(forTextStyle: textStyle, compatibleWith: traitCollection)
}
}
// MARK: - Fonts protocol
extension ElementFonts: Fonts {
public var largeTitle: UIFont {
return self.font(forTextStyle: .largeTitle)
}
public var largeTitleB: UIFont {
return self.largeTitle.vc_bold
}
public var title1: UIFont {
return self.font(forTextStyle: .title1)
}
public var title1B: UIFont {
return self.title1.vc_bold
}
public var title2: UIFont {
return self.font(forTextStyle: .title2)
}
public var title2B: UIFont {
return self.title2.vc_bold
}
public var title3: UIFont {
return self.font(forTextStyle: .title3)
}
public var title3SB: UIFont {
return self.title3.vc_semiBold
}
public var headline: UIFont {
return self.font(forTextStyle: .headline)
}
public var subheadline: UIFont {
return self.font(forTextStyle: .subheadline)
}
public var body: UIFont {
return self.font(forTextStyle: .body)
}
public var bodySB: UIFont {
return self.body.vc_semiBold
}
public var callout: UIFont {
return self.font(forTextStyle: .callout)
}
public var calloutSB: UIFont {
return self.callout.vc_semiBold
}
public var footnote: UIFont {
return self.font(forTextStyle: .footnote)
}
public var footnoteSB: UIFont {
return self.footnote.vc_semiBold
}
public var caption1: UIFont {
return self.font(forTextStyle: .caption1)
}
public var caption1SB: UIFont {
return self.caption1.vc_semiBold
}
public var caption2: UIFont {
return self.font(forTextStyle: .caption2)
}
public var caption2SB: UIFont {
return self.caption2.vc_semiBold
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ use_frameworks!
# - `{ {kit spec hash} => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for each repo. Used by Fastfile during CI
#
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
$matrixKitVersion = '= 0.15.2'
$matrixKitVersion = '= 0.15.3'
# $matrixKitVersion = :local
# $matrixKitVersion = {'develop' => 'develop'}
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Mobile.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Mobile@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Mobile@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Headphones.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Headphones@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Headphones@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Sound.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Sound@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Sound@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "Group 3617.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Group 3617@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Group 3617@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -1,17 +1,17 @@
{
"images" : [
{
"filename" : "call_speaker_off_icon.png",
"filename" : "Button VoIP.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "call_speaker_off_icon@2x.png",
"filename" : "Button VoIP@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "call_speaker_off_icon@3x.png",
"filename" : "Button VoIP@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
@@ -21,6 +21,6 @@
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
"template-rendering-intent" : "original"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -1,17 +1,17 @@
{
"images" : [
{
"filename" : "call_speaker_on_icon.png",
"filename" : "Button VoIP.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "call_speaker_on_icon@2x.png",
"filename" : "Button VoIP@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "call_speaker_on_icon@3x.png",
"filename" : "Button VoIP@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
@@ -21,6 +21,6 @@
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
"template-rendering-intent" : "original"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 785 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -19,5 +19,8 @@
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
+46 -46
View File
@@ -586,46 +586,46 @@
"key_backup_setup_intro_info" = "Nachrichten in verschlüsselten Räumen werden durch Ende-zu-Ende-Verschlüsselung gesichert. Nur Du und der/die Empfänger haben die Schlüssel zum Lesen dieser Nachrichten.\n\nSichere deine Schlüssel auf einer sicheren Art, um sie nicht zu verlieren.";
"key_backup_setup_intro_setup_action_without_existing_backup" = "Beginne Schlüsselsicherung zu nutzen";
"key_backup_setup_intro_setup_action_with_existing_backup" = "Benutze Schlüsselsicherung";
"key_backup_setup_passphrase_title" = "Sichere deine Datensicherung mit einer Passphrase";
"key_backup_setup_passphrase_info" = "Wir speichern eine verschlüsselte Kopie deiner Schlüssel auf unserem Server. Schütze deine Sicherung mit einer Passphrase, um sie sicher zu halten.\n\nFür maximale Sicherheit sollte sich dies von deinem Kontopasswort unterscheiden.";
"key_backup_setup_passphrase_title" = "Sichere dein Backup mit einer Sicherungsphrase";
"key_backup_setup_passphrase_info" = "Wir speichern eine verschlüsselte Kopie deiner Schlüssel auf unserem Server. Schütze sie mit einer Passphrase, um sie sicher zu halten.\n\nFür maximale Sicherheit sollte sich dies von deinem Kontopasswort unterscheiden.";
"key_backup_setup_passphrase_passphrase_title" = "Eingeben";
"key_backup_setup_passphrase_passphrase_placeholder" = "Passphrase eingeben";
"key_backup_setup_passphrase_passphrase_placeholder" = "Sicherungsphrase eingeben";
"key_backup_setup_passphrase_passphrase_valid" = "Gut!";
"key_backup_setup_passphrase_passphrase_invalid" = "Versuche ein Wort hinzuzufügen";
"key_backup_setup_passphrase_confirm_passphrase_title" = "Bestätigen";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Passphrase bestätigen";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Sicherungsphrase bestätigen";
"key_backup_setup_passphrase_confirm_passphrase_valid" = "Gut!";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Passphrasen müssen übereinstimmen";
"key_backup_setup_passphrase_set_passphrase_action" = "Passphrase setzen";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Oder sichere deine Sicherung mit einem Wiederherstellungsschlüssel, und speichere sie an einem sicheren Ort ab.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Erweitert) Mit Wiederherstellungsschlüssel einrichten";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Sicherungsphrase inkorrekt";
"key_backup_setup_passphrase_set_passphrase_action" = "Sicherungsphrase setzen";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Oder sichere deine Sicherung mit einem Sicherungsschlüssel und speichere sie an einem sicheren Ort ab.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Erweitert) Mit Sicherungsschlüssel einrichten";
"key_backup_setup_success_title" = "Erfolgreich!";
// Success from passphrase
"key_backup_setup_success_from_passphrase_info" = "Deine Schlüssel werden gesichert.\n\nDein Wiederherstellungsschlüssel ist ein Sicherheitsnetzwerk - Du kannst damit den Zugriff auf deine verschlüsselten Nachrichten wiederherstellen, wenn du deine Passphrase vergisst.\n\nBewahre den Wiederherstellungsschlüssel an einem sehr sicheren Ort auf, beispielsweise in einer Passwortverwaltung (oder einem Tresor).";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Wiederherstellungsschlüssel speichern";
"key_backup_setup_success_from_passphrase_info" = "Deine Schlüssel werden gesichert.\n\nDein Sicherungsschlüssel ist wie ein Schutznetz - Du kannst damit den Zugriff auf deine verschlüsselten Nachrichten wiederherstellen, wenn du deine Passphrase vergisst.\n\nBewahre ihn an einem sicheren Ort wie einem Passwortmanager oder Tresor auf.";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Sicherungsschlüssel speichern";
"key_backup_setup_success_from_passphrase_done_action" = "Erledigt";
// Success from recovery key
"key_backup_setup_success_from_recovery_key_info" = "Deine Schlüssel werden gesichert.\n\nErstelle eine Kopie dieses Wiederherstellungsschlüssels und bewahre ihn auf.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Wiederherstellungsschlüssel";
"key_backup_setup_success_from_recovery_key_info" = "Deine Schlüssel werden gesichert.\n\nErstelle eine Kopie des Sicherungsschlüssels und bewahre ihn sicher auf.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Sicherungsschlüssel";
"key_backup_setup_success_from_recovery_key_make_copy_action" = "Mache eine Kopie";
"key_backup_setup_success_from_recovery_key_made_copy_action" = "Ich fertigte eine Kopie an";
"key_backup_recover_title" = "Nachrichten sichern";
"key_backup_recover_invalid_passphrase_title" = "Falsche Wiederherstellungspassphrase";
"key_backup_recover_invalid_passphrase" = "Sicherung konnte nicht mit dieser Passphrase entschlüsselt werden: Bitte stelle sicher, dass du die richtige Wiederherstellungspassphrase eingegeben hast.";
"key_backup_recover_invalid_recovery_key_title" = "Wiederherstellungsschlüssel passt nicht";
"key_backup_recover_invalid_recovery_key" = "Sicherung konnte mit diesem Schlüssel nicht entschlüsselt werden: Bitte stelle sicher, dass du den richtigen Wiederherstellungsschlüssel eingegeben hast.";
"key_backup_recover_from_passphrase_info" = "Nutze deine Wiederherstellungspassphrase um deinen sicheren Chatverlauf zu entschlüsseln";
"key_backup_recover_invalid_passphrase_title" = "Falsche Sicherungsphrase";
"key_backup_recover_invalid_passphrase" = "Sicherung konnte mit dieser Phrase nicht entschlüsselt werden: Bitte stelle sicher, dass du die richtige Sicherungsphrase eingegeben hast.";
"key_backup_recover_invalid_recovery_key_title" = "Ungültiger Sicherungsschlüssel";
"key_backup_recover_invalid_recovery_key" = "Sicherung konnte mit diesem Schlüssel nicht entschlüsselt werden: Bitte stelle sicher, dass du den richtigen Sicherungsschlüssel eingegeben hast.";
"key_backup_recover_from_passphrase_info" = "Nutze deine Sicherungsphrase um deinen sicheren Chatverlauf zu entschlüsseln";
"key_backup_recover_from_passphrase_passphrase_title" = "Eingeben";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Passphrase eingeben";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Phrase eingeben";
"key_backup_recover_from_passphrase_recover_action" = "Historie entschlüsseln";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kennst deinen Wiederherstellungskennphrase nicht? Du kannst ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "deinen Wiederherstellungsschlüssel nutzen";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kennst deine Sicherungsphrase nicht? Du kannst ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "deinen Sicherungsschlüssel nutzen";
"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = ".";
"key_backup_recover_from_recovery_key_info" = "Nutze deinen Wiederherstellungsschlüssel um deinen sicheren Chatverlauf zu entschlüsseln";
"key_backup_recover_from_recovery_key_info" = "Nutze deinen Sicherungsschlüssel, um deine Chatverläufe zu entschlüsseln";
"key_backup_recover_from_recovery_key_recovery_key_title" = "Eingeben";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Gebe Wiederherstellungsschlüssel ein";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Sicherungsschlüssel eingeben";
"key_backup_recover_from_recovery_key_recover_action" = "Historie entschlüsseln";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Hast du deinen Wiederherstellungsschlüssel verloren? Du kannst in den Einstellungen einen neuen einrichten.";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Hast du deinen Sicherungsschlüssel verloren? Du kannst in den Einstellungen einen neuen einrichten.";
"key_backup_recover_success_info" = "Sicherung wiederhergestellt!";
"key_backup_recover_done_action" = "Erledigt";
"key_backup_setup_banner_title" = "Verliere niemals verschlüsselte Nachrichten";
@@ -646,7 +646,7 @@
"sign_out_key_backup_in_progress_alert_cancel_action" = "Ich werde warten";
// Key backup wrong version
"e2e_key_backup_wrong_version_title" = "Neue Schlüsselsicherung";
"e2e_key_backup_wrong_version" = "Es wurde eine neue Sicherung für einen sicheren Nachrichtenschlüssel erkannt.\n\nWenn dies nicht der Fall war, lege in den Einstellungen eine neue Passphrase fest.";
"e2e_key_backup_wrong_version" = "Eine neues Schlüsselbackup wurde erkannt.\n\nWenn dies nicht der Fall war, lege in den Einstellungen eine neue Sicherungsphrase fest.";
"e2e_key_backup_wrong_version_button_settings" = "Einstellungen";
"e2e_key_backup_wrong_version_button_wasme" = "Das war ich";
"key_backup_setup_intro_manual_export_info" = "(Erweitert)";
@@ -1028,7 +1028,7 @@
"external_link_confirmation_title" = "Überprüfe diesen Link genau";
"external_link_confirmation_message" = "Der Link %@ braucht zu lange auf der anderen Seite: %@\n\nSicher, dass du fortfahren möchtest?";
"security_settings_crypto_sessions_description_2" = "Wenn du dich nicht angemeldet hast, ändere dein Passwort und setze die Sichere Sicherheitskopie zurück.";
"security_settings_secure_backup_description" = "Sichere deine verschlüsselten Nachrichten und Daten, indem du die Schlüssel auf deinem Server sicherst.";
"security_settings_secure_backup_description" = "Sichere die Schlüssel, um Datenverlust zu verhindern. Sie werden mit einem Sicherungsschlüssel gesichert.";
"security_settings_crosssigning_info_exists" = "Dein Konto hat eine Quersignatur-Identität, aber dieser Sitzung wird noch nicht vertraut. Vervollständige die Sicherheit auf diese Sitzung.";
"security_settings_crosssigning_info_trusted" = "Quersignierung ist aktiviert. Du kannst anderen Nutzern und deinen anderen Sitzungen basierend auf der Quersignatur vertrauen, aber du kannst in dieser Sitzung keine Quersignierung durchführen, da sie keine privaten Quersignatur-Schlüssel enthält. Vervollständige die Sicherheit dieser Sitzung.";
"security_settings_crosssigning_bootstrap" = "Einrichten";
@@ -1042,7 +1042,7 @@
"secure_key_backup_setup_intro_info" = "Absicherung um den Zugriffsverlust auf verschlüsselte Nachrichten und Daten zu verhindern, indem die Schlüssel für die Entschlüsselung auf dem Server gesichert werden.";
"secure_key_backup_setup_intro_use_security_key_title" = "Benutze einen Sicherheitsschlüssel";
"secure_key_backup_setup_intro_use_security_key_info" = "Generiere einen Sicherheitsschlüssel, welcher z.B. in einer Passwortverwaltung oder in einem Tresor sicher aufbewahrt werden sollte.";
"secure_key_backup_setup_intro_use_security_passphrase_title" = "Benutze Sicherheitsphrase";
"secure_key_backup_setup_intro_use_security_passphrase_title" = "Benutze Sicherungsphrase";
"secure_key_backup_setup_intro_use_security_passphrase_info" = "Gib eine geheime Phrase ein, die nur du kennst, um einen Schlüssel für die Sicherung zu generieren.";
"secure_key_backup_setup_existing_backup_error_title" = "Eine Sicherheitskopie für Nachrichten existiert bereits";
"secure_key_backup_setup_existing_backup_error_info" = "Entsperre es, um es in der sicheren Datensicherung wiederzuverwenden, oder lösche es, um eine neue Nachrichtensicherung zu erstellen.";
@@ -1067,8 +1067,8 @@
"key_verification_self_verify_unverified_sessions_alert_validate_action" = "Überprüfung";
"device_verification_self_verify_wait_new_sign_in_title" = "Diese Anmeldung verifizieren";
"device_verification_self_verify_wait_additional_information" = "Dies funktioniert mit Element oder einem anderen Matrix-Client, der Quersignierung unterstützt.";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Wiederherstellungsschlüssel verwenden";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Nutze eine Wiederherstellungsmethode";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Sicherungsschlüssel verwenden";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Sicherungsphrase oder -schlüssel verwenden";
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Falls du keinen Zugang zu einer existierenden Sitzung hast";
"key_verification_verify_sas_title_emoji" = "Vergleiche Emojis";
"key_verification_verify_sas_title_number" = "Vergleiche Zahlen";
@@ -1089,7 +1089,7 @@
"key_verification_bootstrap_not_setup_title" = "Fehler";
"key_verification_bootstrap_not_setup_message" = "Du musst erst die Quersignatur einrichten.";
"key_verification_verify_qr_code_title" = "Verifizierung durch Scannen eines QR-Codes";
"key_verification_verify_qr_code_information" = "Scanne den Code für eine gegenseitige Überprüfung.";
"key_verification_verify_qr_code_information" = "Zum gegenseitigen Verifizieren scanne den QR-Code.";
"key_verification_verify_qr_code_information_other_device" = "Scanne den Code unten zur Überprüfung:";
"key_verification_verify_qr_code_emoji_information" = "Überprüfung durch den Vergleich einzigartiger Emojis.";
"key_verification_verify_qr_code_scan_code_action" = "Scanne Code des Gegenübers";
@@ -1106,25 +1106,25 @@
"key_verification_scan_confirmation_scanned_user_information" = "Zeigt %@ dasselbe Schild an?";
"key_verification_scan_confirmation_scanned_device_information" = "Zeigt das andere Gerät das gleiche Schild an?";
"user_verification_session_details_verify_action_current_user_manually" = "Überprüfe manuell mit einem Text";
"secrets_recovery_with_passphrase_title" = "Wiederherstellungspassphrase";
"secrets_recovery_with_passphrase_information_default" = "Gib deine Wiederherstellungspassphrase ein, um auf deine verschlüsselten Nachrichten und deine Quersignatur-Identität zuzugreifen. Mit der Quersignatur-Identität kannst du andere Sitzungen verifizieren.";
"secrets_recovery_with_passphrase_information_verify_device" = "Nutze deinen Wiederherstellungsphrase um dieses Gerät zu verifizieren.";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Gib die Wiederherstellungspassphrase ein";
"secrets_recovery_with_passphrase_recover_action" = "Nutze Passphrase";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Wenn du deine Wiederherstellungspassphrase nicht weißt, kannst du ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "deinen Wiederherstellungsschlüssel nutzen";
"secrets_recovery_with_passphrase_title" = "Sicherungsphrase";
"secrets_recovery_with_passphrase_information_default" = "Für Zugriff auf die Nachrichtenhistorie und Quersignatur gib deine Sicherungsphrase ein.";
"secrets_recovery_with_passphrase_information_verify_device" = "Nutze deine Sicherungsphrase um dieses Gerät zu verifizieren.";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Gib die Sicherungsphrase ein";
"secrets_recovery_with_passphrase_recover_action" = "Sicherungsphrase verwenden";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Wenn du die Sicherungsphrase vergessen hast, kannst du ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "den Sicherungsschlüssel nutzen";
"secrets_recovery_with_passphrase_lost_passphrase_action_part3" = ".";
"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Auf sicheren Speicher kann nicht zugegriffen werden";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Bitte stell sicher, dass du die korrekte Wiederherstellungspassphrase eingegeben hast.";
"secrets_recovery_with_key_title" = "Wiederherstellungsschlüssel";
"secrets_recovery_with_key_information_default" = "Gib deinen Wiederherstellungsschlüssel ein, um auf deine verschlüsselten Nachrichten und deine Quersignatur-Identität zuzugreifen. Mit der Quersignatur-Identität kannst du andere Sitzungen verifizieren.";
"secrets_recovery_with_key_information_verify_device" = "Nutze deinen Wiederherstellungsschlüssel um dieses Gerät zu verifizieren.";
"secrets_recovery_with_key_recovery_key_placeholder" = "Wiederherstellungsschlüssel eingeben";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Bitte stell sicher, dass du die korrekte Sicherungsphrase eingegeben hast.";
"secrets_recovery_with_key_title" = "Sicherungsschlüssel";
"secrets_recovery_with_key_information_default" = "Gib den Sicherungsschlüssel ein, um auf die verschlüsselten Nachrichten und Quersignatur zuzugreifen. Mit der Quersignatur kannst du andere Sitzungen verifizieren.";
"secrets_recovery_with_key_information_verify_device" = "Nutze deinen Sicherungsschlüssel, um dieses Gerät zu verifizieren.";
"secrets_recovery_with_key_recovery_key_placeholder" = "Sicherungsschlüssel eingeben";
"secrets_recovery_with_key_recover_action" = "Schlüssel benutzen";
"secrets_recovery_with_key_invalid_recovery_key_title" = "Auf sicheren Speicher kann nicht zugegriffen werden";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Bitte stell sicher, dass du den korrekten Wiederherstellungsschlüssel benutzt hast.";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Überprüfe, dass du den richtigen Sicherungsschlüssel verwendest.";
"secrets_setup_recovery_key_title" = "Speichere deinen Sicherheitsschlüssel";
"secrets_setup_recovery_key_information" = "Bewahre deinen Wiederherstellungsschlüssel an einem sicheren Ort auf. Er kann benutzt werden um deine verschlüsselten Nachrichten und Daten zu entschlüsseln.";
"secrets_setup_recovery_key_information" = "Bewahre deinen Sicherungsschlüssel an einem sicheren Ort auf. Mit ihm kannst du deine verschlüsselten Nachrichten wiederherstellen.";
"secrets_setup_recovery_key_loading" = "Lädt…";
"secrets_setup_recovery_key_export_action" = "Speichern";
"secrets_setup_recovery_key_done_action" = "Erledigt";
@@ -1145,7 +1145,7 @@
"secrets_setup_recovery_passphrase_validate_action" = "Fertig";
"secrets_setup_recovery_passphrase_confirm_information" = "Gib deine Sicherheitsphrase zur Bestätigung erneut ein.";
"secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Bestätigen";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Passphrase bestätigen";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Phrase bestätigen";
"cross_signing_setup_banner_title" = "Verschlüsselung einrichten";
"cross_signing_setup_banner_subtitle" = "Verifiziere deine weiteren Geräte bequemer";
"major_update_title" = "Riot ist jetzt Element";
@@ -1275,7 +1275,7 @@
// Social login
"social_login_list_title_continue" = "Weiter mit";
"room_intro_cell_information_multiple_dm_sentence2" = "Nur ihr seid in diesem Gespräch, außer ihr lädt jemand anderen ein.";
"room_intro_cell_information_multiple_dm_sentence2" = "Nur ihr seid in diesem Gespräch, außer ihr lädt jemanden ein.";
"room_intro_cell_information_dm_sentence2" = "Nur zwei von euch sind in diesem Gespräch. Keine anderer kann beitreten.";
"room_intro_cell_information_dm_sentence1_part3" = ". ";
"room_intro_cell_information_dm_sentence1_part1" = "Dies ist der Beginn deiner Direktnachricht mit ";
@@ -1385,7 +1385,7 @@
"security_settings_secure_backup_reset" = "Zurücksetzen";
"security_settings_secure_backup_info_valid" = "Diese Sitzung sichert deine Schlüssel.";
"security_settings_secure_backup_info_checking" = "Überprüfen…";
"settings_ui_theme_picker_message_match_system_theme" = "\"Auto\" passt sich an das Systemthema an";
"settings_ui_theme_picker_message_match_system_theme" = "\"Auto\" verwendet das Systemthema";
"room_recents_unknown_room_error_message" = "Raum kann nicht gefunden werden. Überprüfe bitte, dass er existiert";
"room_creation_dm_error" = "Fehler beim Erstellen der Direktnachricht. Bitte überprüfe die eingeladenen Leute und versuche es erneut.";
"settings_ui_theme_picker_message_invert_colours" = "\"Auto\" verwendet die Farbinvertierungseinstellung deines Geräts";
+72 -45
View File
@@ -369,7 +369,7 @@
"settings_key_backup_info" = "I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e il/i destinatario/i avete le chiavi crittografiche per leggere questi messaggi.";
"settings_key_backup_info_checking" = "Controllo…";
"settings_key_backup_info_none" = "Questa sessione non sta facendo il Backup delle chiavi.";
"settings_key_backup_info_signout_warning" = "Prima di disconnetterti effettua un backup delle chiavi per evitare di perdere eventuali chiavi presenti solo in questa sessione.";
"settings_key_backup_info_signout_warning" = "Fai un backup delle chiavi prima di disconnetterti per evitare di perderle.";
"settings_key_backup_info_version" = "Versione backup chiave: %@";
"settings_key_backup_info_algorithm" = "Algoritmo: %@";
"settings_key_backup_info_valid" = "Questa sessione sta eseguendo il backup delle tue chiavi.";
@@ -528,7 +528,7 @@
"e2e_need_log_in_again" = "È necessario eseguire nuovamente l'accesso per generare le chiavi di crittografia end-to-end per questa sessione ed inviare la chiave pubblica all'homeserver.\nVa fatto una sola volta; ci scusiamo per il disturbo.";
// Key backup wrong version
"e2e_key_backup_wrong_version_title" = "Nuovo Backup delle chiavi";
"e2e_key_backup_wrong_version" = "È stato effettuato un nuovo Backup delle chiavi per i messaggi crittografati. \n\nSe non sei stato tu, imposta una nuova frase di sicurezza dalle impostazioni.";
"e2e_key_backup_wrong_version" = "È stato effettuato un nuovo Backup delle chiavi per i messaggi crittografati. \n\nSe non sei stato tu, imposta una nuova frase di sicurezza nelle impostazioni.";
"e2e_key_backup_wrong_version_button_settings" = "Impostazioni";
"e2e_key_backup_wrong_version_button_wasme" = "Sono stato io";
// Bug report
@@ -595,46 +595,46 @@
"key_backup_setup_intro_setup_action_without_existing_backup" = "Inizia ad usare il backup chiavi";
"key_backup_setup_intro_manual_export_info" = "(Avanzato)";
"key_backup_setup_intro_manual_export_action" = "Esporta manualmente le chiavi";
"key_backup_setup_passphrase_title" = "Proteggi il tuo backup con una frase d'accesso";
"key_backup_setup_passphrase_info" = "Sul tuo Home Server verrà effettuato un Backup cifrato delle tue chiavi crittograficher. Proteggi il Backup con una password perchè sia al sicuro.\n \nPer una massima sicurezza, la password del Backup dovrebbe essere diversa dalla password del tuo account.";
"key_backup_setup_passphrase_title" = "Proteggi il tuo backup con una frase di sicurezza";
"key_backup_setup_passphrase_info" = "Sul tuo Home Server verrà effettuato un Backup cifrato delle tue chiavi crittograficher. Proteggi il Backup con una frase di sicurezza perchè sia al sicuro.\n \nPer una massima sicurezza, la password del Backup dovrebbe essere diversa dalla password del tuo account.";
"key_backup_setup_passphrase_passphrase_title" = "Inserisci";
"key_backup_setup_passphrase_passphrase_placeholder" = "Inserisci frase d'accesso";
"key_backup_setup_passphrase_passphrase_placeholder" = "Inserisci frase";
"key_backup_setup_passphrase_passphrase_valid" = "Bene!";
"key_backup_setup_passphrase_passphrase_invalid" = "Prova ad aggiungere una parola";
"key_backup_setup_passphrase_confirm_passphrase_title" = "Conferma";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Conferma frase d'accesso";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Conferma frase";
"key_backup_setup_passphrase_confirm_passphrase_valid" = "Bene!";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Le frasi d'accesso devono corrispondere";
"key_backup_setup_passphrase_set_passphrase_action" = "Imposta frase d'accesso";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Oppure proteggi il tuo backup con una chiave di ripristino, salvandola in un luogo sicuro.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avanzato) Imposta con chiave di ripristino";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "le frasi non corrispondono";
"key_backup_setup_passphrase_set_passphrase_action" = "Imposta frase";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Oppure proteggi il tuo backup con una chiave di sicurezza, salvandola in un luogo sicuro.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avanzato) Imposta con chiave di sicurezza";
"key_backup_setup_success_title" = "Completato!";
// Success from passphrase
"key_backup_setup_success_from_passphrase_info" = "Backup delle tue chiavi in corso.\n\nIl tuo codice di recupero è un'ancora di salvezza - puoi usarlo per riaccedere ai tuoi messaggi cifrati se dimentichi la password. \n\nSalva il tuo codice di recupero in un luogo sicuro, tipo un password manager (o una cassaforte).";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Salva chiave di ripristino";
"key_backup_setup_success_from_passphrase_info" = "Backup delle tue chiavi in corso.\n\nLa tua chiave di sicurezza è un'ancora di salvezza - puoi usarlo per riaccedere ai tuoi messaggi cifrati se dimentichi la password. \n\nSalva la tua chiave di sicurezza in un luogo sicuro, tipo un password manager (o una cassaforte).";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Salva chiave di sicurezza";
"key_backup_setup_success_from_passphrase_done_action" = "Fatto";
// Success from recovery key
"key_backup_setup_success_from_recovery_key_info" = "Backup delle tue chiavi in corso.\n\nFai una copia di questa chiave di ripristino e tienila al sicuro.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Chiave di ripristino";
"key_backup_setup_success_from_recovery_key_info" = "Backup delle tue chiavi in corso.\n\nFai una copia di questa chiave di sicurezza e tienila al sicuro.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Chiave di sicurezza";
"key_backup_setup_success_from_recovery_key_make_copy_action" = "Fai una copia";
"key_backup_setup_success_from_recovery_key_made_copy_action" = "Ho fatto una copia";
"key_backup_recover_title" = "Messaggi sicuri";
"key_backup_recover_invalid_passphrase_title" = "Frase di sicurezza non corretta";
"key_backup_recover_invalid_passphrase" = "Impossibile decifrare il backup con questa frase di sicurezza. Verifica di avere inserito la frase di sicurezza corretta.";
"key_backup_recover_invalid_recovery_key_title" = "La chiave di ripristino non corrisponde";
"key_backup_recover_invalid_recovery_key" = "Impossibile decrittare il backup con questa chiave di recupero: verifica che la chiave di recupero sia corretta.";
"key_backup_recover_from_passphrase_info" = "Usa la tua chiave di ripristino per sbloccare la cronologia dei messaggi crittografati";
"key_backup_recover_invalid_passphrase" = "Impossibile decifrare il backup con questa frase: verifica di avere inserito la frase di sicurezza corretta.";
"key_backup_recover_invalid_recovery_key_title" = "La chiave di sicurezza non corrisponde";
"key_backup_recover_invalid_recovery_key" = "Impossibile decrittare il backup con questa chiave di recupero: verifica che la chiave di sicurezza sia corretta.";
"key_backup_recover_from_passphrase_info" = "Usa la tua chiave di sicurezza per sbloccare la cronologia dei messaggi crittografati";
"key_backup_recover_from_passphrase_passphrase_title" = "Inserisci";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Inserisci frase d'accesso";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Inserisci frase";
"key_backup_recover_from_passphrase_recover_action" = "Sblocca cronologia";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Non conosci la tua frase d'accesso? Puoi ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "usa la tua chiave di ripristino";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Non conosci la tua frase di sicurezza? Puoi ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "usa la tua chiave di sicurezza";
"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = ".";
"key_backup_recover_from_recovery_key_info" = "Usa la tua chiave di ripristino per sbloccare la cronologia dei tuoi messaggi sicuri";
"key_backup_recover_from_recovery_key_info" = "Usa la tua chiave di sicurezza per sbloccare la cronologia dei tuoi messaggi sicuri";
"key_backup_recover_from_recovery_key_recovery_key_title" = "Inserisci";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Inserisci chiave di ripristino";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Inserisci chiave di sicurezza";
"key_backup_recover_from_recovery_key_recover_action" = "Sblocca cronologia";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Hai perso la chiave di ripristino? Puoi crearne una nuova nelle impostazioni.";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Hai perso la chiave di sicurezza? Puoi crearne una nuova nelle impostazioni.";
"key_backup_recover_success_info" = "Backup ripristinato!";
"key_backup_recover_done_action" = "Fatto";
"key_backup_setup_banner_title" = "Non perdere mai i messaggi crittografati";
@@ -1022,9 +1022,9 @@
"security_settings_crosssigning_info_not_bootstrapped" = "La firma incrociata non è ancora impostata.";
"security_settings_crosssigning_info_exists" = "Il tuo account ha un'identità a firma incrociata, ma non è ancora fidato da questa sessione. Completa la sicurezza di questa sessione.";
"security_settings_crosssigning_info_trusted" = "La firma incrociata è attivata. Puoi fidarti di altri utenti e delle tue altre sessioni in base alla firma ma non puoi firmare da questa sessione perchè non ha le chiavi private di firma incrociata. Completa la sicurezza di questa sessione.";
"security_settings_crosssigning_info_ok" = "La firma incrociata è attiva.";
"security_settings_crosssigning_bootstrap" = "Inizializza firma incrociata";
"security_settings_crosssigning_reset" = "Reimposta firma incrociata";
"security_settings_crosssigning_info_ok" = "La firma incrociata è pronta per l'uso.";
"security_settings_crosssigning_bootstrap" = "Imposta";
"security_settings_crosssigning_reset" = "Ripristina";
"security_settings_crosssigning_complete_security" = "Completa la sicurezza";
"security_settings_complete_security_alert_title" = "Completa la sicurezza";
"security_settings_complete_security_alert_message" = "Dovresti completare la sicurezza prima sulla tua sessione attuale.";
@@ -1072,28 +1072,28 @@
"key_verification_manually_verify_device_additional_information" = "Se non corrispondono, la sicurezza delle tue comunicazioni potrebbe essere compromessa.";
"key_verification_manually_verify_device_validate_action" = "Verifica";
"user_verification_session_details_verify_action_current_user_manually" = "Verifica manualmente con testo";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Usa chiave di recupero";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Usa password o chiave di recupero";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Usa chiave di sicurezza";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Usa password o chiave di sicurezza";
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Se non puoi accedere a una sessione esistente";
"secrets_recovery_with_passphrase_title" = "Password di recupero";
"secrets_recovery_with_passphrase_information_default" = "Accedi alla tua cronologia dei messaggi sicuri e all'identità della firma incrociata per verificare altre sessioni inserendo la password di recupero.";
"secrets_recovery_with_passphrase_information_verify_device" = "Usa la password di recupero per verificare questo dispositivo.";
"secrets_recovery_with_passphrase_title" = "Frase di sicurezza";
"secrets_recovery_with_passphrase_information_default" = "Accedi alla tua cronologia dei messaggi sicuri e all'identità della firma incrociata per verificare altre sessioni inserendo la frase di sicurezza.";
"secrets_recovery_with_passphrase_information_verify_device" = "Usa la frase di sicurezza per verificare questo dispositivo.";
"secrets_recovery_with_passphrase_passphrase_title" = "Inserisci";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Inserisci la password di recupero";
"secrets_recovery_with_passphrase_recover_action" = "Usa password";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Non conosci la tua password di recupero? Puoi ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "usare la chiave di recupero";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Inserisci la frase di sicurezza";
"secrets_recovery_with_passphrase_recover_action" = "Usa frase";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Non conosci la tua frase di sicurezza? Puoi ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "usare la chiave di sicurezza";
"secrets_recovery_with_passphrase_lost_passphrase_action_part3" = ".";
"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Impossibile accedere all'archivio segreto";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Controlla di avere inserito la password di recupero corretta.";
"secrets_recovery_with_key_title" = "Chiave di recupero";
"secrets_recovery_with_key_information_default" = "Accedi alla tua cronologia dei messaggi sicuri e all'identità della firma incrociata per verificare altre sessioni inserendo la chiave di recupero.";
"secrets_recovery_with_key_information_verify_device" = "Usa la chiave di recupero per verificare questo dispositivo.";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Controlla di avere inserito la frase di sicurezza corretta.";
"secrets_recovery_with_key_title" = "Chiave di sicurezza";
"secrets_recovery_with_key_information_default" = "Accedi alla tua cronologia dei messaggi sicuri e all'identità della firma incrociata per verificare altre sessioni inserendo la chiave di sicurezza.";
"secrets_recovery_with_key_information_verify_device" = "Usa la chiave di sicurezza per verificare questo dispositivo.";
"secrets_recovery_with_key_recovery_key_title" = "Inserisci";
"secrets_recovery_with_key_recovery_key_placeholder" = "Inserisci chiave di recupero";
"secrets_recovery_with_key_recovery_key_placeholder" = "Inserisci chiave di sicurezza";
"secrets_recovery_with_key_recover_action" = "Usa chiave";
"secrets_recovery_with_key_invalid_recovery_key_title" = "Impossibile accedere all'archivio segreto";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Controlla di avere inserito la chiave di recupero corretta.";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Controlla di avere inserito la chiave di sicurezza corretta.";
"secure_key_backup_setup_intro_title" = "Backup sicuro";
"secure_key_backup_setup_intro_info" = "Proteggiti contro la perdita dell'accesso ai messaggi e dati cifrati facendo un backup delle chiavi crittografiche sul tuo server.";
"secure_key_backup_setup_intro_use_security_key_title" = "Usa una chiave di sicurezza";
@@ -1115,17 +1115,17 @@
"secrets_setup_recovery_passphrase_validate_action" = "Fatto";
"secrets_setup_recovery_passphrase_confirm_information" = "Inserisci la frase di sicurezza di nuovo per confermarla.";
"secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Conferma";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Conferma frase di sicurezza";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Conferma frase";
// AuthenticatedSessionViewControllerFactory
"authenticated_session_flow_not_supported" = "Questa app non supporta il metodo di autenticazione del tuo homeserver.";
"secure_backup_setup_banner_title" = "Backup Sicuro";
"secure_backup_setup_banner_subtitle" = "Proteggiti dalla perdita dei messaggi e dati crittografati";
"security_settings_crypto_sessions_description_2" = "Se non riconosci un accesso, modifica la password e reimposta il Backup Sicuro.";
"security_settings_secure_backup" = "BACKUP SICURO";
"security_settings_secure_backup_description" = "Proteggiti contro la perdita dell'accesso ai messaggi e dati cifrati facendo un backup delle chiavi crittografiche sul tuo server.";
"security_settings_secure_backup_description" = "Fai un backup delle chiavi crittografiche con i dati del tuo account in caso tu perda l'accesso alle tue sessioni. Le chiavi saranno protette con una chiave di sicurezza univoca.";
"security_settings_secure_backup_setup" = "Configura";
"security_settings_secure_backup_synchronise" = "Sincronizza";
"security_settings_secure_backup_delete" = "Elimina";
"security_settings_secure_backup_delete" = "Elimina backup";
"security_settings_user_password_description" = "Conferma la tua identità inserendo la password del tuo account";
// Events formatter with you
"event_formatter_widget_added_by_you" = "Hai aggiunto il widget: %@";
@@ -1356,3 +1356,30 @@
// Mark: - Spaces
"space_feature_unavailable_title" = "Gli spazi non sono ancora pronti";
"side_menu_app_version" = "Versione %@";
"side_menu_action_feedback" = "Opinioni";
"side_menu_action_help" = "Aiuto";
"side_menu_action_settings" = "Impostazioni";
"side_menu_action_invite_friends" = "Invita amici";
// Mark: - Side menu
"side_menu_reveal_action_accessibility_label" = "Pannello sinistro";
"user_avatar_view_accessibility_hint" = "Cambia avatar utente";
// Mark: - User avatar view
"user_avatar_view_accessibility_label" = "avatar";
"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Inserisci la tua chiave di sicurezza per continuare.";
"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Inserisci la tua frase di sicurezza per continuare.";
// Success from secure backup
"key_backup_setup_success_from_secure_backup_info" = "Il backup delle tue chiavi è in corso.";
"security_settings_secure_backup_restore" = "Ripristina da un backup";
"security_settings_secure_backup_reset" = "Reimposta";
"security_settings_secure_backup_info_valid" = "Questa sessione sta eseguendo il backup delle tue chiavi.";
"security_settings_secure_backup_info_checking" = "Controllo…";
"settings_ui_theme_picker_message_match_system_theme" = "\"Automatico\" usa il tema di sistema del tuo dispositivo";
"settings_ui_theme_picker_message_invert_colours" = "\"Automatico\" usa l'impostazione \"Inverti Colori\" del tuo dispositivo";
"room_recents_unknown_room_error_message" = "Impossibile trovare questa stanza. Assicurati che esista";
"room_creation_dm_error" = "Impossibile creare il messaggio diretto. Ricontrolla gli utenti che vuoi invitare e riprova.";
+5 -5
View File
@@ -1342,18 +1342,18 @@
"security_settings_export_keys_manually" = "Exporteer sleutels handmatig";
"security_settings_cryptography" = "CRYPTOGRAFIE";
"security_settings_crosssigning_complete_security" = "Beveiliging afronden";
"security_settings_crosssigning_reset" = "Kruislings ondertekenen resetten";
"security_settings_crosssigning_bootstrap" = "Kruislings ondertekenen instellen";
"security_settings_crosssigning_info_ok" = "Kruislings ondertekenen is ingeschakeld.";
"security_settings_crosssigning_reset" = "Reset";
"security_settings_crosssigning_bootstrap" = "Stel in";
"security_settings_crosssigning_info_ok" = "Cross-signing is klaar voor gebruik.";
"security_settings_crosssigning_info_trusted" = "Kruislings ondertekenen is ingeschakeld. U kunt andere personen en sessies verifiëren met kruislings ondertekenen, maar u kunt dit nog niet vanaf deze sessie doordat de versleutelingssleutel ontbreekt. Rond de beveiliging van deze sessie af.";
"security_settings_crosssigning_info_exists" = "Uw account heeft een kruislings ondertekenen ID, maar is nog niet geverifieerd door deze sessie. Rond de beveiliging van deze sessie af.";
"security_settings_crosssigning_info_not_bootstrapped" = "Kruislings ondertekenen is nog niet ingesteld.";
"security_settings_crosssigning" = "KRUISLINGS ONDERTEKENEN";
"security_settings_backup" = "BERICHTENBACK-UP";
"security_settings_secure_backup_delete" = "Verwijderen";
"security_settings_secure_backup_delete" = "Verwijder backup";
"security_settings_secure_backup_synchronise" = "Synchroniseren";
"security_settings_secure_backup_setup" = "Instellen";
"security_settings_secure_backup_description" = "Een waarborg voor toegang tot uw versleutelde berichten & data door de versleutelingssleutels op te slaan op uw server.";
"security_settings_secure_backup_description" = "Waarborg uw toegang tot uw versleutelde berichten & data door de versleutelingssleutels op te slaan. Uw sleutels zullen worden beveiligd met een unieke beveiligingssleutel.";
"security_settings_secure_backup" = "VEILIGE BACK-UP";
"security_settings_crypto_sessions_description_2" = "Als u deze inlog niet herkent, verander uw wachtwoord en reset uw Veilige Back-up.";
"security_settings_crypto_sessions_loading" = "Sessies laden…";
+4 -4
View File
@@ -347,7 +347,7 @@
"settings_privacy_policy_url" = "https://riot.im/privacy";
"settings_third_party_notices" = "Notas de Terceiros";
"settings_send_crash_report" = "Enviar dados de cash & uso anon";
"settings_enable_rageshake" = "Agite com raiva para reportar bug";
"settings_enable_rageshake" = "Agitar com raiva para reportar bug";
"settings_clear_cache" = "Limpar cache";
"settings_change_password" = "Mudar senha";
"settings_old_password" = "senha antiga";
@@ -482,7 +482,7 @@
"homeserver_connection_lost" = "Não foi possível conectar-se ao servidorcasa.";
"public_room_section_title" = "Salas Públicas (em %@):";
"bug_report_prompt" = "O aplicativo tem crashado da última vez. Você gostaria de submeter um reporte de crash?";
"rage_shake_prompt" = "Você parece estar agitando o telefone em frustração. Você gostaria desubmeter um reporte de bug?";
"rage_shake_prompt" = "Você parece estar agitando o telefone em frustração. Você gostaria de submeter um reporte de bug?";
"do_not_ask_again" = "Não perguntar de novo";
"camera_access_not_granted" = "%@ não tem permissão para usar Câmera, por favor mude configurações de privacidade";
"large_badge_value_k_format" = "%.1fK";
@@ -842,7 +842,7 @@
"room_participants_action_security_status_verified" = "Verificado";
"room_participants_action_security_status_verify" = "Verificar";
"room_participants_action_security_status_complete_security" = "Completar segurança";
"room_participants_security_information_room_encrypted" = "Mensagens nesta sala são encriptadas ponta-a-ponta.\n\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para destrancá-los.";
"room_participants_security_information_room_encrypted" = "Mensagens nesta sala são encriptadas ponta-a-ponta.\n\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para as destrancar.";
"room_member_power_level_custom_in" = "Personalizada(o) (%@) em %@";
"room_member_power_level_short_custom" = "Perso";
"room_accessiblity_scroll_to_bottom" = "Rolar para fundo";
@@ -1172,7 +1172,7 @@
"room_details_room_name_for_dm" = "Nome";
"room_details_photo_for_dm" = "Foto";
"room_details_title_for_dm" = "Detalhes";
"room_participants_security_information_room_encrypted_for_dm" = "Mensagens aqui são encriptadas ponta-a-ponta.\n\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para os destrancar.";
"room_participants_security_information_room_encrypted_for_dm" = "Mensagens aqui são encriptadas ponta-a-ponta.\n\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para as destrancar.";
"room_participants_security_information_room_not_encrypted_for_dm" = "Mensagens aqui não são encriptadas ponta-a-ponta.";
"room_participants_filter_room_members_for_dm" = "Filtrar membros";
"room_participants_leave_prompt_msg_for_dm" = "Tem certeza que você quer sair?";
+74 -47
View File
@@ -582,16 +582,16 @@
"key_backup_setup_intro_title" = "Mos humbni kurrë mesazhe të fshehtëzuar";
"key_backup_setup_intro_info" = "Mesazhet në dhoma të fshehtëzuara sigurohen me fshehtëzim skaj-më-skaj. Vetëm ju dhe marrësi(t) keni kyçet për leximin e këtyre mesazheve.\n\nBëni një kopjeruajtje të sigurt të kyçeve tuaj, për të shmangur humbjen e tyre.";
"key_backup_setup_intro_setup_action" = "Rregulloje";
"key_backup_setup_passphrase_info" = "Do të depozitojmë një kopje të fshehtëzuar të kyçeve tuaj në shërbyesin tonë. Mbrojeni kopjeruajtjen tuaj me një frazëkalim, për ta mbajtur të parrezikuar.\n\nPër maksimumin e sigurisë, ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë.";
"key_backup_setup_passphrase_info" = "Do të depozitojmë një kopje të fshehtëzuar të kyçeve tuaj në shërbyesin tonë. Mbrojeni kopjeruajtjen tuaj me një frazë, për ta mbajtur të parrezikuar.\n\nPër maksimumin e sigurisë, ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë.";
"key_backup_setup_passphrase_passphrase_title" = "Jepeni";
"key_backup_setup_passphrase_passphrase_placeholder" = "Jepni frazëkalimin";
"key_backup_setup_passphrase_passphrase_placeholder" = "Jepni frazë";
"key_backup_setup_passphrase_passphrase_valid" = "Bukur!";
"key_backup_setup_passphrase_passphrase_invalid" = "Provoni të shtoni një fjalë";
"key_backup_setup_passphrase_confirm_passphrase_title" = "Ripohojeni";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Ripohoni frazëkalimin";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Ripohoni frazën";
"key_backup_setup_passphrase_confirm_passphrase_valid" = "Bukur!";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Frazëkalimet nuk përputhen";
"key_backup_setup_passphrase_set_passphrase_action" = "Caktoni Frazëkalim";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "fraza spërputhet";
"key_backup_setup_passphrase_set_passphrase_action" = "Caktoni Frazë";
"key_backup_setup_recovery_key_info" = "Bëni një kopje të këtij Kyçi Rikthimesh dhe ruajeni diku.\n\nSi rrjet sigurie, mund ta përdorni për të rikthyer historikun e mesazheve tuaj të fshehtëzuar, nëse harroni Frazëkalimin e Rikthimeve.";
"key_backup_setup_recovery_key_recovery_key_title" = "Kyç Rikthimesh";
"key_backup_setup_recovery_key_make_copy_action" = "Bëni një Kopje";
@@ -599,18 +599,18 @@
"key_backup_recover_title" = "Mesazhe të Sigurt";
"key_backup_recover_empty_backup_title" = "Kopjeruajtje e zbrazët";
"key_backup_recover_empty_backup_message" = "Ska kyç për rikthim";
"key_backup_recover_from_passphrase_info" = "Që të shkyçni historikun e mesazheve tuaj të sigurt përdorni frazëkalimin tuaj të rimarrjeve";
"key_backup_recover_from_passphrase_info" = "Që të shkyçni historikun e mesazheve tuaj të sigurt, përdorni Frazën tuaj të Sigurisë";
"key_backup_recover_from_passphrase_passphrase_title" = "Jepeni";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Jepni Frazëkalimin";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Jepni Frazë";
"key_backup_recover_from_passphrase_recover_action" = "Shkyçeni Historikun";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Nuk e dini frazëkalimin tuaj të rimarrjeve? Mundeni të ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "përdorni kyçin tuaj të rimarrjeve";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Nuk e dini Frazën tuaj të Sigurisë? Mundeni të ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "përdorni Kyçin tuaj të Sigurisë";
"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = ".";
"key_backup_recover_from_recovery_key_info" = "Që të shkyçni historikun e mesazheve tuaj të sigurt, përdorni frazëkalimin tuaj të rimarrjeve";
"key_backup_recover_from_recovery_key_info" = "Që të shkyçni historikun e mesazheve tuaj të sigurt, përdorni Kyçin tuaj të Sigurisë";
"key_backup_recover_from_recovery_key_recovery_key_title" = "Jepeni";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Jepni Kyç Rimarrjesh";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Jepni Kyç Sigurie";
"key_backup_recover_from_recovery_key_recover_action" = "Shkyçe Historikun";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Humbët kyçin tuaj të rimarrjeve? Te rregullimet mund të caktoni një të ri.";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Humbët Kyçin tuaj të Sigurisë? Te rregullimet mund të caktoni një të ri.";
"key_backup_recover_success_info" = "Kopjeruajtja u Rikthye!";
"key_backup_recover_done_action" = "U bë";
"key_backup_setup_banner_title_part1" = "Rregulloni Rikthim Mesazhesh të Sigurt";
@@ -618,27 +618,27 @@
"key_backup_recover_banner_title_part1" = "Xhironi Rikthim Mesazhesh të Sigurt";
"key_backup_recover_banner_title_part2" = " që të lexoni historik mesazhesh të fshehtëzuar në këtë pajisje";
"settings_key_backup_info" = "Mesazhet e fshehtëzuar sigurohen me fshehtëzim skaj-më-skaj. Vetëm ju dhe marrësi(t) kanë kyçet për të lexuar këto mesazhe.";
"settings_key_backup_info_signout_warning" = "Lidheni këtë sesion me kopjeruajtje kyçesh, përpara se të dilni, që të shmangni humbje të çfarëdo kyçi që mund të gjendet vetëm në këtë pajisje.";
"settings_key_backup_info_signout_warning" = "Kopjeruani kyçet tuaja, përpara se të dilni, që të shmangni humbjen e tyre.";
"settings_key_backup_button_use" = "Përdor kopjeruajtje kyçesh";
"key_backup_setup_intro_setup_action_without_existing_backup" = "Fillo të përdorësh Kopjeruajtje Kyçesh";
"key_backup_setup_intro_setup_action_with_existing_backup" = "Përdor Kopjeruajtje Kyçesh";
"key_backup_setup_passphrase_title" = "Sigurojeni kopjeruajtjen tuaj me një Frazëkalim";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Ose, sigurojeni kopjeruajtjen tuaj me një Kyç Rimarrjesh, duke e ruajtur këtë diku të parrezikuar.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Të mëtejshme) Rregullojeni me një Kyç Rimarrjesh";
"key_backup_setup_passphrase_title" = "Sigurojeni kopjeruajtjen tuaj me një Frazë Sigurie";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Ose, sigurojeni kopjeruajtjen tuaj me një Kyç Sigurie, duke e ruajtur këtë diku të parrezikuar.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Të mëtejshme) Rregullojeni me një Kyç Sigurie";
"key_backup_setup_success_title" = "Sukses!";
// Success from passphrase
"key_backup_setup_success_from_passphrase_info" = "Po bëhet kopjeruajtja për kyçet tuaj.\n\nKyçi juaj i rimarrjeve është një lloj mase sigurie - mund ta përdorni për të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj.\n\nMbajeni kyçin tuaj të rimarrjeve diku shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë).";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Ruani Kyç Rimarrjesh";
"key_backup_setup_success_from_passphrase_info" = "Po bëhet kopjeruajtja për kyçet tuaj.\n\nKyçi juaj i Sigurisë është një lloj mase sigurie - mund ta përdorni për të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj.\n\nMbajeni Kyçin tuaj të Sigurisë diku shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë).";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Ruani Kyç Sigurie";
"key_backup_setup_success_from_passphrase_done_action" = "U krye";
// Success from recovery key
"key_backup_setup_success_from_recovery_key_info" = "Po bëhet kopjeruajtja për kyçet tuaj.\n\nBëni një kopje të këtij kyçi rimarrjesh dhe mbajeni të parrezikuar.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Kyç Rimarrjesh";
"key_backup_setup_success_from_recovery_key_info" = "Po bëhet kopjeruajtja për kyçet tuaj.\n\nBëni një kopje të këtij Kyçi Sigurie dhe mbajeni të parrezikuar.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Kyç Sigurie";
"key_backup_setup_success_from_recovery_key_make_copy_action" = "Bëni një Kopje";
"key_backup_setup_success_from_recovery_key_made_copy_action" = "Kam bërë një kopje";
"key_backup_recover_invalid_passphrase_title" = "Frazëkalim Rimarrjeje i Pasaktë";
"key_backup_recover_invalid_passphrase" = "Su shfshehtëzua dot kopjeruajtja me këtë frazëkalim: ju lutemi, verifikoni që dhatë frazëkalimin e duhur të rimarrjeve.";
"key_backup_recover_invalid_recovery_key_title" = "Mospërputhje Kyçesh Rimarrjeje";
"key_backup_recover_invalid_recovery_key" = "Nuk u shfshehtëzua dot kopjeruajtja me këtë kyç: ju lutemi, verifikoni që dhatë kyçin e duhur të rimarrjeve.";
"key_backup_recover_invalid_passphrase_title" = "Frazë e Pasaktë Sigurie";
"key_backup_recover_invalid_passphrase" = "Su shfshehtëzua dot kopjeruajtja me këtë frazë: ju lutemi, verifikoni që dhatë Frazën e duhur të Sigurisë.";
"key_backup_recover_invalid_recovery_key_title" = "Mospërputhje Kyçesh Sigurie";
"key_backup_recover_invalid_recovery_key" = "Nuk u shfshehtëzua dot kopjeruajtja me këtë kyç: ju lutemi, verifikoni që dhatë Kyçin e duhur të Sigurisë.";
"key_backup_setup_banner_title" = "Mos humbni kurrë mesazhe të fshehtëzuar";
"key_backup_setup_banner_subtitle" = "Fillo të përdorësh Kopjeruajtje Kyçesh";
"key_backup_recover_banner_title" = "Mos humbni kurrë mesazhe të fshehtëzuar";
@@ -657,7 +657,7 @@
"sign_out_key_backup_in_progress_alert_cancel_action" = "Do të pres";
// Key backup wrong version
"e2e_key_backup_wrong_version_title" = "Kopjeruajtje e Re Kyçesh";
"e2e_key_backup_wrong_version" = "U pikas një kopjeruajtje e re kyçesh mesazhesh të sigurt.\n\nNëse sqe prej jush, caktoni një frazëkalim të ri te Rregullimet.";
"e2e_key_backup_wrong_version" = "U pikas një kopjeruajtje e re kyçesh mesazhesh të sigurt.\n\nNëse sqe prej jush, caktoni një Frazë të re Sigurie te Rregullimet.";
"e2e_key_backup_wrong_version_button_settings" = "Rregullime";
"e2e_key_backup_wrong_version_button_wasme" = "Prej meje qe";
"key_backup_setup_intro_manual_export_info" = "(Të mëtejshme)";
@@ -1039,7 +1039,7 @@
"security_settings_crosssigning_info_not_bootstrapped" = "<em>Cross-signing</em> s’është ujdisur ende.";
"security_settings_crosssigning_info_exists" = "Llogaria juaj ka një identitet <em>cross-signing</em>, por s’është ende i besuar nga ky sesion. Plotësoni sigurinë e këtij sesioni.";
"security_settings_crosssigning_info_trusted" = "<em>Cross-signing</em> është i aktivizuar. Mund të besoni përdorues të tjerë dhe sesionet tuaj të tjerë bazuar në <em>cross-signing</em>, por smund të kryeni <em>cross-sign</em> që nga ky sesion,ngaqë nuk ka kyçe privatë për <em>cross-signing</em>. Plotësoni sigurinë e këtij sesioni.";
"security_settings_crosssigning_info_ok" = "<em>Cross-signing</em> është i aktivizuar.";
"security_settings_crosssigning_info_ok" = "<em>Cross-signing</em> është gati për përdorim.";
"security_settings_crosssigning_complete_security" = "Siguri e plotë";
"security_settings_complete_security_alert_title" = "Siguri e plotë";
"security_settings_complete_security_alert_message" = "Së pari duhet të plotësoni sigurinë në sesionin tuaj të tanishëm.";
@@ -1088,40 +1088,40 @@
"key_verification_manually_verify_device_additional_information" = "Nëse spërputhen, siguria e komunikimeve tuaja mund të jetë komprometuar.";
"key_verification_manually_verify_device_validate_action" = "Verifikoje";
"user_verification_session_details_verify_action_current_user_manually" = "Verifikojeni Dorazi përmes Teksti";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Përdor Kyç Rimarrjesh";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Përdor Frazëkalim ose Kyç Rimarrjesh";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Përdor Kyç Sigurie";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Përdor Frazë ose Kyç Sigurie";
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Nëse shyni dot në një sesion ekzistues";
"secrets_recovery_with_passphrase_title" = "Frazëkalim Rimarrjesh";
"secrets_recovery_with_passphrase_information_default" = "Hyni në historikun tuaj të mesazheve të sigurt dhe përdorni identitetin tuaj “cross-signing” për të verifikuar sesione të tjerë duke dhënë frazëkalimin tuaj të rimarrjeve.";
"secrets_recovery_with_passphrase_information_verify_device" = "Që të verifikoni këtë pajisje, përdorni Frazëkalimin tuaj të Rimarrjeve.";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Jepni Frazëkalim Rimarrjesh";
"secrets_recovery_with_passphrase_recover_action" = "Përdor Frazëkalim";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Se din frazëkalimin tuaj të rimarrjeve? Mundeni të ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "përdorni kyçin tuaj të rimarrjeve";
"secrets_recovery_with_passphrase_title" = "Frazë Sigurie";
"secrets_recovery_with_passphrase_information_default" = "Hyni në historikun tuaj të mesazheve të sigurt dhe përdorni identitetin tuaj “cross-signing” për të verifikuar sesione të tjerë duke dhënë Frazën tuaj të Sigurisë.";
"secrets_recovery_with_passphrase_information_verify_device" = "Që të verifikoni këtë pajisje, përdorni Frazën tuaj të Sigurisë.";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Jepni Frazë Sigurie";
"secrets_recovery_with_passphrase_recover_action" = "Përdor Frazë";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Se dini Frazën tuaj të Sigurisë? Mundeni të ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "përdorni Kyçin tuaj të Sigurisë";
"secrets_recovery_with_passphrase_lost_passphrase_action_part3" = ".";
"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Sarrihet të hyhet në depo të fshehtë";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Ju lutemi, verifikoni që keni dhënë frazëkalimin e saktë të rimarrjeve.";
"secrets_recovery_with_key_title" = "Kyç Rimarrjesh";
"secrets_recovery_with_key_information_default" = "Hyni te historiku i mesazheve tuaj të sigurt dhe te identiteti juaj për cross-signing për verifikim sesionesh të tjerë përmes dhënies së kyçit të rimarrjeve.";
"secrets_recovery_with_key_information_verify_device" = "Që të verifikoni këtë pajisje, përdorni Kyç Rimarrjesh.";
"secrets_recovery_with_key_recovery_key_placeholder" = "Jepni Kyç Rimarrjesh";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Ju lutemi, verifikoni që keni dhënë Frazën e saktë të Sigurisë.";
"secrets_recovery_with_key_title" = "Kyç Sigurie";
"secrets_recovery_with_key_information_default" = "Hyni te historiku i mesazheve tuaj të sigurt dhe te identiteti juaj për cross-signing për verifikim sesionesh të tjerë përmes dhënies së Kyçit të Sigurisë.";
"secrets_recovery_with_key_information_verify_device" = "Që të verifikoni këtë pajisje, përdorni Kyçin tuaj të Sigurisë.";
"secrets_recovery_with_key_recovery_key_placeholder" = "Jepni Kyç Sigurie";
"secrets_recovery_with_key_recover_action" = "Përdor Kyç";
"secrets_recovery_with_key_invalid_recovery_key_title" = "Sarrihet të hyhet në depozitë të fshehtë";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Ju lutemi, verifikoni se dhatë kyçin e saktë të rimarrjeve.";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Ju lutemi, verifikoni se dhatë Kyçin e saktë të Sigurisë.";
// AuthenticatedSessionViewControllerFactory
"authenticated_session_flow_not_supported" = "Ky aplikacion nuk mbulon mekanizimin e mirëfilltësimeve në shërbyesin tuaj Home.";
"secure_key_backup_setup_intro_title" = "Kopjeruajtje e Sigurt";
"secure_key_backup_setup_intro_info" = "Mbrohuni kundër humbjes së hyrjes në mesazhe & të dhëna të fshehtëzuara, duke kopjeruajtur kyçe fshehtëzimi në shërbyesin tuaj.";
"secure_key_backup_setup_intro_use_security_key_title" = "Përdorni një Kyç Sigurie";
"secure_key_backup_setup_intro_use_security_key_info" = "Prodhoni një kyç sigurie për ta ruajtur diku të parrezik, bie fjala, në një përgjegjës fjalëkalimesh apo në një kasafortë.";
"secure_key_backup_setup_intro_use_security_passphrase_title" = "Përdorni një Frazëkalim Sigurie";
"secure_key_backup_setup_intro_use_security_passphrase_title" = "Përdorni një Frazë Sigurie";
"secure_key_backup_setup_intro_use_security_passphrase_info" = "Jepni një frazë të fshehtë që e dini vetëm ju, dhe prodhoni një kyç për kopjeruajtje.";
"secure_key_backup_setup_cancel_alert_title" = "Jeni i sigurt?";
"secure_key_backup_setup_cancel_alert_message" = "Nëse e anuloni tani, mund të humbni mesazhe & të dhëna të fshehtëzuara, nëse humbni hyrje te kredenciale tuajt hyrjesh.\n\nMundeni edhe të ujdisni Kopjeruajtje të Sigurt & të administroni kyçet tuaj që nga Rregullimet.";
"secure_backup_setup_banner_title" = "Kopjeruajtje e Sigurt";
"secure_backup_setup_banner_subtitle" = "Mbrohuni kundër humbjes së hyrjes te mesazhe & të dhëna të fshehtëzuara";
"secrets_setup_recovery_key_title" = "Ruani Kyçin tuaj të Sigurisë";
"secrets_setup_recovery_key_information" = "Mbajeni Kyçin tuaj të Rimarrjeve diku të parrezik. Mund të përdoret për të shkyçur mesazhet & të dhënat tuaja të fshehtëzuara.";
"secrets_setup_recovery_key_information" = "Mbajeni Kyçin tuaj të Sigurisë diku të parrezik. Mund të përdoret për të shkyçur mesazhet & të dhënat tuaja të fshehtëzuara.";
"secrets_setup_recovery_key_loading" = "Po ngarkohet…";
"secrets_setup_recovery_key_export_action" = "Ruaje";
"secrets_setup_recovery_key_done_action" = "U bë";
@@ -1133,12 +1133,12 @@
"secrets_setup_recovery_passphrase_validate_action" = "U bë";
"secrets_setup_recovery_passphrase_confirm_information" = "Që ta ripohoni, rijepeni Frazën e Sigurisë.";
"secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Ripohojeni";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Ripohoni frazëkalimin";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Ripohoni frazën";
"security_settings_secure_backup" = "KOPJERUAJTJE E SIGURT";
"security_settings_secure_backup_description" = "Mbrohuni kundër humbjes së hyrjes në mesazhe & të dhëna të fshehtëzuara, duke kopjeruajtur kyçe fshehtëzimishërbyesin tuaj.";
"security_settings_secure_backup_description" = "Kopjeruani kyçet tuaj të fshehtëzimit me të dhëna të llogarisë tuaj, për rastin kur do të humbnit hyrje në sesionet tuaja. Kyçet tuaj do të sigurohen me një Kyç unik Sigurie.";
"security_settings_secure_backup_setup" = "Ujdiseni";
"security_settings_secure_backup_synchronise" = "Njëkohësoje";
"security_settings_secure_backup_delete" = "Fshije";
"security_settings_secure_backup_delete" = "Fshije Kopjeruajtjen";
"security_settings_user_password_description" = "Ripohoni identitetin tuaj duke dhënë fjalëkalimin e llogarisë tuaj";
"secure_key_backup_setup_existing_backup_error_title" = "Një kopjeruajtje për mesazhe që ekzistojnë tashmë";
"secure_key_backup_setup_existing_backup_error_info" = "Shkyçeni, që ta ripërdorni te kopjeruajtja e sigurt ose për ta fshirë që të krijoni një kopjeruajtje të re mesazhesh te kopjeruajtja e sigurt.";
@@ -1313,7 +1313,7 @@
"event_formatter_call_has_ended" = "Përfundoi %@";
"event_formatter_call_video" = "Thirrje video";
"event_formatter_call_voice" = "Thirrje audio";
"security_settings_crosssigning_reset" = "Rikthe te parazgjedhjet <em>cross-signing</em>";
"security_settings_crosssigning_reset" = "Rikthe te parazgjedhjet";
"security_settings_crosssigning" = "<em>CROSS-SIGNING</em>";
"settings_show_NSFW_public_rooms" = "Shfaq dhoma publike NSFW";
"room_open_dialpad" = "Numërator";
@@ -1374,3 +1374,30 @@
// Mark: - Spaces
"space_feature_unavailable_title" = "Hapësirat skanë ardhur ende";
"side_menu_app_version" = "Version %@";
// Mark: - User avatar view
"user_avatar_view_accessibility_label" = "avatar";
"side_menu_action_feedback" = "Përshtypje";
"side_menu_action_help" = "Ndihmë";
"side_menu_action_settings" = "Rregullime";
"side_menu_action_invite_friends" = "Ftoni shokë";
// Mark: - Side menu
"side_menu_reveal_action_accessibility_label" = "Paneli majtas";
"user_avatar_view_accessibility_hint" = "Ndryshoni avatar përdoruesi";
"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Që të vazhdohet, jepni Kyçin tuaj të Sigurisë.";
"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Që të vazhdohet, jepni Frazën tuaj të Sigurisë.";
// Success from secure backup
"key_backup_setup_success_from_secure_backup_info" = "Kyçet tuaj po kopjeruhen.";
"security_settings_crosssigning_bootstrap" = "Ujdise";
"security_settings_secure_backup_restore" = "Riktheji prej Kopjeruajtjeje";
"security_settings_secure_backup_info_valid" = "Ky sesion po kopjeruan kyçet tuaj.";
"security_settings_secure_backup_info_checking" = "Po kontrollohet…";
"settings_ui_theme_picker_message_match_system_theme" = "“Auto” përputhet me temën e sistemit të pajisjes tuaj";
"settings_ui_theme_picker_message_invert_colours" = "“Auto” përdor rregullimet “Ktheji Së Prapthi Ngjyrat”";
"room_recents_unknown_room_error_message" = "Sgjendet dot kjo dhomë. Sigurohuni se ekziston";
"room_creation_dm_error" = "Smundëm të krijojmë dot MD-në tuaj. Ju lutemi, kontrolloni përdoruesit të cilëve doni tu dërgohet dhe riprovoni.";
+4
View File
@@ -28,6 +28,9 @@ internal enum Asset {
internal static let socialLoginButtonTwitter = ImageAsset(name: "social_login_button_twitter")
internal static let callAudioMuteOffIcon = ImageAsset(name: "call_audio_mute_off_icon")
internal static let callAudioMuteOnIcon = ImageAsset(name: "call_audio_mute_on_icon")
internal static let callAudioRouteBuiltin = ImageAsset(name: "call_audio_route_builtin")
internal static let callAudioRouteHeadphones = ImageAsset(name: "call_audio_route_headphones")
internal static let callAudioRouteSpeakers = ImageAsset(name: "call_audio_route_speakers")
internal static let callChatIcon = ImageAsset(name: "call_chat_icon")
internal static let callDialpadBackspaceIcon = ImageAsset(name: "call_dialpad_backspace_icon")
internal static let callDialpadCallIcon = ImageAsset(name: "call_dialpad_call_icon")
@@ -37,6 +40,7 @@ internal enum Asset {
internal static let callPausedIcon = ImageAsset(name: "call_paused_icon")
internal static let callPausedWhiteIcon = ImageAsset(name: "call_paused_white_icon")
internal static let callPipIcon = ImageAsset(name: "call_pip_icon")
internal static let callSpeakerExternalIcon = ImageAsset(name: "call_speaker_external_icon")
internal static let callSpeakerOffIcon = ImageAsset(name: "call_speaker_off_icon")
internal static let callSpeakerOnIcon = ImageAsset(name: "call_speaker_on_icon")
internal static let callVideoIcon = ImageAsset(name: "call_video_icon")
@@ -146,4 +146,8 @@ class DarkTheme: NSObject, Theme {
lazy var colors: Colors = {
return DarkColors()
}()
lazy var fonts: Fonts = {
return ElementFonts()
}()
}
@@ -153,4 +153,8 @@ class DefaultTheme: NSObject, Theme {
lazy var colors: Colors = {
return LightColors()
}()
lazy var fonts: Fonts = {
return ElementFonts()
}()
}
@@ -83,6 +83,8 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
@property (nonatomic, getter = isFirstViewAppearing) BOOL firstViewAppearing;
@property (nonatomic, strong) MXKErrorAlertPresentation *errorPresenter;
@end
@implementation AuthenticationViewController
@@ -118,6 +120,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
_firstViewAppearing = YES;
self.crossSigningService = [CrossSigningService new];
self.errorPresenter = [MXKErrorAlertPresentation new];
}
- (void)viewDidLoad
@@ -171,6 +174,12 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
self.homeServerTextField.placeholder = NSLocalizedStringFromTable(@"auth_home_server_placeholder", @"Vector", nil);
self.identityServerTextField.placeholder = NSLocalizedStringFromTable(@"auth_identity_server_placeholder", @"Vector", nil);
self.authenticationActivityIndicatorContainerView.layer.cornerRadius = 5;
[self.authenticationActivityIndicator addObserver:self
forKeyPath:@"hidden"
options:0
context:nil];
// Custom used authInputsView
[self registerAuthInputsViewClass:AuthInputsView.class forAuthType:MXKAuthenticationTypeLogin];
[self registerAuthInputsViewClass:AuthInputsView.class forAuthType:MXKAuthenticationTypeRegister];
@@ -239,6 +248,8 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
self.submitButton.backgroundColor = ThemeService.shared.theme.tintColor;
self.skipButton.backgroundColor = ThemeService.shared.theme.tintColor;
self.authenticationActivityIndicator.color = ThemeService.shared.theme.textSecondaryColor;
self.authenticationActivityIndicatorContainerView.backgroundColor = ThemeService.shared.theme.baseColor;
self.noFlowLabel.textColor = ThemeService.shared.theme.warningColor;
NSMutableAttributedString *forgotPasswordTitle = [[NSMutableAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"auth_forgot_password", @"Vector", nil)];
@@ -343,6 +354,8 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
{
[_keyboardAvoider stopAvoiding];
[self.authenticationActivityIndicator removeObserver:self forKeyPath:@"hidden"];
[super viewDidDisappear:animated];
}
@@ -461,6 +474,9 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
// Restore here the actual content view height.
// Indeed this height has been modified according to the authInputsView height in the default implementation of MXKAuthenticationViewController.
[self refreshContentViewHeightConstraint];
// the authentication indicator should be the front most view
[self.authInputsContainerView bringSubviewToFront:self.authenticationActivityIndicatorContainerView];
}
- (void)updateAuthInputViewVisibility
@@ -1355,6 +1371,11 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
// Refresh content view height by considering the updated frame of the options container.
[self refreshContentViewHeightConstraint];
}
else if ([@"hidden" isEqualToString:keyPath])
{
UIActivityIndicatorView *indicator = (UIActivityIndicatorView*)object;
[self.authenticationActivityIndicatorContainerView setHidden:indicator.hidden];
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
@@ -1817,6 +1838,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
- (void)ssoAuthenticationPresenter:(SSOAuthenticationPresenter *)presenter authenticationDidFailWithError:(NSError *)error
{
[self dismissSSOAuthenticationPresenter];
[self.errorPresenter presentErrorFromViewController:self forError:error animated:YES handler:nil];
}
- (void)ssoAuthenticationPresenter:(SSOAuthenticationPresenter *)presenter authenticationSucceededWithToken:(NSString *)token
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina5_9" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17126"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -17,6 +18,7 @@
<outlet property="authInputsContainerView" destination="xWb-IJ-v7F" id="DEo-Ji-wPT"/>
<outlet property="authScrollViewBottomConstraint" destination="Q6p-jM-1nj" id="6gY-U4-cSi"/>
<outlet property="authenticationActivityIndicator" destination="30E-gm-z6O" id="DDw-QJ-ND8"/>
<outlet property="authenticationActivityIndicatorContainerView" destination="yLn-GC-maY" id="ie3-dl-OoN"/>
<outlet property="authenticationScrollView" destination="OHV-KQ-Ww0" id="gyc-zq-fA1"/>
<outlet property="cancelAuthFallbackButton" destination="9qj-5c-Sfb" id="IH4-cc-kKx"/>
<outlet property="contentView" destination="rhx-dD-4EJ" id="XXc-2j-Gi6"/>
@@ -100,12 +102,26 @@
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xWb-IJ-v7F" userLabel="AuthInputsContainerView">
<rect key="frame" x="0.0" y="160" width="375" height="200"/>
<subviews>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="30E-gm-z6O">
<rect key="frame" x="177.66666666666666" y="90" width="20" height="20"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="accessibilityIdentifier" value="AuthenticationVCActivityIndicator"/>
</userDefinedRuntimeAttributes>
</activityIndicatorView>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yLn-GC-maY" userLabel="Activity Container">
<rect key="frame" x="157.66666666666666" y="70" width="60" height="60"/>
<subviews>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="30E-gm-z6O">
<rect key="frame" x="20" y="20" width="20" height="20"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="accessibilityIdentifier" value="AuthenticationVCActivityIndicator"/>
</userDefinedRuntimeAttributes>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="30E-gm-z6O" secondAttribute="centerX" id="5NJ-Fd-8Dd"/>
<constraint firstAttribute="bottom" secondItem="30E-gm-z6O" secondAttribute="bottom" constant="20" symbolic="YES" id="5PP-GA-wTT"/>
<constraint firstItem="30E-gm-z6O" firstAttribute="leading" secondItem="yLn-GC-maY" secondAttribute="leading" constant="20" symbolic="YES" id="Wzf-kr-smK"/>
<constraint firstAttribute="trailing" secondItem="30E-gm-z6O" secondAttribute="trailing" constant="20" symbolic="YES" id="c4O-VY-42t"/>
<constraint firstAttribute="centerY" secondItem="30E-gm-z6O" secondAttribute="centerY" id="nBZ-jT-cXk"/>
<constraint firstItem="30E-gm-z6O" firstAttribute="top" secondItem="yLn-GC-maY" secondAttribute="top" constant="20" symbolic="YES" id="nfX-PM-XBB"/>
</constraints>
</view>
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Currently we do not support authentication flows defined by this homeserver" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="54b-4O-ip9" userLabel="noFlowLabel">
<rect key="frame" x="28" y="8" width="319.33333333333331" height="33.666666666666664"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
@@ -131,19 +147,19 @@
<accessibility key="accessibilityConfiguration" identifier="AuthenticationVCInputContainerView"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="54b-4O-ip9" secondAttribute="centerX" id="0bV-x1-MhX"/>
<constraint firstItem="yLn-GC-maY" firstAttribute="centerY" secondItem="xWb-IJ-v7F" secondAttribute="centerY" id="5MG-iL-vu7"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="150" id="8K0-es-Aee"/>
<constraint firstItem="54b-4O-ip9" firstAttribute="top" secondItem="xWb-IJ-v7F" secondAttribute="top" constant="8" id="Ddp-gU-nLY"/>
<constraint firstItem="yLn-GC-maY" firstAttribute="centerX" secondItem="xWb-IJ-v7F" secondAttribute="centerX" id="ExH-Te-BRQ"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="54b-4O-ip9" secondAttribute="trailing" constant="8" id="VEQ-w9-9Ln"/>
<constraint firstAttribute="centerY" secondItem="30E-gm-z6O" secondAttribute="centerY" id="ctL-D3-bgP"/>
<constraint firstAttribute="height" priority="750" constant="200" id="e04-1Y-4gZ"/>
<constraint firstItem="wIH-Kd-r7q" firstAttribute="top" secondItem="54b-4O-ip9" secondAttribute="bottom" constant="5" id="grf-0I-rwT"/>
<constraint firstItem="54b-4O-ip9" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="xWb-IJ-v7F" secondAttribute="leading" constant="8" id="phW-Yy-zN7"/>
<constraint firstAttribute="centerX" secondItem="wIH-Kd-r7q" secondAttribute="centerX" id="rTd-Qc-xrD"/>
<constraint firstAttribute="centerX" secondItem="30E-gm-z6O" secondAttribute="centerX" id="sSN-PO-Q6t"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Gg0-TE-OGb">
<rect key="frame" x="0.0" y="360" width="375" height="300"/>
<rect key="frame" x="0.0" y="360" width="375" height="125"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" hasAttributedTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AJ2-lJ-NUq">
<rect key="frame" x="19" y="33" width="122" height="30"/>
@@ -418,7 +434,7 @@ Clear it if you're finished using this device, or want to sign in to another acc
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TjK-XL-dQS">
<rect key="frame" x="0.0" y="660" width="375" height="0.0"/>
<rect key="frame" x="0.0" y="485" width="375" height="0.0"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" priority="750" id="mIX-QF-Tmn"/>
@@ -522,5 +538,8 @@ Clear it if you're finished using this device, or want to sign in to another acc
<resources>
<image name="horizontal_logo" width="210" height="120"/>
<image name="selection_untick" width="22" height="22"/>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>
@@ -70,7 +70,9 @@ final class SSOAuthenticationService: NSObject {
}
func loginToken(from url: URL) -> String? {
guard let components = URLComponents(string: url.absoluteString) else {
// If needed convert URL string from HTML entities into correct character representations using UTF8 (like '&amp;' with '&')
guard let sanitizedStringURL = url.absoluteString.replacingHTMLEntities(),
let components = URLComponents(string: sanitizedStringURL) else {
return nil
}
return components.vc_getQueryItemValue(for: SSOURLConstants.Parameters.callbackLoginToken)
+73 -2
View File
@@ -28,7 +28,11 @@
#import "IncomingCallView.h"
@interface CallViewController () <PictureInPicturable, DialpadViewControllerDelegate, CallTransferMainViewControllerDelegate>
@interface CallViewController () <
PictureInPicturable,
DialpadViewControllerDelegate,
CallTransferMainViewControllerDelegate,
CallAudioRouteMenuViewDelegate>
{
// Current alert (if any).
UIAlertController *currentAlert;
@@ -44,6 +48,8 @@
@property (nonatomic, strong) CallPiPView *pipView;
@property (nonatomic, strong) CustomSizedPresentationController *customSizedPresentationController;
@property (nonatomic, strong) SlidingModalPresenter *slidingModalPresenter;
@property (nonatomic, strong) CallAudioRouteMenuView *audioRoutesMenuView;
@end
@@ -99,7 +105,8 @@
UIImage *moreButtonImage = [UIImage imageNamed:@"call_more_icon"];
[self.moreButton setImage:moreButtonImage forState:UIControlStateNormal];
[self.moreButtonForVoice setImage:moreButtonImage forState:UIControlStateNormal];
[self.moreButtonForVideo setImage:moreButtonImage forState:UIControlStateNormal];
// Hang up
@@ -222,6 +229,62 @@
return incomingCallView;
}
- (void)showAudioDeviceOptions
{
MXiOSAudioOutputRouter *router = self.mxCall.audioOutputRouter;
if (router.isAnyExternalDeviceConnected)
{
self.slidingModalPresenter = [SlidingModalPresenter new];
_audioRoutesMenuView = [[CallAudioRouteMenuView alloc] initWithRoutes:router.availableOutputRoutes
currentRoute:router.currentRoute];
_audioRoutesMenuView.delegate = self;
[self.slidingModalPresenter presentView:_audioRoutesMenuView
from:self
animated:true
options:SlidingModalPresenter.CenterInScreenOption
completion:nil];
}
else
{
// toggle between built-in and loud speakers
switch (router.currentRoute.routeType)
{
case MXiOSAudioOutputRouteTypeBuiltIn:
[router changeCurrentRouteTo:router.loudSpeakersRoute];
break;
case MXiOSAudioOutputRouteTypeLoudSpeakers:
[router changeCurrentRouteTo:router.builtInRoute];
break;
default:
break;
}
}
}
- (void)configureSpeakerButton
{
switch (self.mxCall.audioOutputRouter.currentRoute.routeType)
{
case MXiOSAudioOutputRouteTypeBuiltIn:
[self.speakerButton setImage:[UIImage imageNamed:@"call_speaker_off_icon"]
forState:UIControlStateNormal];
break;
case MXiOSAudioOutputRouteTypeLoudSpeakers:
[self.speakerButton setImage:[UIImage imageNamed:@"call_speaker_on_icon"]
forState:UIControlStateNormal];
break;
case MXiOSAudioOutputRouteTypeExternalWired:
case MXiOSAudioOutputRouteTypeExternalBluetooth:
case MXiOSAudioOutputRouteTypeExternalCar:
[self.speakerButton setImage:[UIImage imageNamed:@"call_speaker_external_icon"]
forState:UIControlStateNormal];
break;
}
}
#pragma mark - MXCallDelegate
- (void)call:(MXCall *)call stateDidChange:(MXCallState)state reason:(MXEvent *)event
@@ -704,4 +767,12 @@
self.inPiP = NO;
}
#pragma mark - CallAudioRouteMenuViewDelegate
- (void)callAudioRouteMenuView:(CallAudioRouteMenuView *)view didSelectRoute:(MXiOSAudioOutputRoute *)route
{
[self.mxCall.audioOutputRouter changeCurrentRouteTo:route];
[self.slidingModalPresenter dismissWithAnimated:YES completion:nil];
}
@end
+163 -109
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_5" orientation="portrait" appearance="light"/>
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
@@ -30,7 +30,8 @@
<outlet property="localPreviewContainerViewTopConstraint" destination="6gi-ec-ZnO" id="a0K-Ix-oIo"/>
<outlet property="localPreviewContainerViewWidthConstraint" destination="gyu-kv-SLy" id="urn-uo-hnt"/>
<outlet property="localPreviewVideoView" destination="5XG-md-r93" id="Zdf-Mj-rWp"/>
<outlet property="moreButton" destination="xCi-hD-FBs" id="2Hn-T9-jZY"/>
<outlet property="moreButtonForVideo" destination="t5t-MB-jz9" id="pUB-Ud-HxH"/>
<outlet property="moreButtonForVoice" destination="xCi-hD-FBs" id="Kk3-nb-T4p"/>
<outlet property="onHoldCallContainerView" destination="4TX-46-pAi" id="SsP-eX-aHP"/>
<outlet property="onHoldCallerImageView" destination="uFS-C2-TxV" id="SfP-iP-jgd"/>
<outlet property="overlayContainerView" destination="JAR-tn-sGN" id="09u-3G-1UA"/>
@@ -39,6 +40,7 @@
<outlet property="rejectCallButton" destination="H4g-11-Y8d" id="8aM-2q-Lv7"/>
<outlet property="remotePreviewContainerView" destination="Tjb-57-yB1" id="MaR-IC-ZKw"/>
<outlet property="resumeButton" destination="OaQ-Ki-dbe" id="23i-sp-y3f"/>
<outlet property="speakerButton" destination="Oem-On-qbQ" id="LVJ-uj-OfJ"/>
<outlet property="transferButton" destination="wqv-Uf-iNe" id="jua-io-h9q"/>
<outlet property="videoMuteButton" destination="UHM-u9-ODN" id="bfQ-lc-WMB"/>
<outlet property="view" destination="iN0-l3-epB" id="JDF-cz-roW"/>
@@ -46,11 +48,11 @@
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VWv-s0-46r">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<subviews>
<view contentMode="scaleAspectFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="COl-Go-cPy" customClass="MXKImageView">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
@@ -58,9 +60,9 @@
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ifq-Xw-aqp">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="cgp-ZX-ebr">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<blurEffect style="dark"/>
@@ -75,12 +77,12 @@
</constraints>
</view>
<view hidden="YES" contentMode="scaleAspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="Tjb-57-yB1" userLabel="Remote Preview Container">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCRemotePreviewContainerView"/>
</view>
<view opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleAspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="6gQ-zo-2Zw" userLabel="Local Preview Container">
<rect key="frame" x="20" y="464" width="90" height="130"/>
<rect key="frame" x="20" y="381" width="90" height="130"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5XG-md-r93" userLabel="Local Preview Video View">
<rect key="frame" x="0.0" y="0.0" width="90" height="130"/>
@@ -109,7 +111,7 @@
</constraints>
</view>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="Bhz-hS-5B6">
<rect key="frame" x="26.666666666666664" y="46.666666666666686" width="37" height="37"/>
<rect key="frame" x="26.5" y="46.5" width="37" height="37"/>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -131,10 +133,10 @@
</constraints>
</view>
<view opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JAR-tn-sGN" userLabel="Overlay Container View">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sOu-ER-kOe">
<rect key="frame" x="0.0" y="44" width="414" height="54"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sOu-ER-kOe" userLabel="Navigation View">
<rect key="frame" x="0.0" y="0.0" width="375" height="54"/>
<subviews>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="nff-fB-sTq" userLabel="Back Btn">
<rect key="frame" x="10" y="5" width="44" height="44"/>
@@ -157,39 +159,27 @@
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" text="Name" textAlignment="center" lineBreakMode="middleTruncation" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="IW8-8P-mS3">
<rect key="frame" x="54" y="4" width="306" height="20.333333333333332"/>
<rect key="frame" x="54" y="4" width="267" height="20.5"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCCallerNameLabel"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" text="Duration" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="29y-MK-OWH">
<rect key="frame" x="182" y="32.333333333333329" width="50" height="14.333333333333336"/>
<rect key="frame" x="162.5" y="32.5" width="50" height="14.5"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCCallStatusLabel"/>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="IW8-8P-mS3" secondAttribute="trailing" constant="54" id="KKK-Wz-1w3"/>
<constraint firstItem="IW8-8P-mS3" firstAttribute="top" secondItem="sOu-ER-kOe" secondAttribute="top" constant="4" id="Wwm-db-dYV"/>
<constraint firstItem="nff-fB-sTq" firstAttribute="leading" secondItem="sOu-ER-kOe" secondAttribute="leading" constant="10" id="guD-oo-Tl5"/>
<constraint firstItem="29y-MK-OWH" firstAttribute="top" secondItem="IW8-8P-mS3" secondAttribute="bottom" constant="8" id="iXL-M7-wEB"/>
<constraint firstItem="nff-fB-sTq" firstAttribute="centerY" secondItem="sOu-ER-kOe" secondAttribute="centerY" id="vP7-sN-t5g"/>
<constraint firstItem="29y-MK-OWH" firstAttribute="centerX" secondItem="sOu-ER-kOe" secondAttribute="centerX" id="yrO-M6-IFX"/>
<constraint firstItem="IW8-8P-mS3" firstAttribute="leading" secondItem="nff-fB-sTq" secondAttribute="trailing" id="zfx-8Q-WF1"/>
<constraint firstAttribute="height" constant="54" id="zsh-GQ-fv2"/>
</constraints>
</view>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nk9-Un-LVP" userLabel="Call Control Container View">
<rect key="frame" x="0.0" y="774" width="414" height="68"/>
<subviews>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Iiz-W1-oNW" userLabel="Chat Button">
<rect key="frame" x="12" y="7" width="48" height="48"/>
<rect key="frame" x="321" y="5" width="44" height="44"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCCameraSwitchButton"/>
<constraints>
<constraint firstAttribute="width" constant="44" id="YoI-Kn-0rW"/>
<constraint firstAttribute="height" constant="44" id="agK-Vx-OBT"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<inset key="contentEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
<state key="normal" image="call_go_to_chat_icon">
@@ -203,19 +193,138 @@
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="UaC-FO-rmW"/>
</connections>
</button>
<stackView opaque="NO" contentMode="scaleToFill" spacing="18" translatesAutoresizingMaskIntoConstraints="NO" id="K0z-Tt-rHv">
<rect key="frame" x="105" y="6" width="204" height="56"/>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="IW8-8P-mS3" secondAttribute="trailing" constant="54" id="KKK-Wz-1w3"/>
<constraint firstAttribute="trailing" secondItem="Iiz-W1-oNW" secondAttribute="trailing" constant="10" id="RTQ-jR-0rG"/>
<constraint firstItem="IW8-8P-mS3" firstAttribute="top" secondItem="sOu-ER-kOe" secondAttribute="top" constant="4" id="Wwm-db-dYV"/>
<constraint firstItem="nff-fB-sTq" firstAttribute="leading" secondItem="sOu-ER-kOe" secondAttribute="leading" constant="10" id="guD-oo-Tl5"/>
<constraint firstItem="Iiz-W1-oNW" firstAttribute="centerY" secondItem="sOu-ER-kOe" secondAttribute="centerY" id="hyM-3Z-tD1"/>
<constraint firstItem="29y-MK-OWH" firstAttribute="top" secondItem="IW8-8P-mS3" secondAttribute="bottom" constant="8" id="iXL-M7-wEB"/>
<constraint firstItem="nff-fB-sTq" firstAttribute="centerY" secondItem="sOu-ER-kOe" secondAttribute="centerY" id="vP7-sN-t5g"/>
<constraint firstItem="29y-MK-OWH" firstAttribute="centerX" secondItem="sOu-ER-kOe" secondAttribute="centerX" id="yrO-M6-IFX"/>
<constraint firstItem="IW8-8P-mS3" firstAttribute="leading" secondItem="nff-fB-sTq" secondAttribute="trailing" id="zfx-8Q-WF1"/>
<constraint firstAttribute="height" constant="54" id="zsh-GQ-fv2"/>
</constraints>
</view>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nk9-Un-LVP" userLabel="Call Control Container View">
<rect key="frame" x="0.0" y="531" width="375" height="116"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" alignment="center" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="7og-w9-a4g">
<rect key="frame" x="0.0" y="0.0" width="375" height="116"/>
<subviews>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fxP-zM-kfT" userLabel="Audio Mute Button">
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCAudioMuteButton"/>
<stackView opaque="NO" contentMode="scaleToFill" spacing="18" translatesAutoresizingMaskIntoConstraints="NO" id="K0z-Tt-rHv">
<rect key="frame" x="24.5" y="0.0" width="326" height="56"/>
<subviews>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UHM-u9-ODN" userLabel="Video Mute Button">
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCVideoMuteButton"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="jA5-Bg-GZa"/>
<constraint firstAttribute="height" constant="56" id="tJ7-KN-uzF"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<state key="normal" image="call_video_mute_off_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="9Jd-Wv-foD"/>
</connections>
</button>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Oem-On-qbQ" userLabel="Speaker Button">
<rect key="frame" x="74" y="0.0" width="56" height="56"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCAudioMuteButton"/>
<constraints>
<constraint firstAttribute="height" constant="56" id="798-ec-91r"/>
<constraint firstAttribute="width" constant="56" id="Q9L-Uc-BuG"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<state key="normal" image="call_speaker_off_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="3lZ-hS-cIk"/>
</connections>
</button>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fxP-zM-kfT" userLabel="Audio Mute Button">
<rect key="frame" x="148" y="0.0" width="56" height="56"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCAudioMuteButton"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="2za-pq-LeK"/>
<constraint firstAttribute="height" constant="56" id="WzU-Gl-l7E"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<state key="normal" image="call_audio_mute_off_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="CgE-f8-nPS"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lVK-d8-Dqf" userLabel="End Call Button">
<rect key="frame" x="222" y="0.0" width="56" height="56"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCEndCallButton"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="dOZ-Rv-ioc"/>
<constraint firstAttribute="height" constant="56" id="ry3-Rb-qxA"/>
</constraints>
<state key="normal" image="call_hangup_large">
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="selected" image="call_hangup_icon"/>
<state key="highlighted" image="call_hangup_icon"/>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="ZTw-gz-mwM"/>
</connections>
</button>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xCi-hD-FBs" userLabel="More Button">
<rect key="frame" x="296" y="0.0" width="30" height="56"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCChatButton"/>
<constraints>
<constraint firstAttribute="height" constant="56" id="f4E-mb-Ul3"/>
<constraint firstAttribute="width" constant="30" id="uVj-Rb-2qn"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<state key="normal" image="call_more_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="RaZ-1R-2FR"/>
</connections>
</button>
</subviews>
</stackView>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="t5t-MB-jz9" userLabel="More Button">
<rect key="frame" x="159.5" y="60" width="56" height="56"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCChatButton"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="2za-pq-LeK"/>
<constraint firstAttribute="height" constant="56" id="WzU-Gl-l7E"/>
<constraint firstAttribute="width" constant="56" id="MMs-gV-yKO"/>
<constraint firstAttribute="height" constant="56" id="fbH-zP-Ewf"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<state key="normal" image="call_audio_mute_off_icon">
<inset key="contentEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
<state key="normal" image="call_more_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
@@ -223,79 +332,23 @@
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="CgE-f8-nPS"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lVK-d8-Dqf" userLabel="End Call Button">
<rect key="frame" x="74" y="0.0" width="56" height="56"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCEndCallButton"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="dOZ-Rv-ioc"/>
<constraint firstAttribute="height" constant="56" id="ry3-Rb-qxA"/>
</constraints>
<state key="normal" image="call_hangup_large">
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="selected" image="call_hangup_icon"/>
<state key="highlighted" image="call_hangup_icon"/>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="ZTw-gz-mwM"/>
</connections>
</button>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UHM-u9-ODN" userLabel="Video Mute Button">
<rect key="frame" x="148" y="0.0" width="56" height="56"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCVideoMuteButton"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="jA5-Bg-GZa"/>
<constraint firstAttribute="height" constant="56" id="tJ7-KN-uzF"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<state key="normal" image="call_video_mute_off_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="9Jd-Wv-foD"/>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="eQk-NB-QMX"/>
</connections>
</button>
</subviews>
</stackView>
<button opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xCi-hD-FBs" userLabel="More Button">
<rect key="frame" x="354" y="6" width="48" height="48"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCChatButton"/>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<inset key="contentEdgeInsets" minX="12" minY="12" maxX="12" maxY="12"/>
<state key="normal" image="call_more_icon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="onButtonPressed:" destination="-1" eventType="touchUpInside" id="RaZ-1R-2FR"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<accessibility key="accessibilityConfiguration" identifier="CallVCCallControlContainerView"/>
<constraints>
<constraint firstItem="K0z-Tt-rHv" firstAttribute="centerY" secondItem="nk9-Un-LVP" secondAttribute="centerY" id="42s-hp-QOL"/>
<constraint firstItem="Iiz-W1-oNW" firstAttribute="leading" secondItem="nk9-Un-LVP" secondAttribute="leading" constant="12" id="6Ac-bF-DKJ"/>
<constraint firstAttribute="trailing" secondItem="xCi-hD-FBs" secondAttribute="trailing" constant="12" id="PIj-uS-7Wf"/>
<constraint firstItem="Iiz-W1-oNW" firstAttribute="centerY" secondItem="nk9-Un-LVP" secondAttribute="centerY" constant="-3" id="WGS-jR-0O2"/>
<constraint firstAttribute="height" constant="68" id="eS5-qj-HTc"/>
<constraint firstItem="xCi-hD-FBs" firstAttribute="centerY" secondItem="nk9-Un-LVP" secondAttribute="centerY" constant="-4" id="orn-eU-ogl"/>
<constraint firstItem="K0z-Tt-rHv" firstAttribute="centerX" secondItem="nk9-Un-LVP" secondAttribute="centerX" id="qPd-Nd-Opc"/>
<constraint firstAttribute="trailing" secondItem="7og-w9-a4g" secondAttribute="trailing" id="Zko-Q5-3hJ"/>
<constraint firstItem="7og-w9-a4g" firstAttribute="top" secondItem="nk9-Un-LVP" secondAttribute="top" id="hDg-2x-ne1"/>
<constraint firstAttribute="bottom" secondItem="7og-w9-a4g" secondAttribute="bottom" id="ld6-c4-2UQ"/>
<constraint firstItem="7og-w9-a4g" firstAttribute="leading" secondItem="nk9-Un-LVP" secondAttribute="leading" id="tef-re-Lic"/>
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" alignment="center" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Zc0-eq-2kY">
<rect key="frame" x="167" y="293" width="80" height="154"/>
<rect key="frame" x="147.5" y="178.5" width="80" height="154"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FNb-tG-f7m">
<rect key="frame" x="0.0" y="0.0" width="80" height="80"/>
@@ -340,7 +393,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wqv-Uf-iNe" userLabel="Transfer">
<rect key="frame" x="11.666666666666657" y="125" width="57" height="29"/>
<rect key="frame" x="11.5" y="125" width="57" height="29"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
<color key="tintColor" systemColor="systemGreenColor"/>
<state key="normal" title="Transfer"/>
@@ -363,7 +416,7 @@
</constraints>
</view>
<view hidden="YES" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4TX-46-pAi" userLabel="OnHold Call Container View">
<rect key="frame" x="315" y="100" width="79" height="106"/>
<rect key="frame" x="276" y="56" width="79" height="106"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OG1-NY-jaP">
<rect key="frame" x="0.0" y="0.0" width="79" height="106"/>
@@ -417,7 +470,7 @@
</userDefinedRuntimeAttributes>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UGa-hI-iqx" userLabel="Hidden View">
<rect key="frame" x="135" y="164" width="144" height="64"/>
<rect key="frame" x="115.5" y="120" width="144" height="64"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dGJ-MI-UFd">
<rect key="frame" x="0.0" y="0.0" width="64" height="64"/>
@@ -449,7 +502,7 @@
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sJX-l2-pMa">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
</subviews>
@@ -459,10 +512,11 @@
<constraints>
<constraint firstAttribute="bottom" secondItem="VWv-s0-46r" secondAttribute="bottom" id="25w-l9-NMg"/>
<constraint firstItem="sJX-l2-pMa" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="4WB-kY-gwr"/>
<constraint firstItem="6gQ-zo-2Zw" firstAttribute="top" secondItem="r1a-fi-tZ0" secondAttribute="top" priority="750" constant="420" id="6gi-ec-ZnO"/>
<constraint firstItem="6gQ-zo-2Zw" firstAttribute="top" secondItem="r1a-fi-tZ0" secondAttribute="top" priority="750" constant="390" id="6gi-ec-ZnO"/>
<constraint firstItem="r1a-fi-tZ0" firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6gQ-zo-2Zw" secondAttribute="trailing" constant="20" id="9Om-6f-K9u"/>
<constraint firstItem="r1a-fi-tZ0" firstAttribute="trailing" secondItem="VWv-s0-46r" secondAttribute="trailing" id="GX9-dL-Ejl"/>
<constraint firstAttribute="trailing" secondItem="sJX-l2-pMa" secondAttribute="trailing" id="H3S-H9-PQq"/>
<constraint firstItem="nk9-Un-LVP" firstAttribute="top" relation="greaterThanOrEqual" secondItem="6gQ-zo-2Zw" secondAttribute="bottom" constant="20" id="MWW-gF-Ujo"/>
<constraint firstItem="r1a-fi-tZ0" firstAttribute="trailing" secondItem="4TX-46-pAi" secondAttribute="trailing" constant="20" id="PWX-RT-P9p"/>
<constraint firstItem="JAR-tn-sGN" firstAttribute="leading" secondItem="r1a-fi-tZ0" secondAttribute="leading" id="QLG-jw-Xph"/>
<constraint firstItem="6gQ-zo-2Zw" firstAttribute="leading" secondItem="r1a-fi-tZ0" secondAttribute="leading" priority="750" constant="20" id="Qvg-FG-sBr"/>
@@ -477,7 +531,6 @@
<constraint firstItem="JAR-tn-sGN" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="ck8-BX-Uyq"/>
<constraint firstItem="UGa-hI-iqx" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="dzn-mw-OrJ"/>
<constraint firstItem="sOu-ER-kOe" firstAttribute="top" secondItem="r1a-fi-tZ0" secondAttribute="top" id="iV6-LV-kcn"/>
<constraint firstItem="r1a-fi-tZ0" firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="6gQ-zo-2Zw" secondAttribute="bottom" constant="90" id="jCm-3K-6ah"/>
<constraint firstItem="Tjb-57-yB1" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="mW3-RA-hx2"/>
<constraint firstItem="VWv-s0-46r" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="pzW-oL-TS7"/>
<constraint firstAttribute="trailing" secondItem="Tjb-57-yB1" secondAttribute="trailing" id="rXn-dm-69F"/>
@@ -496,8 +549,9 @@
<image name="call_hangup_large" width="68" height="68"/>
<image name="call_more_icon" width="24" height="24"/>
<image name="call_paused_white_icon" width="20" height="20"/>
<image name="call_speaker_off_icon" width="56" height="56"/>
<image name="call_video_mute_off_icon" width="68" height="68"/>
<image name="camera_switch" width="13.333333015441895" height="13.333333015441895"/>
<image name="camera_switch" width="14" height="14"/>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
@@ -0,0 +1,128 @@
//
// Copyright 2021 New Vector 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 Foundation
@objc
protocol CallAudioRouteMenuViewDelegate: AnyObject {
func callAudioRouteMenuView(_ view: CallAudioRouteMenuView, didSelectRoute route: MXiOSAudioOutputRoute)
}
@objcMembers
class CallAudioRouteMenuView: UIView {
private enum Constants {
static let routeHeight: CGFloat = 62
static let stackViewInsets: UIEdgeInsets = UIEdgeInsets(top: 0, left: 24, bottom: 0, right: 24)
static let stackViewCornerRadius: CGFloat = 13
}
let routes: [MXiOSAudioOutputRoute]
let currentRoute: MXiOSAudioOutputRoute?
private lazy var stackView: UIStackView = {
let view = UIStackView(frame: bounds.inset(by: Constants.stackViewInsets))
view.axis = .vertical
view.alignment = .fill
view.distribution = .fillEqually
view.layer.masksToBounds = true
view.layer.cornerRadius = Constants.stackViewCornerRadius
return view
}()
private var theme: Theme = DefaultTheme()
weak var delegate: CallAudioRouteMenuViewDelegate?
init(withRoutes routes: [MXiOSAudioOutputRoute],
currentRoute: MXiOSAudioOutputRoute?) {
self.routes = routes
self.currentRoute = currentRoute
super.init(frame: CGRect(origin: .zero, size: CGSize(width: UIScreen.main.bounds.width, height: CGFloat(routes.count) * Constants.routeHeight)))
setup()
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setup() {
addSubview(stackView)
for (index, route) in routes.enumerated() {
let routeView = CallAudioRouteView(withRoute: route,
isSelected: route == currentRoute,
isBottomLineHidden: index == routes.count - 1)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(routeTapped(_:)))
routeView.addGestureRecognizer(tapGesture)
stackView.addArrangedSubview(routeView)
}
update(theme: theme)
}
@objc
private func routeTapped(_ sender: UITapGestureRecognizer) {
if let routeView = sender.view as? CallAudioRouteView {
delegate?.callAudioRouteMenuView(self, didSelectRoute: routeView.route)
}
}
override func layoutSubviews() {
super.layoutSubviews()
stackView.frame = bounds.inset(by: Constants.stackViewInsets)
}
override func didMoveToSuperview() {
super.didMoveToSuperview()
// TODO: specific to SlidingModalPresenter, remove bg handling logic from there
superview?.backgroundColor = .clear
}
}
extension CallAudioRouteMenuView: Themable {
func update(theme: Theme) {
self.theme = DefaultTheme()
backgroundColor = .clear
stackView.backgroundColor = self.theme.colors.navigation
for view in stackView.arrangedSubviews {
if let view = view as? Themable {
view.update(theme: self.theme)
}
}
}
}
extension CallAudioRouteMenuView: SlidingModalPresentable {
func allowsDismissOnBackgroundTap() -> Bool {
return true
}
func layoutHeightFittingWidth(_ width: CGFloat) -> CGFloat {
return CGFloat(routes.count) * Constants.routeHeight
}
}
@@ -0,0 +1,84 @@
//
// Copyright 2021 New Vector 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
import Reusable
class CallAudioRouteView: UIView {
@IBOutlet private weak var iconImageView: UIImageView!
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var selectedIconImageView: UIImageView!
@IBOutlet private weak var bottomLineView: UIView!
let route: MXiOSAudioOutputRoute
private let isSelected: Bool
private let isBottomLineHidden: Bool
private var theme: Theme = ThemeService.shared().theme
init(withRoute route: MXiOSAudioOutputRoute,
isSelected: Bool,
isBottomLineHidden: Bool = false) {
self.route = route
self.isSelected = isSelected
self.isBottomLineHidden = isBottomLineHidden
super.init(frame: .zero)
loadNibContent()
setup()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setup() {
selectedIconImageView.isHidden = !isSelected
bottomLineView.isHidden = isBottomLineHidden
switch route.routeType {
case .builtIn:
iconImageView.image = Asset.Images.callAudioRouteBuiltin.image
titleLabel.text = route.name
case .loudSpeakers:
iconImageView.image = Asset.Images.callAudioRouteSpeakers.image
titleLabel.text = Bundle.mxk_localizedString(forKey: "call_more_actions_audio_use_device")
case .externalWired, .externalBluetooth, .externalCar:
iconImageView.image = Asset.Images.callAudioRouteHeadphones.image
titleLabel.text = route.name
}
update(theme: theme)
}
}
extension CallAudioRouteView: NibOwnerLoadable {}
extension CallAudioRouteView: Themable {
func update(theme: Theme) {
self.theme = theme
backgroundColor = theme.colors.navigation
iconImageView.tintColor = theme.colors.secondaryContent
titleLabel.textColor = theme.colors.primaryContent
titleLabel.font = theme.fonts.body
selectedIconImageView.tintColor = theme.colors.primaryContent
bottomLineView.backgroundColor = theme.colors.secondaryContent
}
}
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CallAudioRouteView" customModule="Riot" customModuleProvider="target">
<connections>
<outlet property="bottomLineView" destination="LBR-tU-UxC" id="1tu-bV-izu"/>
<outlet property="iconImageView" destination="jLA-5c-Zt1" id="7NK-9l-u5P"/>
<outlet property="selectedIconImageView" destination="RKb-uU-qR6" id="F09-lz-bN4"/>
<outlet property="titleLabel" destination="diN-eC-pOA" id="FII-J4-ZnN"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="414" height="61"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LBR-tU-UxC">
<rect key="frame" x="0.0" y="60" width="414" height="1"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="m9B-0N-ugj"/>
</constraints>
</view>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jLA-5c-Zt1">
<rect key="frame" x="12" y="18.5" width="24" height="24"/>
<constraints>
<constraint firstAttribute="height" constant="24" id="TXK-r1-bOI"/>
<constraint firstAttribute="width" constant="24" id="Whn-3a-Cvz"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="checkmark" translatesAutoresizingMaskIntoConstraints="NO" id="RKb-uU-qR6">
<rect key="frame" x="374" y="18.5" width="24" height="24"/>
<constraints>
<constraint firstAttribute="width" constant="24" id="KkM-xG-8Es"/>
<constraint firstAttribute="height" constant="24" id="UGP-Up-jBV"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="diN-eC-pOA">
<rect key="frame" x="44" y="8" width="322" height="44"/>
<fontDescription key="fontDescription" type="system" pointSize="19"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="LBR-tU-UxC" firstAttribute="trailing" secondItem="vUN-kp-3ea" secondAttribute="trailing" id="3yO-XI-bnL"/>
<constraint firstItem="LBR-tU-UxC" firstAttribute="bottom" secondItem="vUN-kp-3ea" secondAttribute="bottom" id="85A-Hu-UvO"/>
<constraint firstItem="LBR-tU-UxC" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Efb-YZ-r7n"/>
<constraint firstItem="diN-eC-pOA" firstAttribute="leading" secondItem="jLA-5c-Zt1" secondAttribute="trailing" constant="8" id="InE-KY-BCr"/>
<constraint firstItem="LBR-tU-UxC" firstAttribute="top" secondItem="diN-eC-pOA" secondAttribute="bottom" constant="8" id="JgK-T8-UEb"/>
<constraint firstItem="jLA-5c-Zt1" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="Lzk-Ok-frf"/>
<constraint firstItem="diN-eC-pOA" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="8" id="lT9-3y-xRk"/>
<constraint firstItem="jLA-5c-Zt1" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="12" id="mqI-PE-ePl"/>
<constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="RKb-uU-qR6" secondAttribute="trailing" constant="16" id="p6S-dx-14q"/>
<constraint firstItem="RKb-uU-qR6" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="rd7-Kc-7eL"/>
<constraint firstItem="RKb-uU-qR6" firstAttribute="leading" secondItem="diN-eC-pOA" secondAttribute="trailing" constant="8" id="szb-mp-nYy"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="5.7971014492753632" y="-147.65625"/>
</view>
</objects>
<resources>
<image name="checkmark" width="16" height="12.5"/>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>
@@ -107,6 +107,7 @@ final class SideMenuViewController: UIViewController {
self.userAvatarView.update(theme: theme)
self.userDisplayNameLabel.textColor = theme.textPrimaryColor
self.userDisplayNameLabel.font = theme.fonts.title3SB
self.userIdLabel.textColor = theme.textSecondaryColor
for sideMenuActionView in self.sideMenuActionViews {
@@ -56,6 +56,8 @@ class SlidingModalContainerView: UIView, Themable, NibLoadable {
}
}
var centerInScreen: Bool = false
// MARK: Outlets
@IBOutlet private weak var dimmingView: UIView!
@@ -130,7 +132,11 @@ class SlidingModalContainerView: UIView, Themable, NibLoadable {
if UIDevice.current.userInterfaceIdiom == .pad {
self.contentViewBottomConstraint.constant = (UIScreen.main.bounds.height + self.dismissContentViewBottomConstant) / 2
} else {
self.contentViewBottomConstraint.constant = 0
if centerInScreen {
contentViewBottomConstraint.constant = (bounds.height - contentViewHeightConstraint.constant)/2
} else {
contentViewBottomConstraint.constant = 0
}
}
}
@@ -29,8 +29,7 @@ final class SlidingModalPresentationAnimator: NSObject {
// MARK: - Properties
private let isPresenting: Bool
private let isSpanning: Bool
private let blurBackground: Bool
private let options: SlidingModalOption
// MARK: - Setup
@@ -38,10 +37,9 @@ final class SlidingModalPresentationAnimator: NSObject {
///
/// - Parameter isPresenting: true to animate presentation or false to animate dismissal
/// - Parameter isSpanning: true to remove left, bottom and right spaces between the screen edges and the content view
required public init(isPresenting: Bool, isSpanning: Bool, blurBackground: Bool) {
required public init(isPresenting: Bool, options: SlidingModalOption) {
self.isPresenting = isPresenting
self.isSpanning = isSpanning
self.blurBackground = blurBackground
self.options = options
super.init()
}
@@ -50,7 +48,7 @@ final class SlidingModalPresentationAnimator: NSObject {
// Animate presented view controller presentation
private func animatePresentation(using transitionContext: UIViewControllerContextTransitioning) {
guard let presentedViewController = transitionContext.viewController(forKey: .to),
let sourceViewController = transitionContext.viewController(forKey: .from) else {
transitionContext.viewController(forKey: .from) != nil else {
return
}
@@ -61,8 +59,9 @@ final class SlidingModalPresentationAnimator: NSObject {
let containerView = transitionContext.containerView
// Spanning not available for iPad
let slidingModalContainerView = isSpanning && UIDevice.current.userInterfaceIdiom != .pad ? SpanningSlidingModalContainerView.instantiate() : SlidingModalContainerView.instantiate()
slidingModalContainerView.blurBackground = self.blurBackground
let slidingModalContainerView = options.contains(.spanning) && UIDevice.current.userInterfaceIdiom != .pad ? SpanningSlidingModalContainerView.instantiate() : SlidingModalContainerView.instantiate()
slidingModalContainerView.blurBackground = options.contains(.blurBackground)
slidingModalContainerView.centerInScreen = options.contains(.centerInScreen)
slidingModalContainerView.alpha = 0
slidingModalContainerView.updateDimmingViewAlpha(0.0)
@@ -17,13 +17,11 @@
import Foundation
/// `SlidingModalPresentationDelegate` handle a custom sliding UIViewController transition.
public class SlidingModalPresentationDelegate: NSObject {
private let isSpanning: Bool
private let blurBackground: Bool
class SlidingModalPresentationDelegate: NSObject {
private let options: SlidingModalOption
public init(isSpanning: Bool, blurBackground: Bool) {
self.isSpanning = isSpanning
self.blurBackground = blurBackground
init(options: SlidingModalOption) {
self.options = options
super.init()
}
}
@@ -32,11 +30,11 @@ public class SlidingModalPresentationDelegate: NSObject {
extension SlidingModalPresentationDelegate: UIViewControllerTransitioningDelegate {
public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return SlidingModalPresentationAnimator(isPresenting: true, isSpanning: isSpanning, blurBackground: blurBackground)
return SlidingModalPresentationAnimator(isPresenting: true, options: options)
}
public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return SlidingModalPresentationAnimator(isPresenting: false, isSpanning: isSpanning, blurBackground: blurBackground)
return SlidingModalPresentationAnimator(isPresenting: false, options: options)
}
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
@@ -24,6 +24,8 @@ struct SlidingModalOption: OptionSet {
static let spanning = SlidingModalOption(rawValue: 1 << 0)
/// the background is blurred in order to obfuscate the view behind the popup
static let blurBackground = SlidingModalOption(rawValue: 1 << 1)
/// center content in screen
static let centerInScreen = SlidingModalOption(rawValue: 1 << 2)
}
/// `SlidingModalPresenter` allows to present a custom UIViewController or UIView conforming to `SlidingModalPresentable` as a modal with a vertical sliding animation from a UIViewController.
@@ -49,6 +51,7 @@ final class SlidingModalPresenter: NSObject {
@objc static let NoOption: UInt32 = 0
@objc static let SpanningOption: UInt32 = SlidingModalOption.spanning.rawValue
@objc static let BlurBackgroungOption: UInt32 = SlidingModalOption.blurBackground.rawValue
@objc static let CenterInScreenOption: UInt32 = SlidingModalOption.centerInScreen.rawValue
// MARK: - Public
@@ -64,7 +67,7 @@ final class SlidingModalPresenter: NSObject {
MXLog.debug("[SlidingModalPresenter] present \(type(of: viewController))")
let transitionDelegate = SlidingModalPresentationDelegate(isSpanning: options.contains(.spanning), blurBackground: options.contains(.blurBackground))
let transitionDelegate = SlidingModalPresentationDelegate(options: options)
viewController.modalPresentationStyle = .custom
viewController.transitioningDelegate = transitionDelegate
@@ -87,6 +90,14 @@ final class SlidingModalPresenter: NSObject {
self.present(viewController, from: viewControllerPresenter, animated: animated, completion: completion)
}
@objc func presentView(_ view: SlidingModalPresentable.ViewType, from viewControllerPresenter: UIViewController, animated: Bool, options: UInt32, completion: (() -> Void)?) {
MXLog.debug("[SlidingModalPresenter] presentView \(type(of: view))")
let viewController = SlidingModalEmptyViewController.instantiate(with: view)
self.present(viewController, from: viewControllerPresenter, animated: animated, options: SlidingModalOption(rawValue: options), completion: completion)
}
@objc func dismiss(animated: Bool, completion: (() -> Void)?) {
self.presentingViewController?.dismiss(animated: animated, completion: completion)
}
@@ -4,6 +4,7 @@
@import MatrixSDK;
@import MatrixKit;
@import DTCoreText;
#import "WebViewViewController.h"
#import "RiotSplitViewController.h"
@@ -36,6 +36,7 @@
{
[super viewDidLoad];
self.view.backgroundColor = ThemeService.shared.theme.backgroundColor;
self.titleLabel.textColor = ThemeService.shared.theme.textSecondaryColor;
self.titleLabel.text = NSLocalizedStringFromTable(@"share_extension_auth_prompt", @"Vector", nil);
self.logoImageView.tintColor = ThemeService.shared.theme.tintColor;
@@ -75,6 +75,7 @@
{
[super viewDidLoad];
self.recentsTableView.backgroundColor = ThemeService.shared.theme.backgroundColor;
[self.recentsTableView registerNib:[RecentRoomTableViewCell nib] forCellReuseIdentifier:[RecentRoomTableViewCell defaultReuseIdentifier]];
[self configureSearchBar];
@@ -97,6 +98,7 @@
self.recentsSearchBar.searchBarStyle = UISearchBarStyleMinimal;
self.recentsSearchBar.placeholder = NSLocalizedStringFromTable(@"search_default_placeholder", @"Vector", nil);
self.recentsSearchBar.tintColor = ThemeService.shared.theme.tintColor;
self.recentsSearchBar.backgroundColor = ThemeService.shared.theme.baseColor;
_tableSearchBar.tintColor = self.recentsSearchBar.tintColor;
}
@@ -17,6 +17,8 @@
#import "RecentRoomTableViewCell.h"
#import "MXRoomSummary+Riot.h"
#import "ThemeService.h"
#import "RiotShareExtension-Swift.h"
@interface RecentRoomTableViewCell ()
@@ -44,6 +46,14 @@
return nil;
}
- (void)awakeFromNib
{
[super awakeFromNib];
self.roomTitleLabel.textColor = ThemeService.shared.theme.textPrimaryColor;
self.contentView.backgroundColor = ThemeService.shared.theme.backgroundColor;
}
- (void)layoutSubviews
{
[super layoutSubviews];
@@ -21,11 +21,14 @@
#import "ShareDataSource.h"
#import "ShareExtensionManager.h"
#import "ThemeService.h"
#import "RiotShareExtension-Swift.h"
@interface ShareViewController ()
@property (weak, nonatomic) IBOutlet UIView *masterContainerView;
@property (weak, nonatomic) IBOutlet UILabel *tittleLabel;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (nonatomic) SegmentedViewController *segmentedViewController;
@@ -44,6 +47,10 @@
{
[super viewDidLoad];
self.view.tintColor = ThemeService.shared.theme.tintColor;
self.titleLabel.textColor = ThemeService.shared.theme.textPrimaryColor;
self.masterContainerView.backgroundColor = ThemeService.shared.theme.baseColor;
self.shareExtensionManagerDidUpdateAccountDataObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kShareExtensionManagerDidUpdateAccountDataNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
[self configureViews];
@@ -96,14 +103,14 @@
if ([ShareExtensionManager sharedManager].userAccount)
{
self.tittleLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"send_to", @"Vector", nil), @""];
self.titleLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"send_to", @"Vector", nil), @""];
[self configureSegmentedViewController];
}
else
{
NSDictionary *infoDictionary = [NSBundle mainBundle].infoDictionary;
NSString *bundleDisplayName = infoDictionary[@"CFBundleDisplayName"];
self.tittleLabel.text = bundleDisplayName;
self.titleLabel.text = bundleDisplayName;
[self configureFallbackViewController];
}
}
@@ -1,12 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -14,7 +11,7 @@
<connections>
<outlet property="contentView" destination="jAn-9F-DlU" id="NWV-TS-MGK"/>
<outlet property="masterContainerView" destination="oax-z3-vv0" id="KvN-B4-ZkF"/>
<outlet property="tittleLabel" destination="BQ5-AW-rsV" id="qm6-T7-3LB"/>
<outlet property="titleLabel" destination="BQ5-AW-rsV" id="qm6-T7-3LB"/>
<outlet property="view" destination="Bej-An-0PZ" id="sgO-5Q-y1c"/>
</connections>
</placeholder>
@@ -23,10 +20,6 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view alpha="0.59999999999999998" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0SU-xL-B4a" userLabel="Overlay View">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<color key="backgroundColor" red="0.16337278091968011" green="0.16337278091968011" blue="0.16337278091968011" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oax-z3-vv0" userLabel="Master Container View">
<rect key="frame" x="30" y="58.5" width="315" height="550"/>
<subviews>
@@ -34,7 +27,7 @@
<rect key="frame" x="0.0" y="0.0" width="315" height="40"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BQ5-AW-rsV" userLabel="Title Label">
<rect key="frame" x="133" y="8" width="50.5" height="24"/>
<rect key="frame" x="132.5" y="8" width="50" height="24"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="20"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@@ -81,11 +74,8 @@
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="0SU-xL-B4a" secondAttribute="bottom" id="51f-Wf-Yg2"/>
<constraint firstAttribute="bottom" secondItem="oax-z3-vv0" secondAttribute="bottom" priority="750" constant="10" id="Qjd-aK-VSL"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="oax-z3-vv0" secondAttribute="trailing" constant="30" id="VUX-RZ-Jke"/>
<constraint firstItem="0SU-xL-B4a" firstAttribute="top" secondItem="Bej-An-0PZ" secondAttribute="top" id="avs-GA-7eh"/>
<constraint firstAttribute="trailing" secondItem="0SU-xL-B4a" secondAttribute="trailing" id="bgh-PD-Xqx"/>
<constraint firstAttribute="trailing" secondItem="oax-z3-vv0" secondAttribute="trailing" priority="750" constant="30" id="cYZ-zQ-1Dh"/>
<constraint firstItem="oax-z3-vv0" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Bej-An-0PZ" secondAttribute="leading" constant="30" id="h8V-gU-iRt"/>
<constraint firstItem="oax-z3-vv0" firstAttribute="centerY" secondItem="Bej-An-0PZ" secondAttribute="centerY" id="lbe-HZ-ZsR"/>
@@ -94,7 +84,6 @@
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="oax-z3-vv0" secondAttribute="bottom" constant="10" id="qnO-IP-fp3"/>
<constraint firstItem="oax-z3-vv0" firstAttribute="leading" secondItem="Bej-An-0PZ" secondAttribute="leading" priority="750" constant="30" id="sYU-AK-85d"/>
<constraint firstItem="oax-z3-vv0" firstAttribute="top" relation="greaterThanOrEqual" secondItem="Bej-An-0PZ" secondAttribute="top" constant="40" id="vXO-uW-nFN"/>
<constraint firstItem="0SU-xL-B4a" firstAttribute="leading" secondItem="Bej-An-0PZ" secondAttribute="leading" id="wol-Zy-dCb"/>
</constraints>
<point key="canvasLocation" x="39.5" y="89.5"/>
</view>