From a0fa8132eafe0d425ee362081a87921677b36ddc Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 27 Oct 2020 16:53:29 +0400 Subject: [PATCH] Bazel build updates --- Makefile | 28 +++++++ Telegram/BUILD | 7 +- .../WidgetKitWidget/TodayViewController.swift | 83 +++++++++++++++---- build-system/bazel_version | 2 +- .../Sources/WidgetDataContext.swift | 65 ++++++++++++++- .../WidgetItems/Sources/WidgetItems.swift | 14 +++- submodules/ffmpeg/BUILD | 17 +++- .../Sources/FFMpeg/build-ffmpeg-bazel.sh | 3 + third-party/webrtc/BUILD | 4 +- 9 files changed, 194 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index b58c5208ba..d83c72aebd 100644 --- a/Makefile +++ b/Makefile @@ -416,6 +416,34 @@ bazel_app_arm64: --output_groups=+dsyms \ --verbose_failures +bazel_app_armv7: + APP_VERSION="${APP_VERSION}" \ + BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \ + build-system/prepare-build.sh Telegram distribution + "${BAZEL}" build Telegram/Telegram ${BAZEL_CACHE_FLAGS} ${BAZEL_COMMON_FLAGS} ${BAZEL_OPT_FLAGS} \ + -c opt \ + --ios_multi_cpus=armv7 \ + --watchos_cpus=armv7k,arm64_32 \ + --objc_enable_binary_stripping=true \ + --features=dead_strip \ + --apple_generate_dsym \ + --output_groups=+dsyms \ + --verbose_failures + +bazel_app: + APP_VERSION="${APP_VERSION}" \ + BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \ + build-system/prepare-build.sh Telegram distribution + "${BAZEL}" build Telegram/Telegram ${BAZEL_CACHE_FLAGS} ${BAZEL_COMMON_FLAGS} ${BAZEL_OPT_FLAGS} \ + -c opt \ + --ios_multi_cpus=armv7,arm64 \ + --watchos_cpus=armv7k,arm64_32 \ + --objc_enable_binary_stripping=true \ + --features=dead_strip \ + --apple_generate_dsym \ + --output_groups=+dsyms \ + --verbose_failures + bazel_prepare_development_build: APP_VERSION="${APP_VERSION}" \ BAZEL_CACHE_DIR="${BAZEL_CACHE_DIR}" \ diff --git a/Telegram/BUILD b/Telegram/BUILD index 6ea28c6303..49938c3f8f 100644 --- a/Telegram/BUILD +++ b/Telegram/BUILD @@ -1628,13 +1628,8 @@ ios_application( ":AdditionalInfoPlist", ":TelegramInfoIconsPlist", ], - #app_icons = [ - # ":DefaultAppIcon", - #], resources = [ ":AdditionalIcons", - #":DefaultAppIcon", - #":AppIcons", ], frameworks = [ ":MtProtoKitFramework", @@ -1652,10 +1647,10 @@ ios_application( ], extensions = [ ":ShareExtension", - ":WidgetExtension", ":NotificationContentExtension", ":NotificationServiceExtension", ":IntentsExtension", + ":WidgetExtension", ], watch_application = ":TelegramWatchApp", deps = [ diff --git a/Telegram/WidgetKitWidget/TodayViewController.swift b/Telegram/WidgetKitWidget/TodayViewController.swift index e9285f1436..5d293fbd76 100644 --- a/Telegram/WidgetKitWidget/TodayViewController.swift +++ b/Telegram/WidgetKitWidget/TodayViewController.swift @@ -52,43 +52,98 @@ extension PeersWidgetData { static let previewData = PeersWidgetData.placeholder } +struct AvatarItemView: View { + var accountPeerId: Int64 + var peer: WidgetDataPeer + var itemSize: CGFloat + + var body: some View { + return ZStack { + Image(uiImage: avatarImage(accountPeerId: accountPeerId, peer: peer, size: CGSize(width: itemSize, height: itemSize))) + if let badge = peer.badge, badge.count > 0 { + Text("\(badge.count)") + .font(Font.system(size: 16.0)) + .multilineTextAlignment(.center) + .foregroundColor(.white) + .padding(.horizontal, 4.0) + .background( + RoundedRectangle(cornerRadius: 10) + .fill(badge.isMuted ? Color.gray : Color.red) + .frame(minWidth: 20, idealWidth: 20, maxWidth: .infinity, minHeight: 20, idealHeight: 20, maxHeight: 20.0, alignment: .center) + ) + .position(x: floor(0.84 * itemSize), y: floor(0.16 * itemSize)) + } + } + } +} + struct WidgetView: View { + @Environment(\.widgetFamily) private var widgetFamily let data: PeersWidgetData func placeholder(geometry: GeometryProxy) -> some View { let defaultItemSize: CGFloat = 60.0 let defaultPaddingFraction: CGFloat = 0.36 - let rowCount = Int(round(geometry.size.width / (defaultItemSize * (1.0 + defaultPaddingFraction)))) - let itemSize = floor(geometry.size.width / (CGFloat(rowCount) + defaultPaddingFraction * CGFloat(rowCount - 1))) + let columnCount = Int(round(geometry.size.width / (defaultItemSize * (1.0 + defaultPaddingFraction)))) + let itemSize = floor(geometry.size.width / (CGFloat(columnCount) + defaultPaddingFraction * CGFloat(columnCount - 1))) let firstRowY = itemSize / 2.0 let secondRowY = itemSize / 2.0 + geometry.size.height - itemSize return ZStack { - ForEach(0 ..< rowCount * 2, content: { i in - return Circle().frame(width: itemSize, height: itemSize).position(x: itemSize / 2.0 + floor(CGFloat(i % rowCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / rowCount == 0 ? firstRowY : secondRowY).foregroundColor(.gray) + ForEach(0 ..< columnCount * 2, content: { i in + return Circle().frame(width: itemSize, height: itemSize).position(x: itemSize / 2.0 + floor(CGFloat(i % columnCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / columnCount == 0 ? firstRowY : secondRowY).foregroundColor(.gray) }) } } + private func linkForPeer(id: Int64) -> String { + switch self.widgetFamily { + case .systemSmall: + return "\(buildConfig.appSpecificUrlScheme)://" + default: + return "\(buildConfig.appSpecificUrlScheme)://localpeer?id=\(id)" + } + } + func peersView(geometry: GeometryProxy, peers: WidgetDataPeers) -> some View { let defaultItemSize: CGFloat = 60.0 let defaultPaddingFraction: CGFloat = 0.36 - let rowCount = Int(round(geometry.size.width / (defaultItemSize * (1.0 + defaultPaddingFraction)))) - let itemSize = floor(geometry.size.width / (CGFloat(rowCount) + defaultPaddingFraction * CGFloat(rowCount - 1))) + let rowCount: Int + let rowHeight: CGFloat + let topOffset: CGFloat + switch self.widgetFamily { + case .systemLarge: + rowCount = 4 + rowHeight = 88.0 + topOffset = 12.0 + default: + rowCount = 2 + rowHeight = 76.0 + topOffset = 0.0 + } + let columnCount = Int(round(geometry.size.width / (defaultItemSize * (1.0 + defaultPaddingFraction)))) + let itemSize = floor(geometry.size.width / (CGFloat(columnCount) + defaultPaddingFraction * CGFloat(columnCount - 1))) - let firstRowY = itemSize / 2.0 - let secondRowY = itemSize / 2.0 + geometry.size.height - itemSize + let rowOffset: [CGFloat] = [ + topOffset + itemSize / 2.0, + topOffset + itemSize / 2.0 + rowHeight, + topOffset + itemSize / 2.0 + rowHeight * 2, + topOffset + itemSize / 2.0 + rowHeight * 3, + ] return ZStack { - ForEach(0 ..< min(peers.peers.count, rowCount * 2), content: { i in - Link(destination: URL(string: "\(buildConfig.appSpecificUrlScheme)://localpeer?id=\(peers.peers[i].id)")!, label: { - Image(uiImage: avatarImage(accountPeerId: peers.accountPeerId, peer: peers.peers[i], size: CGSize(width: itemSize, height: itemSize))) - .frame(width: itemSize, height: itemSize) + ForEach(0 ..< min(peers.peers.count, columnCount * rowCount), content: { i in + Link(destination: URL(string: linkForPeer(id: peers.peers[i].id))!, label: { + AvatarItemView( + accountPeerId: peers.accountPeerId, + peer: peers.peers[i], + itemSize: itemSize + ).frame(width: itemSize, height: itemSize) }).frame(width: itemSize, height: itemSize) - .position(x: itemSize / 2.0 + floor(CGFloat(i % rowCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / rowCount == 0 ? firstRowY : secondRowY) + .position(x: itemSize / 2.0 + floor(CGFloat(i % columnCount) * itemSize * (1.0 + defaultPaddingFraction)), y: rowOffset[i / columnCount]) }) } } @@ -214,7 +269,7 @@ struct Static_Widget: Widget { WidgetView(data: getWidgetData()) } ) - .supportedFamilies([.systemMedium]) + .supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) .configurationDisplayName(presentationData.widgetGalleryTitle) .description(presentationData.widgetGalleryDescription) } diff --git a/build-system/bazel_version b/build-system/bazel_version index 47b322c971..7c69a55dbb 100644 --- a/build-system/bazel_version +++ b/build-system/bazel_version @@ -1 +1 @@ -3.4.1 +3.7.0 diff --git a/submodules/TelegramUI/Sources/WidgetDataContext.swift b/submodules/TelegramUI/Sources/WidgetDataContext.swift index 37334f64e2..eddd306ed6 100644 --- a/submodules/TelegramUI/Sources/WidgetDataContext.swift +++ b/submodules/TelegramUI/Sources/WidgetDataContext.swift @@ -23,12 +23,62 @@ final class WidgetDataContext { guard let account = account else { return .single(.notAuthorized) } - return recentPeers(account: account) + + enum RecentPeers { + struct Unread { + var count: Int32 + var isMuted: Bool + } + + case disabled + case peers(peers: [Peer], unread: [PeerId: Unread]) + } + + let recent: Signal = recentPeers(account: account) + |> mapToSignal { recent -> Signal in + switch recent { + case .disabled: + return .single(.disabled) + case let .peers(peers): + return combineLatest(queue: .mainQueue(), peers.filter { !$0.isDeleted }.map { account.postbox.peerView(id: $0.id)}) |> mapToSignal { peerViews -> Signal in + return account.postbox.unreadMessageCountsView(items: peerViews.map { + .peer($0.peerId) + }) + |> map { values -> RecentPeers in + var peers: [Peer] = [] + var unread: [PeerId: RecentPeers.Unread] = [:] + for peerView in peerViews { + if let peer = peerViewMainPeer(peerView) { + var isMuted: Bool = false + if let notificationSettings = peerView.notificationSettings as? TelegramPeerNotificationSettings { + switch notificationSettings.muteState { + case .muted: + isMuted = true + default: + break + } + } + + let unreadCount = values.count(for: .peer(peerView.peerId)) + if let unreadCount = unreadCount, unreadCount > 0 { + unread[peerView.peerId] = RecentPeers.Unread(count: Int32(unreadCount), isMuted: isMuted) + } + + peers.append(peer) + } + } + return .peers(peers: peers, unread: unread) + } + } + } + } + + return recent |> map { result -> WidgetData in switch result { case .disabled: return .disabled - case let .peers(peers): + case let .peers(peers, unread): return .peers(WidgetDataPeers(accountPeerId: account.peerId.toInt64(), peers: peers.compactMap { peer -> WidgetDataPeer? in guard let user = peer as? TelegramUser else { return nil @@ -46,12 +96,21 @@ final class WidgetDataContext { name = phone } + var badge: WidgetDataPeer.Badge? + if let unreadValue = unread[peer.id], unreadValue.count > 0 { + badge = WidgetDataPeer.Badge( + count: Int(unreadValue.count), + isMuted: unreadValue.isMuted + ) + } + return WidgetDataPeer(id: user.id.toInt64(), name: name, lastName: lastName, letters: user.displayLetters, avatarPath: smallestImageRepresentation(user.photo).flatMap { representation in return account.postbox.mediaBox.resourcePath(representation.resource) - }) + }, badge: badge) })) } } + |> distinctUntilChanged }).start(next: { widgetData in let path = basePath + "/widget-data" if let data = try? JSONEncoder().encode(widgetData) { diff --git a/submodules/WidgetItems/Sources/WidgetItems.swift b/submodules/WidgetItems/Sources/WidgetItems.swift index 89dd00ae1f..6af023281c 100644 --- a/submodules/WidgetItems/Sources/WidgetItems.swift +++ b/submodules/WidgetItems/Sources/WidgetItems.swift @@ -5,18 +5,30 @@ public enum WidgetCodingError: Error { } public struct WidgetDataPeer: Codable, Equatable { + public struct Badge: Codable, Equatable { + public var count: Int + public var isMuted: Bool + + public init(count: Int, isMuted: Bool) { + self.count = count + self.isMuted = isMuted + } + } + public var id: Int64 public var name: String public var lastName: String? public var letters: [String] public var avatarPath: String? + public var badge: Badge? - public init(id: Int64, name: String, lastName: String?, letters: [String], avatarPath: String?) { + public init(id: Int64, name: String, lastName: String?, letters: [String], avatarPath: String?, badge: Badge?) { self.id = id self.name = name self.lastName = lastName self.letters = letters self.avatarPath = avatarPath + self.badge = badge } } diff --git a/submodules/ffmpeg/BUILD b/submodules/ffmpeg/BUILD index edcc75499d..555ffe79a7 100644 --- a/submodules/ffmpeg/BUILD +++ b/submodules/ffmpeg/BUILD @@ -127,9 +127,19 @@ genrule( ], cmd_bash = """ - SOURCE_PATH="submodules/ffmpeg/Sources/FFMpeg" + #random:2 - BUILD_DIR="$(RULEDIR)/build" + set -x + + ABS_RULEDIR="$$(pwd)/$(RULEDIR)" + echo "ABS_RULEDIR=$$ABS_RULEDIR" + + SOURCE_PATH="$$ABS_RULEDIR/FFMpegSource" + rm -rf "$$SOURCE_PATH" + + cp -R "submodules/ffmpeg/Sources/FFMpeg" "$$SOURCE_PATH" + + BUILD_DIR="$$ABS_RULEDIR/build" rm -rf "$$BUILD_DIR" mkdir -p "$$BUILD_DIR" YASM_DIR="$$BUILD_DIR/yasm" @@ -167,6 +177,9 @@ genrule( cc_library( name = "ffmpeg_lib", srcs = ffmpeg_libs, + visibility = [ + "//visibility:public", + ] ) objc_library( diff --git a/submodules/ffmpeg/Sources/FFMpeg/build-ffmpeg-bazel.sh b/submodules/ffmpeg/Sources/FFMpeg/build-ffmpeg-bazel.sh index 5d6664b16f..19ab1b51e9 100755 --- a/submodules/ffmpeg/Sources/FFMpeg/build-ffmpeg-bazel.sh +++ b/submodules/ffmpeg/Sources/FFMpeg/build-ffmpeg-bazel.sh @@ -120,6 +120,7 @@ then do echo "building $ARCH..." mkdir -p "$SCRATCH/$ARCH" + pushd "$SCRATCH/$ARCH" LIBOPUS_PATH="$SOURCE_DIR/libopus" @@ -178,6 +179,8 @@ then CORE_COUNT=`sysctl -n hw.logicalcpu` make -j$CORE_COUNT install $EXPORT || exit 1 + + popd done fi diff --git a/third-party/webrtc/BUILD b/third-party/webrtc/BUILD index 972b497880..d7f382d8da 100644 --- a/third-party/webrtc/BUILD +++ b/third-party/webrtc/BUILD @@ -27,7 +27,7 @@ genrule( """ OUT_DIR="ios" if [ "$(TARGET_CPU)" == "ios_armv7" ]; then - BUILD_ARCH="armv7" + BUILD_ARCH="arm" elif [ "$(TARGET_CPU)" == "ios_arm64" ]; then BUILD_ARCH="arm64" elif [ "$(TARGET_CPU)" == "ios_x86_64" ]; then @@ -37,7 +37,7 @@ genrule( echo "Unsupported architecture $(TARGET_CPU)" fi BUILD_DIR="$(RULEDIR)/$$BUILD_ARCH" - #rm -rf "$$BUILD_DIR" + rm -rf "$$BUILD_DIR" mkdir -p "$$BUILD_DIR" SOURCE_PATH="third-party/webrtc/webrtc-ios/src"