From 7a60f948ae4acfab920320b07b8979d588e28f5f Mon Sep 17 00:00:00 2001 From: DrKLO Date: Mon, 19 Jul 2021 18:56:43 +0300 Subject: [PATCH] Update to 7.8.2 (2376) Thanks to @alabiaga and @marcelpinto for help with improvements for Android 12. https://github.com/DrKLO/Telegram/pull/1633 https://github.com/DrKLO/Telegram/pull/1636 https://github.com/DrKLO/Telegram/pull/1630 --- Dockerfile | 19 +- TMessagesProj/build.gradle | 8 +- TMessagesProj/jni/tgnet/Handshake.cpp | 13 +- TMessagesProj/jni/voip/CMakeLists.txt | 2 + .../jni/voip/tgcalls/CodecSelectHelper.cpp | 8 +- .../jni/voip/tgcalls/EncryptedConnection.cpp | 2 +- TMessagesProj/jni/voip/tgcalls/Message.cpp | 1 + .../jni/voip/tgcalls/NetworkManager.cpp | 19 +- .../SctpDataChannelProviderInterfaceImpl.cpp | 158 +++++++++++++++ .../SctpDataChannelProviderInterfaceImpl.h | 64 ++++++ .../jni/voip/tgcalls/StaticThreads.cpp | 9 - .../jni/voip/tgcalls/StaticThreads.h | 2 - .../jni/voip/tgcalls/TurnCustomizerImpl.cpp | 21 ++ .../jni/voip/tgcalls/TurnCustomizerImpl.h | 19 ++ .../tgcalls/group/GroupInstanceCustomImpl.cpp | 65 +++--- .../tgcalls/group/GroupNetworkManager.cpp | 187 +----------------- .../voip/tgcalls/v2/NativeNetworkingImpl.cpp | 184 +---------------- TMessagesProj/src/main/AndroidManifest.xml | 4 +- .../telegram/messenger/AndroidUtilities.java | 6 + .../org/telegram/messenger/BuildVars.java | 6 +- .../messenger/ChatsWidgetProvider.java | 15 +- .../messenger/ChatsWidgetService.java | 6 +- .../messenger/ContactsWidgetProvider.java | 15 +- .../org/telegram/messenger/MessageObject.java | 4 +- .../messenger/MessagesController.java | 4 +- .../messenger/NotificationsController.java | 44 +++-- .../org/telegram/messenger/SharedConfig.java | 36 +++- .../org/telegram/messenger/UserConfig.java | 54 ----- .../ui/ActionBar/ActionBarLayout.java | 4 +- .../telegram/ui/ActionBar/AlertDialog.java | 6 +- .../java/org/telegram/ui/ActionBar/Theme.java | 5 +- .../telegram/ui/Cells/ChatMessageCell.java | 7 + .../java/org/telegram/ui/ChatActivity.java | 15 +- .../ui/ChatsWidgetConfigActivity.java | 2 +- .../ui/Components/BotCommandsMenuView.java | 80 ++++---- .../ui/Components/ChatActivityEnterView.java | 5 +- .../ChatAttachAlertPhotoLayout.java | 2 +- .../ui/Components/InstantCameraView.java | 7 +- .../Components/MotionBackgroundDrawable.java | 2 +- .../telegram/ui/Components/PasscodeView.java | 14 +- .../ui/Components/SearchCounterView.java | 12 +- .../voip/GroupCallMiniTextureView.java | 18 +- .../ui/ContactsWidgetConfigActivity.java | 2 +- .../org/telegram/ui/EditWidgetActivity.java | 26 ++- .../telegram/ui/FeedWidgetConfigActivity.java | 6 +- .../java/org/telegram/ui/LaunchActivity.java | 25 +-- .../java/org/telegram/ui/PhotoViewer.java | 7 +- .../java/org/telegram/ui/ProfileActivity.java | 1 + .../ui/TextMessageEnterTransition.java | 123 +++++++----- .../telegram/ui/VoIPPermissionActivity.java | 2 +- .../res/drawable-v21/widget_background.xml | 6 + .../drawable-v31/widget_badge_background.xml | 10 + .../widget_badge_muted_background.xml | 10 + .../src/main/res/drawable/widget_avatar_1.png | Bin 0 -> 11078 bytes .../src/main/res/drawable/widget_avatar_2.png | Bin 0 -> 13603 bytes .../src/main/res/drawable/widget_avatar_3.png | Bin 0 -> 14205 bytes .../src/main/res/drawable/widget_avatar_4.png | Bin 0 -> 11448 bytes .../src/main/res/drawable/widget_avatar_5.png | Bin 0 -> 10702 bytes .../src/main/res/drawable/widget_avatar_6.png | Bin 0 -> 10317 bytes .../src/main/res/drawable/widget_avatar_7.png | Bin 0 -> 9970 bytes .../res/drawable/widget_badge_background.xml | 3 + .../widget_badge_muted_background.xml | 3 + .../main/res/layout/contacts_widget_item.xml | 120 +---------- .../res/layout/contacts_widget_item_1.xml | 55 ++++++ .../res/layout/contacts_widget_item_2.xml | 56 ++++++ .../res/layout/contacts_widget_layout_1.xml | 9 +- .../res/layout/contacts_widget_layout_2.xml | 9 +- .../res/layout/contacts_widget_layout_3.xml | 9 +- .../res/layout/contacts_widget_layout_4.xml | 9 +- .../layout/contacts_widget_layout_preview.xml | 40 ++++ .../main/res/layout/shortcut_widget_item.xml | 30 ++- .../res/layout/shortcut_widget_layout_1.xml | 6 +- .../res/layout/shortcut_widget_layout_2.xml | 6 +- .../res/layout/shortcut_widget_layout_3.xml | 6 +- .../res/layout/shortcut_widget_layout_4.xml | 6 +- .../layout/shortcut_widget_layout_preview.xml | 19 ++ .../src/main/res/values-v31/styles.xml | 32 +++ .../src/main/res/values-v31/values.xml | 4 + TMessagesProj/src/main/res/values/attrs.xml | 10 + TMessagesProj/src/main/res/values/styles.xml | 90 +++++++++ TMessagesProj/src/main/res/values/values.xml | 1 + .../src/main/res/xml/chats_widget_info.xml | 13 +- .../src/main/res/xml/contacts_widget_info.xml | 7 + 83 files changed, 1038 insertions(+), 877 deletions(-) create mode 100644 TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.cpp create mode 100644 TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.h create mode 100644 TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.cpp create mode 100644 TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.h create mode 100644 TMessagesProj/src/main/res/drawable-v21/widget_background.xml create mode 100644 TMessagesProj/src/main/res/drawable-v31/widget_badge_background.xml create mode 100644 TMessagesProj/src/main/res/drawable-v31/widget_badge_muted_background.xml create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_1.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_2.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_3.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_4.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_5.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_6.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_avatar_7.png create mode 100644 TMessagesProj/src/main/res/drawable/widget_badge_background.xml create mode 100644 TMessagesProj/src/main/res/drawable/widget_badge_muted_background.xml create mode 100644 TMessagesProj/src/main/res/layout/contacts_widget_item_1.xml create mode 100644 TMessagesProj/src/main/res/layout/contacts_widget_item_2.xml create mode 100644 TMessagesProj/src/main/res/layout/contacts_widget_layout_preview.xml create mode 100644 TMessagesProj/src/main/res/layout/shortcut_widget_layout_preview.xml create mode 100644 TMessagesProj/src/main/res/values-v31/styles.xml create mode 100644 TMessagesProj/src/main/res/values-v31/values.xml create mode 100644 TMessagesProj/src/main/res/values/attrs.xml diff --git a/Dockerfile b/Dockerfile index 0b2fdb403..91e717381 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM gradle:6.7.1-jdk8 +FROM gradle:6.7.1-jdk11 -ENV ANDROID_SDK_URL https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -ENV ANDROID_API_LEVEL android-30 -ENV ANDROID_BUILD_TOOLS_VERSION 30.0.3 +ENV ANDROID_SDK_URL https://dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip +ENV ANDROID_API_LEVEL android-31 +ENV ANDROID_BUILD_TOOLS_VERSION 31.0.0 ENV ANDROID_HOME /usr/local/android-sdk-linux ENV ANDROID_NDK_VERSION 21.4.7075529 -ENV ANDROID_VERSION 30 +ENV ANDROID_VERSION 31 ENV ANDROID_NDK_HOME ${ANDROID_HOME}/ndk/${ANDROID_NDK_VERSION}/ ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools @@ -15,12 +15,15 @@ RUN mkdir "$ANDROID_HOME" .android && \ unzip sdk.zip && \ rm sdk.zip -RUN yes | ${ANDROID_HOME}/tools/bin/sdkmanager --licenses -RUN $ANDROID_HOME/tools/bin/sdkmanager --update -RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ +RUN yes | ${ANDROID_HOME}/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses +RUN $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --update +RUN $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME "build-tools;30.0.3" \ + "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ "platforms;android-${ANDROID_VERSION}" \ "platform-tools" \ "ndk;$ANDROID_NDK_VERSION" +RUN cp $ANDROID_HOME/build-tools/30.0.3/dx $ANDROID_HOME/build-tools/31.0.0/dx +RUN cp $ANDROID_HOME/build-tools/30.0.3/lib/dx.jar $ANDROID_HOME/build-tools/31.0.0/lib/dx.jar ENV PATH ${ANDROID_NDK_HOME}:$PATH ENV PATH ${ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/:$PATH diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 88a35410f..557fa34ec 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -42,8 +42,8 @@ dependencies { } android { - compileSdkVersion 30 - buildToolsVersion '30.0.3' + compileSdkVersion 31 + buildToolsVersion '31.0.0' ndkVersion "21.4.7075529" defaultConfig.applicationId = "org.telegram.messenger" @@ -299,7 +299,7 @@ android { } } - defaultConfig.versionCode = 2372 + defaultConfig.versionCode = 2376 applicationVariants.all { variant -> variant.outputs.all { output -> @@ -318,7 +318,7 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionName "7.8.1" + versionName "7.8.2" vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] diff --git a/TMessagesProj/jni/tgnet/Handshake.cpp b/TMessagesProj/jni/tgnet/Handshake.cpp index 233b96902..a9fd6bf15 100644 --- a/TMessagesProj/jni/tgnet/Handshake.cpp +++ b/TMessagesProj/jni/tgnet/Handshake.cpp @@ -482,7 +482,7 @@ void Handshake::processHandshakeResponse(TLObject *message, int64_t messageId) { uint32_t paddedDataSize = 192; uint32_t encryptedDataSize = keySize + paddedDataSize + SHA256_DIGEST_LENGTH; uint32_t additionalSize = innerDataSize < paddedDataSize ? paddedDataSize - innerDataSize : 0; - NativeByteBuffer *innerDataBuffer = BuffersStorage::getInstance().getFreeBuffer(encryptedDataSize + paddedDataSize + ivSize + SHA256_DIGEST_LENGTH); + NativeByteBuffer *innerDataBuffer = BuffersStorage::getInstance().getFreeBuffer(encryptedDataSize + paddedDataSize + ivSize + SHA256_DIGEST_LENGTH + 256); innerDataBuffer->position(encryptedDataSize); innerData->serializeToStream(innerDataBuffer); @@ -518,12 +518,13 @@ void Handshake::processHandshakeResponse(TLObject *message, int64_t messageId) { } bool ok = false; - size_t resLen = BN_bn2bin(rsaKey->n, innerDataBuffer->bytes() + encryptedDataSize); + uint32_t offset = encryptedDataSize + paddedDataSize + ivSize + SHA256_DIGEST_LENGTH; + size_t resLen = BN_bn2bin(rsaKey->n, innerDataBuffer->bytes() + offset); const auto shift = (256 - resLen); for (auto i = 0; i != 256; ++i) { const auto a = innerDataBuffer->bytes()[i]; - const auto b = (i < shift) ? 0 : innerDataBuffer->bytes()[encryptedDataSize + i - shift]; + const auto b = (i < shift) ? 0 : innerDataBuffer->bytes()[offset + i - shift]; if (a > b) { break; } else if (a < b) { @@ -544,9 +545,9 @@ void Handshake::processHandshakeResponse(TLObject *message, int64_t messageId) { BN_mod_exp(r, a, rsaKey->e, rsaKey->n, bnContext); uint32_t size = BN_num_bytes(r); auto rsaEncryptedData = new ByteArray(size >= 256 ? size : 256); - size_t resLen = BN_bn2bin(r, rsaEncryptedData->bytes); - if (256 - resLen > 0) { - memset(rsaEncryptedData->bytes + resLen, 0, 256 - resLen); + BN_bn2bin(r, rsaEncryptedData->bytes + (size < 256 ? (256 - size) : 0)); + if (256 - size > 0) { + memset(rsaEncryptedData->bytes, 0, 256 - size); } BN_free(a); BN_free(r); diff --git a/TMessagesProj/jni/voip/CMakeLists.txt b/TMessagesProj/jni/voip/CMakeLists.txt index 6c3ca4fa0..b958ca0b9 100644 --- a/TMessagesProj/jni/voip/CMakeLists.txt +++ b/TMessagesProj/jni/voip/CMakeLists.txt @@ -911,6 +911,8 @@ add_library(tgcalls STATIC voip/tgcalls/VideoCaptureInterface.cpp voip/tgcalls/VideoCaptureInterfaceImpl.cpp voip/tgcalls/AudioDeviceHelper.cpp + voip/tgcalls/SctpDataChannelProviderInterfaceImpl.cpp + voip/tgcalls/TurnCustomizerImpl.cpp voip/tgcalls/reference/InstanceImplReference.cpp voip/tgcalls/legacy/InstanceImplLegacy.cpp voip/tgcalls/group/GroupNetworkManager.cpp diff --git a/TMessagesProj/jni/voip/tgcalls/CodecSelectHelper.cpp b/TMessagesProj/jni/voip/tgcalls/CodecSelectHelper.cpp index 7fe0f50d4..ebf30427f 100644 --- a/TMessagesProj/jni/voip/tgcalls/CodecSelectHelper.cpp +++ b/TMessagesProj/jni/voip/tgcalls/CodecSelectHelper.cpp @@ -45,7 +45,7 @@ int FormatPriority(const VideoFormat &format, const std::vector &pr } return result; }(); - + for (int i = 0; i < preferredCodecs.size(); i++) { for (const auto &name : kSupported) { if (absl::EqualsIgnoreCase(format.name, preferredCodecs[i]) && absl::EqualsIgnoreCase(format.name, name)) { @@ -114,12 +114,6 @@ std::vector::const_iterator FindEqualFormat( }); } -bool ContainsEqualFormat( - const std::vector &list, - const VideoFormat &format) { - return FindEqualFormat(list, format) != list.end(); -} - void AddDefaultFeedbackParams(cricket::VideoCodec *codec) { // Don't add any feedback params for RED and ULPFEC. if (codec->name == cricket::kRedCodecName || codec->name == cricket::kUlpfecCodecName) diff --git a/TMessagesProj/jni/voip/tgcalls/EncryptedConnection.cpp b/TMessagesProj/jni/voip/tgcalls/EncryptedConnection.cpp index d350299e4..61f561ca5 100644 --- a/TMessagesProj/jni/voip/tgcalls/EncryptedConnection.cpp +++ b/TMessagesProj/jni/voip/tgcalls/EncryptedConnection.cpp @@ -285,7 +285,6 @@ void EncryptedConnection::appendAdditionalMessages(rtc::CopyOnWriteBuffer &buffe } const auto now = rtc::TimeMillis(); - auto someWereNotAdded = false; for (auto &resending : _myNotYetAckedMessages) { const auto sent = resending.lastSent; const auto when = sent @@ -471,6 +470,7 @@ auto EncryptedConnection::processPacket( } const auto success = reader.ReadUInt32(¤tSeq); assert(success); + (void)success; currentCounter = CounterFromSeq(currentSeq); additionalMessage = true; diff --git a/TMessagesProj/jni/voip/tgcalls/Message.cpp b/TMessagesProj/jni/voip/tgcalls/Message.cpp index 56d9ead66..7ee4c5332 100644 --- a/TMessagesProj/jni/voip/tgcalls/Message.cpp +++ b/TMessagesProj/jni/voip/tgcalls/Message.cpp @@ -72,6 +72,7 @@ void Serialize(rtc::ByteBufferWriter &to, const cricket::Candidate &from) { std::string serialized; const auto success = iceCandidate.ToString(&serialized); assert(success); + (void)success; Serialize(to, serialized); } diff --git a/TMessagesProj/jni/voip/tgcalls/NetworkManager.cpp b/TMessagesProj/jni/voip/tgcalls/NetworkManager.cpp index 72f815664..f84fa54dc 100644 --- a/TMessagesProj/jni/voip/tgcalls/NetworkManager.cpp +++ b/TMessagesProj/jni/voip/tgcalls/NetworkManager.cpp @@ -12,6 +12,7 @@ #include "api/jsep_ice_candidate.h" #include "rtc_base/network_monitor_factory.h" +#include "TurnCustomizerImpl.h" #include "platform/PlatformInterface.h" extern "C" { @@ -61,24 +62,6 @@ private: std::string _value; }; -class TurnCustomizerImpl : public webrtc::TurnCustomizer { -public: - TurnCustomizerImpl() { - } - - virtual ~TurnCustomizerImpl() { - } - - void MaybeModifyOutgoingStunMessage(cricket::PortInterface* port, - cricket::StunMessage* message) override { - message->AddAttribute(std::make_unique(cricket::STUN_ATTR_SOFTWARE, "Telegram ")); - } - - bool AllowChannelData(cricket::PortInterface* port, const void *data, size_t size, bool payload) override { - return true; - } -}; - NetworkManager::NetworkManager( rtc::Thread *thread, EncryptionKey encryptionKey, diff --git a/TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.cpp b/TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.cpp new file mode 100644 index 000000000..27f7d063d --- /dev/null +++ b/TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.cpp @@ -0,0 +1,158 @@ +#include "SctpDataChannelProviderInterfaceImpl.h" + +#include "p2p/base/dtls_transport.h" + +namespace tgcalls { + +SctpDataChannelProviderInterfaceImpl::SctpDataChannelProviderInterfaceImpl( + cricket::DtlsTransport *transportChannel, + bool isOutgoing, + std::function onStateChanged, + std::function onTerminated, + std::function onMessageReceived, + std::shared_ptr threads +) : +_threads(std::move(threads)), +_onStateChanged(onStateChanged), +_onTerminated(onTerminated), +_onMessageReceived(onMessageReceived) { + assert(_threads->getNetworkThread()->IsCurrent()); + + _sctpTransportFactory.reset(new cricket::SctpTransportFactory(_threads->getNetworkThread())); + + _sctpTransport = _sctpTransportFactory->CreateSctpTransport(transportChannel); + _sctpTransport->SignalReadyToSendData.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpReadyToSendData); + _sctpTransport->SignalDataReceived.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpDataReceived); + _sctpTransport->SignalClosedAbruptly.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpClosedAbruptly); + + webrtc::InternalDataChannelInit dataChannelInit; + dataChannelInit.id = 0; + dataChannelInit.open_handshake_role = isOutgoing ? webrtc::InternalDataChannelInit::kOpener : webrtc::InternalDataChannelInit::kAcker; + _dataChannel = webrtc::SctpDataChannel::Create( + this, + "data", + dataChannelInit, + _threads->getNetworkThread(), + _threads->getNetworkThread() + ); + + _dataChannel->RegisterObserver(this); +} + + +SctpDataChannelProviderInterfaceImpl::~SctpDataChannelProviderInterfaceImpl() { + assert(_threads->getNetworkThread()->IsCurrent()); + + _dataChannel->UnregisterObserver(); + _dataChannel->Close(); + _dataChannel = nullptr; + + _sctpTransport = nullptr; + _sctpTransportFactory.reset(); +} + +void SctpDataChannelProviderInterfaceImpl::sendDataChannelMessage(std::string const &message) { + assert(_threads->getNetworkThread()->IsCurrent()); + + if (_isDataChannelOpen) { + RTC_LOG(LS_INFO) << "Outgoing DataChannel message: " << message; + + webrtc::DataBuffer buffer(message); + _dataChannel->Send(buffer); + } else { + RTC_LOG(LS_INFO) << "Could not send an outgoing DataChannel message: the channel is not open"; + } +} + +void SctpDataChannelProviderInterfaceImpl::OnStateChange() { + assert(_threads->getNetworkThread()->IsCurrent()); + + auto state = _dataChannel->state(); + bool isDataChannelOpen = state == webrtc::DataChannelInterface::DataState::kOpen; + if (_isDataChannelOpen != isDataChannelOpen) { + _isDataChannelOpen = isDataChannelOpen; + _onStateChanged(_isDataChannelOpen); + } +} + +void SctpDataChannelProviderInterfaceImpl::OnMessage(const webrtc::DataBuffer& buffer) { + assert(_threads->getNetworkThread()->IsCurrent()); + + if (!buffer.binary) { + std::string messageText(buffer.data.data(), buffer.data.data() + buffer.data.size()); + RTC_LOG(LS_INFO) << "Incoming DataChannel message: " << messageText; + + _onMessageReceived(messageText); + } +} + +void SctpDataChannelProviderInterfaceImpl::updateIsConnected(bool isConnected) { + assert(_threads->getNetworkThread()->IsCurrent()); + + if (isConnected) { + if (!_isSctpTransportStarted) { + _isSctpTransportStarted = true; + _sctpTransport->Start(5000, 5000, 262144); + } + } +} + +void SctpDataChannelProviderInterfaceImpl::sctpReadyToSendData() { + assert(_threads->getNetworkThread()->IsCurrent()); + + _dataChannel->OnTransportReady(true); +} + +void SctpDataChannelProviderInterfaceImpl::sctpClosedAbruptly() { + assert(_threads->getNetworkThread()->IsCurrent()); + + if (_onTerminated) { + _onTerminated(); + } +} + +void SctpDataChannelProviderInterfaceImpl::sctpDataReceived(const cricket::ReceiveDataParams& params, const rtc::CopyOnWriteBuffer& buffer) { + assert(_threads->getNetworkThread()->IsCurrent()); + + _dataChannel->OnDataReceived(params, buffer); +} + +bool SctpDataChannelProviderInterfaceImpl::SendData(int sid, const webrtc::SendDataParams& params, const rtc::CopyOnWriteBuffer& payload, cricket::SendDataResult* result) { + assert(_threads->getNetworkThread()->IsCurrent()); + + return _sctpTransport->SendData(sid, params, payload); +} + +bool SctpDataChannelProviderInterfaceImpl::ConnectDataChannel(webrtc::SctpDataChannel *data_channel) { + assert(_threads->getNetworkThread()->IsCurrent()); + + return true; +} + +void SctpDataChannelProviderInterfaceImpl::DisconnectDataChannel(webrtc::SctpDataChannel* data_channel) { + assert(_threads->getNetworkThread()->IsCurrent()); + + return; +} + +void SctpDataChannelProviderInterfaceImpl::AddSctpDataStream(int sid) { + assert(_threads->getNetworkThread()->IsCurrent()); + + _sctpTransport->OpenStream(sid); +} + +void SctpDataChannelProviderInterfaceImpl::RemoveSctpDataStream(int sid) { + assert(_threads->getNetworkThread()->IsCurrent()); + + _threads->getNetworkThread()->Invoke(RTC_FROM_HERE, [this, sid]() { + _sctpTransport->ResetStream(sid); + }); +} + +bool SctpDataChannelProviderInterfaceImpl::ReadyToSendData() const { + assert(_threads->getNetworkThread()->IsCurrent()); + + return _sctpTransport->ReadyToSendData(); +} + +} diff --git a/TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.h b/TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.h new file mode 100644 index 000000000..2ecaffc14 --- /dev/null +++ b/TMessagesProj/jni/voip/tgcalls/SctpDataChannelProviderInterfaceImpl.h @@ -0,0 +1,64 @@ +#ifndef TGCALLS_SCTP_DATA_CHANNEL_PROVIDER_IMPL_H +#define TGCALLS_SCTP_DATA_CHANNEL_PROVIDER_IMPL_H + +#include "media/sctp/sctp_transport_factory.h" +#include "api/turn_customizer.h" +#include "api/data_channel_interface.h" +#include "pc/sctp_data_channel.h" +#include "pc/sctp_transport.h" + +#include "StaticThreads.h" + +namespace cricket { +class DtlsTransport; +} // namespace cricket + +namespace tgcalls { + +class SctpDataChannelProviderInterfaceImpl : public sigslot::has_slots<>, public webrtc::SctpDataChannelProviderInterface, public webrtc::DataChannelObserver { +public: + SctpDataChannelProviderInterfaceImpl( + cricket::DtlsTransport *transportChannel, + bool isOutgoing, + std::function onStateChanged, + std::function onTerminated, + std::function onMessageReceived, + std::shared_ptr threads + ); + virtual ~SctpDataChannelProviderInterfaceImpl(); + + void updateIsConnected(bool isConnected); + void sendDataChannelMessage(std::string const &message); + + virtual void OnStateChange() override; + virtual void OnMessage(const webrtc::DataBuffer& buffer) override; + virtual bool SendData(int sid, const webrtc::SendDataParams& params, const rtc::CopyOnWriteBuffer& payload, cricket::SendDataResult* result = nullptr) override; + virtual bool ConnectDataChannel(webrtc::SctpDataChannel *data_channel) override; + virtual void DisconnectDataChannel(webrtc::SctpDataChannel* data_channel) override; + virtual void AddSctpDataStream(int sid) override; + virtual void RemoveSctpDataStream(int sid) override; + virtual bool ReadyToSendData() const override; + +private: + void sctpReadyToSendData(); + void sctpClosedAbruptly(); + void sctpDataReceived(const cricket::ReceiveDataParams& params, const rtc::CopyOnWriteBuffer& buffer); + +private: + std::shared_ptr _threads; + std::function _onStateChanged; + std::function _onTerminated; + std::function _onMessageReceived; + + std::unique_ptr _sctpTransportFactory; + std::unique_ptr _sctpTransport; + rtc::scoped_refptr _dataChannel; + + bool _isSctpTransportStarted = false; + bool _isDataChannelOpen = false; + +}; + +} // namespace tgcalls + +#endif diff --git a/TMessagesProj/jni/voip/tgcalls/StaticThreads.cpp b/TMessagesProj/jni/voip/tgcalls/StaticThreads.cpp index 4a88625d7..1d14b6fad 100644 --- a/TMessagesProj/jni/voip/tgcalls/StaticThreads.cpp +++ b/TMessagesProj/jni/voip/tgcalls/StaticThreads.cpp @@ -64,7 +64,6 @@ public: network_->DisallowAllInvokes(); media_ = create("tgc-media" + suffix); worker_ = create("tgc-work" + suffix); - process_ = create("tgc-process" + suffix); worker_->DisallowAllInvokes(); worker_->AllowInvokesToThread(network_.get()); } @@ -78,9 +77,6 @@ public: rtc::Thread *getWorkerThread() override { return worker_.get(); } - rtc::Thread *getProcessThread() override { - return process_.get(); - } rtc::scoped_refptr getSharedModuleThread() override { // This function must be called from a single thread because of SharedModuleThread implementation // So we don't care about making it thread safe @@ -96,7 +92,6 @@ private: Thread network_; Thread media_; Thread worker_; - Thread process_; rtc::scoped_refptr shared_module_thread_; static Thread create(const std::string &name) { @@ -146,10 +141,6 @@ rtc::Thread *getWorkerThread() { return getThreads()->getWorkerThread(); } -rtc::Thread *getProcessThread() { - return getThreads()->getProcessThread(); -} - std::shared_ptr &getThreads() { static std::shared_ptr threads = std::make_shared(0); return threads; diff --git a/TMessagesProj/jni/voip/tgcalls/StaticThreads.h b/TMessagesProj/jni/voip/tgcalls/StaticThreads.h index 08c8a9814..eb1c0358b 100644 --- a/TMessagesProj/jni/voip/tgcalls/StaticThreads.h +++ b/TMessagesProj/jni/voip/tgcalls/StaticThreads.h @@ -20,7 +20,6 @@ public: virtual rtc::Thread *getNetworkThread() = 0; virtual rtc::Thread *getMediaThread() = 0; virtual rtc::Thread *getWorkerThread() = 0; - virtual rtc::Thread *getProcessThread() = 0; virtual rtc::scoped_refptr getSharedModuleThread() = 0; // it is not possible to decrease pool size @@ -32,7 +31,6 @@ namespace StaticThreads { rtc::Thread *getNetworkThread(); rtc::Thread *getMediaThread(); rtc::Thread *getWorkerThread(); -rtc::Thread *getProcessThread(); rtc::scoped_refptr getSharedMoudleThread(); std::shared_ptr &getThreads(); } diff --git a/TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.cpp b/TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.cpp new file mode 100644 index 000000000..bab743c0b --- /dev/null +++ b/TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.cpp @@ -0,0 +1,21 @@ +#include "TurnCustomizerImpl.h" + +#include "api/transport/stun.h" + +namespace tgcalls { + +TurnCustomizerImpl::TurnCustomizerImpl() { +} + +TurnCustomizerImpl::~TurnCustomizerImpl() { +} + +void TurnCustomizerImpl::MaybeModifyOutgoingStunMessage(cricket::PortInterface* port, cricket::StunMessage* message) { + message->AddAttribute(std::make_unique(cricket::STUN_ATTR_SOFTWARE, "Telegram ")); +} + +bool TurnCustomizerImpl::AllowChannelData(cricket::PortInterface* port, const void *data, size_t size, bool payload) { + return true; +} + +} diff --git a/TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.h b/TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.h new file mode 100644 index 000000000..6029f4815 --- /dev/null +++ b/TMessagesProj/jni/voip/tgcalls/TurnCustomizerImpl.h @@ -0,0 +1,19 @@ +#ifndef TGCALLS_TURN_CUSTOMIZER_H +#define TGCALLS_TURN_CUSTOMIZER_H + +#include "api/turn_customizer.h" + +namespace tgcalls { + +class TurnCustomizerImpl : public webrtc::TurnCustomizer { +public: + TurnCustomizerImpl(); + virtual ~TurnCustomizerImpl(); + + void MaybeModifyOutgoingStunMessage(cricket::PortInterface* port, cricket::StunMessage* message) override; + bool AllowChannelData(cricket::PortInterface* port, const void *data, size_t size, bool payload) override; +}; + +} // namespace tgcalls + +#endif diff --git a/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceCustomImpl.cpp b/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceCustomImpl.cpp index 1d9166e19..0cf852abd 100644 --- a/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceCustomImpl.cpp +++ b/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceCustomImpl.cpp @@ -520,11 +520,14 @@ class AudioSinkImpl: public webrtc::AudioSinkInterface { public: struct Update { float level = 0.0f; - std::shared_ptr buffer; - std::shared_ptr vad; + bool hasSpeech = false; - Update(float level_, webrtc::AudioBuffer *buffer_, std::shared_ptr vad_) : - level(level_), buffer(std::shared_ptr(buffer_)), vad(vad_) { + Update(float level_, bool hasSpech_) : + level(level_), hasSpeech(hasSpech_) { + } + + Update(const Update &other) : + level(other.level), hasSpeech(other.hasSpeech) { } }; @@ -550,7 +553,7 @@ public: frame.ntp_time_ms = 0; _onAudioFrame(_channel_id.actualSsrc, frame); } - if (_update && audio.channels == 1) { + if (_update && audio.channels == 1) { const int16_t *samples = (const int16_t *)audio.data; int numberOfSamplesInFrame = (int)audio.samples_per_channel; @@ -573,17 +576,7 @@ public: float level = ((float)(_peak)) / 8000.0f; _peak = 0; _peakCount = 0; - - webrtc::AudioBuffer *buffer; - if (_vad->incWaitingFrames()) { - buffer = new webrtc::AudioBuffer(audio.sample_rate, 1, 48000, 1, 48000, 1); - webrtc::StreamConfig config(audio.sample_rate, 1); - buffer->CopyFrom(samples, config); - } else { - buffer = nullptr; - } - - _update(Update(level, buffer, _vad)); + _update(Update(level, level >= 1.0f)); } } } @@ -2929,12 +2922,6 @@ public: } void setIsMuted(bool isMuted) { - if (_videoContentType == VideoContentType::Screencast) { - if (isMuted) { - return; - } - } - if (_isMuted == isMuted) { return; } @@ -3011,23 +2998,23 @@ public: const auto weak = std::weak_ptr(shared_from_this()); std::function onAudioSinkUpdate; - /*if (_audioLevelsUpdated) { - onAudioSinkUpdate = [weak, ssrc = ssrc, threads = _threads](AudioSinkImpl::Update update) { - threads->getProcessThread()->PostTask(RTC_FROM_HERE, [weak, ssrc, update, threads]() { - bool voice = update.vad->update(update.buffer.get()); - threads->getMediaThread()->PostTask(RTC_FROM_HERE, [weak, ssrc, update, voice]() { - auto strong = weak.lock(); - if (!strong) { - return; - } - GroupLevelValue mappedUpdate; - mappedUpdate.level = update.level; - mappedUpdate.voice = voice; - strong->_audioLevels[ssrc] = mappedUpdate; - }); - }); - }; - }*/ + if (ssrc.actualSsrc != ssrc.networkSsrc) { + if (_audioLevelsUpdated) { + onAudioSinkUpdate = [weak, ssrc = ssrc, threads = _threads](AudioSinkImpl::Update update) { + threads->getMediaThread()->PostTask(RTC_FROM_HERE, [weak, ssrc, update]() { + auto strong = weak.lock(); + if (!strong) { + return; + } + InternalGroupLevelValue updated; + updated.value.level = update.level; + updated.value.voice = update.hasSpeech; + updated.timestamp = rtc::TimeMillis(); + strong->_audioLevels.insert(std::make_pair(ChannelId(ssrc), std::move(updated))); + }); + }; + } + } std::unique_ptr channel(new IncomingAudioChannel( _channelManager.get(), diff --git a/TMessagesProj/jni/voip/tgcalls/group/GroupNetworkManager.cpp b/TMessagesProj/jni/voip/tgcalls/group/GroupNetworkManager.cpp index 167046858..183a4d926 100644 --- a/TMessagesProj/jni/voip/tgcalls/group/GroupNetworkManager.cpp +++ b/TMessagesProj/jni/voip/tgcalls/group/GroupNetworkManager.cpp @@ -17,194 +17,12 @@ #include "modules/rtp_rtcp/source/rtp_utility.h" #include "modules/rtp_rtcp/source/byte_io.h" #include "platform/PlatformInterface.h" - +#include "TurnCustomizerImpl.h" +#include "SctpDataChannelProviderInterfaceImpl.h" #include "StaticThreads.h" namespace tgcalls { -class TurnCustomizerImpl : public webrtc::TurnCustomizer { -public: - TurnCustomizerImpl() { - } - - virtual ~TurnCustomizerImpl() { - } - - void MaybeModifyOutgoingStunMessage(cricket::PortInterface* port, - cricket::StunMessage* message) override { - message->AddAttribute(std::make_unique(cricket::STUN_ATTR_SOFTWARE, "Telegram ")); - } - - bool AllowChannelData(cricket::PortInterface* port, const void *data, size_t size, bool payload) override { - return true; - } -}; - -class SctpDataChannelProviderInterfaceImpl : public sigslot::has_slots<>, public webrtc::SctpDataChannelProviderInterface, public webrtc::DataChannelObserver { -public: - SctpDataChannelProviderInterfaceImpl( - cricket::DtlsTransport *transportChannel, - std::function onStateChanged, - std::function onTerminated, - std::function onMessageReceived, - std::shared_ptr threads - ) : - _threads(std::move(threads)), - _onStateChanged(onStateChanged), - _onTerminated(onTerminated), - _onMessageReceived(onMessageReceived) { - assert(_threads->getNetworkThread()->IsCurrent()); - - _sctpTransportFactory.reset(new cricket::SctpTransportFactory(_threads->getNetworkThread())); - - _sctpTransport = _sctpTransportFactory->CreateSctpTransport(transportChannel); - _sctpTransport->SignalReadyToSendData.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpReadyToSendData); - _sctpTransport->SignalDataReceived.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpDataReceived); - _sctpTransport->SignalClosedAbruptly.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpClosedAbruptly); - - webrtc::InternalDataChannelInit dataChannelInit; - dataChannelInit.id = 0; - _dataChannel = webrtc::SctpDataChannel::Create( - this, - "data", - dataChannelInit, - _threads->getNetworkThread(), - _threads->getNetworkThread() - ); - - _dataChannel->RegisterObserver(this); - } - - virtual ~SctpDataChannelProviderInterfaceImpl() { - assert(_threads->getNetworkThread()->IsCurrent()); - - _dataChannel->UnregisterObserver(); - _dataChannel->Close(); - _dataChannel = nullptr; - - _sctpTransport = nullptr; - _sctpTransportFactory.reset(); - } - - void sendDataChannelMessage(std::string const &message) { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (_isDataChannelOpen) { - RTC_LOG(LS_INFO) << "Outgoing DataChannel message: " << message; - - webrtc::DataBuffer buffer(message); - _dataChannel->Send(buffer); - } else { - RTC_LOG(LS_INFO) << "Could not send an outgoing DataChannel message: the channel is not open"; - } - } - - virtual void OnStateChange() override { - assert(_threads->getNetworkThread()->IsCurrent()); - - auto state = _dataChannel->state(); - bool isDataChannelOpen = state == webrtc::DataChannelInterface::DataState::kOpen; - if (_isDataChannelOpen != isDataChannelOpen) { - _isDataChannelOpen = isDataChannelOpen; - _onStateChanged(_isDataChannelOpen); - } - } - - virtual void OnMessage(const webrtc::DataBuffer& buffer) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (!buffer.binary) { - std::string messageText(buffer.data.data(), buffer.data.data() + buffer.data.size()); - RTC_LOG(LS_INFO) << "Incoming DataChannel message: " << messageText; - - _onMessageReceived(messageText); - } - } - - void updateIsConnected(bool isConnected) { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (isConnected) { - if (!_isSctpTransportStarted) { - _isSctpTransportStarted = true; - _sctpTransport->Start(5000, 5000, 262144); - } - } - } - - void sctpReadyToSendData() { - assert(_threads->getNetworkThread()->IsCurrent()); - - _dataChannel->OnTransportReady(true); - } - - void sctpClosedAbruptly() { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (_onTerminated) { - _onTerminated(); - } - } - - void sctpDataReceived(const cricket::ReceiveDataParams& params, const rtc::CopyOnWriteBuffer& buffer) { - assert(_threads->getNetworkThread()->IsCurrent()); - - _dataChannel->OnDataReceived(params, buffer); - } - - virtual bool SendData(int sid, const webrtc::SendDataParams& params, const rtc::CopyOnWriteBuffer& payload, cricket::SendDataResult* result) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return _sctpTransport->SendData(sid, params, payload); - } - - virtual bool ConnectDataChannel(webrtc::SctpDataChannel *data_channel) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return true; - } - - virtual void DisconnectDataChannel(webrtc::SctpDataChannel* data_channel) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return; - } - - virtual void AddSctpDataStream(int sid) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - _sctpTransport->OpenStream(sid); - } - - virtual void RemoveSctpDataStream(int sid) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - _threads->getNetworkThread()->Invoke(RTC_FROM_HERE, [this, sid]() { - _sctpTransport->ResetStream(sid); - }); - } - - virtual bool ReadyToSendData() const override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return _sctpTransport->ReadyToSendData(); - } - -private: - std::shared_ptr _threads; - std::function _onStateChanged; - std::function _onTerminated; - std::function _onMessageReceived; - - std::unique_ptr _sctpTransportFactory; - std::unique_ptr _sctpTransport; - rtc::scoped_refptr _dataChannel; - - bool _isSctpTransportStarted = false; - bool _isDataChannelOpen = false; - -}; - enum { kRtcpExpectedVersion = 2, kRtcpMinHeaderLength = 4, @@ -589,6 +407,7 @@ void GroupNetworkManager::restartDataChannel() { const auto weak = std::weak_ptr(shared_from_this()); _dataChannelInterface.reset(new SctpDataChannelProviderInterfaceImpl( _dtlsTransport.get(), + true, [weak, threads = _threads](bool state) { assert(threads->getNetworkThread()->IsCurrent()); const auto strong = weak.lock(); diff --git a/TMessagesProj/jni/voip/tgcalls/v2/NativeNetworkingImpl.cpp b/TMessagesProj/jni/voip/tgcalls/v2/NativeNetworkingImpl.cpp index fdd43b676..c9024c932 100644 --- a/TMessagesProj/jni/voip/tgcalls/v2/NativeNetworkingImpl.cpp +++ b/TMessagesProj/jni/voip/tgcalls/v2/NativeNetworkingImpl.cpp @@ -13,184 +13,12 @@ #include "p2p/base/dtls_transport_factory.h" #include "pc/dtls_srtp_transport.h" #include "pc/dtls_transport.h" - +#include "TurnCustomizerImpl.h" +#include "SctpDataChannelProviderInterfaceImpl.h" #include "StaticThreads.h" namespace tgcalls { -class TurnCustomizerImpl : public webrtc::TurnCustomizer { -public: - TurnCustomizerImpl() { - } - - virtual ~TurnCustomizerImpl() { - } - - void MaybeModifyOutgoingStunMessage(cricket::PortInterface* port, - cricket::StunMessage* message) override { - message->AddAttribute(std::make_unique(cricket::STUN_ATTR_SOFTWARE, "Telegram ")); - } - - bool AllowChannelData(cricket::PortInterface* port, const void *data, size_t size, bool payload) override { - return true; - } -}; - -class SctpDataChannelProviderInterfaceImpl : public sigslot::has_slots<>, public webrtc::SctpDataChannelProviderInterface, public webrtc::DataChannelObserver { -public: - SctpDataChannelProviderInterfaceImpl( - cricket::DtlsTransport *transportChannel, - bool isOutgoing, - std::function onStateChanged, - std::function onMessageReceived, - std::shared_ptr threads - ) : - _threads(std::move(threads)), - _onStateChanged(onStateChanged), - _onMessageReceived(onMessageReceived) { - assert(_threads->getNetworkThread()->IsCurrent()); - - _sctpTransportFactory.reset(new cricket::SctpTransportFactory(_threads->getNetworkThread())); - - _sctpTransport = _sctpTransportFactory->CreateSctpTransport(transportChannel); - _sctpTransport->SignalReadyToSendData.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpReadyToSendData); - _sctpTransport->SignalDataReceived.connect(this, &SctpDataChannelProviderInterfaceImpl::sctpDataReceived); - - webrtc::InternalDataChannelInit dataChannelInit; - dataChannelInit.id = 0; - dataChannelInit.open_handshake_role = isOutgoing ? webrtc::InternalDataChannelInit::kOpener : webrtc::InternalDataChannelInit::kAcker; - _dataChannel = webrtc::SctpDataChannel::Create( - this, - "data", - dataChannelInit, - _threads->getNetworkThread(), - _threads->getNetworkThread() - ); - - _dataChannel->RegisterObserver(this); - } - - virtual ~SctpDataChannelProviderInterfaceImpl() { - assert(_threads->getNetworkThread()->IsCurrent()); - - _dataChannel->UnregisterObserver(); - _dataChannel->Close(); - _dataChannel = nullptr; - - _sctpTransport = nullptr; - _sctpTransportFactory.reset(); - } - - void sendDataChannelMessage(std::string const &message) { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (_isDataChannelOpen) { - RTC_LOG(LS_INFO) << "Outgoing DataChannel message: " << message; - - webrtc::DataBuffer buffer(message); - _dataChannel->Send(buffer); - } else { - RTC_LOG(LS_INFO) << "Could not send an outgoing DataChannel message: the channel is not open"; - } - } - - virtual void OnStateChange() override { - assert(_threads->getNetworkThread()->IsCurrent()); - - auto state = _dataChannel->state(); - bool isDataChannelOpen = state == webrtc::DataChannelInterface::DataState::kOpen; - if (_isDataChannelOpen != isDataChannelOpen) { - _isDataChannelOpen = isDataChannelOpen; - _onStateChanged(_isDataChannelOpen); - } - } - - virtual void OnMessage(const webrtc::DataBuffer& buffer) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (!buffer.binary) { - std::string messageText(buffer.data.data(), buffer.data.data() + buffer.data.size()); - RTC_LOG(LS_INFO) << "Incoming DataChannel message: " << messageText; - - _onMessageReceived(messageText); - } - } - - void updateIsConnected(bool isConnected) { - assert(_threads->getNetworkThread()->IsCurrent()); - - if (isConnected) { - if (!_isSctpTransportStarted) { - _isSctpTransportStarted = true; - _sctpTransport->Start(5000, 5000, 262144); - } - } - } - - void sctpReadyToSendData() { - assert(_threads->getNetworkThread()->IsCurrent()); - - _dataChannel->OnTransportReady(true); - } - - void sctpDataReceived(const cricket::ReceiveDataParams& params, const rtc::CopyOnWriteBuffer& buffer) { - assert(_threads->getNetworkThread()->IsCurrent()); - - _dataChannel->OnDataReceived(params, buffer); - } - - virtual bool SendData(const cricket::SendDataParams& params, const rtc::CopyOnWriteBuffer& payload, cricket::SendDataResult* result) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return _sctpTransport->SendData(params, payload); - } - - virtual bool ConnectDataChannel(webrtc::SctpDataChannel *data_channel) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return true; - } - - virtual void DisconnectDataChannel(webrtc::SctpDataChannel* data_channel) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return; - } - - virtual void AddSctpDataStream(int sid) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - _sctpTransport->OpenStream(sid); - } - - virtual void RemoveSctpDataStream(int sid) override { - assert(_threads->getNetworkThread()->IsCurrent()); - - _threads->getNetworkThread()->Invoke(RTC_FROM_HERE, [this, sid]() { - _sctpTransport->ResetStream(sid); - }); - } - - virtual bool ReadyToSendData() const override { - assert(_threads->getNetworkThread()->IsCurrent()); - - return _sctpTransport->ReadyToSendData(); - } - -private: - std::shared_ptr _threads; - std::function _onStateChanged; - std::function _onMessageReceived; - - std::unique_ptr _sctpTransportFactory; - std::unique_ptr _sctpTransport; - rtc::scoped_refptr _dataChannel; - - bool _isSctpTransportStarted = false; - bool _isDataChannelOpen = false; - -}; - webrtc::CryptoOptions NativeNetworkingImpl::getDefaulCryptoOptions() { auto options = webrtc::CryptoOptions(); options.srtp.enable_aes128_sha1_80_crypto_cipher = true; @@ -355,6 +183,14 @@ void NativeNetworkingImpl::start() { } strong->_dataChannelStateUpdated(state); }, + [weak, threads = _threads]() { + assert(threads->getNetworkThread()->IsCurrent()); + const auto strong = weak.lock(); + if (!strong) { + return; + } + //strong->restartDataChannel(); + }, [weak, threads = _threads](std::string const &message) { assert(threads->getNetworkThread()->IsCurrent()); const auto strong = weak.lock(); diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index d4f5bd6d7..cac5f8905 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -423,7 +423,7 @@ android:name=".voip.CallNotificationSoundProvider" android:exported="true"/> - + @@ -435,7 +435,7 @@ android:permission="android.permission.BIND_REMOTEVIEWS" android:exported="false" /> - + diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index 8dad1b50a..0df9a4636 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -1747,6 +1747,9 @@ public class AndroidUtilities { } public static void runOnUIThread(Runnable runnable, long delay) { + if (ApplicationLoader.applicationHandler == null) { + return; + } if (delay == 0) { ApplicationLoader.applicationHandler.post(runnable); } else { @@ -1755,6 +1758,9 @@ public class AndroidUtilities { } public static void cancelRunOnUIThread(Runnable runnable) { + if (ApplicationLoader.applicationHandler == null) { + return; + } ApplicationLoader.applicationHandler.removeCallbacks(runnable); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 4fc163d1e..ad534f8c1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -15,12 +15,12 @@ public class BuildVars { public static boolean DEBUG_VERSION = false; public static boolean DEBUG_PRIVATE_VERSION = false; - public static boolean LOGS_ENABLED = true; + public static boolean LOGS_ENABLED = false; public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; public static boolean NO_SCOPED_STORAGE = true/* || Build.VERSION.SDK_INT <= 28*/; - public static int BUILD_VERSION = 2372; - public static String BUILD_VERSION_STRING = "7.8.0"; + public static int BUILD_VERSION = 2376; + public static String BUILD_VERSION_STRING = "7.8.2"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; public static String APPCENTER_HASH = "a5b5c4f5-51da-dedc-9918-d9766a22ca7c"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetProvider.java index 55a16aa58..a9f50cbc8 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetProvider.java @@ -28,13 +28,13 @@ public class ChatsWidgetProvider extends AppWidgetProvider { super.onUpdate(context, appWidgetManager, appWidgetIds); for (int i = 0; i < appWidgetIds.length; i++) { int appWidgetId = appWidgetIds[i]; - updateWidget(context, appWidgetManager, appWidgetId, false); + updateWidget(context, appWidgetManager, appWidgetId); } } @Override public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { - updateWidget(context, appWidgetManager, appWidgetId, true); + updateWidget(context, appWidgetManager, appWidgetId); super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } @@ -65,7 +65,7 @@ public class ChatsWidgetProvider extends AppWidgetProvider { return n - 1; } - public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean edit) { + public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { ApplicationLoader.postInitApplication(); Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT); @@ -80,6 +80,11 @@ public class ChatsWidgetProvider extends AppWidgetProvider { int id; if (!deleted) { int accountId = preferences.getInt("account" + appWidgetId, -1); + if (accountId == -1) { + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("account" + appWidgetId, UserConfig.selectedAccount); + editor.putInt("type" + appWidgetId, EditWidgetActivity.TYPE_CHATS).commit(); + } ArrayList selectedDialogs = new ArrayList<>(); if (accountId >= 0) { AccountInstance.getInstance(accountId).getMessagesStorage().getWidgetDialogIds(appWidgetId, EditWidgetActivity.TYPE_CHATS, selectedDialogs, null, null, false); @@ -109,8 +114,6 @@ public class ChatsWidgetProvider extends AppWidgetProvider { rv.setPendingIntentTemplate(R.id.list_view, contentIntent); appWidgetManager.updateAppWidget(appWidgetId, rv); - if (edit) { - appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); - } + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java b/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java index bf9e66af3..f6615abea 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java @@ -327,9 +327,11 @@ class ChatsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { rv.setTextViewText(R.id.shortcut_widget_item_badge, String.format("%d", dialog.unread_count)); rv.setViewVisibility(R.id.shortcut_widget_item_badge, View.VISIBLE); if (accountInstance.getMessagesController().isDialogMuted(dialog.id)) { - rv.setInt(R.id.shortcut_widget_item_badge, "setBackgroundResource", R.drawable.widget_counter_muted); + rv.setBoolean(R.id.shortcut_widget_item_badge, "setEnabled", false); + rv.setInt(R.id.shortcut_widget_item_badge, "setBackgroundResource", R.drawable.widget_badge_muted_background); } else { - rv.setInt(R.id.shortcut_widget_item_badge, "setBackgroundResource", R.drawable.widget_counter); + rv.setBoolean(R.id.shortcut_widget_item_badge, "setEnabled", true); + rv.setInt(R.id.shortcut_widget_item_badge, "setBackgroundResource", R.drawable.widget_badge_background); } } else { rv.setViewVisibility(R.id.shortcut_widget_item_badge, View.GONE); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetProvider.java index d64cd3ec9..2a6c1eb22 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetProvider.java @@ -28,7 +28,7 @@ public class ContactsWidgetProvider extends AppWidgetProvider { super.onUpdate(context, appWidgetManager, appWidgetIds); for (int i = 0; i < appWidgetIds.length; i++) { int appWidgetId = appWidgetIds[i]; - updateWidget(context, appWidgetManager, appWidgetId, false); + updateWidget(context, appWidgetManager, appWidgetId); } } @@ -53,7 +53,7 @@ public class ContactsWidgetProvider extends AppWidgetProvider { @Override public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { - updateWidget(context, appWidgetManager, appWidgetId, true); + updateWidget(context, appWidgetManager, appWidgetId); super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } @@ -65,7 +65,7 @@ public class ContactsWidgetProvider extends AppWidgetProvider { return n - 1; } - public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean edit) { + public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { ApplicationLoader.postInitApplication(); Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); int maxHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT); @@ -80,6 +80,11 @@ public class ContactsWidgetProvider extends AppWidgetProvider { int id; if (!deleted) { int accountId = preferences.getInt("account" + appWidgetId, -1); + if (accountId == -1) { + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("account" + appWidgetId, UserConfig.selectedAccount); + editor.putInt("type" + appWidgetId, EditWidgetActivity.TYPE_CHATS).commit(); + } ArrayList selectedDialogs = new ArrayList<>(); if (accountId >= 0) { AccountInstance.getInstance(accountId).getMessagesStorage().getWidgetDialogIds(appWidgetId, EditWidgetActivity.TYPE_CONTACTS, selectedDialogs, null, null, false); @@ -111,8 +116,6 @@ public class ContactsWidgetProvider extends AppWidgetProvider { rv.setPendingIntentTemplate(R.id.list_view, contentIntent); appWidgetManager.updateAppWidget(appWidgetId, rv); - if (edit) { - appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); - } + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 7919674b5..fb5e143ca 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -899,7 +899,7 @@ public class MessageObject { } public MessageObject(int accountNum, TLRPC.Message message, MessageObject replyToMessage, AbstractMap users, AbstractMap chats, SparseArray sUsers, SparseArray sChats, boolean generateLayout, boolean checkMediaExists, long eid) { - Theme.createCommonChatResources(null); + Theme.createCommonChatResources(); currentAccount = accountNum; messageOwner = message; @@ -2363,7 +2363,7 @@ public class MessageObject { } wantedBotKeyboardWidth = 0; if (messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup || messageOwner.reactions != null && !messageOwner.reactions.results.isEmpty()) { - Theme.createCommonChatResources(null); + Theme.createCommonChatResources(); if (botButtonsLayout == null) { botButtonsLayout = new StringBuilder(); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 65b648d7f..33806ba4b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -2474,12 +2474,12 @@ public class MessagesController extends BaseController implements NotificationCe } if (chatsWidgets != null) { for (int a = 0, N = chatsWidgets.size(); a < N; a++) { - ChatsWidgetProvider.updateWidget(ApplicationLoader.applicationContext, appWidgetManager, chatsWidgets.get(a), true); + ChatsWidgetProvider.updateWidget(ApplicationLoader.applicationContext, appWidgetManager, chatsWidgets.get(a)); } } if (contactsWidgets != null) { for (int a = 0, N = contactsWidgets.size(); a < N; a++) { - ContactsWidgetProvider.updateWidget(ApplicationLoader.applicationContext, appWidgetManager, contactsWidgets.get(a), true); + ContactsWidgetProvider.updateWidget(ApplicationLoader.applicationContext, appWidgetManager, contactsWidgets.get(a)); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index cc6f0b10d..4015d4bcb 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -47,6 +47,7 @@ import androidx.core.app.NotificationManagerCompat; import androidx.core.app.Person; import androidx.core.app.RemoteInput; import androidx.core.content.FileProvider; +import androidx.core.content.LocusIdCompat; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; import androidx.core.graphics.drawable.IconCompat; @@ -2749,11 +2750,22 @@ public class NotificationsController extends BaseController { } try { String id = "ndid_" + did; + + Intent shortcutIntent = new Intent(ApplicationLoader.applicationContext, OpenChatReceiver.class); + shortcutIntent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE); + if (did > 0) { + shortcutIntent.putExtra("userId", did); + } else { + shortcutIntent.putExtra("chatId", -did); + } + ShortcutInfoCompat.Builder shortcutBuilder = new ShortcutInfoCompat.Builder(ApplicationLoader.applicationContext, id) .setShortLabel(chat != null ? name : UserObject.getFirstName(user)) .setLongLabel(name) .setIntent(new Intent(Intent.ACTION_DEFAULT)) - .setLongLived(true); + .setIntent(shortcutIntent) + .setLongLived(true) + .setLocusId(new LocusIdCompat(id)); Bitmap avatar = null; if (person != null) { @@ -2763,11 +2775,9 @@ public class NotificationsController extends BaseController { avatar = person.getIcon().getBitmap(); } } - ArrayList arrayList = new ArrayList<>(1); - arrayList.add(shortcutBuilder.build()); - ShortcutManagerCompat.addDynamicShortcuts(ApplicationLoader.applicationContext, arrayList); - builder.setShortcutId(id); - NotificationCompat.BubbleMetadata.Builder bubbleBuilder = new NotificationCompat.BubbleMetadata.Builder(); + ShortcutInfoCompat shortcut = shortcutBuilder.build(); + ShortcutManagerCompat.pushDynamicShortcut(ApplicationLoader.applicationContext, shortcut); + builder.setShortcutInfo(shortcut); Intent intent = new Intent(ApplicationLoader.applicationContext, BubbleActivity.class); intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE); if (did > 0) { @@ -2776,19 +2786,21 @@ public class NotificationsController extends BaseController { intent.putExtra("chatId", -did); } intent.putExtra("currentAccount", currentAccount); - bubbleBuilder.setIntent(PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); + IconCompat icon; + if (avatar != null) { + icon = IconCompat.createWithAdaptiveBitmap(avatar); + } else if (user != null) { + icon = IconCompat.createWithResource(ApplicationLoader.applicationContext, user.bot ? R.drawable.book_bot : R.drawable.book_user); + } else { + icon = IconCompat.createWithResource(ApplicationLoader.applicationContext, R.drawable.book_group); + } + NotificationCompat.BubbleMetadata.Builder bubbleBuilder = + new NotificationCompat.BubbleMetadata.Builder( + PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT), + icon); bubbleBuilder.setSuppressNotification(opened_dialog_id == did); bubbleBuilder.setAutoExpandBubble(false); bubbleBuilder.setDesiredHeight(AndroidUtilities.dp(640)); - if (avatar != null) { - bubbleBuilder.setIcon(IconCompat.createWithAdaptiveBitmap(avatar)); - } else { - if (user != null) { - bubbleBuilder.setIcon(IconCompat.createWithResource(ApplicationLoader.applicationContext, user.bot ? R.drawable.book_bot : R.drawable.book_user)); - } else { - bubbleBuilder.setIcon(IconCompat.createWithResource(ApplicationLoader.applicationContext, R.drawable.book_group)); - } - } builder.setBubbleMetadata(bubbleBuilder.build()); return id; } catch (Exception e) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java index 27acfe327..1d4cf65b9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java @@ -284,15 +284,22 @@ public class SharedConfig { } if (pendingAppUpdate != null) { long updateTime = 0; - int updateVerstion; + int updateVersion = 0; + String updateVersionString = null; try { PackageInfo packageInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0); - updateVerstion = packageInfo.versionCode; + updateVersion = packageInfo.versionCode; + updateVersionString = packageInfo.versionName; } catch (Exception e) { FileLog.e(e); - updateVerstion = BuildVars.BUILD_VERSION; } - if (pendingAppUpdateBuildVersion != updateVerstion) { + if (updateVersion == 0) { + updateVersion = BuildVars.BUILD_VERSION; + } + if (updateVersionString == null) { + updateVersionString = BuildVars.BUILD_VERSION_STRING; + } + if (pendingAppUpdateBuildVersion != updateVersion || pendingAppUpdate.version == null || updateVersionString.compareTo(pendingAppUpdate.version) >= 0) { pendingAppUpdate = null; AndroidUtilities.runOnUIThread(SharedConfig::saveConfig); } @@ -428,16 +435,29 @@ public class SharedConfig { return pendingAppUpdateBuildVersion == currentVersion; } - public static void setNewAppVersionAvailable(TLRPC.TL_help_appUpdate update) { - pendingAppUpdate = update; + public static boolean setNewAppVersionAvailable(TLRPC.TL_help_appUpdate update) { + String updateVersionString = null; + int versionCode = 0; try { PackageInfo packageInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0); - pendingAppUpdateBuildVersion = packageInfo.versionCode; + versionCode = packageInfo.versionCode; + updateVersionString = packageInfo.versionName; } catch (Exception e) { FileLog.e(e); - pendingAppUpdateBuildVersion = BuildVars.BUILD_VERSION; } + if (versionCode == 0) { + versionCode = BuildVars.BUILD_VERSION; + } + if (updateVersionString == null) { + updateVersionString = BuildVars.BUILD_VERSION_STRING; + } + if (update.version == null || updateVersionString.compareTo(update.version) >= 0) { + return false; + } + pendingAppUpdate = update; + pendingAppUpdateBuildVersion = versionCode; saveConfig(); + return true; } public static boolean checkPasscode(String passcode) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index cdb7c258e..e3cc31a17 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -65,16 +65,6 @@ public class UserConfig extends BaseController { public volatile byte[] savedSaltedPassword; public volatile long savedPasswordTime; - public String tonEncryptedData; - public String tonPublicKey; - public int tonPasscodeType = -1; - public byte[] tonPasscodeSalt; - public long tonPasscodeRetryInMs; - public long tonLastUptimeMillis; - public int tonBadPasscodeTries; - public String tonKeyName; - public boolean tonCreationFinished; - private static volatile UserConfig[] Instance = new UserConfig[UserConfig.MAX_ACCOUNT_COUNT]; public static UserConfig getInstance(int num) { UserConfig localInstance = Instance[num]; @@ -146,21 +136,6 @@ public class UserConfig extends BaseController { editor.putInt("sharingMyLocationUntil", sharingMyLocationUntil); editor.putInt("lastMyLocationShareTime", lastMyLocationShareTime); editor.putBoolean("filtersLoaded", filtersLoaded); - if (tonEncryptedData != null) { - editor.putString("tonEncryptedData", tonEncryptedData); - editor.putString("tonPublicKey", tonPublicKey); - editor.putString("tonKeyName", tonKeyName); - editor.putBoolean("tonCreationFinished", tonCreationFinished); - if (tonPasscodeSalt != null) { - editor.putInt("tonPasscodeType", tonPasscodeType); - editor.putString("tonPasscodeSalt", Base64.encodeToString(tonPasscodeSalt, Base64.DEFAULT)); - editor.putLong("tonPasscodeRetryInMs", tonPasscodeRetryInMs); - editor.putLong("tonLastUptimeMillis", tonLastUptimeMillis); - editor.putInt("tonBadPasscodeTries", tonBadPasscodeTries); - } - } else { - editor.remove("tonEncryptedData").remove("tonPublicKey").remove("tonKeyName").remove("tonPasscodeType").remove("tonPasscodeSalt").remove("tonPasscodeRetryInMs").remove("tonBadPasscodeTries").remove("tonLastUptimeMillis").remove("tonCreationFinished"); - } editor.putInt("6migrateOffsetId", migrateOffsetId); if (migrateOffsetId != -1) { @@ -282,25 +257,9 @@ public class UserConfig extends BaseController { notificationsSignUpSettingsLoaded = preferences.getBoolean("notificationsSignUpSettingsLoaded", false); autoDownloadConfigLoadTime = preferences.getLong("autoDownloadConfigLoadTime", 0); hasValidDialogLoadIds = preferences.contains("2dialogsLoadOffsetId") || preferences.getBoolean("hasValidDialogLoadIds", false); - tonEncryptedData = preferences.getString("tonEncryptedData", null); - tonPublicKey = preferences.getString("tonPublicKey", null); - tonKeyName = preferences.getString("tonKeyName", "walletKey" + currentAccount); - tonCreationFinished = preferences.getBoolean("tonCreationFinished", true); sharingMyLocationUntil = preferences.getInt("sharingMyLocationUntil", 0); lastMyLocationShareTime = preferences.getInt("lastMyLocationShareTime", 0); filtersLoaded = preferences.getBoolean("filtersLoaded", false); - String salt = preferences.getString("tonPasscodeSalt", null); - if (salt != null) { - try { - tonPasscodeSalt = Base64.decode(salt, Base64.DEFAULT); - tonPasscodeType = preferences.getInt("tonPasscodeType", -1); - tonPasscodeRetryInMs = preferences.getLong("tonPasscodeRetryInMs", 0); - tonLastUptimeMillis = preferences.getLong("tonLastUptimeMillis", 0); - tonBadPasscodeTries = preferences.getInt("tonBadPasscodeTries", 0); - } catch (Exception e) { - FileLog.e(e); - } - } try { String terms = preferences.getString("terms", null); @@ -388,21 +347,8 @@ public class UserConfig extends BaseController { } } - public void clearTonConfig() { - tonEncryptedData = null; - tonKeyName = null; - tonPublicKey = null; - tonPasscodeType = -1; - tonPasscodeSalt = null; - tonCreationFinished = false; - tonPasscodeRetryInMs = 0; - tonLastUptimeMillis = 0; - tonBadPasscodeTries = 0; - } - public void clearConfig() { getPreferences().edit().clear().commit(); - clearTonConfig(); sharingMyLocationUntil = 0; lastMyLocationShareTime = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java index 6876c2de8..7b26e005c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -644,9 +644,11 @@ public class ActionBarLayout extends FrameLayout { public boolean onTouchEvent(MotionEvent ev) { if (!checkTransitionAnimation() && !inActionMode && !animationInProgress) { if (fragmentsStack.size() > 1) { - if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN && !startedTracking && !maybeStartTracking) { + if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN) { BaseFragment currentFragment = fragmentsStack.get(fragmentsStack.size() - 1); if (!currentFragment.isSwipeBackEnabled(ev)) { + maybeStartTracking = false; + startedTracking = false; return false; } startedTrackingPointerId = ev.getPointerId(0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java index 7775c20fc..d103f45cc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java @@ -358,7 +358,11 @@ public class AlertDialog extends Dialog implements Drawable.Callback { WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.copyFrom(window.getAttributes()); params.width = Math.min(maxWidth, calculatedWidth) + backgroundPaddings.left + backgroundPaddings.right; - window.setAttributes(params); + try { + window.setAttributes(params); + } catch (Throwable e) { + FileLog.e(e); + } }); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java index 3fd49c276..7e9e0faa9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java @@ -7369,7 +7369,7 @@ public class Theme { } } - public static void createCommonChatResources(Context context) { + public static void createCommonChatResources() { synchronized (sync) { if (chat_msgTextPaint == null) { chat_msgTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); @@ -7466,7 +7466,7 @@ public class Theme { } public static void createChatResources(Context context, boolean fontsOnly) { - createCommonChatResources(context); + createCommonChatResources(); if (!fontsOnly && chat_msgInDrawable == null) { @@ -8687,6 +8687,7 @@ public class Theme { Drawable drawable = wallpaper; AndroidUtilities.runOnUIThread(() -> { wallpaperLoadTask = null; + createCommonChatResources(); applyChatServiceMessageColor(null, null, drawable); NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.didSetNewWallpapper); }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 4d0a416d4..cd973314d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -8028,10 +8028,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (firstVisibleBlockNum >= 0) { int restore = Integer.MIN_VALUE; int oldAlpha = -1; + int oldLinkAlpha = -1; if (alpha != 1.0f) { if (drawOnlyText) { oldAlpha = Theme.chat_msgTextPaint.getAlpha(); + oldLinkAlpha = Color.alpha(Theme.chat_msgTextPaint.linkColor); Theme.chat_msgTextPaint.setAlpha((int) (oldAlpha * alpha)); + Theme.chat_msgTextPaint.linkColor = ColorUtils.setAlphaComponent(Theme.chat_msgTextPaint.linkColor, (int) (oldLinkAlpha * alpha)); } else { if (currentBackgroundDrawable != null) { int top = currentBackgroundDrawable.getBounds().top; @@ -8083,6 +8086,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } if (oldAlpha >= 0) { Theme.chat_msgTextPaint.setAlpha(oldAlpha); + Theme.chat_msgTextPaint.linkColor = ColorUtils.setAlphaComponent(Theme.chat_msgTextPaint.linkColor, oldLinkAlpha); } if (restore != Integer.MIN_VALUE) { @@ -9817,6 +9821,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate return; } Theme.MessageDrawable drawable = a == 0 ? currentBackgroundDrawable : currentBackgroundSelectedDrawable; + if (drawable == null) { + continue; + } int h = parentHeight; if (h == 0) { h = AndroidUtilities.displaySize.y; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 1e6861555..279028988 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -3102,8 +3102,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (!SharedConfig.smoothKeyboard) { setBottomClip(paddingBottom); - } else if (!inPreviewMode) { + } else if (!inPreviewMode && chatActivityEnterView.getEmojiPadding() == 0) { setBottomClip(AndroidUtilities.dp(48)); + } else { + setBottomClip(0); } for (int i = 0; i < count; i++) { @@ -6936,13 +6938,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not searchUpButton.setOnClickListener(view -> { getMediaDataController().searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, 1, threadMessageId, searchingUserMessages, searchingChatMessages); showMessagesSearchListView(false); - //if (!SharedConfig.searchMessagesAsListUsed && SharedConfig.searchMessagesAsListHintShows < 3 && !searchAsListHintShown && Math.random() <= 0.25) { - if (!searchAsListHintShown) { + if (!SharedConfig.searchMessagesAsListUsed && SharedConfig.searchMessagesAsListHintShows < 3 && !searchAsListHintShown && Math.random() <= 0.25) { showSearchAsListHint(); - // searchAsListHintShown = true; + searchAsListHintShown = true; + SharedConfig.increaseSearchAsListHintShows(); } -// SharedConfig.increaseSearchAsListHintShows(); -// } }); searchUpButton.setContentDescription(LocaleController.getString("AccDescrSearchNext", R.string.AccDescrSearchNext)); @@ -6997,9 +6997,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not searchCalendarButton.setContentDescription(LocaleController.getString("JumpToDate", R.string.JumpToDate)); searchCountText = new SearchCounterView(context); -// searchCountText.setTextColor(Theme.getColor(Theme.key_chat_searchPanelText)); -// searchCountText.setTextSize(15); -// searchCountText.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); searchCountText.setGravity(Gravity.LEFT); searchContainer.addView(searchCountText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 0, 0, 108, 0)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatsWidgetConfigActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatsWidgetConfigActivity.java index cd502ffff..abe812fa4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatsWidgetConfigActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatsWidgetConfigActivity.java @@ -25,7 +25,7 @@ public class ChatsWidgetConfigActivity extends ExternalActionActivity { args.putBoolean("onlySelect", true); args.putInt("dialogsType", 10); args.putBoolean("allowSwitchAccount", true); - EditWidgetActivity fragment = new EditWidgetActivity(EditWidgetActivity.TYPE_CHATS, creatingAppWidgetId, false); + EditWidgetActivity fragment = new EditWidgetActivity(EditWidgetActivity.TYPE_CHATS, creatingAppWidgetId); fragment.setDelegate(dialogs -> { Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, creatingAppWidgetId); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java index 216a47007..581d0b216 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.text.Layout; import android.text.StaticLayout; @@ -31,6 +32,7 @@ import java.util.ArrayList; public class BotCommandsMenuView extends View { + final RectF rectTmp = new RectF(); final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); final TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); final MenuDrawable backDrawable = new MenuDrawable() { @@ -74,7 +76,7 @@ public class BotCommandsMenuView extends View { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int size = MeasureSpec.getSize(widthMeasureSpec) + MeasureSpec.getSize(heightMeasureSpec) << 16; - if (lastSize != size) { + if (lastSize != size || menuText == null) { backDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); textPaint.setTextSize(AndroidUtilities.dp(15)); lastSize = size; @@ -93,49 +95,49 @@ public class BotCommandsMenuView extends View { @Override protected void dispatchDraw(Canvas canvas) { - boolean update = false; - if (expanded && expandProgress != 1f) { - expandProgress += 16f / 150f; - if (expandProgress > 1) { - expandProgress = 1f; - } else { - invalidate(); + if (menuText != null) { + boolean update = false; + if (expanded && expandProgress != 1f) { + expandProgress += 16f / 150f; + if (expandProgress > 1) { + expandProgress = 1f; + } else { + invalidate(); + } + update = true; + } else if (!expanded && expandProgress != 0) { + expandProgress -= 16f / 150f; + if (expandProgress < 0) { + expandProgress = 0; + } else { + invalidate(); + } + update = true; } - update = true; - } else if (!expanded && expandProgress != 0) { - expandProgress -= 16f / 150f; - if (expandProgress < 0) { - expandProgress = 0; - } else { - invalidate(); + + float expandProgress = CubicBezierInterpolator.DEFAULT.getInterpolation(this.expandProgress); + if (update && expandProgress > 0) { + textPaint.setAlpha((int) (255 * expandProgress)); } - update = true; - } - - float expandProgress = CubicBezierInterpolator.DEFAULT.getInterpolation(this.expandProgress); - if (update && expandProgress > 0) { - textPaint.setAlpha((int) (255 * expandProgress)); - } - AndroidUtilities.rectTmp.set(0, 0, AndroidUtilities.dp(40) + (menuText.getWidth() + AndroidUtilities.dp(4)) * expandProgress, getMeasuredHeight()); - canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(16), AndroidUtilities.dp(16), paint); - backgroundDrawable.setBounds((int) AndroidUtilities.rectTmp.left, (int) AndroidUtilities.rectTmp.top, (int) AndroidUtilities.rectTmp.right, (int) AndroidUtilities.rectTmp.bottom); - backgroundDrawable.draw(canvas); - canvas.save(); - canvas.translate(AndroidUtilities.dp(8), AndroidUtilities.dp(4)); - backDrawable.draw(canvas); - canvas.restore(); - - - - if (expandProgress > 0) { + rectTmp.set(0, 0, AndroidUtilities.dp(40) + (menuText.getWidth() + AndroidUtilities.dp(4)) * expandProgress, getMeasuredHeight()); + canvas.drawRoundRect(rectTmp, AndroidUtilities.dp(16), AndroidUtilities.dp(16), paint); + backgroundDrawable.setBounds((int) rectTmp.left, (int) rectTmp.top, (int) rectTmp.right, (int) rectTmp.bottom); + backgroundDrawable.draw(canvas); canvas.save(); - canvas.translate(AndroidUtilities.dp(34), (getMeasuredHeight() - menuText.getHeight()) / 2f); - menuText.draw(canvas); + canvas.translate(AndroidUtilities.dp(8), AndroidUtilities.dp(4)); + backDrawable.draw(canvas); canvas.restore(); - } - if (update) { - onTranslationChanged((menuText.getWidth() + AndroidUtilities.dp(4)) * expandProgress); + if (expandProgress > 0) { + canvas.save(); + canvas.translate(AndroidUtilities.dp(34), (getMeasuredHeight() - menuText.getHeight()) / 2f); + menuText.draw(canvas); + canvas.restore(); + } + + if (update) { + onTranslationChanged((menuText.getWidth() + AndroidUtilities.dp(4)) * expandProgress); + } } super.dispatchDraw(canvas); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java index 9230bb929..4a3f6a981 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -144,8 +144,6 @@ import java.util.Locale; public class ChatActivityEnterView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate, SizeNotifierFrameLayout.SizeNotifierFrameLayoutDelegate, StickersAlert.StickersAlertDelegate { - boolean textTransitionIsRunning; - public interface ChatActivityEnterViewDelegate { void onMessageSend(CharSequence message, boolean notify, int scheduleDate); @@ -243,6 +241,7 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe private Runnable moveToSendStateRunnable; boolean messageTransitionIsRunning; + boolean textTransitionIsRunning; private BotCommandsMenuView botCommandsMenuButton; public BotCommandsMenuContainer botCommandsMenuContainer; @@ -4121,7 +4120,7 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe } } if (processSendingText(message, notify, scheduleDate)) { - if (delegate.hasForwardingMessages()) { + if (delegate.hasForwardingMessages() || (scheduleDate != 0 && !isInScheduleMode()) || isInScheduleMode()) { messageEditText.setText(""); if (delegate != null) { delegate.onMessageSend(message, notify, scheduleDate); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java index aba64d97d..f8f0a4759 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java @@ -2874,7 +2874,7 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou @Override public boolean onSheetKeyDown(int keyCode, KeyEvent event) { - if (cameraOpened && (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) { + if (cameraOpened && (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)) { shutterButton.getDelegate().shutterReleased(); return true; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java index d6a59a78d..6a323af66 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java @@ -209,6 +209,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter float pinchScale; boolean isInPinchToZoomTouchMode; + boolean maybePinchToZoomTouchMode; private int pointerId1, pointerId2; @@ -2497,7 +2498,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } if (ev.getActionMasked() == MotionEvent.ACTION_DOWN || ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { - if (!isInPinchToZoomTouchMode && ev.getPointerCount() == 2 && finishZoomTransition == null && recording) { + if (maybePinchToZoomTouchMode && !isInPinchToZoomTouchMode && ev.getPointerCount() == 2 && finishZoomTransition == null && recording) { pinchStartDistance = (float) Math.hypot(ev.getX(1) - ev.getX(0), ev.getY(1) - ev.getY(0)); pinchScale = 1f; @@ -2508,7 +2509,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { AndroidUtilities.rectTmp.set(cameraContainer.getX(), cameraContainer.getY(), cameraContainer.getX() + cameraContainer.getMeasuredWidth(), cameraContainer.getY() + cameraContainer.getMeasuredHeight()); - return AndroidUtilities.rectTmp.contains(ev.getX(), ev.getY()); + maybePinchToZoomTouchMode = AndroidUtilities.rectTmp.contains(ev.getX(), ev.getY()); } return true; } else if (ev.getActionMasked() == MotionEvent.ACTION_MOVE && isInPinchToZoomTouchMode) { @@ -2536,7 +2537,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter isInPinchToZoomTouchMode = false; finishZoom(); } - return isInPinchToZoomTouchMode; + return true; } ValueAnimator finishZoomTransition; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MotionBackgroundDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MotionBackgroundDrawable.java index 99f331925..db45718b3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MotionBackgroundDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MotionBackgroundDrawable.java @@ -314,7 +314,7 @@ public class MotionBackgroundDrawable extends Drawable { if (Build.VERSION.SDK_INT < 28 && intensity < 0) { int w = right - left; int h = bottom - top; - if (legacyBitmap == null || legacyBitmap.getWidth() != w || legacyBitmap.getHeight() != h) { + if (w > 0 && h > 0 && (legacyBitmap == null || legacyBitmap.getWidth() != w || legacyBitmap.getHeight() != h)) { if (legacyBitmap != null) { legacyBitmap.recycle(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java index 3a001953d..c606c0ede 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java @@ -1090,14 +1090,22 @@ public class PasscodeView extends FrameLayout { FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(ApplicationLoader.applicationContext); if (fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints()) { fingerprintView.setVisibility(VISIBLE); + } else { + fingerprintView.setVisibility(GONE); } } catch (Throwable e) { FileLog.e(e); + fingerprintView.setVisibility(GONE); } + } else { + fingerprintView.setVisibility(GONE); } if (SharedConfig.passcodeType == 1) { fingerprintImage.setVisibility(fingerprintView.getVisibility()); } + if (numberFrameLayouts.size() >= 11) { + numberFrameLayouts.get(11).setVisibility(fingerprintView.getVisibility()); + } } public void onShow(boolean fingerprint, boolean animated, int x, int y, Runnable onShow, Runnable onStart) { @@ -1363,7 +1371,7 @@ public class PasscodeView extends FrameLayout { layoutParams = (LayoutParams) numbersFrameLayout.getLayoutParams(); layoutParams.height = height; layoutParams.leftMargin = width / 2; - layoutParams.topMargin = height - layoutParams.height; + layoutParams.topMargin = height - layoutParams.height + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); layoutParams.width = width / 2; numbersFrameLayout.setLayoutParams(layoutParams); } else { @@ -1390,10 +1398,10 @@ public class PasscodeView extends FrameLayout { passwordFrameLayout.setLayoutParams(layoutParams); layoutParams = (LayoutParams) numbersFrameLayout.getLayoutParams(); - layoutParams.height = height / 3 * 2 + AndroidUtilities.dp(20); + layoutParams.height = height / 3 * 2; layoutParams.leftMargin = left; if (AndroidUtilities.isTablet()) { - layoutParams.topMargin = height - layoutParams.height + top; + layoutParams.topMargin = height - layoutParams.height + top + AndroidUtilities.dp(20); } else { layoutParams.topMargin = height - layoutParams.height + top + (SharedConfig.passcodeType == 0 ? AndroidUtilities.dp(40) : 0); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchCounterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchCounterView.java index c1774ff85..6f0133a04 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchCounterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchCounterView.java @@ -237,13 +237,13 @@ public class SearchCounterView extends View { boolean increment = countAnimationIncrement; if (countAnimationInLayout != null) { canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4) + (increment ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - countChangeProgress)); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(2) + (increment ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - countChangeProgress)); textPaint.setAlpha((int) (255 * countChangeProgress)); countAnimationInLayout.draw(canvas); canvas.restore(); } else if (countLayout != null) { canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4) + (increment ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - countChangeProgress)); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(2) + (increment ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - countChangeProgress)); textPaint.setAlpha((int) (255 * countChangeProgress)); countLayout.draw(canvas); canvas.restore(); @@ -251,7 +251,7 @@ public class SearchCounterView extends View { if (countOldLayout != null) { canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4) + (increment ? -AndroidUtilities.dp(13) : AndroidUtilities.dp(13)) * (countChangeProgress)); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(2) + (increment ? -AndroidUtilities.dp(13) : AndroidUtilities.dp(13)) * (countChangeProgress)); textPaint.setAlpha((int) (255 * (1f - countChangeProgress))); countOldLayout.draw(canvas); canvas.restore(); @@ -259,7 +259,7 @@ public class SearchCounterView extends View { if (countAnimationStableLayout != null) { canvas.save(); - canvas.translate(countLeft + dx * (1f - countChangeProgress), countTop + AndroidUtilities.dp(4)); + canvas.translate(countLeft + dx * (1f - countChangeProgress), countTop + AndroidUtilities.dp(2)); textPaint.setAlpha(255); countAnimationStableLayout.draw(canvas); canvas.restore(); @@ -267,7 +267,7 @@ public class SearchCounterView extends View { if (countAnimationStableLayout2 != null) { canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(2)); textPaint.setAlpha(255); countAnimationStableLayout2.draw(canvas); canvas.restore(); @@ -299,7 +299,7 @@ public class SearchCounterView extends View { updateX(countWidth); if (countLayout != null) { canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(2)); countLayout.draw(canvas); canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/GroupCallMiniTextureView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/GroupCallMiniTextureView.java index ada1502fd..b6745d826 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/GroupCallMiniTextureView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/GroupCallMiniTextureView.java @@ -254,18 +254,20 @@ public class GroupCallMiniTextureView extends FrameLayout implements GroupCallSt if (animateToFullscreen || showingInFullscreen) { size += (AndroidUtilities.dp(10) + AndroidUtilities.dp(39) * parentContainer.progressToFullscreenMode); } else { - size += AndroidUtilities.dp(10) * (1.0f - parentContainer.progressToFullscreenMode); + size += AndroidUtilities.dp(10) * Math.max(1.0f - parentContainer.progressToFullscreenMode, showingAsScrimView || animateToScrimView ? parentContainer.progressToScrimView : 0.0f); } int x = (getMeasuredWidth() - size) / 2; float smallProgress; + float smallProgress2; float scrimProgress = (showingAsScrimView || animateToScrimView ? parentContainer.progressToScrimView : 0); if (showingInFullscreen) { - smallProgress = progressToFullscreen; + smallProgress = smallProgress2 = progressToFullscreen; } else { smallProgress = animateToFullscreen ? parentContainer.progressToFullscreenMode : scrimProgress; + smallProgress2 = showingAsScrimView || animateToScrimView ? parentContainer.progressToScrimView : parentContainer.progressToFullscreenMode; } - int y = (int) ((getMeasuredHeight() - size) / 2 - AndroidUtilities.dp(11) - (AndroidUtilities.dp(17) + AndroidUtilities.dp(74) * parentContainer.progressToFullscreenMode) * smallProgress); + int y = (int) ((getMeasuredHeight() - size) / 2 - AndroidUtilities.dp(28) - (AndroidUtilities.dp(17) + AndroidUtilities.dp(74) * (showingInFullscreen || animateToFullscreen ? parentContainer.progressToFullscreenMode : 0.0f)) * smallProgress + AndroidUtilities.dp(17) * smallProgress2); castingScreenDrawable.setBounds(x, y, x + size, y + size); castingScreenDrawable.draw(canvas); @@ -1102,8 +1104,14 @@ public class GroupCallMiniTextureView extends FrameLayout implements GroupCallSt } boolean pausedInternal = false; - if (participant.participant.video != null && participant.participant.video.paused) { - pausedInternal = true; + if (participant.presentation) { + if (participant.participant.presentation != null && participant.participant.presentation.paused) { + pausedInternal = true; + } + } else { + if (participant.participant.video != null && participant.participant.video.paused) { + pausedInternal = true; + } } if (videoIsPaused != pausedInternal) { videoIsPaused = pausedInternal; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsWidgetConfigActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsWidgetConfigActivity.java index 3255f777e..127320b18 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsWidgetConfigActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsWidgetConfigActivity.java @@ -25,7 +25,7 @@ public class ContactsWidgetConfigActivity extends ExternalActionActivity { args.putBoolean("onlySelect", true); args.putInt("dialogsType", 10); args.putBoolean("allowSwitchAccount", true); - EditWidgetActivity fragment = new EditWidgetActivity(EditWidgetActivity.TYPE_CONTACTS, creatingAppWidgetId, false); + EditWidgetActivity fragment = new EditWidgetActivity(EditWidgetActivity.TYPE_CONTACTS, creatingAppWidgetId); fragment.setDelegate(dialogs -> { Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, creatingAppWidgetId); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/EditWidgetActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/EditWidgetActivity.java index f4df734b4..9b68adf27 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/EditWidgetActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/EditWidgetActivity.java @@ -104,7 +104,6 @@ public class EditWidgetActivity extends BaseFragment { private int widgetType; private int currentWidgetId; - private boolean isEdit; private EditWidgetActivityDelegate delegate; @@ -733,18 +732,15 @@ public class EditWidgetActivity extends BaseFragment { } } - public EditWidgetActivity(int type, int widgetId, boolean edit) { + public EditWidgetActivity(int type, int widgetId) { super(); widgetType = type; currentWidgetId = widgetId; - isEdit = edit; - if (edit) { - ArrayList users = new ArrayList<>(); - ArrayList chats = new ArrayList<>(); - getMessagesStorage().getWidgetDialogIds(currentWidgetId, widgetType, selectedDialogs, users, chats, true); - getMessagesController().putUsers(users, true); - getMessagesController().putChats(chats, true); - } + ArrayList users = new ArrayList<>(); + ArrayList chats = new ArrayList<>(); + getMessagesStorage().getWidgetDialogIds(currentWidgetId, widgetType, selectedDialogs, users, chats, true); + getMessagesController().putUsers(users, true); + getMessagesController().putChats(chats, true); updateRows(); } @@ -810,14 +806,16 @@ public class EditWidgetActivity extends BaseFragment { getMessagesStorage().putWidgetDialogs(currentWidgetId, selectedDialogs); SharedPreferences preferences = getParentActivity().getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); - preferences.edit().putInt("account" + currentWidgetId, currentAccount).commit(); - preferences.edit().putInt("type" + currentWidgetId, widgetType).commit(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("account" + currentWidgetId, currentAccount); + editor.putInt("type" + currentWidgetId, widgetType); + editor.commit(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getParentActivity()); if (widgetType == TYPE_CHATS) { - ChatsWidgetProvider.updateWidget(getParentActivity(), appWidgetManager, currentWidgetId, isEdit); + ChatsWidgetProvider.updateWidget(getParentActivity(), appWidgetManager, currentWidgetId); } else { - ContactsWidgetProvider.updateWidget(getParentActivity(), appWidgetManager, currentWidgetId, isEdit); + ContactsWidgetProvider.updateWidget(getParentActivity(), appWidgetManager, currentWidgetId); } if (delegate != null) { delegate.didSelectDialogs(selectedDialogs); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java index 8adfd46fa..c6272347c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java @@ -35,8 +35,10 @@ public class FeedWidgetConfigActivity extends ExternalActionActivity { AccountInstance.getInstance(fragment1.getCurrentAccount()).getMessagesStorage().putWidgetDialogs(creatingAppWidgetId, dids); SharedPreferences preferences = FeedWidgetConfigActivity.this.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); - preferences.edit().putInt("account" + creatingAppWidgetId, fragment1.getCurrentAccount()).commit(); - preferences.edit().putLong("dialogId" + creatingAppWidgetId, dids.get(0)).commit(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("account" + creatingAppWidgetId, fragment1.getCurrentAccount()); + editor.putLong("dialogId" + creatingAppWidgetId, dids.get(0)); + editor.commit(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(FeedWidgetConfigActivity.this); FeedWidgetProvider.updateWidget(FeedWidgetConfigActivity.this, appWidgetManager, creatingAppWidgetId); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index a77a35e53..ea3b2e5c9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -308,7 +308,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa if (Build.VERSION.SDK_INT >= 24) { AndroidUtilities.isInMultiwindow = isInMultiWindowMode(); } - Theme.createCommonChatResources(this); + Theme.createCommonChatResources(); Theme.createDialogsResources(this); if (SharedConfig.passcodeHash.length() != 0 && SharedConfig.appLocked) { SharedConfig.lastPauseTime = (int) (SystemClock.elapsedRealtime() / 1000); @@ -2273,7 +2273,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa fragment = new ActionIntroActivity(ActionIntroActivity.ACTION_TYPE_CHANGE_PHONE_NUMBER); closePrevious = true; } else if (open_settings == 6) { - fragment = new EditWidgetActivity(open_widget_edit_type, open_widget_edit, true); + fragment = new EditWidgetActivity(open_widget_edit_type, open_widget_edit); } else { fragment = null; } @@ -3657,18 +3657,19 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa if (SharedConfig.pendingAppUpdate != null && SharedConfig.pendingAppUpdate.version.equals(res.version)) { return; } - SharedConfig.setNewAppVersionAvailable(res); - if (res.can_not_skip) { - showUpdateActivity(accountNum, res, false); - } else { - drawerLayoutAdapter.notifyDataSetChanged(); - try { - (new UpdateAppAlertDialog(LaunchActivity.this, res, accountNum)).show(); - } catch (Exception e) { - FileLog.e(e); + if (SharedConfig.setNewAppVersionAvailable(res)) { + if (res.can_not_skip) { + showUpdateActivity(accountNum, res, false); + } else { + drawerLayoutAdapter.notifyDataSetChanged(); + try { + (new UpdateAppAlertDialog(LaunchActivity.this, res, accountNum)).show(); + } catch (Exception e) { + FileLog.e(e); + } } + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.appUpdateAvailable); } - NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.appUpdateAvailable); }); } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 83cf4d4d9..8e3f44531 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -676,7 +676,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat BulletinFactory.of(containerView).createSimpleBulletin(R.raw.voip_invite, bulletinMessage).show(); } }); - builder.create().show(); + BottomSheet bottomSheet = builder.create(); + bottomSheet.show(); + bottomSheet.setItemColor(0,0xffffffff, 0xffffffff); + bottomSheet.setItemColor(1,0xffffffff, 0xffffffff); + bottomSheet.setBackgroundColor(0xff1C2229); + bottomSheet.setTitleColor(0xff8A8A8A); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index b147a8793..5cc2f1fd4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -1480,6 +1480,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. @Override public View createView(Context context) { Theme.createProfileResources(context); + Theme.createChatResources(context, false); searchTransitionOffset = 0; searchTransitionProgress = 1f; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java b/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java index d457d8ed7..47278b3a4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java @@ -16,6 +16,7 @@ import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.Layout; +import android.text.Spannable; import android.text.SpannableString; import android.text.StaticLayout; import android.text.TextPaint; @@ -114,6 +115,9 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain enterView = chatActivity.getChatActivityEnterView(); ChatActivityEnterView chatActivityEnterView = chatActivity.getChatActivityEnterView(); + if (chatActivityEnterView == null || chatActivityEnterView.getEditField() == null || chatActivityEnterView.getEditField().getLayout() == null) { + return; + } fromRadius = chatActivityEnterView.getRecordCicle().drawingCircleRadius; bitmapPaint.setFilterBitmap(true); @@ -145,7 +149,18 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain emojiSize = AndroidUtilities.dp(24); } } - if (editText.length() != text.length()) { + boolean containsSpans = false; + if (text instanceof Spannable) { + Spannable spannable = (Spannable) text; + Object[] objects = spannable.getSpans(0, text.length(), Object.class); + for (int i = 0; i < objects.length; i++) { + if (!(objects[i] instanceof Emoji.EmojiSpan)) { + containsSpans = true; + break; + } + } + } + if (editText.length() != text.length() || containsSpans) { crossfade = true; String str = editText.toString(); String trimmedStr = str.trim(); @@ -543,78 +558,78 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain } canvas.save(); - { - canvas.clipRect(drawableX + AndroidUtilities.dp(4), drawableTop + AndroidUtilities.dp(4), drawableRight - AndroidUtilities.dp(4), drawableBottom - AndroidUtilities.dp(4)); - float scale = progressX + scaleFrom * (1f - progressX); - float scale2; - if (drawBitmaps) { - scale2 = progressX + scaleY * (1f - progressX); + canvas.clipRect(drawableX + AndroidUtilities.dp(4), drawableTop + AndroidUtilities.dp(4), drawableRight - AndroidUtilities.dp(4), drawableBottom - AndroidUtilities.dp(4)); + + float scale = progressX + scaleFrom * (1f - progressX); + float scale2; + if (drawBitmaps) { + scale2 = progressX + scaleY * (1f - progressX); + } else { + scale2 = 1f; + } + + canvas.save(); + canvas.translate(fromX * (1f - progressX) + (toX - toXOffset) * progressX, fromY * (1f - progress) + (toY + textLayoutBlock.textYOffset) * progress); + canvas.scale(scale, scale * scale2, 0, 0); + // canvas.translate(0, textLayoutBlock.textYOffset / 2); + if (drawBitmaps) { + if (crossfade) { + bitmapPaint.setAlpha((int) (255 * (1f - alphaProgress))); + } + canvas.drawBitmap(textLayoutBitmap, 0, 0, bitmapPaint); + } else { + if (crossfade) { + int oldAlpha = Theme.chat_msgTextPaint.getAlpha(); + Theme.chat_msgTextPaint.setAlpha((int) (oldAlpha * (1f - alphaProgress))); + layout.draw(canvas); + Theme.chat_msgTextPaint.setAlpha(oldAlpha); } else { - scale2 = 1f; + layout.draw(canvas); } + } + canvas.restore(); + + if (rtlLayout != null) { canvas.save(); - canvas.translate(fromX * (1f - progressX) + (toX - toXOffset) * progressX, fromY * (1f - progress) + (toY + textLayoutBlock.textYOffset) * progress); + canvas.translate(fromX * (1f - progressX) + (toX - toXOffsetRtl) * progressX, fromY * (1f - progress) + (toY + textLayoutBlock.textYOffset) * progress); canvas.scale(scale, scale * scale2, 0, 0); - // canvas.translate(0, textLayoutBlock.textYOffset / 2); if (drawBitmaps) { if (crossfade) { bitmapPaint.setAlpha((int) (255 * (1f - alphaProgress))); } - canvas.drawBitmap(textLayoutBitmap, 0, 0, bitmapPaint); + canvas.drawBitmap(textLayoutBitmapRtl, 0, 0, bitmapPaint); } else { if (crossfade) { int oldAlpha = Theme.chat_msgTextPaint.getAlpha(); Theme.chat_msgTextPaint.setAlpha((int) (oldAlpha * (1f - alphaProgress))); - layout.draw(canvas); + rtlLayout.draw(canvas); Theme.chat_msgTextPaint.setAlpha(oldAlpha); } else { - layout.draw(canvas); + rtlLayout.draw(canvas); } } canvas.restore(); - - if (rtlLayout != null) { - canvas.save(); - canvas.translate(fromX * (1f - progressX) + (toX - toXOffsetRtl) * progressX, fromY * (1f - progress) + (toY + textLayoutBlock.textYOffset) * progress); - canvas.scale(scale, scale * scale2, 0, 0); - if (drawBitmaps) { - if (crossfade) { - bitmapPaint.setAlpha((int) (255 * (1f - alphaProgress))); - } - canvas.drawBitmap(textLayoutBitmapRtl, 0, 0, bitmapPaint); - } else { - if (crossfade) { - int oldAlpha = Theme.chat_msgTextPaint.getAlpha(); - Theme.chat_msgTextPaint.setAlpha((int) (oldAlpha * (1f - alphaProgress))); - rtlLayout.draw(canvas); - Theme.chat_msgTextPaint.setAlpha(oldAlpha); - } else { - rtlLayout.draw(canvas); - } - - } - canvas.restore(); - } - - if (crossfade) { - canvas.save(); - canvas.translate(messageView.getLeft() + listView.getX() - container.getX() + (fromX - toX) * (1f - progressX), messageViewY + (fromY - toY) * (1f - progress)); - canvas.scale(scale, scale * scale2, messageView.getTextX(), messageView.getTextY()); - canvas.translate(0, -crossfadeTextOffset); - - if (drawBitmaps) { - bitmapPaint.setAlpha((int) (255 * alphaProgress)); - canvas.drawBitmap(crossfadeTextBitmap, 0, 0, bitmapPaint); - } else { - messageView.drawMessageText(canvas, messageView.getMessageObject().textLayoutBlocks, true, alphaProgress, true); - } - canvas.restore(); - } - } + + if (crossfade) { + canvas.save(); + canvas.translate(messageView.getLeft() + listView.getX() - container.getX() + (fromX - toX) * (1f - progressX), messageViewY + (fromY - toY) * (1f - progress)); + canvas.scale(scale, scale * scale2, messageView.getTextX(), messageView.getTextY()); + canvas.translate(0, -crossfadeTextOffset); + + if (crossfadeTextBitmap != null) { + bitmapPaint.setAlpha((int) (255 * alphaProgress)); + canvas.drawBitmap(crossfadeTextBitmap, 0, 0, bitmapPaint); + } else { + messageView.drawMessageText(canvas, messageView.getMessageObject().textLayoutBlocks, true, alphaProgress, true); + } + canvas.restore(); + } + + canvas.restore(); if (clipBottomWithAlpha) { @@ -631,8 +646,8 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain } if (enterView.getSendButton().getVisibility() == View.VISIBLE && sendProgress < 1f) { canvas.save(); - canvas.translate(enterView.getX() + enterView.getSendButton().getX() + ((View) enterView.getSendButton().getParent()).getX() + ((View) enterView.getSendButton().getParent().getParent()).getX() - container.getX() + AndroidUtilities.dp(52) * sendProgress, enterView.getY() + enterView.getSendButton().getY() + ((View) enterView.getSendButton().getParent()).getY() + ((View) enterView.getSendButton().getParent().getParent()).getY()- container.getY()); - // canvas.saveLayerAlpha(0, 0, enterView.getSendButton().getWidth(), enterView.getSendButton().getHeight(), (int) (enterView.getSendButton().getAlpha() * 255), Canvas.ALL_SAVE_FLAG); + canvas.translate(enterView.getX() + enterView.getSendButton().getX() + ((View) enterView.getSendButton().getParent()).getX() + ((View) enterView.getSendButton().getParent().getParent()).getX() - container.getX() + AndroidUtilities.dp(52) * sendProgress, enterView.getY() + enterView.getSendButton().getY() + ((View) enterView.getSendButton().getParent()).getY() + ((View) enterView.getSendButton().getParent().getParent()).getY() - container.getY()); + // canvas.saveLayerAlpha(0, 0, enterView.getSendButton().getWidth(), enterView.getSendButton().getHeight(), (int) (enterView.getSendButton().getAlpha() * 255), Canvas.ALL_SAVE_FLAG); //canvas.scale(enterView.getSendButton().getScaleX(), enterView.getSendButton().getScaleY(), enterView.getSendButton().getWidth() / 2f, enterView.getSendButton().getHeight() / 2f); enterView.getSendButton().draw(canvas); canvas.restore(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VoIPPermissionActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/VoIPPermissionActivity.java index 8f9bb335b..a223f5017 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VoIPPermissionActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VoIPPermissionActivity.java @@ -29,7 +29,7 @@ public class VoIPPermissionActivity extends Activity { if (isVideoCall && checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { permissions.add(Manifest.permission.CAMERA); } - if (permissions.isEmpty()) { + if (!permissions.isEmpty()) { try { requestPermissions(permissions.toArray(new String[0]), isVideoCall ? 102 : 101); } catch (Exception e) { diff --git a/TMessagesProj/src/main/res/drawable-v21/widget_background.xml b/TMessagesProj/src/main/res/drawable-v21/widget_background.xml new file mode 100644 index 000000000..ecee3cc35 --- /dev/null +++ b/TMessagesProj/src/main/res/drawable-v21/widget_background.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/TMessagesProj/src/main/res/drawable-v31/widget_badge_background.xml b/TMessagesProj/src/main/res/drawable-v31/widget_badge_background.xml new file mode 100644 index 000000000..2ace851a0 --- /dev/null +++ b/TMessagesProj/src/main/res/drawable-v31/widget_badge_background.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/TMessagesProj/src/main/res/drawable-v31/widget_badge_muted_background.xml b/TMessagesProj/src/main/res/drawable-v31/widget_badge_muted_background.xml new file mode 100644 index 000000000..1423bfd62 --- /dev/null +++ b/TMessagesProj/src/main/res/drawable-v31/widget_badge_muted_background.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/TMessagesProj/src/main/res/drawable/widget_avatar_1.png b/TMessagesProj/src/main/res/drawable/widget_avatar_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc96833e3a602ed046c97487fd3b06337723653 GIT binary patch literal 11078 zcmV-ME4kE(P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91ke~wq1ONa40RR91kN^Mx06#wphyVa8ut`KgRCodHeFvNrRkr@As-Ee| zff?e!kmGEluaWys$ zRNTryUD5k1A{}&*OnheQIzRPH<8MXDVNC^Z_7}V$o|wQ5r;-4S?KQ zT~XI)y8fv%LtCoMTUiy0`r@I?Lkd9puYTdI-M(eCTVyOcHVy+kDpp`IJ9!4EL{@-n zEm1{2N+~G(OnLI1IEeQa%*c`zXJ=u`sc=RLd_L95=8j3DXH3B%7Rs8q0-y+JT3qPg;=SbGW0U=><7Vh zI@;CwgsewV_CS{3p0a55^H998h-+VJcL3E*9X8D6a?b^bPH5kuNUYicp5>aRUguo6 zYE^r-yxjn#Po1h&H?Fx44VZDLudHG@Cqt!0nT)i0Z(cH8hISqpxTuoh53APU0@#FYe;6#J%RD?~P|eh$Lfs|rVU;x~)}3iCpPV2qLmVef5XXdRq89cC zH_)0NyLW7o`oG*S?yo+Ij!Tf6xf(?qd#)s3c8e$-IycuruIK(?wKTl>g1El?K%^cK z90Zb0gjL#FMUyjA7Zz`cWtA}nP~DUxi(Gmm!BY^+PBfRTLv&!`)FY0Uq>Fwf+R#zW zk6M4xYpSLGse8or=^Nlg$*muo`@5k*9Oqmn$^SjW1H=HiTmWkQOHYcvex;`_o464` zv|UpiXF3;sR~(>eQQwXkfT|}Koq!)GW=GGBx|L=MppN5kh~vMmkff>CLR^K8@X#yE zrEd1s5H;`+gbN~Y6!q9~k}~5-k!0vpAxN*-FAXm~CXMg?9Vx-N)Po!`MAj%DD`mjz z#I(i5%cCsFZ}yk~sA@{lMA%6G4$hP6w^plff)gkmI!e-&cSCHQ6;|o4A67~ItSd#Y zDmSlKLu@JeUBx;3c~QId46DAzcVCwJ=N}fSsxSZ_R^|v3gA>)jJ#<0(qGJ4@ttE?> zA{ZBf$1RKP15dpu1wF+%LRYhaI2W7~&W+X8SqdPEErave6|(~|q6|DzoOeGh>X4BUk4@6q(?#hyz#NFk z?FJt$j#DQ`T%Tj)DdN2Ak65`uxukp#z8)_ejz==3VoU2gn zGyB{U0CB0#)s}4vGrU+If+Z49!l3*1K?cC0v#IVEUWW*@2r zy~TOQlR_{_gFT#xbHusgoSAKBuyj!ah(^LDJC8j}b=Y{+qLJdf_4lIW29NxxJWwWE zfB0TDtoc^9{j^r9VBiZx3hhQ`obTa6_?fmL-h*YCI!qvYjvLnKeY>{HrteqD#_v~3 z$<~c9P6yX>)Gj?FdBzi>^Z|Hjzp{ZKB?^o=!`ww%T~w>ECilcgwpo}lz)G)y;=E_B zsGWNR>^moN$HpI}WXlGag&I8R&{KyaSvqzvl!D&Y$}1JLRX< z-$*T%=0;u3bt;fdwX%P22@K;|l9CqKHl^g`i8^4IxW8G3r7TSfQB6&YrU&_>u(6~% zdCuBB9|lPi^ijkjj9zu{dzfHtApH6T;>vmR1EPWh1*2V?f08}hw|Icl%Hm6opu(kb zVBc=}5fk3vX9c81x`AS&IxOLlJF;JxMfgj+&82AoENjzsqcFX&5-(Wu{t!;pJzTDM9XsF!)`LkT(n zpPrQ?>6tk#>LYjB56(w%7m6I?CW&LpRl!$;p$ZA_c|PaVnA`C3NlPWbL}rGeBH2kM zl185ddXM9*X|TKezmR2>VPXz|t59Tk$qm4C>DEIE2M#s#kPX;gg=1ZsC!7<%d)sEo z>)KsXQV-g79I*3f!hZ+y~k9B zrbGuv+e9t~z(Z!)qxaC(1B-3)Ww*8wNv)eo5wa6XvoBGEWMpMaLEnJ}U~)TlkzRv_ zc_y=o6H)$>bLn)%`jFyG5w&9hY)qYv_#VU7gcY1GHG=azFEuu*;<9PFK+hrYMK{uN{Q zgdJ`QiXp7HlCPa<#P#^L!{7I^J-aY52bwtx(?DI8ZhZ!{_@(D{DUfcx`WyO*8=!IF z%7zn`lN~PQcI*u4<}`FD0@w-5bnn4OAlT8_TvUfnU7`DTZeG^&fr6+=D*05bLy-cm zmwf$fIBsDqMIEswx;vV7$ndviirOw40%W^m)vK2SM868~*t**g19TH4-}JwRqti^m zC0jO0)q(xZqJp9%C%+@?Jp)>Rie+Wybii^t1CyT&(N$oiX}z2`Q)e<1`z$QIH5eDO za`UA}|G|=$nbjgIMWhp=aUWJ{K#{>od5?h0%F8#NwaDP-4}wVT*bPBxOQ2wZQ~Kyz zev(^ptI+kz+)Z=7-(zY!wJ8q79i!;}gI2UIXc-hO7+iX~wGrmkEdJ`7S3M|$lhmn4 zuVz5`*2!o2(0O_fITGBcpEv-dNGT&H*Dw+m4j9q~Jl-Hn=mt&);=Pt3%Gadnl>ubfexWTfm1SK4jzgw=n~17 z-x?8kI6~A#G9gmp5j;lwu&Sc|6)AXF1`V7^7v1R5gE(d}BxBBbLP`h<3Lu`(1JN}h zL>bXPhUjvfb%{7m{6+L-9pWV6qtJh13?N33LwwnPC;^8@d&J4 z?K4D@&c7C=g_NjP)R@?1z@nXe@r|N%>t)N*J`@H50*J@TVci&c+@_gn;?g!bMH~=a zN>)otubJ#W*E9;2^-0tIr^#OyTTw;~c(CAqv;zW&XA;I-_o1r-0a}g`WBj-7@ZEqT z;5c!-XeXZyQ5M@sMq+?i2-Fb20ODz=2*8eQoDWt_N+FcO^R5omw!`;>jQ~U$6>6nR zA&itQT`|G3Me>YTASV3f^$Q>#rAxE6zYLb#;|c;kqNMY$7bPe5PJK(-9EXLdox6*J zKR}LW42f7Uj#u_mM;id~5N~)1r};^1-7OjnN1YncJ}&DTacGp}7&jRX*JH7>BeZWV zsvh%fZepVqwYk9);NkNsXqC>oKjFYs;N?!5c2mraVb(P|eoIo|&}F<70+7IouqcTU z5fj8l>*Cu0h_4T5oygL^A+H^iu&a|NW*jCtJ&%{6^(2EfdT3>kOxbr8WbIZ~B9jN%20g^b>(l4*WW}W#%x&b_BR@UmZR=W)^B^>THS*o34XV?xnh(GfO8qPY>jyo+TT!>g9W;n!#!<6q;w_IM5 z`yg(`ZlhssZLO@r3vAY}UvKQr7&vgC3>q{@($iyO-U@`%s;Vj}E-scIe)z#S=z(n* zGGvH2efEt7%4^kq?&@`a@qy@dHHP!rs&ZM5ffr^2sNk7;T(Adv-IxqpmbW0gN?g z)TiYVMifM>g0UH=jIG>LZK)1~N#o%J&i{GHmZke|fBRcw(#|{YJo(FC{vugfo^3tH zAAh`j@x>P{hB!MrTV8$jRXOc6=m!?kn{U1;7hG_GR99EaEw|hv1Z>BSo~?A}o_ntR z;~zLA!G|7w^ijF_=9_))#ON#Z(AxX168E>uEj{@R8#EhIkLZ}D)_q^r$5QZc9B?>+ z=+>>9QDp-x-*?}Aw`|?I)o&A$EO|@M!J@fc+FRzti4zUw zolmJqlM}62vEpFjrf(J41W7JL@Wq<6W5&kBQ%~$T6t^-EA&b`a0b7f;6R^K4hW;3D zV+oK?KmFABlPjLDzWU10HK+qET)5Diti>nKOuXun!y}5<3oE(Q)2M zz&?iefJ=9rp6cK^gEr8XEnAFVIjdT|dbNxjH_lL^xs(q?*I$3Vq1Xm`9_jtdF1t)V z`|LCM+u!~s%a$!ORm{G9`)mOa8^awO4e!1r*#B+WlAhS%JN$y5KWl0zni4VA8As9a zND@1!M~@zonR#%Zd1Ym#1OgA2^LN~Fhdli7!v=@2x_uO3Pd)XN+;r1T*k)}`-^k0$ zlg^zxTiq1DdA`st_3s8OQ~Yp|KJtV%=Wn5!(V5@{9Rzkk2chAv&Y$T7zpBaXRcEMj z^zu@vz3l?y>_sb1_rO8rpDR_9idF)W!$MUa@;MIFPP*cDPbfji#IZ}jc`inWWOvQrWg`o0OH6 z3GGB&LD8b^1tP^BjgvV!IYPaqSFc_|ohlrP7eG6(AJ6s9%i%OVU|M3w0q{hx0~z9L zV4H)u1J)cT4>oMrVAx_l{`h0zcN+adQGR~D^zYwaF1+wUx%%p>B_#!Jf&?NJua{Er zstA4SPcXGWABuvA9S44~nf#?iOMDHI9k!on+v&}}a^*^yGG$5&ho|>hu+P1F_X;oS zH@u#E?m1gM?7`Y*<{5pI>Y(A`+Oi(WqXQ7JV~wJKFv@rkUuFi7X{g}R+3M>pH=EZt z-ODe(EOekI8fn9!YWSRA9ZmbOjMrgVih^i7?9wCX8+4*5JtkSH>jbk9hg0dl{`IeL zlE+0_6|V`!DWp+HD-t_2Bt{1y>OXi930Y&JP)$vZA%?7IFO_euuo8(>Y;sV0BN_v9 z7Yz|RDo$074nR=EH0nR?ygUtOAh=Sazsd^YYK-M26v0oa_8A+{8s`9-gi3>ilT$GwZ1_sGUI9@A%?cnD;^2a5>4?F3BCXR z`)xo^7fI{BMN)P+d9|FG!djr+I znW;;7MS=I8*-v`LpLymP!@p%V57SX}F_bo3e;D&JUWwrzt%*BE>;@3u$;MMtBGsgc z9To4&iVQ$dpp_o|@NTcbF)ytLDcZm3hhl7xFHw9w`|PtuT(s|fv){*z86z*g_+lGi z2FgEl=umm-rI(~@*RFw*1ieqg{wN~#EX;DFdKWG3}GO{CH&J#PTb8zkk zAV2&tHCUk4-moRuNc3n^Y_$HRE?>UfnAAv{LQry3BK4xyWqZqH-Bi|@uBa$7y^qe? zIdkT;(RD_Q7$L_V3tO7a#PfvI?%+ZZ7($5|VnZ54L^jBex?lIi}}_=nx$2*dD|I zKkKZs+EmT(3U2IUY)?4E^vuU?&w)$=<>lpa!wokW+jat_@mD9)KKbO6hVhg8*nEkB z_%mnDG`3*--na9+@j_p01VzWgs#aIjHOycDNYnLC!^-VOWjJY7$;t~Wn^lSF$Koo8 zyE0l6z3iu+da4m@&y9V-h&l-mLg02F?pqH^>d!?8i^w9#SDyz03Xi&t*LUA;n$L6s)5{nT6B!0{O#yB2c z!0kN#XynL|GI{c3V}-*N9GBhX0t~z-x1lS9n*se%4&D>r6UW4TS6Sxov9a{0@=b0? zrJ4shki5sbaH-CnAPhe9M+|1;#zXGpXiw5hcT4S^7dHjkn{zNzflf`=a+P^2s|*0K z1J#p@mH|NK96Q|qb@D`U-unCY?7LAngSxmYlp-b=(NM?9BG(CJc+5b6+!Osq${8KH z$<^z=khe>B1S{HzNF+c>jIZ{`ZF~!$_? zlmbA@(-s#S0q}+hW1$dAOIjBm>~AI4bMi#6Gu21yWd87_>TqhFhUSfu|rj zRh}7etX$H$kK{R=@~45v$%P$z1}&SuEgs~+D-?L>1dbQ*uv1DB{FqqIheN(tX$BC! zd=yS03SMI!FEnAo1fhF?j@D@CEO4BE3_V5817PZ4=W5X1LQzH#J=XVVDR722(7tWq z!4KTIO0g9WoX59qN>)x-O0+LlngNtjQ1}`AgMl}d`_@Q)MGIye5#w@rpaL)2Y|OeD zoG=iM$?hZz2A?SNaSct+F~H;Pn#)+7C~|$lKzVQ2IJps@)Q!v%IU~;t;vo>f{3YJ~ z9%uX2jDDn>pG#tdSn>A1SqI{cs>wy~VmWuF_hG=#`Z`Iz^GR{=6plC~dg*zj3KeBK zTQ_dpXowaD(=&#Lx=`P~edYK{w~VROWn^|oNrT?g0Q(k>@(#o^< z5ZBuuOFe)=krj#>!HpVqmvo0Ho7TCvT$tHK)N3!2%1Ps-eE$IhKnzwRfXp7S5UNgF zo+l-nu7()#P22)NDe3Csnks!RR%4-gv`s-|zKxCaJ5Ol!cS>txZkE*3jPEdanufQ2 zFOYy3N$S`^@;l@im-l(XeQM^cH&}gD5hK3+Yu15ylk0jg@I}4}0)FRyjsz#AYbRLo z;g*Sns2imqpguowcB2IBrU~xLyu=1E;#*D&0P%sQsPlXi1p2O52DiHe$`?=f)y@dw zg3dxt5;h@^lAd-*07x(QZ!B#+CjPL|20+eXQ3nmZgsItukYL(a$6QLL2R^cM;ibsvu5EO5_z$8!WMr6 zK(68yU}+Hye2aqG_Ybw8GeU9^Q4on3LmqADK#^29A`_V0CEMV}*aEL;8z{8w6)<67 zqvc(XGqu${Y@61e!AUlOw=LqxSpCOhac|-V{RAcqTGE(f0HDw-u-3iQp#wU`jBI^7 z;r@251|!(BGbn(F1!BTq=lsGhb>Yg5x*`kwWiakx;Cb3rc!>hr zfosWY;@+ItTuANOQIaR0VLmF43O6{g^P+PQ1`)Yy!{21seb2T09nshRC#VyZ7$6n` zwJjikoQqZ=;!Fw5Vt70VxKRDPM@5HaI*}>qf(ha{3E~LW8y zSBnFSoVP!Yr7c!9iB15Ly9B#ktFdn$V4<#~bcv7nr)Y<^;qCd-@GJz20?r!blrri* zx~7dvU%2Y)V0DHB5Hr_I8ZsAr=GtHd30^D2Hxwq{{+MV3hX+l1_+k5uK;s9CrT*!e z9x)xl?gMV|bn0tst_#)Dz+A;AXG*Ge7k-I*d~UVtjeO1GVQTjg&~X5K{k-2x z!@NhZFo3ENg7dJ!oNLaxnZ}zEVJrwC9!kxWp-W8#-qW&6TghF25N+fsX4-K$O^imM z{<(*w@l_a+8S`U8`Deg<>Y~*r;S)+yXfnltSPTo)H1)cmE)H*fY^XC;ln$M}cMgBH z(+DV?;OirsFasXAEQ~oe2_AOIG=P}cxp37g!14ip4@y|YXh)9`wHKU?hpAmhfbVWo zy7h)FE3j+R+d$4O=h*wVna{8Q!~)YCLuLZdOM@1UkW$Af=a`bW-f|e&RbIMB_U|ph zUjNXY_2&Dzd^W(^Us|$5%J=P|I$^roN>09LqsE4eIN+ReZcP{5lo0vCr|PLk7U+!) z-y&yzo7|Xuo*R_%;LD;IhZnU;(dGsLvvJKz*$=NUqHM5hI!n3~_LkgEUE^~XLz^DN z?uHBIk-a;&Ny*ktQdd)LNTd92J*4MAyz|0@Ld=%A)_yB>_e>84qP>bEX?WVg?}EpH z`RQiZ9EfGGB2AR(KwsOR0>Gf*W%p*m!}9j;DUp4l~< z$?+pBIDx4VyMK3Y+brLI{kd#jyIN|iJ&~ktjM1L$TciSGWR}!EgG8Y^0Wh{E&LQVA z67aCBhycWlDX$e{ovyUhhX?@dnc`c5!=XmQ&qOSG7$SdJP}-%UY@Y$7wE)td9b3@< z`f!R($h7rXcJJD=~RGNneZ&pS$PPlz^cvNDzM87q{{uJva$F(S@YFrvhAmJ z1}l%OyYZW=y0StxuP;U)m&=xQ#Zrx!b8r8BTTO19mXRqLIpOWA*G8NO(Sgl2{E;^i z=Z=MhtZFX#253W;c?3C~) z-znmFB_j|%7t7PUF5R#}w(ZHSVOQQx8Mtt$z>i}u#P|N)yQBeLas~b=FSqe+7SpQm zoaf|smV(~>B{eh4_i@PYdTq7T{{JcPz;84>@Tg;LYDW5r$_p#t^oyLL1`w;RnOanc z{dS)rE~p^+wnq`_8PtIru(cedGOWT%wrn&8mcJH%K;nI#sjR{BorZzT>)cJU^E=^; z0Q|xdfNH8L4850m!`@mV&wbeF;G`CG`_O{ zJ5f@%E1HZ>U0A%uY~DcWTD3S(ve5VIrVJ@^rDiR4&Y7317WNCBAxH|c>HT|mLy6pE z0EwbarRTVfG0ek}JX|SNGIR3`FlFTA!tm-0QiJ`EsM}B!@7uM*=u-p!_9vp)G7qQ4 z4+IY;O;?Zf?3jf1OP#F!tV}dse2VCZLEx;>BvSY>-(HL4BCjvZ{i7ocfOa6Q6eH!H_ z2CN80yoakG%A$g1_v#vDSPFAlTwhy5s2H3jkl0{>#)Og$82|7eCZ0#bI1u_kZiUTs zM!hcD>JCl%l%u4ay4a3>Rh2-;$U!w_^Hj>m(gQei1h$GL+PQ8X=3B-%{$4xEer zMP(#3(`H)$#D)MwT$RnnH3OGz^`b6=$c4zADB`H_*1&a8TT=xc#^Yb}2rwiyTIOk9 zGq&)snIAQAC~pTShPZknXvkr>?510W+@~Fg&7^BOk*w$A7X*?>MhbwZE zss*j3^_NTRI)I2K0{WsDF2V2#D$LY*jO8`zqH;_?IAGYLa_z+NcwWWZ3GmRhg7;=w z(5k44*o)lL0UTR{(QOA1hX^2|QvDLHllXT$5yc)AWdg|;Kvb$7aGh|~7KgMHZMq2H zq0($CwF`jQLx6}p{ytn3Y3=^=MH>>4D5fZ~W&%9e$zVUV8-ToB1(1f}`&?YK8yzO| zBS5>(bpXyP^I5D<8JP*z!ge$b07cmqxPot9w6NX;E{bEsvEtU7b_EZ|u-!Qj8{s8z zBU-J0hwExw?GA2lyW->%z7Kg8*IfXP`FPeCH$JWajU$ocFsfk=fWsXyaY=CvAn%9)NOXhTiR)rqhx&?* zE2{;#aKxZOcSKxMLIB7+f&fx)e7^?QG+eYL9ZEzS&WpI70dO`ZO2-lkK;A(GkSNZ^ z;hK(X3a)fqiAdb+wFnn2^E}|4Vk@C2Apzt&!T=M&LmlZ7TqonQ&E1Wd*b+v8y5fTV4|hdeu(V8t{r~^~ M07*qoM6N<$g3HJ@DgXcg literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/widget_avatar_2.png b/TMessagesProj/src/main/res/drawable/widget_avatar_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b160967c525bb5c095a43459414a773ccd6744f6 GIT binary patch literal 13603 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 TB$(un00000NkvXXu0mjfB}W+e literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/widget_avatar_4.png b/TMessagesProj/src/main/res/drawable/widget_avatar_4.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f15afb96df56f950d0b18b96713a68b54fba12 GIT binary patch literal 11448 zcmV;pEJxFcP)<h;3K|Lk000e1NJLTq0058x0058(1^@s6=SJeV00001b5ch_0Itp) z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91ke~wq1ONa40RR91kN^Mx06#wphyVaAB1uF+RCodHeF=C~<+b+O$;mv= zfrKGp2!kRxV3|amKv9`~y>-C0-rib=+xxV=t%~rA6~UpceeAup`df#KS}g^^UYsi^ zpfU*x2muUJ0wFUAkU9H*-+j(^vd_tIPLjP(63KebK70E1H>~yU^{sDx!`9>+qjigQ z$LC*3c2kq&py)ZG$uM1)L`{<zoX6<cG;Hda?7?{zc2&4n<v!MNtVx;Zasc;ogMuV? z!Ud8yZL!wCXU-J@Kfb&4)O<av=Cn+KkS{|)M*%1!AoOhPL+mIu;;u*BdD!m**uDYs zJ`InS4Zm8hov|amo)G7E3P8{NyB=0mAQPcorU5ipK#=3@0*k-GbAf6L!1OV+)Vi1q z`Rr$Z)N1{GzNd%l^#G!lsjZT^VDxPO%T(;cdpOf;0IE-r$JfGQWL0n1PQ4O9`eHq3 z$u7A<8e~2SFb~y5R1XJDtJy=|&miwB#UaZVo-ZG3i?ya!1NPvHy$V2&-lS&%G<Si` zw}bH+J(#Z@&Kd+!pa;pT0Mm1eR%nMh96>id&?^A6be=w<u|XaLk8Z{0=q6qTDp|JT zUJrK2vIQ%(eSu1}v+49`06jKaAKRqMLoh(+!YB^vY$1E)bDA`v%&USldF-Lp+RmO@ zh8_u^WwZ5*8g+RD)zr+M%D6!03qo2OtjWU<uGY2(GF^Yt>QMk%cB`Jyct)1$n*8LP z(>T7Q1&yTX@_cZVEO_vBt=w1eK;7>V0Md0`TRKO60FCn`n&K&eDtvED2QGkO2<_Jk z-jY`|4Up<)>UID<K1)BpUgTNuVNy5qqPHc#3GVc}A6TR9>duUJ8-V_HlOCK~Cy$`; z_hb96x2)`vF<Wd;<b=w@H?Pnd?MkG*c)JBaOK#FL^m_R#?3^j>Wv=g@pB&I+gBBvU zEL@=#`1yoo!2%ATN9X7>&_G>|5+qwzioS@*ff6`6<}Z3ndoPge2pE7kjAGLcc@%}a zAC_Oh(hVdtyE`o~l}7awlg7!SKn*Jih#;5F(Uag1T#Xji<nCtjxsX0uY8&BzoW0;J zt<>)F+76({Z_)=g)XDpJHAdK7n7;U%IRL@#bA-zD2UciDo3C1bWGjFkpQn#*XfVL@ zo$C0sUJUlc2;mku901WuZI3-Eh<*J_OXup70G<udJbmD?OL{)yCGRN%%ECv`PT#hr zgL26%{RWH*{1635=ycBd9<+o5lmTTynOG8`S0t8KVazBpy$b2{IS0L%-OZ;B5cb@K zYqWn@nGZ_=L{({M9$g}=%w%6&)^Gr=vucdXzIwqbZId-ITIi2)8O*eKdPTJbmxAFn z;oiKFvBo_w4jXS8{vZT{G*tdP_P*}*SdTkJe#>E4PqE6dcCn*t<#aXGKZ7iKuEC7V z!51Y>=rJNd!Xg?ZEc~=YL{&*_Vxhz*osg)wQk<WX@Q5mLgw#opqaJ}ZX>16QhWc<h zdnQ(@PsdADMY5bK>5qM?)Ko`HEw*~hv(SP?f(a~JEX%IR$ow>fUVtY4L@S#3T?UZh zBy5t6kV((;^B_}=t}e!q&<2T5J|USyzLI`}_eyfVLpU#x*n}bpCQvw@ouebvo*Xwu zOMpeVj1vP)1e9R#GDhb}U2UYCD(xrbB^gqjKU4}1kCuYG^W;orA^@iestXAMsCpuy z6#J0B$z63eBA(8Z(LJ$K*5QrrQ66TDpEhJ38rC2ggLli|k=rC|<Yq}9uwOzWFvl+h z>VhC>gmk$lC^|y~SP&4(4W!paKtsjJ(Qn7dp}phf$i7RY<T&O5AU{13O!Qb!8Y|Pf z((Tbn&N;b_7S}Sc@B!yp_x`h5V)aD3ByGUAGVFp+W%R`#NfI=TBeD`V(I{+mH4Hlo z7+*y+G#D}x48#D!)s;zd;_xWh{l&GC2S8O6r}j7?fnATIWyT2$ouW<yh`s92_V0jQ zosOeZIre&pz@f$ofwmbqY=>Mlb(Lg~{zAgzN}PacqK3iN9TbFW(a=u1R1^)6ecP{+ zof~hIllj?3Zi0J2^#<YTV9#}(?Zxku@Qv|2b;6kf-8v+LzzGg%l<ZNPWx_SD$>0%N zMGHmsL`_5B^dzEI0+?#6666~IY0HPVNa3-ehQ?&|*3DF+h055@j3??afQ*rZ^|B5c zdP;W{8onmh5R#GojZC`kWyu-4-U%GEmO5?E1gbDJ(j5&_14H}E4YOtIN8gw7;xriY z&gwT%*=Ugt2BqbM$h3}*Z0xWS9W!k4qe%Sr78wY{1%QSIX-s^nOq=^>nQ`k=l9sgx z4JW+9v~jw(HuaMOcxRh}#SvN~14e9<kr#d<O$}jEls^nDw_w9Y@-rf<gAFQel;Cx_ zk9^#bh&!Z#Tm#_0L;@~rv?ED%Ev(WyBQ9DmSIqk_NzU94G*RPpzy9x1$%5H})8*jT zQ{<m3ekLc54DC*BM2=qAk%9VtbDvXh;4R_oiGYKLS|>8PO0K*8Ntt)|{gRw<P^3Pr z_k)MXqbmU#X(+1U+kbhtTzb_?DAFb|UKrjFEYTzOEM@I)vVI4|G~*w_llzjt5nC0m z0VT@F%9ZQxSSlIAcK|q{J>SmhY~fwn=&KF0<io%H91h7iLmPEAy3Rg_(TqRBbn2J= zdEPGo88b%DN-mnrft&Q_YM$p@xDnu4BC+ry8{qM$RJ}P2eMycwIR?Mc+b=yV#m5Jr zTP3gsf-kK&I8t)_nE~rp6=qB~4j_08-wqlp-<$r1QDwy@o;)|eL!7YoK=nLe<W{-m z=l4n0sO>PW0}CK33d-D{RDEh7E_47BWDD#(zrf~CqV0ttcyzr<rr!9XTsG^^@RI;Z zuo2Elf<;n|=Kkszej~X%CI?m%VJ<$5-SNH_bnpoZu96X0@aS^oyk}+V>_4GV4m6#s z;NcsCHc>=Oxy-q1fsDRnePA^a6ow&tA8&5E8pyRi4=mRJ5U~PfGi~m(GUbN<=Tzmr zy@_rW+u+5nIU6IZpI<8bz6`7;f<Zm5z4eLO)j-DLPF69Yop=nJ2leFmtNtdFum4LQ zc)WRqu9@)2D!Jj##WHaC?tp3{Ul?c;KwMT1bqH5KwVl|fHD=NWa@EaGJ8hmm&C`<S z08tb=h-d$JAx0Y<GCGi32D0G_FkoPzji}oM5QO?*AZ#DDFa{3$2Hg_N4EO#yZS%At zB==?5M2Y<m$qhgJjYP(r3XHRnwvcmuN_RHQ2dx6gSPj*=prtvi<;S#n;*v__`XBs8 zB4W#&z37&w@*Rs1j?~PY?Q+e{&tT}R-s<>m8%lhu3llA(ZWTaWN*5t*?XsZV!v(gc z&3RT*2Y-VW2RzJu<R1sXs|%*QC1WS94OCU;aABfF{#pQti+IEJa(j!A7GI#<bHT)S zWbBmHec<URZ|Q8rZ`!<PBz<6BKtM!H5F6fEZE=Asz(YA?cn7rdoI_6&(+cJCIsa{R z9QODzJXRLos<_Yz8;#i{SI+w*9E@Nngk~oZ6UNs8yb@^vAgHSOUSTXfHL5Pu-Iv|? zyu_yD_t`yN;V$f<VdK`zdEa}_7$?=0sQh}i6>N9_h#xM2W}N3&WStDeX*R<z*eGKr z{BK{?)kz*UKSn>WCR1;CUJ_D@jY$Q~_pCo6Hi!{(%pL&ZS8t%IJOY>lcl8)uT$r?1 zgJGyINf0LP^;KP6<tUy<RTht#C*!Yr-S%cZvElkMk~`xb0K(PV+;?m^p!OMwsWzFI zJz<O{v>}aiGRnpf89RB6q-7qlT?>J~9vE>0h#zZ%eKOT90nqk|j6NfmUik*JE>8N$ zIu2k=cm%xEmt6U#?S3I*gji9TcLRuD`ol%rKGw!&`|t}kNIC|=OM|U0CRMg`YmdPf zqb~VCQZkOZr*qrHfN&R9jOg6}f>(H&O$i!r1t<Ppbot+%&2~C5`p8-iz!r*3I4NVk zw^nFt+DT@txB&z|!WDKUO6@aX$S&!ZwHroXfX8RrRj8gAFL+BW6cu~g-m1)m6$3y< z^Bo_kwTma5c{%Em55>WS4g4SQZ&!A{yYa#nN=QE<Lol_QFRfjKG1KE!bKU?DKaCCJ z$QIQ=<2gFMLUP8f>+}2AB~cYGUQP{z&qiMKk#jbOO>Gro#rT{$(lr2t>gzI<2dnoS zt}*1iO_)tugdvB{<g8AkFFq3oFytc(YXopDBrd3B8@Vu}05saJgo1;0sMOD~d<Gnc zeG~u=1W7o?QIqGkR%5VASQw=ea_lG>TLV$CRg#&7Pg>b+JmZ^?5`rz%wdZ+HA%`np zDsPJGcI1y*2eUZ_<!nPWW}gZ|HD;_x=WwkumQ7p5YT|&gl>XmJe9Cdd<!*KSMtl@T zXpmGE*UORoIyqb2B#{w8GB6`l;!<JO)uCXv>hg9<Mc^QR$B))YA@bKyuS<Mfuw)Mo z!=hK1s#FIC*}!*t`7_{ei;Ag|vsJOStl0=dI-A&WeEyXXJhm9n1P~W};u~R0*98Pr zRnZ`Sex*?U`c|3j-Cr#=wYr3bX)<zHgxq{%g4}y&Di+a%;}XIPC;`;__nnpB{i#qs z{G>__AFDN*)&$VF^P}XRJ5yxt%mn9Z9N?3sgsD(*STr;Nqa99HjuJa&)e$qqjsrrr zr}~1t*nIED(T1EHXf>g_I&!2|Zoex}Hf}lX5qm8_v~%}aV_W;tDOvt(mSknY$sQ;W zp{jcS{c`!&pC6Wj6L@({RB@_N)@`hm^_wc??jNSg@0JXZaDdHfEvaD*qRb&*%aQ#6 zkR1p@nTQ=$0JZ>#s+smr0#-t`d<hmX<Ww03r~FibN0XeK9LdbgG>OW2xC!8z|I<TK ziYi0`VHW`mn>JO+ZTI9E;7LzUmk}dIhy#l=n~5gFpI$1GMUUk>*<-cIhSkv02ISgP zMK%`%0McYw^SO0LG&`a&P(C)P5Ky)F6#x((`~7j*u=%v4rKQQ=|Gq*tZrmuFH*c2v z@4p|KkMBh@ZQ6QT9(l6Bejg^1ttzjVpFMa~O3NDM-h1zrty{Mmd0V@7tqdGEusKt% zqo<!Ml6T%KcQyc8-0j*0R$-x758Dp=*2o#KLry1kEt{=B%}ht5hnP)DOZ`8nx(?)4 z%S&(I3y%QGvSrI;-n@B|oSZEE`}a4_XUv$<B2zEFSt_}Et6`5>{i>Uig7#Ulrd+<< zbyhCB>@s=!>8A~?n3R+x*IaXr{Qmd9Z=s1AF@N}}|2`@8HK^vT%o<+WnD}BC(iQdr z2-qQjVoWTs^e`?7tuL#GZh*;ezgr<Cc*9duQ{{#mJU>E%Z>bxA;@(VEr<>%B)tEZO zroJ77XzR~5%Bw3&jo9bTohu<Bo^6xq)2G80%W9GO7u!zDw(aQV3GvjNEdqAr0-Uyy zczMII#IcQ?t1%dzY!84arg#kcw!E1NLzq<;DIy|5;^X6uWAk51N(v0emeuAL+fPdq zoAq{J2-RvqLA~rf04)b%9=s_!I$ENlS`PTEMV@v*Ygw8vbZdk~RT`gi@Xm)-=fn;n zA8l2H-tllMuB8OQH#X>UAg{)Vwz9HP^7An;--`|&JcvQ&EqfCSi|S#c;5t?eu$;ij zQW*9{#m;p1@5dUBUUc&0NhvLLYACN;a^MikgzC&v!aCIv(dCxE!=^k&la;nrVG+@% zOletjNZac48K+yItgK94c;N+)h|9~%W%=^u9@o@KO^q(Kbl%xPU}Rl=^V)`QzWJsc zKaMKgM6bN^3bYhjrLB-rCX4aIWFn(0T1m~COT-S_mbL*XJi^mIV@0-U+QdXVt0yc5 zDZl;gZ>74rTJE^x4k<1!mM5NgLU!zc^Rg8R4~JT(&&3Xc@ELb7sxlhJ`}XaVn{U2Z z7A#m`w7yoYT4m&|iQd&#$S4!aW+@?0l!4XJn(`RK-V)mYWPAn3lv<Y$k=bChqJ|F% zlRapOk!ovejn)lYIKHS~T8P9X;GMCfYXi7Qg2y{8#UaNFozBBen>NYJnKON5%eX%* zJIv{)LKST#SuO)p=7=4eUPost!NHzhSX0`aKSV3)vI(8T{KQM5C5RoGZOMqQDx3Li z4bkbSHg%2rwg_6MKl<NB=XCsIjp1QIa^aZBw)53intoijMFysH$&xDY(<Wb#4fw>H zK5KfsJpRlHIq5Q3P339xFfKM&Zkdf@w$`0NTsV-|YRo%2h-&v3v|A~@xuJYB?D$MW zSI7W>V*mtAV0mi_Ffjz3xbtsHLf;p@4%7jfd}*{?JPvIc*icpzzocRp5j(Vjs<7Dt zphi1}a6oWb!@}jqx24Eqe>mYcZ+?7RvJA-q2)qHrW&|zsO=vNGh(T|M;g30sbApN+ z38%(}j!+p1?RRZDKCg#8TTQ&D2nPC`>l5VC7mH-`mx#v?3V}xb^?m6Qj1FL9<bWT~ zbR>u^GHA{~75zX2kS$bOgSXWVg5Vzbk94_mihotvv`I0t=$HM`r)!orGRBv)7Fy?( zBj}jQ!#Dh(eW+PrjtEzqp&yVNk9iG_LfL{=%~NQizXu-|!KXlm+X4j=9p{igE*mK6 z97^H`5j<C471t8jemv_l2r-GTDteXL=VSf`Aa=+C`v8Q6A#EYZF*?>EuRT9RW|H~s z&~;bFAzZe^(RjvlZenwe+UUhYA|Dhxfk2s?0pSkpIw0T}rWQzf?HF9*Xr{9|GZVDX zCF7%I)k{NUI1S@A$N}Twp`Z7Y#rOAj=F282SK~Xcb`h~dme>X$emm4Qf~H8rTfX8i zLyR|m!o^V%9p$X=xxe(nDEY&q1C0Cq(xF1kHVb9Wpeyr5HlnYN8paC;?dF@$Qs8d^ zKpRl?dAkPSS)MR4Mm|_ET>j(VQf0)@aCB=p6G%;V$h83d>i-!kOBQ5`g8=l_jO`}g zv72YBT6*d`7DKzCs~o8QZ39pxzG`eM0TdCDL2}<c>2l{S$wu?J8isE~c#yEk9>sxV zbR3$&qpF>i1tRZY1$<h8ogspV@&3<ICx9j-IgMbYNdTfjgTv(yPYse1j0q|!ZGd-N zmzbDfW3;4(JlZxQk>x=jWMeJA;TqqeccUY$Aa)$k<YlxWttLiUflp)GmV1?9;DfED zNNAm*!(k*VO~UIGFae{g844Z4E#z&0=RFwA46DN9u*1aoXcxV37<wFC7*mtsxr3q2 zv`J(vZYKlG$<%^WTf9f(o7JG5gh71O_&Q=ub&T;<L_3lqb{r_v0b3$Rq?Ki9(g;J^ zaAw&)p%6%*T|>dtKx$P0N(D9wn9XC_J15XQ--+&(!`M^vbOk($X~2uo{HGzl1-<>F zVRIw_EXsEjjf4_#9)*Ar*yt`Gfb1spgH@eMa%vy~-3|hF$VLoXvz{o+vv>olDpD}0 zJ|8b1Ic)<G1i|1?8T>W`#~y5XXhK&)Bha?sMtN~#KPQ<<L)c1E0@@90fE&3=V&0Sn zOa_RC!q+nfM*n%(=vy*Zt;Pcu{y_s(m8Z$s(|CbxVm)%3>%f?-+(sL;sRpL<4LDWW zPvSA%*78w_<TV9ET94{z4SYg{01=4{Q}=kzV{TRhhjE)p0Y_aUUkP9W<rsR~4`W*o zqdOZzI{qaS+6q8wuz~qZ9}dK#f}zHuQ~VyQ9YpK|O}Ievpe>;5ttD!p`kG)AVu-a7 zn`7hKz2>;n1}Oq~2oP@62nsaZcNdxSKu|*o8TmQ@4f%(IBHK{qwbwn;m3(7FVnN<{ z&RHK_iKmTci5X%iXxd_}0k&RV8{xWiIS5QUdf-CT`Q)C(M8@Z$y7&h)56PSa1;=x4 z-3=h`d@w%*`5D+|uOEd`U+1jmaLF=43#<nIpOeRi+cGDN`6OnD9aVeVV+SGj<A+8| zEuC3b4{fFPp%11S)q^SpONPtEz}4q?CAJ-beAuHvp)m~ic9SVBrp-JsFU*ri`m9z8 z0iGT3Y^zqHRe3`vcHyxc%n3`hvjw(~*>%>An(Tp*d81YNSMjhKtExzr6GunL;PXC5 zokksQ0Z~Y2U=bIfHN|5^IHsW9-iv8JxJ8V8nJ+RJ{>&_F{ej~s<s9a7G^|N#?>zJW zU!`q|>kMkr<CP+ZP&*yQb{56~&7f~!rrkIaLtW{dSLt!j&fBZg{7=)Lka$@O4xW!s zM1@GGDz87!bs!9j#NY}*pQ2C?cHnuxf)YTr)gf{u_aYh01s1F#BVrhzY_6NN4~{9Q zO4zC)t}2Z|_P}4b7uTbK-(=XY{b9SNV9)bNY!Tps<_hm`7Inm1O)mkI$Z2fF&^E`> z04%|t=L8KKhsK6TnJ4CLD$;g$sSrR_h=_Zuhz`V>C^@ievYo9jzPO(<%LahLqh$k@ zZ>>kYW_de>O~~Axm&>FXuZSZIT(rs`L>q`c6))y1rJ&@&a|R<(uvOUdpc!~Qf&c;s z!cpol<THYMoQGm#twIe(A{gkpse{t1#YW(;54MH?;yL1EHi&CJ!spbpd|r_&I(6#Y zV=R#IkmuFTpJ75_asEhre}0tE2DO7w&iXK5hH)DJ`qgsn%%ijPEjXWKb%HEJF<N3r z4~~^=EV5}yHAabYG;SL7^S7AIpa@E7R5~sJAQiaG`Gsadx{qCwtOWoF0^JmaimHWB zi4ZSRfT5OYi<ni8VvUb<=FRP;<^y~#3#t(JEh7ME&-SaNwk8B~&@7A9BO)l8EyN5j zHWyu!k3B+Jcv4>%Bzv}AW1aS4-l)kgg<(S`DdA$zD(c2jA{S<g!~$O^tl?^*AiaqI zAgJ6`4Y=Vx=5_OCzUMmTvy8)=m=@hTOq+RNUYIB5&7D_*27}yWEb6q@GUpwsKj&~B z)>b9T!LO%yyg2?m+MzHethh0Xw{;ypg0iSX5&0RITIj&nljT&=0Ewel8eiY*GST}v z4n57>I7SE6kwFkz5(G7M2tJ`X0RB5Vrb|VNV5?T31~p{m0+Z4pt%1Ow{1G6GihF|q zCW0yf0~b@_bk0t~07l@0Ri!~H98Xa7$<?X&gb4y$<&nmM3WvTKFDLV}ZL7YRbz+5k zl3S878S>ewqXHINzg9G>lFG6~*}ZwXOq%taH2|V8Xx!X35OpM)K8Mik@)8sUHykn= zp5ioiD-fg*tuzHDR$ts`&k&FP0*Qd3rlQ?M`-xjT`f&-GbhNVKfe9MtMm5NMa#O@( zq$v{<M6T=SG_KUWuIynvH`Ry8m!HltR;wq^ZK4`tMaAu*fS1hH-ve`|tD9Et`H83G z{zv79_unaz{5l~#rIrwl>3ksL**vE`1Yx$YUzm_8scX;AF3|X8Gg}$PHP8xmxK3l4 zno89y)GFL)T!#`g*eioO66q1B?*1kP7PU7Q5+F5NU=skII|sw3fQYQ>Sj7^8M|Mw; zSD*eP02Jc)%V5r)KgW2<-e0&{o1wzGHIVDVYuMWYAXZ~V`2(Sau9fj<ky!>Hs{c&9 z^1mD=@<zVMXQ;0zC~tf!fx7mzZ=#_!qVcE)sc;?_O(%HHgBYG0(`=8Zbt3TaOj!9d z`$K&}MOXzMM6F}>|IPpWzSP&kc;-uF9}y#N@=$bPF|rCpG^}fP2n!FWR=2IYS<aTD zUO{WYG9rjLWa1}TBL6lRjvgR`HU_u$NC}?8SDOMvTYD8w?HR5u;ynU~VMn8W`^9j4 zFewvGDsb6C@Q4H2XYY79xNCxQdEd73)5Yt=1~Foe#sffXnxV`q%>k@DHndQ|0NJ+w zCTIv>((Pc%6bMQvmjj#&M~M7jAgoxZ7YdI;BwpJSHf~!&OoM4LO{%#IVnu#7MC3nn zFpLAo1iO{_pyLn&=Qq9kBXnMe*;aLtH^}x%)qLkU$-4^UmF0MI?{MC>{-3tOmXE$K zIb%POG~;8t7V29HhJ(jq5GSYJOhPk=9j;%%=3<vY5sV%Rm(?4=rZyaQnwTax0+n&I zn#w@ieH5Bsm%`SepNG~q+x1qpwvddQpnZ0(|3C8W?(q_AAuHYSn-7Q$FCq&)h#yvc zY=;~LPcl4iSa`z4$46YWQEs~L7kEj*SgX9#-gz{vU)RMlfahD(&ietRTy$0y<DC5* zSa87*K6SAIl-ir)Q$SH*;hsRmWI|(b7^_Xr85@d?py5bFHrJ>b8P*Ph7C%*-Aum7i z7dcguW^2<OEGc+soD9?!Q((>1LIW|tqjU6E!PNVkgIRk-BX9rC$@2AvSu&2_532+7 z?I5Em<%&2SHqv-#hKr#Us0lcXq7YsSjw7NQfB@sQ)2LcG)PkB!X$($v=FAH&>Ok$5 zh`2axH3jjdVoOK<2^h8r=?kE?v0;{}2a8a3=~zT+{ag1+MNyjV+6Uv)UiAhK^V0%A zMkXEdoYcuL+q`cC>iXaM)ptoo_Scd+Xdjpkf!Imrb~!anG6c`*%G5m65*#y4!Sh&Y z4ICQ8@YH6?HBBR!pyG8SJoeN!2H?~~#*_B_h1AN|sJg!XVutPDK_MD|l;>J24B6L$ z7Ol_@;o|EpZdiDMEwWQ($@1Ro4@lh^*b5j09#A5ns3kZEpMobRsAV|to!TT8nkLS* z@tA|+ITgn>zss1Cqn;&r0!dhRyYSmF^3mV_9k?ZmZKu~=m}rp@+14sy9PKi^VYW(@ zRaxGiak75RPw_U}npCT0^teb2m^Y=d)ZTnAz<BY<C#o(E(0ljQ2Qg?q(Y7J0?lge` z0}Jj8o(F9LXu(Qt9~kP<=J$Nmnllc*Hx{C5ODIOwfk51!E2PTYR^JL(5f+KoWgrL` zFtE@@T5SS|;Zcsq+IY^A%WRE}nfRVey8Z>c{cO^B5gEv#g@@r?E<5W4QCm#)dbC%b z5;&|53(-nE3fBWW>b%Q~Dl06aN@m`%1Yc=BZ0i?!$U|Qk@cCLVnWg_PiZs(|f$&pA z{RSP7TYq^ER<r;>ya(QsnFP+(qt4DMc0#dxdlWh#IWCn|OQ3BJtC^tUBS<KT61W(4 z9mfPn0Ep#Fgd=p)5ZGdLh~nH#Frts_nIM0C=4m((BW)Qxk1VZSxJJ9)oUHe8yBdgr z(eQZKYFmiw7KcSv%Zyu}l<0(_mf#^X*{iwd1bRGyG<D7~p&z2fw*MpyU)*PxIPdjV zB5+s+j*H!KOyr;Yo#Rgk7M80B+IJty>aB%X-uf^Zgki#$UH_snV9jzC(DtG1eUMK8 zJ-Axi4!iAnAMtePHb?03`|$%uZ2==%Yrcbf3{(%0s2q}^tmP`<v-#qP$j4yz5ojnf zySD*J0f$x8ZoDLXDRvb)%gZvdtR(K$&;a9t*B?IXH2$jBC2Q0UEZpFAuZyRYIc4uF z8YP}~!v#ml0+hM9-9UccWYv{9WRFa|_GM_1*4<D>)f9#%S|$dI0Ye_1T;`Y?2lZ_D z7H@4XMyo+HQDf0h!>X^R5`oVAoq+>$Cp69ndquWmUxk;#3>@a4jZ!)$2V&G^TT+5| z&k=rBuAKJ_7MD0{*^2a(HD&G(8<}mN^v_+7)Lc1YaWUTY***ie6M!a55Jt^ick5G< zh7Y2(`xQgtAT`Fx*m9_HI{M6vR5;-%`2vhc<i@33LI6q*)=^psk98X{j|2=iYRZ!U z{a$FAF9DikuyYL1BaA8wGs^rDJaKSxUOZ4_5bQp0`-kBaVO&*gN`bKw$C3SGEa}cb zcJEuTLi<7`(ca#i_4dL+Dd^gg*~UoxN$mz~=O$ZSqb~l`=mUd_1o=pws-Da*L6h}s z7?+$kL*|-+q|)Pc#>wSXQZRHP1KNuKq#)?ER0cQqM%wB@3-`>gDiV)b{gk8icoO-~ z2f#VfU%dz_oJyW~Vj0-+IwaXS0zV4XJ3ZaLD7aB7OVZ`#$6u0)QuK+n#vfmCG~eH} zaJ5Xqw?_O(xUH^?=E&SfjPUVU`rW|5m$=wQ-Qy14;(&4s3$K&!U9;TyG__w}FyupI zU=jc^br{~-a_1Y&$yY3%nNjMPZ*@L^#=+2>@Wt_^1Qfv(3ovo~DO+@W-VG{dmls@Q zI#id8y<6z61MU=P_>3AOOO06s4a0oW4Z-hoFn<h>q&<kw5jgA`83fReOhY#d^2_V~ zfQONx1sj{1FBeW-DIcx4rz-%0RV8=(3mzuzW(iOHAx!^Sf^ZM{6V@Dt+Gq6m^)m0? zUq}#_p6#d$o;l^K#kcwx-e$JMC?GQ5TPP}FB^*Q0xJW?707TrVnPLDg&MxF+FlC=m z;}H}jV~<D}kFnv8)d@EaqOL*pN&Dp#Y??{{<ur~tgOF7z!>e>%(J@Ll@jmm;?i0>* z%)vM&f}Cl#S7o^)@H&7Ns=|6qFE4vZ%8Ie-Yg;_=dd%zeu|;dNg<jX%Jq71FMmeGK zaBe-mGq1~(jy&lIX_AXBUx7Lr8lt`vr6a>BG!CR60=r-U-c~x?@=Balo9a2oZ8uSH z=A`HnI0HMR5F76?ECt55pGG@16Q{JA!9*=ZL9<n8jOjuCISQYX%BUgKeddpGs(5kO zDlsk+XEf44&O&vS7>T^#K>|l<MQ14g|DlCq@O8-ZE`3)%dHYA6<@P5QO*Z6&_-?j) zN5$fHn3mk6XXqHmga=W2-^3>7pkcdY{;%%BcwM}u)Ie4c1x=w=KocEC^>!SZiQ0fd zV#(CzD=iA2#JxH;E_nSZZh7y$f_a>(IJsx5igS(#{s90_3>>1Q&S)Ixlb-(=A5@Y* zR9;;A3MLl9xv28#8LG9j5-n85E?l7%w05(-YaP}=jEo6k%+P%Ff4&30_{=5?GU}2K z@u_PVlU9!XG3MeRL$r~Sq5iAWvBEsS#1>gGw2V=mAcqRC%xP=6RoB#>h3qVu0mC?G z)YFsPFV<OA(I(^c4r(u}fTQw?7FkmNJQ+N4i+r>7a=!-GqsUy$etu`b!(`10US-3t z{knaR9K2%0Vi*!KxxELdk)vWx$@E)(2O}D-5UaG0IZ;Ds_;a8*G?X(jXpGeZZ3}h> zP*X7@+*sA225ME)_zNIJ;U*qa<0-92dnyKYRR+=?2|%CM&$;gpt;5M;owae?3AT5j zi53dG4F0v;omV>F6(427?I#wk)}CuG*7ojoN&~3~CykRun|8`%$fZpX(Rdzm-e>rB zJ3Ou!L1!x&AYlrSD&KM%rQAk9ko0QP(52B^g=&u4iAFEG5jZZ0&ng>40fc+A0C=p7 zZ0>0@v0si=5rL}=^k|&ZRwGzcywsL~AWSaI9<>?YjW5J1x#>oB+e#MM+c;?~W+Sg@ zD}?XsT>{WFtWdRdjy@ZF-w0lhXf3(mU|og+KoSBZ)q$~rA~%>^3DQtz^H?p=qpA>s zh6XX0+#tx*G*ueSyk~$0&k`^Mg)zGjY-5X#PD@@lJm9!TQh?#Jt*SXAl#PEu5`l@E z<oV{0=Hlx_ttW+C??cvSQ--aF@b7Au0K_B~yrq>sev>}Ep-w&n%QDQ#vePswwo)>O zeuZkI%SoA|?)b4GPcNY=;fJ`i2V<qyP^1p|m?8p%WbE+AJ-0w<7^dAGF)twvGI+!` zOrM&A6IF=jhj6995h~LkSfQ0RU+vtH>$U0J!|Ewy<S3RBnU0L1Db!4SiBmHVNIbvZ z>^)qgIav1|834c^H3l~VL2X8}-E_|DDx9~5>)uj$rVbk@BYPLVCsNs>r=BvRtSB?j zhdOs=34oaN11q&Xm^gR?USJp+P9lH?<!poM?~;~O(e>^9<p5e^aj-cP(++ubuu?XZ z5oP6XRKCJl1|TN1V3oEB>il1D$dzBwjBJt&cAEOvt>P=MefK-U0XS?24c}qbKn;|Q zA)}7O<0Gu40AgAg!S)ZR$+<YJj)^aqMD)?v-um)U$aC^G)*k4G=~6W5sCg(8%EoG5 zSPmd&(3R1vqvMOqW0Ot*K%I6sSzX?9CqDSw;_>oE#hot4jH#>b01ugI3xF8$|9xBA zl-B>ql;E)Hf)00_GJ-zp8VB&w#wVRDh)*n=vH-H^T4ZfM4b5gR>17uUlm_j6)W5Cz ziR?}N9FAR+ed5rkYl+*B+Q|jmG?2=)QGoEE$#6$(RM-0UHgkZy2G8vV4@+S?fS8CD zyQLI^x~9RJdmKPQ`>c;_;Q)C{9)s5g&uvM>Gg8~DFwf-Rv@N=12HgG2aow+>Al}dS zowvz>5`bsEmb&%5HbdBOBj5mH8T66~8Pe47R{&{>4P`p_qSUkvn5}S&mi&2#$MbZR zSpliSyfbMOG-WWVG)$e=y4IQJ9rrnPPTrA+;AMA!hrI3<4P+LwUN+%;X{dh|wf7|R z^}b^t9MEJFT>W=ziJ$NC5z^M%-3}m@j#GxDc>E7=@FY%CY%Ou`kGvRK``41P<&}=i zp0KOfJpw?gaC*h$1Pta~3cdIfXrykbUR7Rt+@5PSaf*3Z_yR3{qsOR+?#yeC0+3>a zUOfI{bR#bY!z^DFM5WQI_L{84WV(m7l+D|FTE2TEfE1I^<R6O)?jfAdJ?Au%b9Fc@ z@TEP5ruk0Alb*Kk(Ew7+LbHDaz9jM>n0YJgq;4MCsB&e~-e{HTuS-zKGPJDr*_4W9 z(e?@esnY5d<FhbL_%58^4j_39pH*Rc?OrqHWW6e(+H+d`mP5Uz9K8xaimAH3I7mv@ zUV-7I^HH_U!*$Ho>y>l{4ThB%n7>?-W`3+`i!p|?cTukdkeS80eod4VmCZ%d_BMcN zDr_c<knhQ))c`b~K!d&}sfnvJ?E}n&?7h_M0c2*qu3sA_C1n#ajuT#P{R-S04^Uy! zdp8n3P>a;JU`*7<SR7)VBqx5RY42h}+ING#QvmW7iJ_f}%h}(?#UMuG&Ch{`%C-$u z23WK_#Gi|_IB@+_NlDny+qH~0U(M&=X#klEs*ZL2a)*?h%?6Ni;F<%VWEg~<g!33^ z2~1<vG5e5v;W76htqOnGbZpvbXgBVw0F+W(KLD3!F3xi$IWkYv)}K>TQ2sxxNwSEp S4{cQd0000<MNUMnLSTYmhKPCq literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/widget_avatar_5.png b/TMessagesProj/src/main/res/drawable/widget_avatar_5.png new file mode 100644 index 0000000000000000000000000000000000000000..e48bf6c736d944eb68f0b818ba6fa247e4695c27 GIT binary patch literal 10702 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 AAOHXW literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/widget_avatar_6.png b/TMessagesProj/src/main/res/drawable/widget_avatar_6.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2b8dcf73fe5089fab78fd3fbb22b2402be603e GIT binary patch literal 10317 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%0AROb_O`NVG~w!1aJP|T(glj);`#7mO%E-~O{cUV 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/widget_avatar_7.png b/TMessagesProj/src/main/res/drawable/widget_avatar_7.png new file mode 100644 index 0000000000000000000000000000000000000000..52d3775e5122d77be159fc0dddbbed24fff3c26d GIT binary patch literal 9970 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/widget_badge_background.xml b/TMessagesProj/src/main/res/drawable/widget_badge_background.xml new file mode 100644 index 000000000..e826fef66 --- /dev/null +++ b/TMessagesProj/src/main/res/drawable/widget_badge_background.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" + android:src="@drawable/widget_counter" /> diff --git a/TMessagesProj/src/main/res/drawable/widget_badge_muted_background.xml b/TMessagesProj/src/main/res/drawable/widget_badge_muted_background.xml new file mode 100644 index 000000000..63f9c4693 --- /dev/null +++ b/TMessagesProj/src/main/res/drawable/widget_badge_muted_background.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" + android:src="@drawable/widget_counter_muted" /> diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_item.xml b/TMessagesProj/src/main/res/layout/contacts_widget_item.xml index 9ac5fdc75..2173d26dc 100644 --- a/TMessagesProj/src/main/res/layout/contacts_widget_item.xml +++ b/TMessagesProj/src/main/res/layout/contacts_widget_item.xml @@ -1,121 +1,15 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="horizontal" - android:layout_width="match_parent" - android:minHeight="72dp" android:id="@+id/contacts_widget_item" + android:layout_width="match_parent" android:layout_height="86dp" - android:weightSum="1" - android:baselineAligned="false"> + android:baselineAligned="false" + android:minHeight="72dp" + android:orientation="horizontal" + android:weightSum="1"> - <FrameLayout - android:layout_width="0dp" - android:id="@+id/contacts_widget_item1" - android:layout_height="86dp" - android:background="@drawable/list_selector_ex" - android:layout_weight="0.5"> + <include layout="@layout/contacts_widget_item_1" /> - <ImageView android:id="@+id/contacts_widget_item_avatar1" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_gravity="center" - android:layout_marginBottom="10dp" - android:gravity="start" /> + <include layout="@layout/contacts_widget_item_2" /> - <TextView android:id="@+id/contacts_widget_item_text1" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="end" - android:gravity="center" - android:layout_gravity="center" - android:textSize="12dp" - android:layout_marginRight="6dp" - android:layout_marginLeft="6dp" - android:layout_marginTop="28dp" - android:textColor="@color/widget_name"/> - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="1dp" - android:background="@drawable/widgets_light_badgebg" - android:layout_gravity="center" - android:layout_marginBottom="27dp" - android:layout_marginLeft="20dp" - android:layout_marginRight="4dp" - android:id="@+id/contacts_widget_item_badge_bg1"> - - <TextView android:id="@+id/contacts_widget_item_badge1" - android:layout_width="wrap_content" - android:layout_height="23dp" - android:paddingLeft="7dp" - android:paddingRight="7dp" - android:paddingBottom="1dp" - android:fontFamily="sans-serif-medium" - android:layout_gravity="center" - android:gravity="center" - android:minWidth="23dp" - android:textSize="13dp" - android:background="@drawable/widget_counter" - android:textColor="@color/widget_badge" /> - </FrameLayout> - - </FrameLayout> - - <FrameLayout - android:layout_width="0dp" - android:minHeight="72dp" - android:id="@+id/contacts_widget_item2" - android:background="@drawable/list_selector_ex" - android:layout_height="86dp" - android:layout_weight="0.5"> - - <ImageView android:id="@+id/contacts_widget_item_avatar2" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_gravity="center" - android:layout_marginBottom="10dp" - android:gravity="start" /> - - <TextView android:id="@+id/contacts_widget_item_text2" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="end" - android:gravity="center" - android:layout_gravity="center" - android:textSize="12dp" - android:layout_marginRight="6dp" - android:layout_marginLeft="6dp" - android:layout_marginTop="28dp" - android:textColor="@color/widget_name"/> - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="1dp" - android:background="@drawable/widgets_light_badgebg" - android:layout_gravity="center" - android:layout_marginBottom="27dp" - android:layout_marginLeft="20dp" - android:layout_marginRight="4dp" - android:id="@+id/contacts_widget_item_badge_bg2"> - - <TextView android:id="@+id/contacts_widget_item_badge2" - android:layout_width="wrap_content" - android:layout_height="23dp" - android:paddingLeft="7dp" - android:paddingRight="7dp" - android:paddingBottom="1dp" - android:fontFamily="sans-serif-medium" - android:layout_gravity="center" - android:gravity="center" - android:minWidth="23dp" - android:textSize="13dp" - android:background="@drawable/widget_counter" - android:textColor="@color/widget_badge" /> - </FrameLayout> - - </FrameLayout> </LinearLayout> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_item_1.xml b/TMessagesProj/src/main/res/layout/contacts_widget_item_1.xml new file mode 100644 index 000000000..3abe22faf --- /dev/null +++ b/TMessagesProj/src/main/res/layout/contacts_widget_item_1.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="0dp" + android:id="@+id/contacts_widget_item1" + android:layout_height="86dp" + android:background="@drawable/list_selector_ex" + android:layout_weight="0.5" + android:theme="@style/Theme.TMessages.AppWidget" + tools:showIn="@layout/contacts_widget_item"> + + <ImageView + android:id="@+id/contacts_widget_item_avatar1" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_gravity="center" + android:layout_marginBottom="10dp" + android:src="?attr/widgetPreviewImage" + android:gravity="start" /> + + <TextView + android:id="@+id/contacts_widget_item_text1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:singleLine="true" + android:ellipsize="end" + android:gravity="center" + android:layout_gravity="center" + android:textSize="12dp" + android:layout_marginRight="6dp" + android:layout_marginLeft="6dp" + android:layout_marginTop="28dp" + android:text="?attr/widgetPreviewTitle" + android:textColor="@color/widget_name" /> + + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="1dp" + android:background="@drawable/widgets_light_badgebg" + android:layout_gravity="center" + android:layout_marginBottom="27dp" + android:layout_marginLeft="20dp" + android:layout_marginRight="4dp" + android:visibility="?attr/widgetPreviewDot" + android:id="@+id/contacts_widget_item_badge_bg1"> + + <TextView + android:id="@+id/contacts_widget_item_badge1" + style="@style/TMessages.AppWidget.Badge" + android:layout_gravity="center" + android:text="2" /> + </FrameLayout> + +</FrameLayout> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_item_2.xml b/TMessagesProj/src/main/res/layout/contacts_widget_item_2.xml new file mode 100644 index 000000000..872aa8af2 --- /dev/null +++ b/TMessagesProj/src/main/res/layout/contacts_widget_item_2.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="0dp" + android:minHeight="72dp" + android:id="@+id/contacts_widget_item2" + android:background="@drawable/list_selector_ex" + android:layout_height="86dp" + android:layout_weight="0.5" + android:theme="@style/Theme.TMessages.AppWidget" + tools:showIn="@layout/contacts_widget_item"> + + <ImageView + android:id="@+id/contacts_widget_item_avatar2" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_gravity="center" + android:layout_marginBottom="10dp" + android:src="?attr/widgetPreviewImage" + android:gravity="start" /> + + <TextView + android:id="@+id/contacts_widget_item_text2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:singleLine="true" + android:ellipsize="end" + android:gravity="center" + android:layout_gravity="center" + android:textSize="12dp" + android:layout_marginRight="6dp" + android:layout_marginLeft="6dp" + android:layout_marginTop="28dp" + android:text="?attr/widgetPreviewTitle" + android:textColor="@color/widget_name" /> + + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="1dp" + android:background="@drawable/widgets_light_badgebg" + android:layout_gravity="center" + android:layout_marginBottom="27dp" + android:layout_marginLeft="20dp" + android:layout_marginRight="4dp" + android:visibility="?attr/widgetPreviewDot" + android:id="@+id/contacts_widget_item_badge_bg2"> + + <TextView + android:id="@+id/contacts_widget_item_badge2" + style="@style/TMessages.AppWidget.Badge" + android:layout_gravity="center" + android:text="1" /> + </FrameLayout> + +</FrameLayout> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_layout_1.xml b/TMessagesProj/src/main/res/layout/contacts_widget_layout_1.xml index 543980ae3..f55980bcb 100644 --- a/TMessagesProj/src/main/res/layout/contacts_widget_layout_1.xml +++ b/TMessagesProj/src/main/res/layout/contacts_widget_layout_1.xml @@ -1,11 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="90dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_layout_2.xml b/TMessagesProj/src/main/res/layout/contacts_widget_layout_2.xml index 5af4af0b7..090f9c86a 100644 --- a/TMessagesProj/src/main/res/layout/contacts_widget_layout_2.xml +++ b/TMessagesProj/src/main/res/layout/contacts_widget_layout_2.xml @@ -1,11 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="176dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_layout_3.xml b/TMessagesProj/src/main/res/layout/contacts_widget_layout_3.xml index 2b13334b3..50743640f 100644 --- a/TMessagesProj/src/main/res/layout/contacts_widget_layout_3.xml +++ b/TMessagesProj/src/main/res/layout/contacts_widget_layout_3.xml @@ -1,11 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="262dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_layout_4.xml b/TMessagesProj/src/main/res/layout/contacts_widget_layout_4.xml index 4a077cec8..40f540047 100644 --- a/TMessagesProj/src/main/res/layout/contacts_widget_layout_4.xml +++ b/TMessagesProj/src/main/res/layout/contacts_widget_layout_4.xml @@ -1,11 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="348dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/contacts_widget_layout_preview.xml b/TMessagesProj/src/main/res/layout/contacts_widget_layout_preview.xml new file mode 100644 index 000000000..4ff6f8214 --- /dev/null +++ b/TMessagesProj/src/main/res/layout/contacts_widget_layout_preview.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/TMessages.AppWidget.Background" + android:layout_width="match_parent" + android:layout_height="176dp" + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <include + layout="@layout/contacts_widget_item_1" + android:theme="@style/Theme.TMessages.AppWidget.Preview4" /> + + <include + layout="@layout/contacts_widget_item_2" + android:theme="@style/Theme.TMessages.AppWidget.Preview5" /> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:weightSum="1"> + + <include + layout="@layout/contacts_widget_item_2" + android:theme="@style/Theme.TMessages.AppWidget.Preview6" /> + + <include + layout="@layout/contacts_widget_item_2" + android:theme="@style/Theme.TMessages.AppWidget.Preview7" /> + + </LinearLayout> + +</LinearLayout> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml index 87f48d98b..4248ce2d0 100644 --- a/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:minHeight="72dp" android:id="@+id/shortcut_widget_item" - android:layout_height="72dp"> + android:layout_width="match_parent" + android:layout_height="72dp" + android:minHeight="72dp" + android:theme="@style/Theme.TMessages.AppWidget"> <ImageView android:id="@+id/shortcut_widget_item_avatar" android:layout_width="54dp" @@ -12,6 +13,7 @@ android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_gravity="start|center_vertical" + android:src="?attr/widgetPreviewImage" android:gravity="start" /> <RelativeLayout @@ -33,6 +35,7 @@ android:textColor="@color/widget_name" android:layout_alignParentStart="true" android:layout_marginEnd="4dp" + android:text="?attr/widgetPreviewTitle" android:layout_toStartOf="@+id/shortcut_widget_item_time"/> <TextView android:id="@+id/shortcut_widget_item_time" @@ -41,6 +44,7 @@ android:layout_alignParentEnd="true" android:layout_marginTop="3dp" android:textSize="13dp" + android:text="?attr/widgetPreviewTime" android:textColor="@color/widget_time" /> </RelativeLayout> @@ -65,22 +69,16 @@ android:autoLink="none" android:textColorLink="@color/widget_text" android:layout_alignParentStart="true" + android:text="?attr/widgetPreviewContent" android:layout_toStartOf="@+id/shortcut_widget_item_badge"/> - <TextView android:id="@+id/shortcut_widget_item_badge" - android:layout_width="wrap_content" - android:layout_height="23dp" - android:paddingLeft="7dp" - android:paddingRight="7dp" - android:paddingBottom="1dp" - android:fontFamily="sans-serif-medium" - android:gravity="center" - android:minWidth="23dp" - android:textSize="13dp" - android:layout_marginStart="4dp" + <TextView + android:id="@+id/shortcut_widget_item_badge" + style="@style/TMessages.AppWidget.Badge" android:layout_alignParentEnd="true" - android:background="@drawable/widget_counter" - android:textColor="@color/widget_badge" /> + android:layout_marginStart="4dp" + android:text="2" + android:visibility="?attr/widgetPreviewDot" /> </RelativeLayout> diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_1.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_1.xml index 48a635f8c..a069cacc4 100644 --- a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_1.xml +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_1.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="76dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_2.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_2.xml index 1adcdc557..bccaf0afb 100644 --- a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_2.xml +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_2.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="148dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_3.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_3.xml index 60fe4965c..2bb1b6958 100644 --- a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_3.xml +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_3.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="220dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_4.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_4.xml index 5cd001fc1..aa96e517a 100644 --- a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_4.xml +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_4.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" + style="@style/TMessages.AppWidget.Background" android:layout_width="match_parent" android:layout_height="292dp" - android:background="@drawable/widget_bg" - android:padding="2dp"> + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_layout_preview.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_preview.xml new file mode 100644 index 000000000..c689d6f2a --- /dev/null +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_layout_preview.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + style="@style/TMessages.AppWidget.Background" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:theme="@style/Theme.TMessages.AppWidget" + tools:ignore="UnusedAttribute"> + + <include + layout="@layout/shortcut_widget_item" + android:theme="@style/Theme.TMessages.AppWidget.Preview" /> + + <include + layout="@layout/shortcut_widget_item" + android:theme="@style/Theme.TMessages.AppWidget.Preview2" /> + +</LinearLayout> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-v31/styles.xml b/TMessagesProj/src/main/res/values-v31/styles.xml new file mode 100644 index 000000000..8c12783b0 --- /dev/null +++ b/TMessagesProj/src/main/res/values-v31/styles.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright 2021 Google LLC + ~ + ~ 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 + ~ + ~ https://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. + --> + +<resources> + + <!-- APP WIDGET --> + + <style name="Base.Theme.TMessages.AppWidget" parent="android:Theme.DeviceDefault.DayNight" /> + + <style name="TMessages.AppWidget.Background" parent="Base.TMessages.AppWidget.Background"> + <item name="android:clipToOutline">true</item> + <item name="android:background">@drawable/widget_background</item> + </style> + + <style name="TMessages.AppWidget.Badge" parent="Base.TMessages.AppWidget.Badge"> + <item name="android:textColor">?android:attr/textColorPrimaryInverse</item> + </style> + +</resources> diff --git a/TMessagesProj/src/main/res/values-v31/values.xml b/TMessagesProj/src/main/res/values-v31/values.xml new file mode 100644 index 000000000..a28bad5e6 --- /dev/null +++ b/TMessagesProj/src/main/res/values-v31/values.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <dimen name="app_widget_background_corner_radius">@android:dimen/system_app_widget_background_radius</dimen> +</resources> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/attrs.xml b/TMessagesProj/src/main/res/values/attrs.xml new file mode 100644 index 000000000..e622e06f0 --- /dev/null +++ b/TMessagesProj/src/main/res/values/attrs.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <attr name="widgetBackgroundCornerRadius" format="dimension" /> + + <attr name="widgetPreviewTitle" format="string" /> + <attr name="widgetPreviewContent" format="string" /> + <attr name="widgetPreviewTime" format="string" /> + <attr name="widgetPreviewImage" format="reference" /> + <attr name="widgetPreviewDot" format="integer" /> +</resources> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/styles.xml b/TMessagesProj/src/main/res/values/styles.xml index a1f892932..f3a3ed764 100644 --- a/TMessagesProj/src/main/res/values/styles.xml +++ b/TMessagesProj/src/main/res/values/styles.xml @@ -130,4 +130,94 @@ <item name="android:windowFullscreen">false</item> </style> + <!--APP WIDGET--> + + <style name="Base.Theme.TMessages.AppWidget" parent="Theme.TMessages"/> + + <style name="Theme.TMessages.AppWidget" parent="Base.Theme.TMessages.AppWidget"> + <item name="widgetBackgroundCornerRadius">@dimen/app_widget_background_corner_radius</item> + + <item name="widgetPreviewTitle"/> + <item name="widgetPreviewContent"/> + <item name="widgetPreviewTime"/> + <item name="widgetPreviewDot">0</item> + <item name="widgetPreviewImage">@null</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview"> + <item name="widgetPreviewTitle">Local Weather</item> + <item name="widgetPreviewContent">&#9728; 30°C Sunny,</item> + <item name="widgetPreviewTime">13:00</item> + <item name="widgetPreviewDot">0</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_5</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview2"> + <item name="widgetPreviewTitle">Rex</item> + <item name="widgetPreviewContent">It\'s morning in Tokyo &#128526;</item> + <item name="widgetPreviewTime">12:00</item> + <item name="widgetPreviewDot">2</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_7</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview3"> + <item name="widgetPreviewTitle">Dolph Ingman</item> + <item name="widgetPreviewContent">&#128517; Sticker</item> + <item name="widgetPreviewTime">11:00</item> + <item name="widgetPreviewDot">2</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_6</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview4"> + <item name="widgetPreviewTitle">Doge</item> + <item name="widgetPreviewDot">0</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_1</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview5"> + <item name="widgetPreviewTitle">Donald</item> + <item name="widgetPreviewDot">2</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_4</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview6"> + <item name="widgetPreviewTitle">Kate</item> + <item name="widgetPreviewDot">2</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_2</item> + </style> + + <style name="Theme.TMessages.AppWidget.Preview7"> + <item name="widgetPreviewTitle">Nick</item> + <item name="widgetPreviewDot">2</item> + <item name="widgetPreviewImage">@drawable/widget_avatar_3</item> + </style> + + <!-- APP WIDGET STYLES--> + + <style name="Base.TMessages.AppWidget.Background" parent="android:Widget"> + <item name="android:id">@android:id/background</item> + <item name="android:padding">2dp</item> + </style> + + <style name="TMessages.AppWidget.Background" parent="Base.TMessages.AppWidget.Background"> + <item name="android:background">@drawable/widget_bg</item> + </style> + + <style name="Base.TMessages.AppWidget.Badge" parent="android:Widget"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">23dp</item> + <item name="android:paddingLeft">7dp</item> + <item name="android:paddingRight">7dp</item> + <item name="android:paddingBottom">1dp</item> + <item name="android:fontFamily">sans-serif-medium</item> + <item name="android:gravity">center</item> + <item name="android:minWidth">23dp</item> + <item name="android:textSize">13dp</item> + <item name="android:background">@drawable/widget_badge_background</item> + </style> + + <style name="TMessages.AppWidget.Badge" parent="Base.TMessages.AppWidget.Badge"> + <item name="android:textColor">@color/widget_badge</item> + </style> + </resources> diff --git a/TMessagesProj/src/main/res/values/values.xml b/TMessagesProj/src/main/res/values/values.xml index d249ac5ac..640e58101 100644 --- a/TMessagesProj/src/main/res/values/values.xml +++ b/TMessagesProj/src/main/res/values/values.xml @@ -2,4 +2,5 @@ <resources> <bool name="isTablet">false</bool> <dimen name="custom_notification_corner_radius">2dip</dimen> + <dimen name="app_widget_background_corner_radius">16dp</dimen> </resources> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/xml/chats_widget_info.xml b/TMessagesProj/src/main/res/xml/chats_widget_info.xml index de15ba7a4..c441f762e 100644 --- a/TMessagesProj/src/main/res/xml/chats_widget_info.xml +++ b/TMessagesProj/src/main/res/xml/chats_widget_info.xml @@ -1,13 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" - android:minWidth="320dp" - android:minHeight="78dp" + android:minWidth="250dp" + android:minHeight="110dp" + android:minResizeWidth="180dp" + android:minResizeHeight="40dp" + android:targetCellWidth="4" + android:targetCellHeight="2" android:updatePeriodMillis="3600000" - android:initialLayout="@layout/shortcut_widget_layout_1" + android:initialLayout="@layout/shortcut_widget_layout_2" android:autoAdvanceViewId="@id/list_view" android:resizeMode="horizontal|vertical" android:widgetCategory="home_screen" + android:description="@string/EditWidgetChatsInfo" android:previewImage="@drawable/chats_widget_preview" + android:previewLayout="@layout/shortcut_widget_layout_preview" + android:widgetFeatures="reconfigurable|configuration_optional" android:configure="org.telegram.ui.ChatsWidgetConfigActivity"> </appwidget-provider> \ No newline at end of file diff --git a/TMessagesProj/src/main/res/xml/contacts_widget_info.xml b/TMessagesProj/src/main/res/xml/contacts_widget_info.xml index 46f69d980..c1c2ad848 100644 --- a/TMessagesProj/src/main/res/xml/contacts_widget_info.xml +++ b/TMessagesProj/src/main/res/xml/contacts_widget_info.xml @@ -3,11 +3,18 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="110dp" android:minHeight="86dp" + android:minResizeHeight="40dp" + android:maxResizeHeight="110dp" + android:targetCellWidth="2" + android:targetCellHeight="2" android:updatePeriodMillis="3600000" android:initialLayout="@layout/contacts_widget_layout_2" android:autoAdvanceViewId="@id/list_view" android:resizeMode="vertical" android:widgetCategory="home_screen" + android:description="@string/EditWidgetContactsInfo" android:previewImage="@drawable/contacts_widget_preview" + android:previewLayout="@layout/contacts_widget_layout_preview" + android:widgetFeatures="reconfigurable|configuration_optional" android:configure="org.telegram.ui.ContactsWidgetConfigActivity"> </appwidget-provider> \ No newline at end of file