mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-17 15:09:31 +02:00
142 lines
4.8 KiB
Swift
142 lines
4.8 KiB
Swift
//
|
|
/*
|
|
* Copyright (c) 2022 BWI GmbH
|
|
*
|
|
* 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 SwiftUI
|
|
import UIKit
|
|
import CoreImage.CIFilterBuiltins
|
|
|
|
class MyQRCodeViewController: NSObject {
|
|
|
|
@objc static func createFromSwiftUIView(matrixID: String, displayName: String, avatarUIImage: UIImage) -> UIViewController {
|
|
return UIHostingController(rootView: MyQRCodeView(matrixID: matrixID, displayName: displayName, avatarUIImage: avatarUIImage))
|
|
}
|
|
|
|
@objc static func createFromSwiftUIView(matrixID: String, displayName: String) -> UIViewController {
|
|
return UIHostingController(rootView: MyQRCodeView(matrixID: matrixID, displayName: displayName))
|
|
}
|
|
|
|
}
|
|
|
|
struct MyQRCodeView: View {
|
|
let avatarSize = 80.0
|
|
var matrixID: String
|
|
var displayName: String
|
|
var avatarUIImage: UIImage?
|
|
|
|
var avatarImage: some View {
|
|
if let avatarUIImage = avatarUIImage {
|
|
return Image(uiImage: avatarUIImage)
|
|
.resizable()
|
|
.frame(width: avatarSize, height: avatarSize)
|
|
.clipShape(Circle())
|
|
} else {
|
|
return Image(uiImage: generateAvatarUIImage())
|
|
.resizable()
|
|
.frame(width: avatarSize, height: avatarSize)
|
|
.clipShape(Circle())
|
|
}
|
|
}
|
|
|
|
var qrCode: some View {
|
|
return Image(uiImage: generateQRCodeUIImage())
|
|
.interpolation(.none)
|
|
.resizable()
|
|
.aspectRatio(1, contentMode: .fit)
|
|
.padding(8)
|
|
.frame(maxWidth: 200, maxHeight: 200)
|
|
.background(Color.white)
|
|
.cornerRadius(8)
|
|
}
|
|
|
|
var grayContainer: some View {
|
|
qrCode
|
|
.padding(.top, 120)
|
|
.padding(.bottom, 30)
|
|
.padding(.horizontal, 50)
|
|
.background(Color(ThemeService.shared().theme.colors.system))
|
|
.cornerRadius(8)
|
|
}
|
|
|
|
var content: some View {
|
|
ZStack(alignment: .top) {
|
|
grayContainer
|
|
.padding(.top, avatarSize / 2)
|
|
VStack {
|
|
avatarImage
|
|
.padding(.bottom, 2)
|
|
Text(displayName)
|
|
.lineLimit(1)
|
|
.font(.system(size: 17, weight: .bold))
|
|
.foregroundColor(Color(ThemeService.shared().theme.colors.primaryContent))
|
|
.padding(.bottom, 2)
|
|
Text(matrixID)
|
|
.lineLimit(1)
|
|
.font(.system(size: 15))
|
|
.foregroundColor(Color(ThemeService.shared().theme.colors.secondaryContent))
|
|
.padding(.bottom, 20)
|
|
}
|
|
.padding(.horizontal, 10)
|
|
}
|
|
}
|
|
|
|
var footer: some View {
|
|
Text(BWIL10n.showMyQrScreenMessage(AppInfo.current.displayName))
|
|
.font(.system(size: 15))
|
|
.foregroundColor(BWIBuildSettings.shared.useNewBumColors ? Color(ThemeService.shared().theme.tintColor) : Color(ThemeService.shared().theme.colors.primaryContent)) // bwi: 4769
|
|
.multilineTextAlignment(.center)
|
|
}
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(spacing: 20) {
|
|
content
|
|
footer
|
|
}
|
|
.padding(.vertical, 40)
|
|
.padding(.horizontal, 40)
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.navigationTitle(BWIL10n.showMyQrScreenTitle)
|
|
}
|
|
}
|
|
|
|
private func generateAvatarUIImage() -> UIImage {
|
|
return AvatarGenerator.generateAvatar(forMatrixItem: matrixID, withDisplayName: displayName)
|
|
}
|
|
private func generateQRCodeUIImage() -> UIImage {
|
|
let context = CIContext()
|
|
let filter = CIFilter.qrCodeGenerator()
|
|
|
|
if let permalink = MXTools.permalinkToUser(withUserId: matrixID) {
|
|
filter.message = Data(permalink.utf8)
|
|
|
|
if let outputImage = filter.outputImage {
|
|
if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
|
|
return UIImage(cgImage: cgImage)
|
|
}
|
|
}
|
|
}
|
|
return UIImage()
|
|
}
|
|
|
|
}
|
|
|
|
struct MyQRCodeView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
MyQRCodeView(matrixID: "User ID", displayName: "Display Name")
|
|
}
|
|
}
|