diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 0ad5124063..0000000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-patreon: qwq233
-custom: https://afdian.com/@gao_cai_sheng
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 79735962d7..8ff88aeacc 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -6,7 +6,7 @@ body:
- type: markdown
attributes:
value: |
- Thanks for reporting bug to Nullgram
+ Thanks for reporting bug to Nnngram
For further processing please fill in blanks.
- type: textarea
attributes:
@@ -43,7 +43,7 @@ body:
required: true
- type: input
attributes:
- label: Nullgram Version
+ label: Nnngram Version
placeholder: vX.X.X.XXXXXXX
validations:
required: true
@@ -52,7 +52,7 @@ body:
attributes:
label: Version requirement
options:
- - label: I am using latest debug CI version of Nullgram and enable verbose log/我正在使用最新 CI 调试版本且启用详细日志
+ - label: I am using latest debug CI version of Nnngram and enable verbose log/我正在使用最新 CI 调试版本且启用详细日志
required: true
- type: textarea
id: logs
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 2aed96a8d5..83eac5a917 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,7 +1,7 @@
blank_issues_enabled: false
contact_links:
- name: channel
- url: https://t.me/NullgramClient
+ url: https://t.me/nagram_channel
about: Our Telegram Channel
- name: smart-question
url: http://www.catb.org/~esr/faqs/smart-questions.html
diff --git a/.github/Privacy-Policy.md b/.github/Privacy-Policy.md
index 1fa12f0bdc..b88cddf9c3 100644
--- a/.github/Privacy-Policy.md
+++ b/.github/Privacy-Policy.md
@@ -1 +1 @@
-> Nullgram will not share any user data or device information with anyone. It is based on the official Telegram, so in order to learn more about it, please check [Telegram Privacy Policy](https://telegram.org/privacy)
+> Nnngram will not share any user data or device information with anyone. It is based on the official Telegram, so in order to learn more about it, please check [Telegram Privacy Policy](https://telegram.org/privacy)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 7f283b1cf3..0000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: "gradle"
- directory: "/"
- schedule:
- interval: "daily"
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0033301907..f7916712df 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -3,19 +3,20 @@ name: Build CI
on:
push:
branches:
- - master
+ - main
paths-ignore:
- '**.md'
- '**.txt'
- '.github/**'
- '!.github/workflows/**'
- "TMessagesProj/src/main/res/values**/**"
+ - '.gitignore'
workflow_dispatch:
jobs:
build:
name: Gradle Build
- if: ${{ github.event_name != 'pull_request' && success() && github.ref == 'refs/heads/master' }}
+ if: ${{ github.event_name != 'pull_request' && success() && github.ref == 'refs/heads/main' }}
runs-on: ubuntu-latest
env:
CCACHE_COMPILERCHECK: "%compiler% -dumpmachine; %compiler% -dumpversion"
@@ -33,6 +34,9 @@ jobs:
uses: jwlawson/actions-setup-cmake@v1.12
with:
cmake-version: '3.22.1'
+ - name: Get short SHA
+ run: |
+ echo "SHA7=$(echo ${GITHUB_SHA} | cut -c1-7)" >> $GITHUB_ENV
- name: Setup Java
uses: actions/setup-java@v3
with:
@@ -67,123 +71,67 @@ jobs:
sudo rm -rf /usr/local/share/chromium
sudo rm -rf /usr/local/lib/node_modules
df -h
-
+
sudo apt-get install bison gcc make curl ninja-build -y
echo "y" | sdkmanager --install "ndk;27.0.12077973" --sdk_root=${ANDROID_SDK_ROOT} &> /dev/null
echo "sdk.dir=${ANDROID_HOME}" >> local.properties
- name: Debug Build
run: |
echo -e "RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }}\nRELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }}\nRELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }}">>local.properties
- cat > service_account_credentials.json << EOF
- ${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}"
- EOF
- mkdir TMessagesProj/config/
- echo ${{ secrets.KEYSTORE }} | base64 -d > TMessagesProj/config/release.keystore
- echo ${{ secrets.GOOGLE_SERVICES_JSON }} | base64 -d > TMessagesProj/google-services.json
+ mkdir -p TMessagesProj/config/
+ echo "${{ secrets.KEYSTORE }}" | base64 -d > TMessagesProj/config/release.keystore
+ echo "${{ secrets.GOOGLE_SERVICES_JSON }}" | base64 -d > TMessagesProj/google-services.json
./gradlew :TMessagesProj:assembleRelease :TMessagesProj:uploadCrashlyticsSymbolFileRelease
echo "APK_FILE=$(find TMessagesProj/build/outputs/apk -name '*arm64*.apk')" >> $GITHUB_ENV
- echo "APK_FILE_ARMV7=$(find TMessagesProj/build/outputs/apk -name '*arm32*.apk')" >> $GITHUB_ENV
- - uses: actions/upload-artifact@v3
+ - uses: actions/upload-artifact@master
name: Upload apk (arm64-v8a)
with:
- name: Nullgram-arm64-v8a
+ name: Nnngram-arm64-v8a-${{ env.SHA7 }}
path: ${{ env.APK_FILE }}
- - uses: actions/upload-artifact@v3
- name: Upload apk (armeabi-v7a)
- with:
- name: Nullgram-armeabi-v7a
- path: ${{ env.APK_FILE_ARMV7 }}
+
- name: Upload mapping
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@master
with:
name: mapping
path: TMessagesProj/build/outputs/mapping
-
- play-build:
- name: Gradle Build (play store)
- runs-on: ubuntu-latest
- # if: ${{ github.event_name != 'pull_request' && success() && github.ref == 'refs/heads/master' }}
- if: false
- env:
- CCACHE_COMPILERCHECK: "%compiler% -dumpmachine; %compiler% -dumpversion"
- CCACHE_NOHASHDIR: "true"
- CCACHE_MAXSIZE: "5G"
- CCACHE_HARDLINK: "true"
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
- - name: Check out submodules
+ - name: Debug Build (Telegram)
run: |
- git -c submodule."libs/rust".update=none submodule update --init --recursive
- - name: Setup cmake
- uses: jwlawson/actions-setup-cmake@v1.12
- with:
- cmake-version: '3.22.1'
- - name: Setup Java
- uses: actions/setup-java@v3
+ echo -e "RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }}\nRELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }}\nRELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }}">>local.properties
+ mkdir -p TMessagesProj/config/
+ echo "${{ secrets.KEYSTORE }}" | base64 -d > TMessagesProj/config/release.keystore
+ echo "${{ secrets.GOOGLE_SERVICES_JSON }}" | base64 -d > TMessagesProj/google-services.json
+ sed -i 's@xyz.nextalone.nnngram@org.telegram.messenger@' TMessagesProj/build.gradle.kts
+ sed -i 's@xyz.nextalone.nnngram@org.telegram.messenger@' TMessagesProj/google-services.json
+ ./gradlew TMessagesProj:assembleRelease
+ find TMessagesProj/build/outputs/apk -name '*arm64*.apk' -exec mv {} TMessagesProj/build/outputs/apk/Nnngram-arm64-v8a-${{ env.SHA7 }}-Telegram.apk \;
+ echo "APK_FILE=$(find TMessagesProj/build/outputs/apk -name '*arm64*.apk')" >> $GITHUB_ENV
+
+ - uses: actions/upload-artifact@master
+ name: Upload apk (arm64-v8a) (Telegram)
with:
- distribution: 'temurin'
- java-version: '17'
- cache: 'gradle'
- - name: Setup Gradle
- uses: gradle/gradle-build-action@v2.4.2
- - name: Set up ccache
- uses: hendrikmuhs/ccache-action@v1.2
+ name: Nnngram-arm64-v8a-${{ env.SHA7 }}-Telegram
+ path: ${{ env.APK_FILE }}
+
+ - name: Upload mapping
+ uses: actions/upload-artifact@master
with:
- key: ccache
- restore-keys: ccache
- - name: Setup Android SDK Tools
- uses: android-actions/setup-android@v2
- - name: Prepare Environment
- run: |
- echo "Removing large packages"
- sudo apt-get remove -y '^dotnet-.*' aspnetcore-targeting-pack-6.0 aspnetcore-targeting-pack-7.0
- sudo apt-get remove -y '^llvm-.*'
- sudo apt-get remove -y 'php.*'
- sudo apt-get remove -y '^mongodb-.*'
- sudo apt-get remove -y '^mysql-.*'
- sudo apt-get remove -y azure-cli google-chrome-stable firefox powershell mono-devel libgl1-mesa-dri
- sudo apt-get autoremove -y
- sudo apt-get clean
- echo "Removing large directories"
- sudo rm -rf /usr/share/dotnet/
- sudo rm -rf /usr/local/graalvm/
- sudo rm -rf /usr/local/.ghcup/
- sudo rm -rf /usr/local/share/powershell
- sudo rm -rf /usr/local/share/chromium
- sudo rm -rf /usr/local/lib/node_modules
- df -h
-
- sudo apt-get install bison gcc make curl ninja-build -y
- echo "y" | sdkmanager --install "ndk;27.0.12077973" --sdk_root=${ANDROID_SDK_ROOT} &> /dev/null
- echo "sdk.dir=${ANDROID_HOME}" >> local.properties
+ name: mapping-Telegram
+ path: TMessagesProj/build/outputs/mapping
- - name: Debug Build
- run: |
- echo -e "RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }}\nRELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }}\nRELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }}">>local.properties
- cat > service_account_credentials.json << EOF
- ${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}"
- EOF
- mkdir TMessagesProj/config/
- echo ${{ secrets.KEYSTORE }} | base64 -d > TMessagesProj/config/release.keystore
- echo ${{ secrets.GOOGLE_SERVICES_JSON }} | base64 -d > TMessagesProj/google-services.json
- ./gradlew :TMessagesProj:publishPlayBundle
-
upload:
name: Upload Release
- if: ${{ github.event_name != 'pull_request' && success() && github.ref == 'refs/heads/master' }}
+ if: ${{ github.event_name != 'pull_request' && success() && github.ref == 'refs/heads/main' }}
runs-on: ubuntu-latest
needs:
- build
- telegram-bot-api
steps:
- name: Donwload Artifacts
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@master
with:
path: artifacts
- name: Download Telegram Bot API Binary
@@ -195,6 +143,7 @@ jobs:
- name: find apk
run: |
mkdir apks
+ find artifacts -name "*Telegram.apk" -exec rm {} \;
find artifacts -name "*.apk" -exec cp {} apks \;
echo "APK_FILE_UPLOAD=$(find apks -name '*arm64*.apk')" >> $GITHUB_ENV
- name: Get Apk Info
@@ -207,12 +156,13 @@ jobs:
run: |
chmod +x telegram-bot-api-binary
./telegram-bot-api-binary --api-id=21724 --api-hash=3e0cb5efcd52300aec5994fdfc5bdc16 --local 2>&1 > /dev/null &
- curl https://raw.githubusercontent.com/qwq233/qwq233/master/uploadCI.py -o uploadCI.py
+ curl https://raw.githubusercontent.com/PreviousAlone/ActionScript/main/uploadCI.py -o uploadCI.py
python uploadCI.py
env:
+ CHAT_ID: ${{ secrets.TELEGRAM_CHATID }}
TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
- VERSION_CODE: ${{steps.apk.outputs.versionCode}}
- VERSION_NAME: ${{steps.apk.outputs.versionNum}}
+ VERSION_CODE: ${{ steps.apk.outputs.versionCode }}
+ VERSION_NAME: ${{ steps.apk.outputs.versionNum }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
telegram-bot-api:
@@ -220,14 +170,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- name: Clone Telegram Bot API
run: |
git clone --recursive https://github.com/tdlib/telegram-bot-api.git
git status telegram-bot-api >> telegram-bot-api-status
- name: Cache Bot API Binary
id: cache-bot-api
- uses: actions/cache@v2
+ uses: actions/cache@v3
with:
path: telegram-bot-api-binary
key: CI-telegram-bot-api-${{ hashFiles('telegram-bot-api-status') }}
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index 68c41b4c85..d4e22d0b3e 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -3,7 +3,7 @@ name: Build CI (Pull Request)
on:
pull_request:
branches:
- - master
+ - main
paths-ignore:
- '**.md'
- '**.txt'
diff --git a/.gitignore b/.gitignore
index cf3aa0fbf2..169ae3b826 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,9 @@ local.properties
service_account_credentials.json
Tools/Utils.java
test.py
+.project
+.settings
+.classpath
+History.md
+apks
+dprint.json
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index ba1e544b3c..0000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,539 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- xmlns:android
-
- ^$
-
-
-
-
-
-
-
-
- xmlns:.*
-
- ^$
-
-
- BY_NAME
-
-
-
-
-
-
- .*:id
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- style
-
- ^$
-
-
-
-
-
-
-
-
- .*
-
- ^$
-
-
- BY_NAME
-
-
-
-
-
-
- .*:.*Style
-
- http://schemas.android.com/apk/res/android\n
-
-
- BY_NAME
-
-
-
-
-
-
- .*:layout_width
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_height
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_weight
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_margin
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_marginTop
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_marginBottom
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_marginStart
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_marginEnd
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_marginLeft
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_marginRight
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:layout_.*
-
- http://schemas.android.com/apk/res/android\n
-
-
- BY_NAME
-
-
-
-
-
-
- .*:padding
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:paddingTop
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:paddingBottom
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:paddingStart
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:paddingEnd
-
- http://schemas.android.com/apk/res/android\n
-
-
- ANDROID_ATTRIBUTE_ORDER
-
-
-
-
-
-
- .*:paddingLeft
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*:paddingRight
-
- http://schemas.android.com/apk/res/android\n
-
-
-
-
-
-
-
-
- .*
- http://schemas.android.com/apk/res/android\n
-
-
- BY_NAME
-
-
-
-
-
-
- .*
- http://schemas.android.com/apk/res-auto\n
-
-
- BY_NAME
-
-
-
-
-
-
- .*
- http://schemas.android.com/tools
-
-
- BY_NAME
-
-
-
-
-
-
- .*
- .*
-
-
- BY_NAME
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index 79ee123c2b..0000000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/copyright/Default.xml b/.idea/copyright/Default.xml
deleted file mode 100644
index 0d4432414a..0000000000
--- a/.idea/copyright/Default.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index b8a2842cd8..0000000000
--- a/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index c6c66ca48b..a7da3fa8ca 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
-# Nullgram
+
-[](https://t.me/NullgramClient) [](https://github.com/qwq233/Nullgram/actions/workflows/ci.yml/) [](https://crowdin.com/project/nullgram)
+# Nagram-reborn based on Nullgram
+[](https://t.me/Nnngram)
+
+## What is Nullgram
[中文](README_CN.md) [日本語](README_JA.md)
@@ -13,6 +16,7 @@ In the name of Nullgram, the purpose is to express that there is no such bad thi
## How to Contribute
### I want to add new feature
+
Great!
Make sure you fully understand [the Development Document](./docs/CONTRIBUTING.md).
@@ -21,21 +25,22 @@ If you haven't read it.**THEN GO READ IT.**
Then just create a new pull request and I should be review in a couple of days.
### I've encountered a bug!
+
First, make sure you have the latest version installed (check the channel, Play store versions usually have a delay).
Then, if the issue appears in the official Telegram client too, please submit it to the officials, (be careful not to show Nullgram in the description and screenshots, the official developers doesn't like us!).
Then, please detail your issue (ENGLISH ONLY), create an issue or submit it to our group with #bug.
-Make sure using the issue template and writing the detailed version number I DO NOT KNOW WTF IS *I HAVE BEEN USING THE LATEST VERSION*
+Make sure using the issue template and writing the detailed version number I DO NOT KNOW WTF IS _I HAVE BEEN USING THE LATEST VERSION_
-If you experience a crash, you can use logcat to catch the log (TAG: `Nullgram` ).
+If you experience a crash, you can use logcat to catch the log (TAG: `Nnngram` ).
### Compilation Guide
You will require Android NDK rev. 21 and Android SDK 14
-1. Download the Telegram source code from https://github.com/qwq233/Nullgram
+1. Download the Telegram source code from https://github.com/PreviousAlone/Nnngram
2. Download the ccache from [here](https://ccache.dev/) and make sure it is in your `PATH`.
3. Replace release.keystore in TMessagesProj/config with your own one.
4. Fill out RELEASE_KEY_PASSWORD, RELEASE_KEY_ALIAS, RELEASE_STORE_PASSWORD in gradle.properties to access your release.keystore
@@ -45,18 +50,17 @@ You will require Android NDK rev. 21 and Android SDK 14
## Sponsor
-Thanks to Jetbrains for allocating free open-source licences for IDEs and CloudFlare for OSS sponsorship
+Thanks to Jetbrains for allocating free open-source licences for IDEs.
[
](https://jb.gg/OpenSource)
-[
](https://www.cloudflare.com/)
[^1]: https://telegra.ph/%E6%9C%89%E5%85%B3-Nekogram-Lite-%E7%9A%84%E6%95%85%E4%BA%8B-04-09
-[^2]:https://sm.ms/image/FAKi3mx6XwqlvRj
+[^2]: https://sm.ms/image/FAKi3mx6XwqlvRj
-[^3]:https://t.me/NekogramX/418
+[^3]: https://t.me/NekogramX/418
-[^4]:https://t.me/zuragram/392
+[^4]: https://t.me/zuragram/392
-[^5]:https://t.me/sayingArchive/15428
+[^5]: https://t.me/sayingArchive/15428
diff --git a/README_CN.md b/README_CN.md
index c4e8d37e53..071d5afabe 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -1,6 +1,7 @@
-# Nullgram
+
-[](https://t.me/NullgramClient) [](https://github.com/qwq233/Nullgram/actions/workflows/ci.yml/) [](https://crowdin.com/project/nullgram)
+# Nagram-reborn 基于 Nullgram
+[](https://t.me/Nnngram)
[English](README.md) [日本語](README_JA.md)
@@ -22,7 +23,7 @@ Null的意思是*未初始化、未定义或者不存在*。以Nullgram为名,
### 我发现了个BUG!
-首先,确认你已经安装了最新版本的Nullgram。
+首先,确认你已经安装了最新版本的Nnngram。
然后,确认这个Bug是否也出现在官方Telegram端。如果也出现,那就把这个Bug提交给官方。
@@ -30,7 +31,7 @@ Null的意思是*未初始化、未定义或者不存在*。以Nullgram为名,
务必使用Issue Template。写详细版本号,**我不知道什么是*最新版本***。
-你可以用logcat抓取日志。(TAG: `Nullgram` )
+你可以用logcat抓取日志。(TAG: `Nnngram` )
[^1]: https://telegra.ph/%E6%9C%89%E5%85%B3-Nekogram-Lite-%E7%9A%84%E6%95%85%E4%BA%8B-04-09
diff --git a/README_JA.md b/README_JA.md
index eac1c2c640..c56a308607 100644
--- a/README_JA.md
+++ b/README_JA.md
@@ -1,6 +1,9 @@
-# Nullgram
+
-[](https://t.me/NullgramClient) [](https://github.com/qwq233/Nullgram/actions/workflows/ci.yml/) [](https://crowdin.com/project/nullgram)
+# Nullgramベースで生まれ変わったNagram
+[](https://t.me/Nnngram)
+
+## Nullgramって何ですか
[English](README.md) [中文](README_CN.md)
@@ -31,13 +34,13 @@ Nullgramの名前には、悪意のある物は存在しないことを表す意
Issueテンプレートを使用して詳細なバージョン番号を入力してください。**私は最新のバージョンを使用していますが、あなたが使用しているバージョンはわかりません。**
-クラッシュが発生した場合は、logcatを使用してログを取得することができます(タグ:`Nullgram`)。
+クラッシュが発生した場合は、logcatを使用してログを取得することができます(タグ:`Nnngram`)。
### コンパイルガイド
Android NDK rev.21とAndroid SDK 14が必要です。
-1. Telegramのソースコードを https://github.com/qwq233/Nullgram からダウンロードしてください。
+1. Telegramのソースコードを[https://github.com/PreviousAlone/Nnngram](https://github.com/PreviousAlone/Nnngram)からダウンロードしてください。
2. [こちら](https://ccache.dev/)からccacheをダウンロードして`PATH`にあることを確認してください。
3. TMessagesProj/configのrelease.keystoreを自分のものに置換してください。
4. gradle.properties内のRELEASE_KEY_PASSWORD、RELEASE_KEY_ALIAS、RELEASE_STORE_PASSWORDでrelease.keystoreにアクセスします。
@@ -46,10 +49,9 @@ Android NDK rev.21とAndroid SDK 14が必要です。
## スポンサー
-IDEに無料のオープンソースライセンスを割り当ててくれたJetbrainsとOSSのスポンサーになって頂いたCloudFlareに感謝をします。
+IDEに無料のオープンソースライセンスを割り当ててくれたJetbrainsに感謝をします。
[
](https://jb.gg/OpenSource)
-[
](https://www.cloudflare.com/)
[^1]: https://telegra.ph/%E6%9C%89%E5%85%B3-Nekogram-Lite-%E7%9A%84%E6%95%85%E4%BA%8B-04-09
diff --git a/TMessagesProj/build.gradle.kts b/TMessagesProj/build.gradle.kts
index 951c5e2344..7879793732 100644
--- a/TMessagesProj/build.gradle.kts
+++ b/TMessagesProj/build.gradle.kts
@@ -45,23 +45,7 @@ configurations {
}
}
-var serviceAccountCredentialsFile = File(rootProject.projectDir, "service_account_credentials.json")
-val abiName = mapOf("armeabi-v7a" to "arm32", "arm64-v8a" to "arm64")
-
-if (serviceAccountCredentialsFile.isFile) {
- setupPlay(Version.isStable)
- play.serviceAccountCredentials.set(serviceAccountCredentialsFile)
-} else if (System.getenv().containsKey("ANDROID_PUBLISHER_CREDENTIALS")) {
- setupPlay(Version.isStable)
-}
-
-fun setupPlay(stable: Boolean) {
- val targetTrace = if (stable) "production" else "beta"
- play {
- track.set(targetTrace)
- defaultToAppBundles.set(true)
- }
-}
+val abiName = mapOf("arm64-v8a" to "arm64")
cargo {
module = "../libs/rust"
@@ -114,13 +98,16 @@ dependencies {
implementation(libs.ktor.client.contentNegotiation)
implementation(libs.ktor.serialization.json)
+ implementation(libs.ffmpeg)
+ implementation(libs.lottie)
+
implementation(project(":libs:tcp2ws"))
implementation(project(":libs:pangu"))
ksp(project(":libs:ksp"))
}
android {
- defaultConfig.applicationId = "top.qwq2333.nullgram"
+ defaultConfig.applicationId = "xyz.nextalone.nnngram"
namespace = "org.telegram.messenger"
sourceSets.getByName("main") {
@@ -179,10 +166,6 @@ android {
isDebuggable = true
isJniDebuggable = true
}
-
- create("play") {
- initWith(getByName("release"))
- }
}
buildFeatures {
@@ -210,26 +193,25 @@ android {
abi {
isEnable = true
reset()
- include("armeabi-v7a", "arm64-v8a")
+ //noinspection ChromeOsAbiSupport
+ include("arm64-v8a")
}
}
- androidComponents {
- onVariants { variant ->
- variant.buildConfigFields.put("isPlay", BuildConfigField("boolean", variant.name.lowercase() == "play", null))
- }
- }
+// androidComponents {
+// onVariants { variant ->
+// variant.buildConfigFields.put("isPlay", BuildConfigField("boolean", variant.name.lowercase() == "play", null))
+// }
+// }
applicationVariants.all {
outputs.all {
val abi = this.filters.find { it.filterType == FilterConfiguration.FilterType.ABI.name }?.identifier
val output = this as? com.android.build.gradle.internal.api.BaseVariantOutputImpl
- val outputFileName = "Nullgram-${defaultConfig.versionName}-${abiName[abi]}.apk"
+ val outputFileName = "Nnngram-${defaultConfig.versionName}-${abiName[abi]}.apk"
output?.outputFileName = outputFileName
}
}
-
-
}
kotlin {
diff --git a/TMessagesProj/icons/CREDITS.txt b/TMessagesProj/icons/CREDITS.txt
deleted file mode 100644
index 5c76e690f6..0000000000
--- a/TMessagesProj/icons/CREDITS.txt
+++ /dev/null
@@ -1,10 +0,0 @@
- icon_1: https://twitter.com/TorinoAqua/status/1500774004344467461
- icon_2: https://twitter.com/nolma7/status/1501211141351305219
- icon_3: https://twitter.com/Nishina_hima/status/1501211397711175693
- icon_5: https://twitter.com/omu3retu/status/1502222606287605761
- icon_6: https://twitter.com/muninshiki/status/1445651719539478536
- icon_7: https://twitter.com/kasu1923/status/1445693353023053825
- icon_10: https://twitter.com/tnm_tyny/status/1442764062404734978
- icon_11: https://twitter.com/S2_DSA/status/1443459843025608708
- icon_12: https://twitter.com/ririkocafe/status/1444836713197543424
- icon_13: https://twitter.com/Man_SU_11/status/1501852999773085698
diff --git a/TMessagesProj/icons/anime/icon-0.png b/TMessagesProj/icons/anime/icon-0.png
deleted file mode 100644
index b59cd1ba49..0000000000
Binary files a/TMessagesProj/icons/anime/icon-0.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-1.png b/TMessagesProj/icons/anime/icon-1.png
deleted file mode 100644
index 50609c165c..0000000000
Binary files a/TMessagesProj/icons/anime/icon-1.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-10.png b/TMessagesProj/icons/anime/icon-10.png
deleted file mode 100644
index 0d89c41b5a..0000000000
Binary files a/TMessagesProj/icons/anime/icon-10.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-11.png b/TMessagesProj/icons/anime/icon-11.png
deleted file mode 100644
index c9ff231ebd..0000000000
Binary files a/TMessagesProj/icons/anime/icon-11.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-12.png b/TMessagesProj/icons/anime/icon-12.png
deleted file mode 100644
index ca8eb4f8e5..0000000000
Binary files a/TMessagesProj/icons/anime/icon-12.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-13.png b/TMessagesProj/icons/anime/icon-13.png
deleted file mode 100644
index 36b9895823..0000000000
Binary files a/TMessagesProj/icons/anime/icon-13.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-14.png b/TMessagesProj/icons/anime/icon-14.png
deleted file mode 100644
index 80693d9cb4..0000000000
Binary files a/TMessagesProj/icons/anime/icon-14.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-2.png b/TMessagesProj/icons/anime/icon-2.png
deleted file mode 100644
index d2bfc67997..0000000000
Binary files a/TMessagesProj/icons/anime/icon-2.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-3.png b/TMessagesProj/icons/anime/icon-3.png
deleted file mode 100644
index 93dbce89a2..0000000000
Binary files a/TMessagesProj/icons/anime/icon-3.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-5.png b/TMessagesProj/icons/anime/icon-5.png
deleted file mode 100644
index d38b2f2694..0000000000
Binary files a/TMessagesProj/icons/anime/icon-5.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-6.png b/TMessagesProj/icons/anime/icon-6.png
deleted file mode 100644
index c23694407e..0000000000
Binary files a/TMessagesProj/icons/anime/icon-6.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-7.png b/TMessagesProj/icons/anime/icon-7.png
deleted file mode 100644
index 0d5aff48c1..0000000000
Binary files a/TMessagesProj/icons/anime/icon-7.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon-9.png b/TMessagesProj/icons/anime/icon-9.png
deleted file mode 100644
index b2c270ec3c..0000000000
Binary files a/TMessagesProj/icons/anime/icon-9.png and /dev/null differ
diff --git a/TMessagesProj/icons/anime/icon.png b/TMessagesProj/icons/anime/icon.png
deleted file mode 100644
index 932073b9a5..0000000000
Binary files a/TMessagesProj/icons/anime/icon.png and /dev/null differ
diff --git a/TMessagesProj/jni/jni.c b/TMessagesProj/jni/jni.c
index 2e87c7ac88..905a2e08c2 100644
--- a/TMessagesProj/jni/jni.c
+++ b/TMessagesProj/jni/jni.c
@@ -28,10 +28,6 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) {
return -1;
}
- if (!checkSignature(verify_signature(vm))) {
- return JNI_ERR;
- }
-
if (imageOnJNILoad(vm, env) != JNI_TRUE) {
return -1;
}
@@ -57,7 +53,7 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_aesIgeEncryption(JNIEnv *en
jbyte *what = (*env)->GetDirectBufferAddress(env, buffer) + offset;
unsigned char *keyBuff = (unsigned char *)(*env)->GetByteArrayElements(env, key, NULL);
unsigned char *ivBuff = (unsigned char *)(*env)->GetByteArrayElements(env, iv, NULL);
-
+
AES_KEY akey;
if (!encrypt) {
AES_set_decrypt_key(keyBuff, 32 * 8, &akey);
diff --git a/TMessagesProj/proguard-rules.pro b/TMessagesProj/proguard-rules.pro
index 59fd1f53c7..d3bb3b053c 100644
--- a/TMessagesProj/proguard-rules.pro
+++ b/TMessagesProj/proguard-rules.pro
@@ -127,11 +127,11 @@
public ();
}
-keep class * extends org.telegram.ui.Components.UItem$UItemFactory { public (...); }
--keepclassmembernames class top.qwq2333.nullgram.activity.DatacenterActivity$DatacenterCell { ; }
--keepclassmembernames class top.qwq2333.nullgram.activity.DatacenterActivity$DatacenterHeaderCell { ; }
--keepclassmembernames class top.qwq2333.nullgram.activity.MessageDetailActivity$TextDetailSimpleCell { ; }
--keepclassmembernames class top.qwq2333.nullgram.activity.PasscodeSettingActivity$AccountCell { ; }
--keepclassmembernames class top.qwq2333.nullgram.activity.ChatSettingActivity$StickerSizeCell { ; }
+-keepclassmembernames class xyz.nextalone.nnngram.activity.DatacenterActivity$DatacenterCell { ; }
+-keepclassmembernames class xyz.nextalone.nnngram.activity.DatacenterActivity$DatacenterHeaderCell { ; }
+-keepclassmembernames class xyz.nextalone.nnngram.activity.MessageDetailActivity$TextDetailSimpleCell { ; }
+-keepclassmembernames class xyz.nextalone.nnngram.activity.PasscodeSettingActivity$AccountCell { ; }
+-keepclassmembernames class xyz.nextalone.nnngram.activity.ChatSettingActivity$StickerSizeCell { ; }
-keepclassmembernames class androidx.core.widget.NestedScrollView {
private android.widget.OverScroller mScroller;
@@ -150,7 +150,7 @@
public static *** d(...);
}
--assumenosideeffects class top.qwq2333.nullgram.utils.Log {
+-assumenosideeffects class xyz.nextalone.nnngram.utils.Log {
public static *** d(...);
}
@@ -183,7 +183,7 @@
kotlinx.serialization.KSerializer serializer(...);
}
--keep class top.qwq2333.nullgram.utils.Log {
+-keep class xyz.nextalone.nnngram.utils.Log {
public static *** nativeLog(...);
}
diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml
index 5234955bfd..dd83eab877 100644
--- a/TMessagesProj/src/main/AndroidManifest.xml
+++ b/TMessagesProj/src/main/AndroidManifest.xml
@@ -130,8 +130,8 @@
android:restoreAnyVersion="true"
android:backupAgent=".BackupAgent"
android:hardwareAccelerated="@bool/useHardwareAcceleration"
- android:icon="@mipmap/ic_launcher"
- android:roundIcon="@mipmap/ic_launcher"
+ android:icon="@mipmap/ic_launcher_nagram"
+ android:roundIcon="@mipmap/ic_launcher_nagram_round"
android:largeHeap="true"
android:label="@string/NullgramName"
android:theme="@style/Theme.TMessages.Start"
@@ -162,10 +162,10 @@
@@ -179,10 +179,10 @@
@@ -196,10 +196,10 @@
@@ -213,10 +213,10 @@
@@ -230,26 +230,10 @@
-
-
-
-
-
-
-
-
-
-
@@ -330,7 +314,7 @@
-
+
@@ -378,7 +362,7 @@
android:stateNotNeeded="true"
android:theme="@style/Theme.TMessages.Transparent"
android:exported="true">
-
+
@@ -391,7 +375,7 @@
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:exported="true"
android:windowSoftInputMode="adjustPan">
-
+
@@ -402,7 +386,7 @@
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:exported="true"
android:windowSoftInputMode="adjustPan">
-
+
@@ -412,7 +396,7 @@
android:hardwareAccelerated="@bool/useHardwareAcceleration"
android:exported="true"
android:windowSoftInputMode="adjustPan">
-
+
@@ -506,15 +490,15 @@ e
-
+
-
+
-
+
@@ -762,6 +746,10 @@ e
+
+
diff --git a/TMessagesProj/src/main/assets/spotify_embed.html b/TMessagesProj/src/main/assets/spotify_embed.html
new file mode 100644
index 0000000000..1df6e439c1
--- /dev/null
+++ b/TMessagesProj/src/main/assets/spotify_embed.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
index eeef34034e..ef5c5977a7 100644
--- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
+++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
@@ -40,11 +40,12 @@
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import org.telegram.messenger.AndroidUtilities;
+import org.telegram.ui.Cells.DialogCell;
import java.util.ArrayList;
import java.util.List;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
/**
* This is a utility class to add swipe to dismiss and drag & drop support to RecyclerView.
@@ -1256,6 +1257,11 @@ public boolean isIdle() {
}
public int checkHorizontalSwipe(ViewHolder viewHolder, int flags) {
+ if (viewHolder != null && viewHolder.itemView instanceof DialogCell) {
+ if (((DialogCell) viewHolder.itemView).getCurrentDialogFolderId() == 0 && Config.doNotUnarchiveBySwipe) {
+ return 0;
+ }
+ }
if ((flags & (LEFT | RIGHT)) != 0) {
final int dirFlag = mDx > 0 ? RIGHT : LEFT;
if (mVelocityTracker != null && mActivePointerId > -1) {
diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 8bb7eba379..d65a26fba9 100644
--- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -97,10 +97,10 @@
import java.util.Collections;
import java.util.List;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.config.ConfigManager;
-import top.qwq2333.nullgram.utils.Defines;
-import top.qwq2333.nullgram.utils.VibrationUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.config.ConfigManager;
+import xyz.nextalone.nnngram.utils.Defines;
+import xyz.nextalone.nnngram.utils.VibrationUtils;
/**
* A flexible view for providing a limited window into a large data set.
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AccountInstance.java b/TMessagesProj/src/main/java/org/telegram/messenger/AccountInstance.java
index 3d10e4aadb..2d989cd72c 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/AccountInstance.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/AccountInstance.java
@@ -5,9 +5,9 @@
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.ui.Components.Paint.PersistColorPalette;
-import top.qwq2333.nullgram.config.CloudStorage;
-import top.qwq2333.nullgram.helpers.ConnectionsHelper;
-import top.qwq2333.nullgram.utils.MessageUtils;
+import xyz.nextalone.nnngram.config.CloudStorage;
+import xyz.nextalone.nnngram.helpers.ConnectionsHelper;
+import xyz.nextalone.nnngram.utils.MessageUtils;
public class AccountInstance {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java
index edadaf6ae2..98fd05462d 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java
@@ -224,9 +224,10 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.AlertUtil;
-import top.qwq2333.nullgram.utils.AnalyticsUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.AlertUtil;
+import xyz.nextalone.nnngram.utils.AnalyticsUtils;
+import xyz.nextalone.nnngram.utils.TypefaceUtils;
public class AndroidUtilities {
public final static int LIGHT_STATUS_BAR_OVERLAY = 0x0f000000, DARK_STATUS_BAR_OVERLAY = 0x33000000;
@@ -2248,17 +2249,43 @@ public static Typeface getTypeface(String assetPath) {
if (!typefaceCache.containsKey(assetPath)) {
try {
Typeface t;
- if (Build.VERSION.SDK_INT >= 26) {
- Typeface.Builder builder = new Typeface.Builder(ApplicationLoader.applicationContext.getAssets(), assetPath);
- if (assetPath.contains("medium")) {
- builder.setWeight(700);
- }
- if (assetPath.contains("italic")) {
- builder.setItalic(true);
- }
- t = builder.build();
- } else {
- t = Typeface.createFromAsset(ApplicationLoader.applicationContext.getAssets(), assetPath);
+ switch (assetPath) {
+ case TYPEFACE_ROBOTO_MEDIUM:
+ if (TypefaceUtils.isMediumWeightSupported()) {
+ t = Typeface.create("sans-serif-medium", Typeface.NORMAL);
+ } else {
+ t = Typeface.create("sans-serif", Typeface.BOLD);
+ }
+ break;
+ case "fonts/ritalic.ttf":
+ t = Typeface.create("sans-serif", Typeface.ITALIC);
+ break;
+ case TYPEFACE_ROBOTO_MEDIUM_ITALIC:
+ if (TypefaceUtils.isMediumWeightSupported()) {
+ t = Typeface.create("sans-serif-medium", Typeface.ITALIC);
+ } else {
+ t = Typeface.create("sans-serif", Typeface.BOLD_ITALIC);
+ }
+ break;
+ case TYPEFACE_ROBOTO_MONO:
+ t = Typeface.MONOSPACE;
+ break;
+ case "fonts/rcondensedbold.ttf":
+ t = Typeface.create("sans-serif-condensed", Typeface.BOLD);
+ break;
+ default:
+ if (Build.VERSION.SDK_INT >= 26) {
+ Typeface.Builder builder = new Typeface.Builder(ApplicationLoader.applicationContext.getAssets(), assetPath);
+ if (assetPath.contains("medium")) {
+ builder.setWeight(700);
+ }
+ if (assetPath.contains("italic")) {
+ builder.setItalic(true);
+ }
+ t = builder.build();
+ } else {
+ t = Typeface.createFromAsset(ApplicationLoader.applicationContext.getAssets(), assetPath);
+ }
}
typefaceCache.put(assetPath, t);
} catch (Exception e) {
@@ -4016,10 +4043,10 @@ public static void openDocument(MessageObject message, Activity activity, BaseFr
// intent.setDataAndType(Uri.fromFile(f), realMimeType != null ? realMimeType : "text/plain");
//}
if (realMimeType != null) {
- if (BuildConfig.isPlay && realMimeType.equals("application/vnd.android.package-archive")) {
- AlertUtil.showSimpleAlert(activity, LocaleController.getString("InstallProhibitedPlay", R.string.InstallProhibitedPlay));
- return;
- }
+// if (BuildConfig.isPlay && realMimeType.equals("application/vnd.android.package-archive")) {
+// AlertUtil.showSimpleAlert(activity, LocaleController.getString("InstallProhibitedPlay", R.string.InstallProhibitedPlay));
+// return;
+// }
try {
activity.startActivityForResult(intent, 500);
} catch (Exception e) {
@@ -4076,10 +4103,10 @@ public static boolean openForView(File f, String fileName, String mimeType, fina
}
}
}
- if (BuildConfig.isPlay && realMimeType != null && realMimeType.equals("application/vnd.android.package-archive")) {
- AlertUtil.showSimpleAlert(activity, LocaleController.getString("InstallProhibitedPlay", R.string.InstallProhibitedPlay));
- return true;
- }
+// if (BuildConfig.isPlay && realMimeType != null && realMimeType.equals("application/vnd.android.package-archive")) {
+// AlertUtil.showSimpleAlert(activity, LocaleController.getString("InstallProhibitedPlay", R.string.InstallProhibitedPlay));
+// return true;
+// }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && realMimeType != null && realMimeType.equals("application/vnd.android.package-archive") && !ApplicationLoader.applicationContext.getPackageManager().canRequestPackageInstalls()) {
AlertsCreator.createApkRestrictedDialog(activity, resourcesProvider).show();
return true;
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java
index ce4c4bcaf0..962ca90f13 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java
@@ -67,8 +67,8 @@
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
-import top.qwq2333.nullgram.CrashListener;
-import top.qwq2333.nullgram.utils.AnalyticsUtils;
+import xyz.nextalone.nnngram.CrashListener;
+import xyz.nextalone.nnngram.utils.AnalyticsUtils;
public class ApplicationLoader extends Application {
@@ -178,7 +178,7 @@ public static File getFilesDirFixed() {
} catch (Exception e) {
FileLog.e(e);
}
- return new File("/data/data/top.qwq2333.nullgram/files");
+ return new File("/data/data/xyz.nextalone.nnngram/files");
}
public static void postInitApplication() {
@@ -322,7 +322,7 @@ public void onActivityStarted(Activity activity) {
applicationHandler = new Handler(applicationContext.getMainLooper());
- org.osmdroid.config.Configuration.getInstance().setUserAgentValue("Nullgram" + BuildConfig.VERSION_NAME);
+ org.osmdroid.config.Configuration.getInstance().setUserAgentValue("Nnngram" + BuildConfig.VERSION_NAME);
org.osmdroid.config.Configuration.getInstance().setOsmdroidBasePath(new File(ApplicationLoader.applicationContext.getCacheDir(), "osmdroid"));
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BaseController.java b/TMessagesProj/src/main/java/org/telegram/messenger/BaseController.java
index 776f3edfff..b7fd9a0c8a 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/BaseController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/BaseController.java
@@ -3,8 +3,8 @@
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.ui.Components.Paint.PersistColorPalette;
-import top.qwq2333.nullgram.config.CloudStorage;
-import top.qwq2333.nullgram.helpers.ConnectionsHelper;
+import xyz.nextalone.nnngram.config.CloudStorage;
+import xyz.nextalone.nnngram.helpers.ConnectionsHelper;
public class BaseController {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java
index 9758e2fac0..7ad49e52c6 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java
@@ -26,27 +26,27 @@
public class BuildVars {
public static final boolean DEBUG_VERSION = true;
- public static boolean DEBUG_PRIVATE_VERSION = false;
+ public static boolean DEBUG_PRIVATE_VERSION = true;
public static boolean CHECK_UPDATES = true;
public static boolean LOGS_ENABLED = true;
public static boolean USE_CLOUD_STRINGS = true;
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
public static final int BUILD_VERSION = 5511;
public static final String BUILD_VERSION_STRING = "11.5.3";
- public static final int APP_ID = 19797609;
- public static final String APP_HASH = "e8f1567dbbf38944a1391c4d23c34b60";
+ public static final int APP_ID = 25184524;
+ public static final String APP_HASH = "0cda2e05621028b7d3836504dad86b9c";
public static final String APPCENTER_HASH = "PLACEHOLDER";
public static String SAFETYNET_KEY = "";
public static String SMS_HASH = "O2P2z+/jBpJ";
- public static final String PLAYSTORE_APP_URL = "https://play.google.com/store/apps/details?id=top.qwq2333.nullgram";
+ public static final String PLAYSTORE_APP_URL = "";
public static String HUAWEI_STORE_URL = "";
public static String GOOGLE_AUTH_CLIENT_ID = "760348033671-81kmi3pi84p11ub8hp9a1funsv0rn2p9.apps.googleusercontent.com";
// You can use this flag to disable Google Play Billing (If you're making fork and want it to be in Google Play)
- public static boolean IS_BILLING_UNAVAILABLE = BuildConfig.isPlay;
+ public static boolean IS_BILLING_UNAVAILABLE = false;
static {
if (ApplicationLoader.applicationContext != null) {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java
index 023a99cae0..b46d19020e 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java
@@ -60,7 +60,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import top.qwq2333.nullgram.helpers.PasscodeHelper;
+import xyz.nextalone.nnngram.helpers.PasscodeHelper;
+import xyz.nextalone.nnngram.utils.StringUtils;
public class ContactsController extends BaseController {
@@ -397,7 +398,7 @@ public void checkAppAccount() {
Utilities.globalQueue.postRunnable(() -> {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
try {
- Account[] accounts = am.getAccountsByType("top.qwq2333.nullgram");
+ Account[] accounts = am.getAccountsByType("xyz.nextalone.nnngram");
for (int a = 0; a < accounts.length; a++) {
Account acc = accounts[a];
boolean found = false;
@@ -429,7 +430,7 @@ public void checkAppAccount() {
readContacts();
if (systemAccount == null) {
try {
- systemAccount = new Account("" + getUserConfig().getClientUserId(), "top.qwq2333.nullgram");
+ systemAccount = new Account("" + getUserConfig().getClientUserId(), "xyz.nextalone.nnngram");
am.addAccountExplicitly(systemAccount, "", null);
} catch (Exception ignore) {
@@ -443,7 +444,7 @@ public void deleteUnknownAppAccounts() {
try {
systemAccount = null;
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
- Account[] accounts = am.getAccountsByType("top.qwq2333.nullgram");
+ Account[] accounts = am.getAccountsByType("xyz.nextalone.nnngram");
for (int a = 0; a < accounts.length; a++) {
Account acc = accounts[a];
boolean found = false;
@@ -519,7 +520,7 @@ public void deleteAllContacts(final Runnable runnable) {
AndroidUtilities.runOnUIThread(() -> {
AccountManager am = AccountManager.get(ApplicationLoader.applicationContext);
try {
- Account[] accounts = am.getAccountsByType("top.qwq2333.nullgram");
+ Account[] accounts = am.getAccountsByType("xyz.nextalone.nnngram");
systemAccount = null;
for (int a = 0; a < accounts.length; a++) {
Account acc = accounts[a];
@@ -537,7 +538,7 @@ public void deleteAllContacts(final Runnable runnable) {
}
try {
- systemAccount = new Account("" + getUserConfig().getClientUserId(), "top.qwq2333.nullgram");
+ systemAccount = new Account("" + getUserConfig().getClientUserId(), "xyz.nextalone.nnngram");
am.addAccountExplicitly(systemAccount, "", null);
} catch (Exception ignore) {
@@ -2304,7 +2305,7 @@ private void applyContactToPhoneBook(ArrayList query,
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
- builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.top.qwq2333.nullgram.android.profile");
+ builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.xyz.nextalone.nnngram.android.profile");
builder.withValue(ContactsContract.Data.DATA1, user.id);
builder.withValue(ContactsContract.Data.DATA2, "Telegram Profile");
builder.withValue(ContactsContract.Data.DATA3, LocaleController.formatString("ContactShortcutMessage", R.string.ContactShortcutMessage, phoneOrName));
@@ -2313,7 +2314,7 @@ private void applyContactToPhoneBook(ArrayList query,
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
- builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.top.qwq2333.nullgram.android.call");
+ builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.xyz.nextalone.nnngram.android.call");
builder.withValue(ContactsContract.Data.DATA1, user.id);
builder.withValue(ContactsContract.Data.DATA2, "Telegram Voice Call");
builder.withValue(ContactsContract.Data.DATA3, LocaleController.formatString("ContactShortcutVoiceCall", R.string.ContactShortcutVoiceCall, phoneOrName));
@@ -2322,7 +2323,7 @@ private void applyContactToPhoneBook(ArrayList query,
builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
- builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.top.qwq2333.nullgram.android.call.video");
+ builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.xyz.nextalone.nnngram.android.call.video");
builder.withValue(ContactsContract.Data.DATA1, user.id);
builder.withValue(ContactsContract.Data.DATA2, "Telegram Video Call");
builder.withValue(ContactsContract.Data.DATA3, LocaleController.formatString("ContactShortcutVideoCall", R.string.ContactShortcutVideoCall, phoneOrName));
@@ -3077,7 +3078,7 @@ public static String formatName(String firstName, String lastName, int maxLength
result.append(firstName);
}
}
- return result.toString();
+ return StringUtils.zalgoFilter(result.toString());
}
private class PhoneBookContact {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java
index 73d69fae9c..e80dbc6913 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java
@@ -51,8 +51,8 @@
import java.util.Locale;
import java.util.Objects;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.Utils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.Utils;
public class Emoji {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java
index 17af649510..9ad6d97dc3 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java
@@ -41,9 +41,9 @@
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipException;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.config.ConfigManager;
-import top.qwq2333.nullgram.utils.Defines;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.config.ConfigManager;
+import xyz.nextalone.nnngram.utils.Defines;
public class FileLoadOperation {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java
index 20f8f31a56..9eeabb84c9 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java
@@ -17,7 +17,7 @@
import java.io.File;
import java.io.OutputStreamWriter;
-import top.qwq2333.nullgram.utils.Log;
+import xyz.nextalone.nnngram.utils.Log;
/**
* @deprecated use {@link Log} instead
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java
index 19156ad02f..5c70ad68b4 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java
@@ -25,7 +25,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class FileUploadOperation {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FilesMigrationService.java b/TMessagesProj/src/main/java/org/telegram/messenger/FilesMigrationService.java
index f3e66be098..50dded041e 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/FilesMigrationService.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/FilesMigrationService.java
@@ -204,7 +204,7 @@ public static void checkBottomSheet(BaseFragment fragment) {
}
}
}
- File oldDirectory = new File(path, "Nullgram");
+ File oldDirectory = new File(path, "Nnngram");
hasOldFolder = oldDirectory.exists();
}
if (hasOldFolder) {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FingerprintController.java b/TMessagesProj/src/main/java/org/telegram/messenger/FingerprintController.java
index ac56341e6a..76680f4e39 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/FingerprintController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/FingerprintController.java
@@ -110,7 +110,10 @@ public static void checkKeyReady(boolean notifyCheckFingerprint) {
public static boolean isKeyReady() {
try {
- return getKeyStore().containsAlias(KEY_ALIAS);
+ var ks = getKeyStore();
+ if (ks != null) {
+ return ks.containsAlias(KEY_ALIAS);
+ }
} catch (KeyStoreException e) {
FileLog.e(e);
}
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FlagSecureReason.java b/TMessagesProj/src/main/java/org/telegram/messenger/FlagSecureReason.java
index 6a163a909f..85ffad2e9b 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/FlagSecureReason.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/FlagSecureReason.java
@@ -5,7 +5,7 @@
import java.util.HashMap;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class FlagSecureReason {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java
index 228de41bd0..e74afa54fc 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java
@@ -2463,14 +2463,14 @@ public SparseArray createMediaPaths() {
try {
if (ApplicationLoader.applicationContext.getExternalMediaDirs().length > 0) {
publicMediaDir = getPublicStorageDir();
- publicMediaDir = new File(publicMediaDir, "Nullgram");
+ publicMediaDir = new File(publicMediaDir, "Nnngram");
publicMediaDir.mkdirs();
}
} catch (Exception e) {
FileLog.e(e);
}
newPath = ApplicationLoader.applicationContext.getExternalFilesDir(null);
- telegramPath = new File(newPath, "Nullgram");
+ telegramPath = new File(newPath, "Nnngram");
} else {
boolean isSdCard = !TextUtils.isEmpty(SharedConfig.storageCacheDir) && path.getAbsolutePath().startsWith(SharedConfig.storageCacheDir);
if (!isSdCard) {
@@ -2479,7 +2479,7 @@ public SparseArray createMediaPaths() {
path = ApplicationLoader.applicationContext.getExternalFilesDir(null);
}
}
- telegramPath = new File(path, "Nullgram");
+ telegramPath = new File(path, "Nnngram");
}
telegramPath.mkdirs();
@@ -2489,7 +2489,7 @@ public SparseArray createMediaPaths() {
File dir = dirs.get(a);
if (dir != null && !TextUtils.isEmpty(SharedConfig.storageCacheDir) && dir.getAbsolutePath().startsWith(SharedConfig.storageCacheDir)) {
path = dir;
- telegramPath = new File(path, "Nullgram");
+ telegramPath = new File(path, "Nnngram");
telegramPath.mkdirs();
break;
}
@@ -2498,7 +2498,7 @@ public SparseArray createMediaPaths() {
if (telegramPath.isDirectory()) {
try {
- File imagePath = new File(telegramPath, "Nullgram Images");
+ File imagePath = new File(telegramPath, "Nnngram Images");
imagePath.mkdir();
if (imagePath.isDirectory() && canMoveFiles(cachePath, imagePath, FileLoader.MEDIA_DIR_IMAGE)) {
mediaDirs.put(FileLoader.MEDIA_DIR_IMAGE, imagePath);
@@ -2511,7 +2511,7 @@ public SparseArray createMediaPaths() {
}
try {
- File videoPath = new File(telegramPath, "Nullgram Video");
+ File videoPath = new File(telegramPath, "Nnngram Video");
videoPath.mkdir();
if (videoPath.isDirectory() && canMoveFiles(cachePath, videoPath, FileLoader.MEDIA_DIR_VIDEO)) {
mediaDirs.put(FileLoader.MEDIA_DIR_VIDEO, videoPath);
@@ -2524,7 +2524,7 @@ public SparseArray createMediaPaths() {
}
try {
- File audioPath = new File(telegramPath, "Nullgram Audio");
+ File audioPath = new File(telegramPath, "Nnngram Audio");
audioPath.mkdir();
if (audioPath.isDirectory() && canMoveFiles(cachePath, audioPath, FileLoader.MEDIA_DIR_AUDIO)) {
AndroidUtilities.createEmptyFile(new File(audioPath, ".nomedia"));
@@ -2538,7 +2538,7 @@ public SparseArray createMediaPaths() {
}
try {
- File documentPath = new File(telegramPath, "Nullgram Documents");
+ File documentPath = new File(telegramPath, "Nnngram Documents");
documentPath.mkdir();
if (documentPath.isDirectory() && canMoveFiles(cachePath, documentPath, FileLoader.MEDIA_DIR_DOCUMENT)) {
AndroidUtilities.createEmptyFile(new File(documentPath, ".nomedia"));
@@ -2552,7 +2552,7 @@ public SparseArray createMediaPaths() {
}
try {
- File normalNamesPath = new File(telegramPath, "Nullgram Files");
+ File normalNamesPath = new File(telegramPath, "Nnngram Files");
normalNamesPath.mkdir();
if (normalNamesPath.isDirectory() && canMoveFiles(cachePath, normalNamesPath, FileLoader.MEDIA_DIR_FILES)) {
AndroidUtilities.createEmptyFile(new File(normalNamesPath, ".nomedia"));
@@ -2581,7 +2581,7 @@ public SparseArray createMediaPaths() {
}
if (publicMediaDir != null && publicMediaDir.isDirectory()) {
try {
- File imagePath = new File(publicMediaDir, "Nullgram Images");
+ File imagePath = new File(publicMediaDir, "Nnngram Images");
imagePath.mkdir();
if (imagePath.isDirectory() && canMoveFiles(cachePath, imagePath, FileLoader.MEDIA_DIR_IMAGE)) {
mediaDirs.put(FileLoader.MEDIA_DIR_IMAGE_PUBLIC, imagePath);
@@ -2594,7 +2594,7 @@ public SparseArray createMediaPaths() {
}
try {
- File videoPath = new File(publicMediaDir, "Nullgram Video");
+ File videoPath = new File(publicMediaDir, "Nnngram Video");
videoPath.mkdir();
if (videoPath.isDirectory() && canMoveFiles(cachePath, videoPath, FileLoader.MEDIA_DIR_VIDEO)) {
mediaDirs.put(FileLoader.MEDIA_DIR_VIDEO_PUBLIC, videoPath);
@@ -2832,11 +2832,13 @@ public void cancelLoadingForImageReceiver(final ImageReceiver imageReceiver, fin
}
WebInstantView.cancelLoadPhoto(imageReceiver);
ArrayList runnables = imageReceiver.getLoadingOperations();
- if (!runnables.isEmpty()) {
- for (int i = 0; i < runnables.size(); i++) {
- imageLoadQueue.cancelRunnable(runnables.get(i));
+ synchronized (runnables) {
+ if (!runnables.isEmpty()) {
+ for (int i = 0; i < runnables.size(); i++) {
+ imageLoadQueue.cancelRunnable(runnables.get(i));
+ }
+ runnables.clear();
}
- runnables.clear();
}
imageReceiver.addLoadingImageRunnable(null);
imageLoadQueue.postRunnable(() -> {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java
index b750c1352f..a22dc4db14 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java
@@ -57,8 +57,8 @@
import java.util.Locale;
import java.util.TimeZone;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.Log;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.Log;
public class LocaleController {
@@ -1431,7 +1431,7 @@ private String getStringInternal(String key, String fallback, int fallbackRes, i
return ApplicationLoader.applicationContext.getString(R.string.NullgramName);
}
case "TelegramFeaturesUrl":
- return "t.me/NullgramClient";
+ return "t.me/nagram_group";
case "UnsupportedMedia":
return ApplicationLoader.applicationContext.getString(R.string.UnsupportedMediaNullgram);
default:
@@ -1462,10 +1462,14 @@ private String getStringInternal(String key, String fallback, int fallbackRes, i
value = "LOC_ERR:" + key;
}
- if (value.contains("Telegram"))
- value = value.replace("Telegram", "Nullgram");
+// if (value.contains("Telegram"))
+// value = value.replace("Telegram", "Nnngram");
if (value.contains("TELEOFFICIAL"))
value = value.replace("TELEOFFICIAL", "Telegram");
+ if (value.contains("NullgramClient"))
+ value = value.replace("NullgramClient", "nagram_group");
+ if (value.contains("Nullgram"))
+ value = value.replace("Nullgram", "Nnngram");
return value;
}
@@ -1663,12 +1667,15 @@ public static String formatString(String key, String fallback, int res, int fall
}
}
- if (value.contains("Telegram")) {
- value = value.replace("Telegram", "Nullgram");
- }
+// if (value.contains("Telegram")) {
+// value = value.replace("Telegram", "Nullgram");
+// }
if (value.contains("TELEOFFICIAL")) {
value = value.replace("TELEOFFICIAL", "Telegram");
}
+ if (value.contains("Nullgram")) {
+ value = value.replace("Nullgram", "Nnngram");
+ }
if (getInstance().currentLocale != null) {
return String.format(getInstance().currentLocale, value, args);
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java
index 07348d391b..5e37d41caf 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java
@@ -125,12 +125,12 @@
import java.util.concurrent.CountDownLatch;
import kotlin.Unit;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.CallStateListener;
-import top.qwq2333.nullgram.SaveToDownloadReceiver;
-import top.qwq2333.nullgram.utils.AudioUtils;
-import top.qwq2333.nullgram.utils.Log;
-import top.qwq2333.nullgram.utils.PermissionUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.CallStateListener;
+import xyz.nextalone.nnngram.SaveToDownloadReceiver;
+import xyz.nextalone.nnngram.utils.AudioUtils;
+import xyz.nextalone.nnngram.utils.Log;
+import xyz.nextalone.nnngram.utils.PermissionUtils;
public class MediaController implements AudioManager.OnAudioFocusChangeListener, NotificationCenter.NotificationCenterDelegate, SensorEventListener {
@@ -4529,7 +4529,7 @@ SaveToDownloadReceiver. makeNotification(context,notificationId,messageObjects.s
break;
}
if (!sourceFile.exists()) {
- sourceFile = FileLoader.getInstance(currentAccount.getCurrentAccount()).getPathToAttach(message.messageOwner, true);
+ sourceFile = FileLoader.getInstance(currentAccount.getCurrentAccount()).getPathToMessage(message.messageOwner);
FileLog.d("saving file: correcting path from " + path + " to " + (sourceFile == null ? null : sourceFile.getAbsolutePath()));
}
if (sourceFile != null && sourceFile.exists()) {
@@ -4790,11 +4790,11 @@ public static void saveFile(String fullPath, Context context, final int type, fi
} else {
File destFile;
if (type == 0) {
- destFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Nullgram");
+ destFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Nnngram");
destFile.mkdirs();
destFile = new File(destFile, AndroidUtilities.generateFileName(0, FileLoader.getFileExtension(sourceFile)));
} else if (type == 1) {
- destFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "Nullgram");
+ destFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "Nnngram");
destFile.mkdirs();
destFile = new File(destFile, AndroidUtilities.generateFileName(1, FileLoader.getFileExtension(sourceFile)));
} else {
@@ -4804,7 +4804,7 @@ public static void saveFile(String fullPath, Context context, final int type, fi
} else {
dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
}
- dir = new File(dir, "Nullgram");
+ dir = new File(dir, "Nnngram");
dir.mkdirs();
destFile = new File(dir, name);
if (destFile.exists()) {
@@ -4909,7 +4909,7 @@ private static Uri saveFileInternal(int type, File sourceFile, String filename)
filename = AndroidUtilities.generateFileName(0, extension);
}
uriToInsert = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
- File dirDest = new File(Environment.DIRECTORY_PICTURES, "Nullgram");
+ File dirDest = new File(Environment.DIRECTORY_PICTURES, "Nnngram");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, dirDest + File.separator);
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
contentValues.put(MediaStore.Images.Media.MIME_TYPE, mimeType);
@@ -4917,7 +4917,7 @@ private static Uri saveFileInternal(int type, File sourceFile, String filename)
if (filename == null) {
filename = AndroidUtilities.generateFileName(1, extension);
}
- File dirDest = new File(Environment.DIRECTORY_MOVIES, "Nullgram");
+ File dirDest = new File(Environment.DIRECTORY_MOVIES, "Nnngram");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, dirDest + File.separator);
uriToInsert = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
contentValues.put(MediaStore.Video.Media.DISPLAY_NAME, filename);
@@ -4925,7 +4925,7 @@ private static Uri saveFileInternal(int type, File sourceFile, String filename)
if (filename == null) {
filename = sourceFile.getName();
}
- File dirDest = new File(Environment.DIRECTORY_DOWNLOADS, "Nullgram");
+ File dirDest = new File(Environment.DIRECTORY_DOWNLOADS, "Nnngram");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, dirDest + File.separator);
uriToInsert = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
contentValues.put(MediaStore.Downloads.DISPLAY_NAME, filename);
@@ -4933,7 +4933,7 @@ private static Uri saveFileInternal(int type, File sourceFile, String filename)
if (filename == null) {
filename = sourceFile.getName();
}
- File dirDest = new File(Environment.DIRECTORY_MUSIC, "Nullgram");
+ File dirDest = new File(Environment.DIRECTORY_MUSIC, "Nnngram");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, dirDest + File.separator);
uriToInsert = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
contentValues.put(MediaStore.Audio.Media.DISPLAY_NAME, filename);
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java
index 44df25470f..22ee95e781 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java
@@ -111,8 +111,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.helpers.EntitiesHelper;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.helpers.EntitiesHelper;
@SuppressWarnings("unchecked")
public class MediaDataController extends BaseController {
@@ -3686,7 +3686,11 @@ public boolean isMessageFound(int messageId, boolean mergeDialog) {
}
public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, TLRPC.User user, TLRPC.Chat chat, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter) {
- searchMessagesInChat(query, dialogId, mergeDialogId, guid, direction, replyMessageId, false, user, chat, true, reaction, filter);
+ searchMessagesInChat(query, dialogId, mergeDialogId, guid, direction, replyMessageId, false, user, chat, true, reaction, filter, false);
+ }
+
+ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, TLRPC.User user, TLRPC.Chat chat, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter, boolean firstSearch) {
+ searchMessagesInChat(query, dialogId, mergeDialogId, guid, direction, replyMessageId, false, user, chat, true, reaction, filter, firstSearch);
}
public void jumpToSearchedMessage(int guid, int index) {
@@ -3720,8 +3724,20 @@ public boolean searchEndReached() {
return messagesSearchEndReached[0] && lastMergeDialogId == 0 && messagesSearchEndReached[1] || (loadingSearchLocal || loadedPredirectedSearchLocal);
}
+ public void setCurrentMessage(int index) {
+ lastReturnedNum = index;
+ }
+
+ public void setCurrentMaxMessage() {
+ lastReturnedNum = searchResultMessages.size() - 1;
+ }
+
public void loadMoreSearchMessages(boolean fromList) {
- if (loadingMoreSearchMessages || reqId != 0 || messagesSearchEndReached[0] && lastMergeDialogId == 0 && messagesSearchEndReached[1]) {
+ loadMoreSearchMessages(fromList, false);
+ }
+
+ public void loadMoreSearchMessages(boolean fromList, boolean force) {
+ if (!force && (loadingMoreSearchMessages || reqId != 0 || messagesSearchEndReached[0] && lastMergeDialogId == 0 && messagesSearchEndReached[1])) {
return;
}
int temp = lastReturnedNum;
@@ -3735,8 +3751,12 @@ public boolean isSearchLoading() {
return reqId != 0;
}
+ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, boolean internal, TLRPC.User user, TLRPC.Chat chat, boolean jumpToMessage, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter) {
+ searchMessagesInChat(query, dialogId, mergeDialogId, guid, direction, replyMessageId, internal, user, chat, jumpToMessage, reaction, filter, false);
+ }
+
public void searchMessagesInChat(String query, long dialogId, long mergeDialogId, int guid, int direction, long replyMessageId, boolean internal, TLRPC.User user, TLRPC.Chat chat,
- boolean jumpToMessage, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter) {
+ boolean jumpToMessage, ReactionsLayoutInBubble.VisibleReaction reaction, TLRPC.MessagesFilter filter, boolean firstSearch) {
int max_id = 0;
long queryWithDialog = dialogId;
boolean firstQuery = !internal;
@@ -3854,11 +3874,11 @@ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId
TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
messagesSearchEndReached[1] = res.messages.isEmpty();
messagesSearchCount[1] = res instanceof TLRPC.TL_messages_messagesSlice ? res.count : res.messages.size();
- searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction, filter);
+ searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction, filter, firstSearch);
} else {
messagesSearchEndReached[1] = true;
messagesSearchCount[1] = 0;
- searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction, filter);
+ searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage, reaction, filter, firstSearch);
}
}
}), ConnectionsManager.RequestFlagFailOnServerErrors);
@@ -4002,7 +4022,7 @@ public void searchMessagesInChat(String query, long dialogId, long mergeDialogId
lastReturnedNum = searchResultMessages.size() - 1;
}
MessageObject messageObject = searchResultMessages.get(lastReturnedNum);
- getNotificationCenter().postNotificationName(NotificationCenter.chatSearchResultsAvailable, guid, messageObject.getId(), getMask(), messageObject.getDialogId(), lastReturnedNum, getSearchCount(), jumpToMessage);
+ getNotificationCenter().postNotificationName(NotificationCenter.chatSearchResultsAvailable, guid, messageObject.getId(), getMask(), messageObject.getDialogId(), lastReturnedNum, getSearchCount(), jumpToMessage, firstSearch, filter);
} else if (isSaved) {
getNotificationCenter().postNotificationName(NotificationCenter.chatSearchResultsAvailable, guid, 0, getMask(), dialogId, lastReturnedNum, getSearchCount(), false);
}
@@ -8318,7 +8338,7 @@ public void checkAllMedia(boolean force) {
loadFeaturedDate[0] = 0;
loadFeaturedDate[1] = 0;
}
- loadRecents(MediaDataController.TYPE_FAVE, false, true, false);
+ loadRecents(MediaDataController.TYPE_FAVE, false, false, true);
loadRecents(MediaDataController.TYPE_GREETINGS, false, true, false);
loadRecents(MediaDataController.TYPE_PREMIUM_STICKERS, false, false, true);
checkFeaturedStickers();
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java
index bd309fc913..d71fe6d066 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java
@@ -116,8 +116,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.StringUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.StringUtils;
public class MessageObject {
@@ -5163,6 +5163,8 @@ private void updateMessageText(AbstractMap users, AbstractMap<
if (messageText == null) {
messageText = "";
+ } else {
+ messageText = StringUtils.zalgoFilter(messageText);
}
}
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java
index a1842cda4e..38ffc30d04 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java
@@ -127,7 +127,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class MessagesController extends BaseController implements NotificationCenter.NotificationCenterDelegate {
@@ -20254,7 +20254,7 @@ public String getRestrictionReason(ArrayList reasons) {
TLRPC.RestrictionReason reason = reasons.get(a);
if (ignoreRestrictionReasons != null && ignoreRestrictionReasons.contains(reason.reason)) continue;
if ("sensitive".equals(reason.reason)) continue;
- if ("all".equals(reason.platform) || ("android".equals(reason.platform) && BuildConfig.isPlay)) {
+ if ("all".equals(reason.platform)) {
return reason.text;
}
}
@@ -20268,7 +20268,7 @@ public boolean isSensitive(ArrayList reasons) {
for (int a = 0, N = reasons.size(); a < N; a++) {
TLRPC.RestrictionReason reason = reasons.get(a);
if (ignoreRestrictionReasons != null && ignoreRestrictionReasons.contains(reason.reason)) continue;
- if ("all".equals(reason.platform) || ("android".equals(reason.platform) && BuildConfig.isPlay)) {
+ if ("all".equals(reason.platform)) {
if ("sensitive".equals(reason.reason)) return true;
}
}
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java
index 62276e6513..ac4f01a0e8 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java
@@ -75,7 +75,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class MessagesStorage extends BaseController {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java
index bb55408317..c8ca8365ab 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java
@@ -103,8 +103,8 @@
import java.util.concurrent.CountDownLatch;
import java.util.function.Consumer;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.helpers.PasscodeHelper;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.helpers.PasscodeHelper;
public class NotificationsController extends BaseController {
@@ -3439,7 +3439,7 @@ private String createNotificationShortcut(NotificationCompat.Builder builder, lo
} else {
icon = IconCompat.createWithResource(ApplicationLoader.applicationContext, R.drawable.book_group);
}
- if (supportsBubble) {
+ if (!Config.disableNotificationBubble && supportsBubble) {
NotificationCompat.BubbleMetadata.Builder bubbleBuilder =
new NotificationCompat.BubbleMetadata.Builder(
PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT),
@@ -4368,7 +4368,7 @@ private void showOrUpdateNotification(boolean notifyAboutLast) {
PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
mBuilder.setContentTitle(name)
- .setSmallIcon(R.drawable.notification)
+ .setSmallIcon(R.drawable.na_notification)
.setAutoCancel(true)
.setNumber(total_unread_count)
.setContentIntent(contentIntent)
@@ -5336,7 +5336,7 @@ void call() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(ApplicationLoader.applicationContext)
.setContentTitle(name)
- .setSmallIcon(R.drawable.notification)
+ .setSmallIcon(R.drawable.na_notification)
.setContentText(text.toString())
.setAutoCancel(true)
.setNumber(dialogKey.story ? storyPushMessages.size() : messageObjects.size())
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java
index 2f7eb44554..f145407938 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java
@@ -113,8 +113,8 @@
import java.util.zip.ZipInputStream;
import kotlin.Pair;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.StringUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.StringUtils;
public class SendMessagesHelper extends BaseController implements NotificationCenter.NotificationCenterDelegate {
@@ -8762,6 +8762,10 @@ public static void prepareSendingMedia(AccountInstance accountInstance, ArrayLis
}
}
} else {
+ if (Config.sendMp4DocumentAsVideo) {
+ info.isVideo = info.path.endsWith("mp4");
+ info.doNotCompress = info.isVideo;
+ }
if (info.isVideo || info.videoEditedInfo != null) {
Bitmap thumb = null;
String thumbKey = null;
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java
index c8fad0ff5f..cf2dd7d99a 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java
@@ -63,12 +63,12 @@
import java.util.List;
import java.util.Locale;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.helpers.WebSocketHelper;
-import top.qwq2333.nullgram.utils.AlertUtil;
-import top.qwq2333.nullgram.utils.Defines;
-import top.qwq2333.nullgram.utils.Log;
-import top.qwq2333.nullgram.utils.StringUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.helpers.WebSocketHelper;
+import xyz.nextalone.nnngram.utils.AlertUtil;
+import xyz.nextalone.nnngram.utils.Defines;
+import xyz.nextalone.nnngram.utils.Log;
+import xyz.nextalone.nnngram.utils.StringUtils;
public class SharedConfig {
/**
@@ -302,8 +302,8 @@ private static boolean isWhitelisted(MediaCodecInfo codecInfo) {
public static boolean raiseToListen = true;
public static boolean nextMediaTap = true;
public static boolean recordViaSco = false;
- public static boolean customTabs = true;
- public static boolean inappBrowser = true;
+ public static boolean customTabs = false;
+ public static boolean inappBrowser = false;
public static boolean adaptableColorInBrowser = true;
public static boolean onlyLocalInstantView = false;
public static boolean directShare = true;
@@ -859,7 +859,7 @@ public static void loadConfig() {
raiseToSpeak = preferences.getBoolean("raise_to_speak", false);
nextMediaTap = preferences.getBoolean("next_media_on_tap", true);
recordViaSco = preferences.getBoolean("record_via_sco", false);
- customTabs = preferences.getBoolean("custom_tabs", true);
+ customTabs = preferences.getBoolean("custom_tabs", false);
inappBrowser = preferences.getBoolean("inapp_browser", false);
adaptableColorInBrowser = preferences.getBoolean("adaptableBrowser", false);
onlyLocalInstantView = preferences.getBoolean("onlyLocalInstantView", BuildVars.DEBUG_PRIVATE_VERSION);
@@ -1805,10 +1805,10 @@ public static void deleteProxy(ProxyInfo proxyInfo) {
public static void checkSaveToGalleryFiles() {
Utilities.globalQueue.postRunnable(() -> {
try {
- File telegramPath = new File(Environment.getExternalStorageDirectory(), "Nullgram");
- File imagePath = new File(telegramPath, "Nullgram Images");
+ File telegramPath = new File(Environment.getExternalStorageDirectory(), "Nnngram");
+ File imagePath = new File(telegramPath, "Nnngram Images");
imagePath.mkdir();
- File videoPath = new File(telegramPath, "Nullgram Video");
+ File videoPath = new File(telegramPath, "Nnngram Video");
videoPath.mkdir();
if (!BuildVars.NO_SCOPED_STORAGE) {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TranslateController.java b/TMessagesProj/src/main/java/org/telegram/messenger/TranslateController.java
index 44b344ea6a..8ed088eafb 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/TranslateController.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/TranslateController.java
@@ -50,7 +50,7 @@
import java.util.Set;
import kotlin.Unit;
-import top.qwq2333.nullgram.helpers.TranslateHelper;
+import xyz.nextalone.nnngram.helpers.TranslateHelper;
public class TranslateController extends BaseController {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java
index be575cfd05..7aac13adfc 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java
@@ -30,8 +30,8 @@
import java.util.Arrays;
-import top.qwq2333.nullgram.helpers.PasscodeHelper;
-import top.qwq2333.nullgram.utils.AnalyticsUtils;
+import xyz.nextalone.nnngram.helpers.PasscodeHelper;
+import xyz.nextalone.nnngram.utils.AnalyticsUtils;
public class UserConfig extends BaseController {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java
index 4d67f897bb..2180b07a9b 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java
@@ -26,6 +26,8 @@
import org.telegram.PhoneFormat.PhoneFormat;
import org.telegram.tgnet.TLRPC;
+import xyz.nextalone.nnngram.utils.StringUtils;
+
public class UserObject {
public static final long REPLY_BOT = 1271266957L;
@@ -123,7 +125,7 @@ public static String getFirstName(TLRPC.User user, boolean allowShort) {
} else if (!allowShort && name.length() <= 2) {
return ContactsController.formatName(user.first_name, user.last_name);
}
- return !TextUtils.isEmpty(name) ? name : LocaleController.getString(R.string.HiddenName);
+ return !TextUtils.isEmpty(name) ? StringUtils.zalgoFilter(name) : LocaleController.getString(R.string.HiddenName);
}
public static String getForcedFirstName(TLRPC.User user) {
@@ -141,7 +143,7 @@ public static String getForcedFirstName(TLRPC.User user) {
if (index >= 0) {
name = name.substring(0, index);
}
- return name;
+ return StringUtils.zalgoFilter(name);
}
public static boolean hasPhoto(TLRPC.User user) {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraView.java b/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraView.java
index 29ef2772dc..30c669ca41 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraView.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraView.java
@@ -106,7 +106,7 @@
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
@SuppressLint("NewApi")
public class CameraView extends FrameLayout implements TextureView.SurfaceTextureListener, CameraController.ICameraView, CameraController.ErrorCallback {
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPPreNotificationService.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPPreNotificationService.java
index e92e5af4ac..6fc4273b77 100644
--- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPPreNotificationService.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPPreNotificationService.java
@@ -357,7 +357,11 @@ private static void startRinging(Context context, int account, long user_id) {
} else if (vibrate == 3) {
duration *= 2;
}
- vibrator.vibrate(new long[]{0, duration, 500}, 0);
+ AudioAttributes audioAttributes = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
+ .build();
+ vibrator.vibrate(new long[]{0, duration, 500}, 0, audioAttributes);
}
}
}
diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java
index 1fc9980c10..30d4333179 100755
--- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java
+++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java
@@ -152,7 +152,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-import top.qwq2333.nullgram.utils.PermissionUtils;
+import xyz.nextalone.nnngram.utils.PermissionUtils;
@SuppressLint("NewApi")
public class VoIPService extends Service implements SensorEventListener, AudioManager.OnAudioFocusChangeListener, VoIPController.ConnectionStateListener, NotificationCenter.NotificationCenterDelegate, VoIPServiceState {
@@ -3148,7 +3148,11 @@ private void startRingtoneAndVibration(long chatID) {
} else if (vibrate == 3) {
duration *= 2;
}
- vibrator.vibrate(new long[]{0, duration, 500}, 0);
+ AudioAttributes audioAttributes = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
+ .build();
+ vibrator.vibrate(new long[]{0, duration, 500}, 0, audioAttributes);
}
}
}
diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java
index 1b5c682276..04862cfd59 100644
--- a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java
+++ b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java
@@ -89,11 +89,11 @@
import javax.net.ssl.SSLException;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.helpers.WebSocketHelper;
-import top.qwq2333.nullgram.utils.DatabaseUtils;
-import top.qwq2333.nullgram.utils.Log;
-import top.qwq2333.nullgram.utils.Utils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.helpers.WebSocketHelper;
+import xyz.nextalone.nnngram.utils.DatabaseUtils;
+import xyz.nextalone.nnngram.utils.Log;
+import xyz.nextalone.nnngram.utils.Utils;
@SuppressWarnings("JavaJniMissingFunction")
public class ConnectionsManager extends BaseController {
diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java
index 63fef7518b..4f8f801668 100644
--- a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java
+++ b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java
@@ -50,7 +50,7 @@
import java.util.ArrayList;
import java.util.HashMap;
-import top.qwq2333.nullgram.utils.Defines;
+import xyz.nextalone.nnngram.utils.Defines;
@SuppressWarnings("unchecked")
public class TLRPC {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java
index 5597195da6..664458aa97 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java
@@ -77,7 +77,7 @@
import java.util.ArrayList;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class ActionBar extends FrameLayout {
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 5f9a149681..4e9fd4c755 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java
@@ -87,8 +87,9 @@
import java.util.Collections;
import java.util.List;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.VibrationUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.VibrationUtils;
+import xyz.nextalone.nnngram.utils.VibrationUtils;
public class ActionBarLayout extends FrameLayout implements INavigationLayout, FloatingDebugProvider {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java
index 22ef12daab..f835b97ab6 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java
@@ -331,7 +331,7 @@ public boolean onTouchEvent(MotionEvent event) {
View child = popupLayout.getItemAt(a);
child.getHitRect(rect);
Object tag = child.getTag();
- if (tag instanceof Integer && (Integer) tag < 100) {
+ if (tag instanceof Integer) {
if (!rect.contains((int) x, (int) y)) {
child.setPressed(false);
child.setSelected(false);
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 e614b1e498..c5695a1b58 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java
@@ -810,6 +810,8 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
lineProgressViewPercent.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
containerView.addView(lineProgressViewPercent, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 23, 4, 23, 24));
updateLineProgressTextView();
+ backgroundColor = getThemedColor(Theme.key_dialog_inlineProgressBackground);
+ containerView.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(18), backgroundColor));
} else if (progressViewStyle == ALERT_TYPE_SPINNER) {
setCanceledOnTouchOutside(false);
setCancelable(false);
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java
index fdf7e13e8f..a57f79b4e3 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java
@@ -71,11 +71,11 @@
import java.util.ArrayList;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.config.CloudStorage;
-import top.qwq2333.nullgram.helpers.ConnectionsHelper;
-import top.qwq2333.nullgram.utils.MessageUtils;
-import top.qwq2333.nullgram.utils.VibrationUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.config.CloudStorage;
+import xyz.nextalone.nnngram.helpers.ConnectionsHelper;
+import xyz.nextalone.nnngram.utils.MessageUtils;
+import xyz.nextalone.nnngram.utils.VibrationUtils;
public abstract class BaseFragment {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java
index 718d025004..5ecd922d3d 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java
@@ -55,7 +55,7 @@
import org.telegram.messenger.R;
import org.telegram.messenger.Utilities;
-import top.qwq2333.nullgram.utils.Log;
+import xyz.nextalone.nnngram.utils.Log;
public class DrawerLayoutContainer extends FrameLayout {
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 03638dacc2..dfce86abcb 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java
@@ -161,7 +161,7 @@
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
-import top.qwq2333.nullgram.helpers.MonetHelper;
+import xyz.nextalone.nnngram.helpers.MonetHelper;
public class Theme {
@@ -2523,7 +2523,8 @@ public boolean isDark() {
}
public boolean isLight() {
- return pathToFile == null && !isDark();
+// return pathToFile == null && !isDark(); // don't use pathToFile to determine light theme
+ return !isDark();
}
public String getKey() {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java
index 8608b6ede2..c5241806ef 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java
@@ -49,7 +49,8 @@
import java.util.ArrayList;
import java.util.Collections;
-import top.qwq2333.nullgram.helpers.PasscodeHelper;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.helpers.PasscodeHelper;
public class DrawerLayoutAdapter extends RecyclerListView.SelectionAdapter {
@@ -315,20 +316,20 @@ private void resetItems() {
}
UserConfig me = UserConfig.getInstance(UserConfig.selectedAccount);
boolean showDivider = false;
- items.add(new Item(16, LocaleController.getString(R.string.MyProfile), R.drawable.left_status_profile));
- if (me != null && me.isPremium()) {
- if (me.getEmojiStatus() != null) {
+ if (Config.showProfileMyStories) {
+ items.add(new Item(16, LocaleController.getString(R.string.MyProfile), R.drawable.left_status_profile));
+ showDivider = true;
+ }
+ if (Config.showChangeEmojiStatus) {
+ if (me != null && me.isPremium()) {
+ if (me.getEmojiStatus() != null) {
items.add(new Item(15, LocaleController.getString(R.string.ChangeEmojiStatus), R.drawable.msg_status_edit));
- } else {
+ } else {
items.add(new Item(15, LocaleController.getString(R.string.SetEmojiStatus), R.drawable.msg_status_set));
+ }
+ showDivider = true;
}
- showDivider = true;
}
-// if (MessagesController.getInstance(UserConfig.selectedAccount).storiesEnabled()) {
-// items.add(new Item(17, LocaleController.getString(R.string.ProfileStories), R.drawable.msg_menu_stories));
-// showDivider = true;
-// }
- showDivider = true;
if (ApplicationLoader.applicationLoaderInstance != null) {
if (ApplicationLoader.applicationLoaderInstance.extendDrawer(items)) {
showDivider = true;
@@ -347,16 +348,30 @@ private void resetItems() {
if (showDivider) {
items.add(null); // divider
}
- items.add(new Item(2, LocaleController.getString(R.string.NewGroup), newGroupIcon));
- //items.add(new Item(3, LocaleController.getString(R.string.NewSecretChat), newSecretIcon));
- //items.add(new Item(4, LocaleController.getString(R.string.NewChannel), newChannelIcon));
- items.add(new Item(6, LocaleController.getString(R.string.Contacts), contactsIcon));
- items.add(new Item(10, LocaleController.getString(R.string.Calls), callsIcon));
- items.add(new Item(11, LocaleController.getString(R.string.SavedMessages), savedIcon));
+ if (Config.showNewGroup) {
+ items.add(new Item(2, LocaleController.getString(R.string.NewGroup), newGroupIcon));
+ }
+ //items.add(new Item(3, LocaleController.getString("NewSecretChat", R.string.NewSecretChat), newSecretIcon));
+ //items.add(new Item(4, LocaleController.getString("NewChannel", R.string.NewChannel), newChannelIcon));
+ if (Config.showContacts) {
+ items.add(new Item(6, LocaleController.getString(R.string.Contacts), contactsIcon));
+ }
+ if (Config.showCalls) {
+ items.add(new Item(10, LocaleController.getString(R.string.Calls), callsIcon));
+ }
+// if (Config.showPeopleNearby && hasGps) {
+// items.add(new Item(12, LocaleController.getString(R.string.PeopleNearby), peopleNearbyIcon));
+// }
+ if (Config.showSavedMessages) {
+ items.add(new Item(11, LocaleController.getString(R.string.SavedMessages), savedIcon));
+ }
+ if (Config.showArchivedChats) {
+ items.add(new Item(18, LocaleController.getString(R.string.ArchivedChats), R.drawable.msg_archive));
+ }
items.add(new Item(8, LocaleController.getString(R.string.Settings), settingsIcon));
- items.add(null); // divider
- items.add(new Item(7, LocaleController.getString(R.string.InviteFriends), inviteIcon));
- items.add(new Item(13, LocaleController.getString(R.string.TelegramFeatures), helpIcon));
+// items.add(null); // divider
+// items.add(new Item(7, LocaleController.getString(R.string.InviteFriends), inviteIcon));
+// items.add(new Item(13, LocaleController.getString(R.string.TelegramFeatures), helpIcon));
}
public boolean click(View view, int position) {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java
index 5425fcd3f1..d05efd8966 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java
@@ -234,7 +234,7 @@
import java.util.List;
import java.util.Locale;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class ArticleViewer implements NotificationCenter.NotificationCenterDelegate {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java b/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java
index ae37eb6437..4d4f9b9aa9 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java
@@ -55,7 +55,7 @@
import java.util.Collections;
import java.util.Objects;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class AvatarPreviewer {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java
index 5b549431d2..ffd4f64c0b 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java
@@ -21,7 +21,7 @@
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AlertsCreator;
-import top.qwq2333.nullgram.utils.PermissionUtils;
+import xyz.nextalone.nnngram.utils.PermissionUtils;
public class BasePermissionsActivity extends FragmentActivity {
public final static int REQUEST_CODE_GEOLOCATION = 2,
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java
index 7d0d00bf25..50e8fd8e7f 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java
@@ -36,7 +36,7 @@
import java.util.ArrayList;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class BubbleActivity extends BasePermissionsActivity implements INavigationLayout.INavigationLayoutDelegate {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CalendarActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CalendarActivity.java
index 883189a157..c97669bcec 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/CalendarActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/CalendarActivity.java
@@ -69,7 +69,7 @@
import java.util.ArrayList;
import java.util.Calendar;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class CalendarActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java
index c382cf9d91..7d6098205e 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java
@@ -83,8 +83,8 @@
import java.util.ArrayList;
import java.util.HashMap;
-import top.qwq2333.nullgram.helpers.QrHelper;
-import top.qwq2333.nullgram.utils.PermissionUtils;
+import xyz.nextalone.nnngram.helpers.QrHelper;
+import xyz.nextalone.nnngram.utils.PermissionUtils;
public class CameraScanActivity extends BaseFragment {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java
index 3a651cf9e4..90442a0588 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java
@@ -33,7 +33,7 @@
import android.view.ViewConfiguration;
import android.view.ViewGroup;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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 a69d60f4d3..6b5687ffa3 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java
@@ -241,12 +241,13 @@
import java.util.Stack;
import java.util.concurrent.atomic.AtomicReference;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.config.ConfigManager;
-import top.qwq2333.nullgram.utils.Defines;
-import top.qwq2333.nullgram.utils.Log;
-import top.qwq2333.nullgram.utils.StringUtils;
-import top.qwq2333.nullgram.utils.Utils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.config.ConfigManager;
+import xyz.nextalone.nnngram.utils.Defines;
+import xyz.nextalone.nnngram.utils.Log;
+import xyz.nextalone.nnngram.utils.NeteaseEmbed;
+import xyz.nextalone.nnngram.utils.StringUtils;
+import xyz.nextalone.nnngram.utils.Utils;
public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate, ImageReceiver.ImageReceiverDelegate, DownloadController.FileDownloadProgressListener, TextSelectionHelper.SelectableView, NotificationCenter.NotificationCenterDelegate {
private final static int TIME_APPEAR_MS = 200;
@@ -1747,6 +1748,52 @@ public Theme.ResourcesProvider getResourcesProvider() {
return resourcesProvider;
}
+ public void drawStatusWithImage(Canvas canvas, ImageReceiver imageReceiver, int radius) {
+ String formatUserStatus = currentUser != null ? LocaleController.formatUserStatus(this.currentAccount, currentUser) : "";
+ if (!Config.showOnlineStatus || currentUser == null || currentUser.bot) {
+ imageReceiver.draw(canvas);
+ return;
+ }
+ int diff = -60 * 60 - 1;
+ if (Config.showOnlineStatus) {
+ if (currentUser != null && currentUser.status != null) {
+ diff = currentUser.status.expires - ConnectionsManager.getInstance(currentAccount).getCurrentTime();
+ }
+ if (diff < -60 * 60) {
+ imageReceiver.draw(canvas);
+ return;
+ }
+ } else if (!formatUserStatus.equals(LocaleController.getString("Online", R.string.Online))) {
+ imageReceiver.draw(canvas);
+ return;
+ }
+ int x = Math.round(imageReceiver.getImageX2());
+ int y = Math.round(imageReceiver.getImageY2());
+ int circleRadius = radius - AndroidUtilities.dp(2.25f);
+ int spaceLeft = radius - circleRadius;
+ int xCenterRegion = x - spaceLeft;
+ int yCenterRegion = y - spaceLeft;
+ int colorOnline = diff > 0
+ ? Theme.getColor(Theme.key_chats_onlineCircle)
+ : diff > -15 * 60
+ ? android.graphics.Color.argb(255, 234, 234, 30)
+ : diff > -30 * 60
+ ? android.graphics.Color.argb(255, 234, 132, 30)
+ : diff > -60 * 60
+ ? android.graphics.Color.argb(255, 234, 30, 30)
+ : 0;
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setColor(colorOnline);
+ canvas.save();
+ Path p = new Path();
+ p.addCircle(x - radius, y - radius, radius, Path.Direction.CW);
+ p.toggleInverseFillType();
+ canvas.clipPath(p);
+ imageReceiver.draw(canvas);
+ canvas.restore();
+ canvas.drawCircle(xCenterRegion - circleRadius, yCenterRegion - circleRadius, circleRadius, paint);
+ }
+
private void createPollUI() {
if (pollAvatarImages != null) {
return;
@@ -5736,7 +5783,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe
drawSideButton = checkNeedDrawShareButton(messageObject) ? 2 : 0;
} else if (messageObject.searchType == ChatActivity.SEARCH_MY_MESSAGES) {
drawSideButton = 0;
- } else if (MessagesController.getInstance(currentAccount).isChatNoForwards(messageObject.getChatId()) || (messageObject.messageOwner != null && messageObject.messageOwner.noforwards)) {
+ } else if (!Config.ignoreChatStrict && (MessagesController.getInstance(currentAccount).isChatNoForwards(messageObject.getChatId()) || (messageObject.messageOwner != null && messageObject.messageOwner.noforwards))) {
drawSideButton = 0;
} else {
drawSideButton = !isRepliesChat && checkNeedDrawShareButton(messageObject) ? 1 : 0;
@@ -6135,6 +6182,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe
drawInstantView = hasLinkPreview && webpage.cached_page != null;
String siteName = hasLinkPreview ? webpage.site_name : null;
+ NeteaseEmbed.fixWebPage(webpage);
hasEmbed = hasLinkPreview && !TextUtils.isEmpty(webpage.embed_url) && !messageObject.isGif() && !"instagram".equalsIgnoreCase(siteName);
boolean slideshow = false;
String webpageType = webpage != null ? webpage.type : null;
@@ -8820,6 +8868,10 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe
}
}
}
+ if (messageObject.type == MessageObject.TYPE_GIF) {
+ w = w * Config.getGifSize() / 100;
+ h = h * Config.getGifSize() / 100;
+ }
if (w == 0 || h == 0) {
w = h = AndroidUtilities.dp(150);
@@ -9212,7 +9264,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe
photoImage.setOrientation(currentMessageObject.sendPreviewEntry.orientation, currentMessageObject.sendPreviewEntry.invert, true);
photoImage.setImage(ImageLocation.getForPath("thumb://" + currentMessageObject.sendPreviewEntry.imageId + ":" + currentMessageObject.sendPreviewEntry.path), null, null, null, null, null, currentMessageObject.sendPreviewEntry.thumb, 0, null, messageObject, 0);
}
-
+
}
} else if (autoPlayingMedia) {
photoImage.setAllowStartAnimation(true);
@@ -9598,7 +9650,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe
botButtonsByPosition.clear();
botButtonsLayout = null;
}
- if (!messageObject.isRestrictedMessage && !messageObject.isRepostPreview && (currentPosition == null || currentMessagesGroup != null && currentMessagesGroup.isDocuments && currentPosition.last) && (messageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && !messageObject.hasExtendedMedia()) {
+ if (!isBlockedUserMessage() && !messageObject.isRestrictedMessage && !messageObject.isRepostPreview && (currentPosition == null || currentMessagesGroup != null && currentMessagesGroup.isDocuments && currentPosition.last) && (messageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && !messageObject.hasExtendedMedia()) {
int rows;
if (messageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) {
@@ -16049,6 +16101,9 @@ private void measureTime(MessageObject messageObject) {
timeString = LocaleController.getInstance().getFormatterDay().format((long) (messageObject.messageOwner.date) * 1000);
}
}
+ if (currentMessageObject.translated) {
+ timeString = LocaleController.getString("TranslateMessage", R.string.TranslateMessage) + " " + timeString;
+ }
if (Config.showMessageID && currentMessageObject.messageOwner != null && currentMessageObject.isSent() && messageObject.messageOwner.id >= 0) {
timeString = timeString + " | " + messageObject.messageOwner.id;
}
@@ -16361,7 +16416,7 @@ private void setMessageObjectInternal(MessageObject messageObject) {
&& currentChat != null && currentMessageObject.isSenderChannel()) {
if (Config.channelAlias) {
String aliasName = ConfigManager.getStringOrDefault(Defines.channelAliasPrefix
- + currentMessageObject.messageOwner.from_id.channel_id, null);
+ + currentMessageObject.messageOwner.from_id.channel_id, "");
String nickname = null;
if (Config.linkedUser
@@ -16853,7 +16908,7 @@ protected void onClick() {
} else if (messageObject.replyMessageObject == null && messageObject.messageOwner.reply_to != null && messageObject.messageOwner.reply_to.reply_from != null) {
name = messageObject.getReplyQuoteNameWithIcon();
} else if (messageObject.replyMessageObject != null) {
- if (drawForwardedName) {
+ if (drawForwardedName && messageObject.getForwardedName() != null) {
name = AndroidUtilities.removeDiacritics(messageObject.replyMessageObject.getForwardedName());
}
@@ -24580,7 +24635,7 @@ public boolean animateChange() {
changed = true;
}
}
-
+
if (mediaOffsetY != lastMediaOffsetY) {
animateFromMediaOffsetY = lastMediaOffsetY;
animateMediaOffsetY = true;
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java
index 60888f8695..707d9e1aaa 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java
@@ -138,8 +138,9 @@
import java.util.Objects;
import java.util.Stack;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.MessageUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.MessageUtils;
+import xyz.nextalone.nnngram.utils.StringUtils;
public class DialogCell extends BaseCell implements StoriesListPlaceProvider.AvatarOverlaysView {
@@ -692,6 +693,10 @@ private void checkOnline() {
}
}
boolean isOnline = isOnline();
+ if (Config.showOnlineStatus && !isOnline && user != null && !user.self && user.status != null) {
+ final int diff = user.status.expires - ConnectionsManager.getInstance(currentAccount).getCurrentTime();
+ isOnline = diff > -60 * 60;
+ }
onlineProgress = isOnline ? 1.0f : 0.0f;
}
@@ -968,7 +973,7 @@ private CharSequence formatArchivedDialogNames() {
}
String title;
if (currentChat != null) {
- title = currentChat.title.replace('\n', ' ');
+ title = StringUtils.zalgoFilter(currentChat.title.replace('\n', ' '));
} else if (currentUser != null) {
if (UserObject.isDeleted(currentUser)) {
title = LocaleController.getString(R.string.HiddenName);
@@ -1961,7 +1966,8 @@ public void buildLayout() {
}
}
}
-
+ if (topicIconInName == null)
+ nameString = StringUtils.zalgoFilter(nameString);
int timeWidth;
if (drawTime) {
timeWidth = (int) Math.ceil(Theme.dialogs_timePaint.measureText(timeString));
@@ -4421,7 +4427,26 @@ public boolean drawAvatarOverlays(Canvas canvas) {
if (user != null && !MessagesController.isSupportUser(user) && !user.bot) {
boolean isOnline = isOnline();
wasDrawnOnline = isOnline;
+ int colorOnline = 0;
+ if (Config.showOnlineStatus && !user.self && user.status != null) {
+ final int diff = user.status.expires - ConnectionsManager.getInstance(currentAccount).getCurrentTime();
+ colorOnline = diff > 0
+ ? Theme.getColor(Theme.key_chats_onlineCircle)
+ : diff > -15 * 60
+ ? android.graphics.Color.argb(255, 234, 234, 30)
+ : diff > -30 * 60
+ ? android.graphics.Color.argb(255, 234, 132, 30)
+ : diff > -60 * 60
+ ? android.graphics.Color.argb(255, 234, 30, 30)
+ : 0;
+ if (colorOnline != 0) {
+ isOnline = true;
+ }
+ }
if (isOnline || onlineProgress != 0) {
+ if (onlineProgress != 0 && colorOnline == 0) {
+ colorOnline = Theme.getColor(Theme.key_chats_onlineCircle, resourcesProvider);
+ }
int top = (int) (storyParams.originalAvatarRect.bottom - dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 6 : 8));
int left;
if (LocaleController.isRTL) {
@@ -4432,7 +4457,7 @@ public boolean drawAvatarOverlays(Canvas canvas) {
Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider));
canvas.drawCircle(left, top, dp(7) * onlineProgress, Theme.dialogs_onlineCirclePaint);
- Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_chats_onlineCircle, resourcesProvider));
+ Theme.dialogs_onlineCirclePaint.setColor(colorOnline);
canvas.drawCircle(left, top, dp(5) * onlineProgress, Theme.dialogs_onlineCirclePaint);
if (isOnline) {
if (onlineProgress < 1.0f) {
@@ -5254,7 +5279,7 @@ public SpannableStringBuilder getMessageStringFormatted(int messageFormatType, S
}
} else if (captionMessage != null && captionMessage.caption != null) {
MessageObject message = captionMessage;
- CharSequence mess = message.caption.toString();
+ CharSequence mess = StringUtils.zalgoFilter(message.caption.toString());
String emoji;
if (!needEmoji) {
emoji = "";
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java
index 4a9dce8dc6..12be7f6a64 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java
@@ -74,8 +74,8 @@
import java.util.ArrayList;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.Log;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.Log;
public class DrawerProfileCell extends FrameLayout implements NotificationCenter.NotificationCenterDelegate {
@@ -790,7 +790,8 @@ public void setUser(TLRPC.User user, boolean accounts) {
} else if (!TextUtils.isEmpty(user.username)) {
phoneTextView.setText("@" + user.username);
} else {
- phoneTextView.setText(LocaleController.getString("MobileHidden", R.string.MobileHidden));
+// phoneTextView.setText(LocaleController.getString("MobileHidden", R.string.MobileHidden));
+ phoneTextView.setVisibility(GONE);
}
AvatarDrawable avatarDrawable = new AvatarDrawable(user);
avatarDrawable.setColor(Theme.getColor(Theme.key_avatar_backgroundInProfileBlue));
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java
index 0da6b4bda2..b9584f5e40 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java
@@ -35,6 +35,7 @@
import org.telegram.SQLite.SQLiteCursor;
import org.telegram.messenger.AndroidUtilities;
+import org.telegram.messenger.ChatObject;
import org.telegram.messenger.DialogObject;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
@@ -384,6 +385,127 @@ public void fetch(long channel_id, int message_id) {
});
}
+ public void fetchChannelMsg(TLRPC.ChatFull chatFull) {
+ if (chatFull == null || chatFull.linked_chat_id == 0) {
+ searchId++;
+ loaded = true;
+ messageObject = null;
+ done(false);
+ return;
+ }
+ fetchChannelMsg(chatFull.linked_chat_id);
+ }
+
+ public void fetchChannelMsg(long channel_id) {
+ if (loaded || loading) {
+ if (this.channel_id != channel_id) {
+ loaded = false;
+ messageObject = null;
+ } else {
+ return;
+ }
+ }
+ final int thisSearchId = ++this.searchId;
+ loading = true;
+
+ this.channel_id = channel_id;
+ this.message_id = 0;
+
+ final long selfId = UserConfig.getInstance(currentAccount).getClientUserId();
+ MessagesStorage storage = MessagesStorage.getInstance(currentAccount);
+ storage.getStorageQueue().postRunnable(() -> {
+ TLRPC.Message message = null;
+ ArrayList users = new ArrayList<>();
+ ArrayList chats = new ArrayList<>();
+ SQLiteCursor cursor = null;
+ try {
+ if (message_id <= 0) {
+ cursor = storage.getDatabase().queryFinalized("SELECT data, mid FROM messages_v2 WHERE uid = ? ORDER BY mid DESC LIMTI 1", -channel_id);
+ } else {
+ cursor = storage.getDatabase().queryFinalized("SELECT data, mid FROM messages_v2 WHERE uid = ? AND mid = ? LIMIT 1", -channel_id, message_id);
+ }
+ ArrayList usersToLoad = new ArrayList<>();
+ ArrayList chatsToLoad = new ArrayList<>();
+ if (cursor.next()) {
+ NativeByteBuffer data = cursor.byteBufferValue(0);
+ if (data != null) {
+ message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
+ message.readAttachPath(data, selfId);
+ data.reuse();
+ message.id = cursor.intValue(1);
+ message.dialog_id = -channel_id;
+ MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null);
+ }
+ }
+ cursor.dispose();
+
+ if (message != null) {
+
+ if (!usersToLoad.isEmpty()) {
+ storage.getUsersInternal(usersToLoad, users);
+ }
+ if (!chatsToLoad.isEmpty()) {
+ storage.getChatsInternal(TextUtils.join(",", chatsToLoad), chats);
+ }
+ }
+ } catch (Exception e) {
+ FileLog.e(e);
+ } finally {
+ if (cursor != null) {
+ cursor.dispose();
+ }
+ }
+ final TLRPC.Message finalMessage = message;
+ AndroidUtilities.runOnUIThread(() -> {
+ if (thisSearchId != searchId) return;
+ MessageObject messageObject1 = null;
+ if (finalMessage != null) {
+ messageObject1 = new MessageObject(currentAccount, finalMessage, true, true);
+ }
+
+ if (messageObject1 != null) {
+ this.messageObject = messageObject1;
+ done(false);
+ return;
+ }
+
+ TLRPC.TL_messages_search req = new TLRPC.TL_messages_search();
+ req.limit = 3;
+ req.offset_id = 0;
+ req.filter = new TLRPC.TL_inputMessagesFilterEmpty();
+ req.q = "";
+ req.peer = MessagesController.getInstance(currentAccount).getInputPeer(-channel_id);
+ ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, err) -> AndroidUtilities.runOnUIThread(() -> {
+ if (response instanceof TLRPC.messages_Messages) {
+ TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
+ MessagesController.getInstance(currentAccount).putUsers(res.users, false);
+ MessagesController.getInstance(currentAccount).putChats(res.chats, false);
+ storage.putUsersAndChats(res.users, res.chats, true, true);
+ storage.putMessages(res, -channel_id, -1, 0, false, 0, 0);
+
+ if (thisSearchId != searchId) return;
+
+ TLRPC.Message message1 = null;
+ for (TLRPC.Message m : res.messages) {
+ if (!(m instanceof TLRPC.TL_messageEmpty)) {
+ message1 = m;
+ break;
+ }
+ }
+ if (message1 != null) {
+ message_id = message1.id;
+ this.messageObject = new MessageObject(currentAccount, message1, true, true);
+ done(false);
+ }
+ } else {
+ if (thisSearchId != searchId) return;
+ done(true);
+ }
+ }));
+ });
+ });
+ }
+
private ArrayList callbacks = new ArrayList<>();
public void subscribe(Runnable callback) {
if (loaded) {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java
index 71245722a0..cf39b27706 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java
@@ -72,6 +72,8 @@
import java.util.Locale;
+import xyz.nextalone.nnngram.utils.StringUtils;
+
public class ProfileSearchCell extends BaseCell implements NotificationCenter.NotificationCenterDelegate, Theme.Colorable {
private CharSequence currentName;
@@ -755,6 +757,7 @@ public void update(int mask) {
} else {
newName = chat.title;
}
+ newName = StringUtils.zalgoFilter(newName);
if (!newName.equals(lastName)) {
continueUpdate = true;
}
@@ -782,6 +785,7 @@ public void update(int mask) {
lastName = chat.title;
}
+ lastName = StringUtils.zalgoFilter(lastName);
lastAvatar = photo;
if (getMeasuredWidth() != 0 || getMeasuredHeight() != 0) {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java
index 399ee90afe..a5cb4eef50 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java
@@ -59,9 +59,9 @@
import java.util.Stack;
import java.util.concurrent.atomic.AtomicReference;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.config.ConfigManager;
-import top.qwq2333.nullgram.utils.Defines;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.config.ConfigManager;
+import xyz.nextalone.nnngram.utils.Defines;
public class SharedLinkCell extends FrameLayout {
private final static int SPOILER_TYPE_LINK = 0,
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java
index 2b2db6603e..5298878adc 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java
@@ -594,12 +594,7 @@ public void setTextAndValueAndIcon(CharSequence text, CharSequence value, boolea
}
public static CharSequence applyNewSpan(CharSequence str) {
- SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(str);
- spannableStringBuilder.append(" d");
- FilterCreateActivity.NewSpan span = new FilterCreateActivity.NewSpan(10);
- span.setColor(Theme.getColor(Theme.key_premiumGradient1));
- spannableStringBuilder.setSpan(span, spannableStringBuilder.length() - 1, spannableStringBuilder.length(), 0);
- return spannableStringBuilder;
+ return str;
}
public void setColorfulIcon(int color, int resId) {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java
index 603d399f8f..1dff5954bd 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java
@@ -82,8 +82,12 @@
import org.telegram.ui.Components.RecyclerListView;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
-import top.qwq2333.nullgram.helpers.TranslateHelper;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.helpers.HyperOsHelper;
+import xyz.nextalone.nnngram.helpers.TranslateHelper;
public abstract class TextSelectionHelper {
@@ -1418,20 +1422,44 @@ public void invalidate() {
}
private static final int TRANSLATE = 3;
+ private static final int BLOCK = 4;
+ private static final Map menus = new HashMap<>();
+ private int getMenuIndex(int id, int defaultIndex) {
+ if (menus.containsKey(id)) {
+ Integer index = menus.get(id);
+ if (index != null) {
+ return index;
+ }
+ }
+ return defaultIndex;
+ }
+
private ActionMode.Callback createActionCallback() {
final ActionMode.Callback callback = new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- menu.add(Menu.NONE, android.R.id.copy, 0, android.R.string.copy);
- menu.add(Menu.NONE, R.id.menu_quote, 1, LocaleController.getString(R.string.Quote));
- menu.add(Menu.NONE, android.R.id.selectAll, 2, android.R.string.selectAll);
- menu.add(Menu.NONE, TRANSLATE, 3, LocaleController.getString(R.string.TranslateMessage));
+ menus.clear();
+ int index = 0;
+ if (HyperOsHelper.INSTANCE.isHyperAiAvailable(textSelectionOverlay.getContext())) {
+ menus.put(R.id.hyperos_ai, index);
+ menu.add(Menu.NONE, R.id.hyperos_ai, index++, "AI");
+ }
+ menus.put(android.R.id.copy, index);
+ menu.add(Menu.NONE, android.R.id.copy, index++, android.R.string.copy);
+ menus.put(R.id.menu_quote, index);
+ menu.add(Menu.NONE, R.id.menu_quote, index++, LocaleController.getString(R.string.Quote));
+ menus.put(android.R.id.selectAll, index);
+ menu.add(Menu.NONE, android.R.id.selectAll, index++, android.R.string.selectAll);
+ menus.put(TRANSLATE, index);
+ menu.add(Menu.NONE, TRANSLATE, index++, LocaleController.getString(R.string.TranslateMessage));
+ menus.put(BLOCK, index);
+ menu.add(Menu.NONE, BLOCK, index, LocaleController.getString(R.string.block));
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- menu.getItem(1).setVisible(canShowQuote());
+ menu.getItem(getMenuIndex(R.id.menu_quote, 0)).setVisible(canShowQuote());
MenuItem copyItem = menu.findItem(android.R.id.copy);
if (copyItem != null) {
copyItem.setVisible(canCopy());
@@ -1439,11 +1467,11 @@ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
if (selectedView != null) {
CharSequence charSequence = getText(selectedView, false);
if (!canCopy()) {
- menu.getItem(2).setVisible(false);
+ menu.getItem(getMenuIndex(android.R.id.selectAll, 2)).setVisible(false);
} else if (multiselect || selectionStart <= 0 && selectionEnd >= charSequence.length() - 1) {
- menu.getItem(2).setVisible(false);
+ menu.getItem(getMenuIndex(android.R.id.selectAll, 2)).setVisible(false);
} else {
- menu.getItem(2).setVisible(true);
+ menu.getItem(getMenuIndex(android.R.id.selectAll, 2)).setVisible(true);
}
}
if (onTranslateListener != null && LanguageDetector.hasSupport() && getSelectedText() != null) {
@@ -1465,7 +1493,7 @@ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
private String translateFromLanguage = null;
private void updateTranslateButton(Menu menu) {
- menu.getItem(3).setVisible(!LanguageDetector.hasSupport() || translateFromLanguage != null && !TranslateHelper.isLanguageRestricted(translateFromLanguage));
+ menu.getItem(getMenuIndex(TRANSLATE, 3)).setVisible(!LanguageDetector.hasSupport() || translateFromLanguage == null || !TranslateHelper.isLanguageRestricted(translateFromLanguage));
}
@Override
@@ -1502,6 +1530,26 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
quoteText();
hideActions();
return true;
+ } else if (itemId == BLOCK) {
+ CharSequence str = getSelectedText();
+ if (str == null) {
+ return true;
+ }
+ String currentFilteredMessages = Config.getMessageFilter();
+ currentFilteredMessages = currentFilteredMessages + (currentFilteredMessages.isEmpty() ? "" : "|") + str.toString();
+ Config.setMessageFilter(currentFilteredMessages);
+ hideActions();
+ clear(true);
+ return true;
+ } else if (itemId == R.id.hyperos_ai) {
+ CharSequence str = getSelectedText();
+ if (str == null) {
+ return true;
+ }
+ HyperOsHelper.INSTANCE.startHyperOsAiService(textSelectionOverlay, str.toString());
+ hideActions();
+ clear(true);
+ return true;
} else {
clear();
}
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java
index 3f863863dd..2505c4df20 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java
@@ -164,7 +164,7 @@
import java.util.HashMap;
import java.util.HashSet;
-import top.qwq2333.gen.Config;
+import xyz.nextalone.gen.Config;
public class ChannelAdminLogActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
index 731325c9bf..82992d5f7a 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
@@ -404,20 +404,24 @@
import java.util.stream.Collectors;
import kotlin.Unit;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.activity.MessageDetailActivity;
-import top.qwq2333.nullgram.config.ConfigManager;
-import top.qwq2333.nullgram.config.DialogConfig;
-import top.qwq2333.nullgram.config.ForwardContext;
-import top.qwq2333.nullgram.helpers.QrHelper;
-import top.qwq2333.nullgram.helpers.TranslateHelper;
-import top.qwq2333.nullgram.helpers.TranslateHelper.Status;
-import top.qwq2333.nullgram.translate.LanguageDetectorTimeout;
-import top.qwq2333.nullgram.ui.TranslatorSettingsPopupWrapper;
-import top.qwq2333.nullgram.utils.Defines;
-import top.qwq2333.nullgram.utils.Log;
-import top.qwq2333.nullgram.utils.MessageUtils;
-import top.qwq2333.nullgram.utils.PermissionUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.activity.MessageDetailActivity;
+import xyz.nextalone.nnngram.config.ConfigManager;
+import xyz.nextalone.nnngram.config.DialogConfig;
+import xyz.nextalone.nnngram.config.ForwardContext;
+import xyz.nextalone.nnngram.helpers.MessageHelper;
+import xyz.nextalone.nnngram.helpers.QrHelper;
+import xyz.nextalone.nnngram.helpers.TranslateHelper;
+import xyz.nextalone.nnngram.helpers.TranslateHelper.Status;
+import xyz.nextalone.nnngram.translate.LanguageDetectorTimeout;
+import xyz.nextalone.nnngram.ui.TranslatorSettingsPopupWrapper;
+import xyz.nextalone.nnngram.ui.sortList.items.TextStyleItems;
+import xyz.nextalone.nnngram.utils.Defines;
+import xyz.nextalone.nnngram.utils.Log;
+import xyz.nextalone.nnngram.utils.MessageUtils;
+import xyz.nextalone.nnngram.utils.PermissionUtils;
+import xyz.nextalone.nnngram.utils.StringUtils;
+import xyz.nextalone.nnngram.utils.WordUtils;
@SuppressWarnings("unchecked")
public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate, LocationActivity.LocationActivityDelegate, ChatAttachAlertDocumentLayout.DocumentSelectActivityDelegate, ChatActivityInterface, FloatingDebugProvider, ForwardContext, InstantCameraView.Delegate {
@@ -914,6 +918,7 @@ public boolean isReport() {
private int last_message_id = 0;
private long mergeDialogId;
private boolean sentBotStart;
+ private int lastSearchedMessageId = 0;
private long startMessageAppearTransitionMs;
private List messageSkeletons = new ArrayList<>();
@@ -1211,6 +1216,8 @@ public void run() {
private final static int OPTION_SAVE_MESSAGE = 93;
private final static int OPTION_REPEAT = 94;
private final static int OPTION_NOQUOTE_FORWARD = 95;
+ private final static int OPTION_REPEAT_AS_COPY = 96;
+ private final static int OPTION_REVERSE = 97;
private final static int OPTION_ABOUT_REVENUE_SHARING_ADS = 33;
private final static int OPTION_REPORT_AD = 34;
private final static int OPTION_REMOVE_ADS = 35;
@@ -1218,6 +1225,7 @@ public void run() {
private final static int OPTION_EDIT_SCHEDULE_TIME = 102;
private final static int OPTION_SPEED_PROMO = 103;
private final static int OPTION_OPEN_PROFILE = 104;
+ private final static int OPTION_SHARE_PHOTO = 105;
private final static int OPTION_FACT_CHECK = 106;
private final static int OPTION_EDIT_PRICE = 107;
@@ -1623,6 +1631,8 @@ public void sendButtonPressed(int index, VideoEditedInfo videoEditedInfo, boolea
private final static int search = 40;
+ private final static int merge_message = 200;
+
private final static int topic_close = 60;
private final static int open_forum = 61;
@@ -1634,7 +1644,7 @@ public void sendButtonPressed(int index, VideoEditedInfo videoEditedInfo, boolea
private final static int share_business_link = 66;
private final static int rename_business_link = 67;
private final static int delete_business_link = 68;
-
+
private final static int share = 69;
private final static int id_chat_compose_panel = 1000;
@@ -1893,10 +1903,12 @@ public boolean hasDoubleTap(View view, int position) {
}
break;
case Defines.doubleTabReply:
+ case Defines.doubleTabReverse:
return message.getId() > 0 && allowChatActions;
case Defines.doubleTabSaveMessages:
return !message.isSponsored() && chatMode != MODE_SCHEDULED && (!message.needDrawBluredPreview() || message.hasExtendedMediaPreview()) && !message.isLiveLocation() && message.type != MessageObject.TYPE_PHONE_CALL && !noforwards && message.type != MessageObject.TYPE_GIFT_PREMIUM && !UserObject.isUserSelf(currentUser);
case Defines.doubleTabRepeat:
+ case Defines.doubleTabRepeatAsCopy:
return allowChatActions && (!(isThreadChat() && !isTopic) && !noforwards || getMessageUtils().getMessageForRepeat(message, messageGroup) != null) && !message.isSponsored() && chatMode != MODE_SCHEDULED && (!message.needDrawBluredPreview() || message.hasExtendedMediaPreview()) && !message.isLiveLocation() && message.type != MessageObject.TYPE_PHONE_CALL && message.type != MessageObject.TYPE_GIFT_PREMIUM && !UserObject.isUserSelf(currentUser);
case Defines.doubleTabEdit:
return allowEdit;
@@ -1977,6 +1989,12 @@ public void onDoubleTap(View view, int position, float x, float y) {
case Defines.doubleTabRepeat:
processSelectedOption(OPTION_REPEAT);
break;
+ case Defines.doubleTabRepeatAsCopy:
+ processSelectedOption(OPTION_REPEAT_AS_COPY);
+ break;
+ case Defines.doubleTabReverse:
+ processSelectedOption(OPTION_REVERSE);
+ break;
case Defines.doubleTabEdit:
processSelectedOption(OPTION_EDIT);
break;
@@ -3655,6 +3673,70 @@ public void onItemClick(final int id) {
undoView.showWithAction(0, UndoView.ACTION_TEXT_COPIED, null);
}
clearSelectionMode();
+ } else if (id == merge_message) {
+ StringBuilder str = new StringBuilder();
+ ArrayList toDeleteMessagesIds = new ArrayList<>();
+ MessageObject toEdit = null;
+ ArrayList entities;
+ entities = new ArrayList<>();
+ for (int a = 1; a >= 0; a--) {
+ ArrayList ids = new ArrayList<>();
+ for (int b = 0; b < selectedMessagesIds[a].size(); b++) {
+ ids.add(selectedMessagesIds[a].keyAt(b));
+ }
+ if (currentEncryptedChat == null) {
+ Collections.sort(ids);
+ } else {
+ ids.sort(Collections.reverseOrder());
+ }
+ for (int b = 0; b < ids.size(); b++) {
+
+ Integer messageId = ids.get(b);
+ MessageObject messageObject = selectedMessagesIds[a].get(messageId);
+ if (messageObject.isDocument() || messageObject.isSticker() || messageObject.isPhoto()){
+ continue;
+ }
+ if (str.length() != 0) {
+ str.append(" ");
+ }
+ if (messageObject.messageOwner.entities != null && !messageObject.messageOwner.entities.isEmpty()) {
+ for (TLRPC.MessageEntity entity : messageObject.messageOwner.entities) {
+ if (entity instanceof TLRPC.TL_messageEntityMentionName) {
+ TLRPC.TL_inputMessageEntityMentionName mention = new TLRPC.TL_inputMessageEntityMentionName();
+ mention.length = entity.length;
+ mention.offset = str.length() + entity.offset;
+ mention.user_id = getMessagesController().getInputUser(((TLRPC.TL_messageEntityMentionName) entity).user_id);
+ entities.add(mention);
+ } else {
+ entity.offset += str.length();
+ entities.add(entity);
+ }
+ }
+ }
+ str.append(messageObject.messageText);
+ if (messageObject.getSenderId() == UserConfig.getInstance(currentAccount).getClientUserId()) {
+ if (b == 0) {
+ toEdit = messageObject;
+ } else {
+ toDeleteMessagesIds.add(messageId);
+ }
+ }
+ }
+ }
+ if (str.length() != 0 && toEdit != null) {
+ if (toEdit.canEditMessage(currentChat)) {
+ toEdit.editingMessage = str;
+ toEdit.editingMessageEntities = entities;
+ SendMessagesHelper.getInstance(currentAccount).editMessage(toEdit, null, null, null, null, null, false, toEdit.hasMediaSpoilers(), null);
+ } else {
+ MessageObject replyTo = toEdit.replyMessageObject;
+ toDeleteMessagesIds.add(toEdit.getId());
+ SendMessagesHelper.getInstance(currentAccount)
+ .sendMessage(SendMessagesHelper.SendMessageParams.of(str.toString(), dialog_id, replyTo, getThreadMessage(), null, false, entities, null, null, true, 0, null, false));
+ }
+ MessagesController.getInstance(currentAccount).deleteMessages(toDeleteMessagesIds, null, null, dialog_id, 0, true, 0);
+ }
+ clearSelectionMode();
} else if (id == delete) {
if (getParentActivity() == null) {
return;
@@ -5999,7 +6081,7 @@ public boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (updateVisibility) {
imageReceiver.setVisible(true, false);
}
- imageReceiver.draw(canvas);
+ cell.drawStatusWithImage(canvas, imageReceiver, AndroidUtilities.dp(7));
canvas.restore();
if (!replaceAnimation && child.getTranslationY() != 0) {
@@ -6424,6 +6506,9 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
wasManualScroll = true;
scrollingChatListView = true;
} else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
+ if (Config.hideKeyboardWhenScrolling) {
+ AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
+ }
pollHintCell = null;
wasManualScroll = true;
scrollingFloatingDate = true;
@@ -8473,6 +8558,8 @@ protected float getTopOffset() {
getNotificationCenter().postNotificationName(NotificationCenter.peerSettingsDidLoad, dialog_id);
}
}
+ if (Config.autoMuteAfterJoiningChannel)
+ getNotificationsController().muteDialog(dialog_id, getTopicId(), true);
} else {
toggleMute(true);
}
@@ -8806,8 +8893,9 @@ protected boolean setFilter(ReactionsLayoutInBubble.VisibleReaction reaction) {
updateSearchUpDownButtonVisibility(true);
updatePagedownButtonVisibility(true);
searchingQuery = searchItem.getSearchField().getText().toString();
+ lastSearchedMessageId = 0;
getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages, searchingChatMessages,
- !TextUtils.isEmpty(searchingQuery) || searchingReaction != null, searchingReaction, searchingType);
+ !TextUtils.isEmpty(searchingQuery) || searchingReaction != null, searchingReaction, searchingType, true);
AndroidUtilities.hideKeyboard(searchItem.getSearchField());
return true;
}
@@ -8911,7 +8999,7 @@ private void showBotMessageHint(ChatMessageCell cell, boolean byClick) {
botMessageHint.show();
});
}
-
+
private void hideHints() {
if (savedMessagesTagHint != null && savedMessagesTagHint.shown()) {
savedMessagesTagHint.hide();
@@ -9792,6 +9880,8 @@ private void createActionMode() {
actionModeViews.add(actionMode.addItemWithWidth(tag_message, R.drawable.menu_tag_edit, AndroidUtilities.dp(54), LocaleController.getString(R.string.AccDescrTagMessage)));
}
actionModeViews.add(actionMode.addItemWithWidth(star, R.drawable.msg_fave, AndroidUtilities.dp(54), LocaleController.getString(R.string.AddToFavorites)));
+ if (Config.mergeMessage)
+ actionModeViews.add(actionMode.addItemWithWidth(merge_message, R.drawable.msg_replace, AndroidUtilities.dp(54), LocaleController.getString("MergeMessage", R.string.MergeMessage)));
actionModeViews.add(actionMode.addItemWithWidth(copy, R.drawable.msg_copy, AndroidUtilities.dp(54), LocaleController.getString(R.string.Copy)));
if (!isSavedMessages && getDialogId() != UserObject.VERIFY) {
actionModeViews.add(actionMode.addItemWithWidth(forward, R.drawable.msg_forward, AndroidUtilities.dp(54), LocaleController.getString(R.string.Forward)));
@@ -9802,6 +9892,8 @@ private void createActionMode() {
} else {
actionModeViews.add(actionMode.addItemWithWidth(edit, R.drawable.msg_edit, AndroidUtilities.dp(54), LocaleController.getString(R.string.Edit)));
actionModeViews.add(actionMode.addItemWithWidth(star, R.drawable.msg_fave, AndroidUtilities.dp(54), LocaleController.getString(R.string.AddToFavorites)));
+ if (Config.mergeMessage)
+ actionModeViews.add(actionMode.addItemWithWidth(merge_message, R.drawable.msg_replace, AndroidUtilities.dp(54), LocaleController.getString("MergeMessage", R.string.MergeMessage)));
actionModeViews.add(actionMode.addItemWithWidth(copy, R.drawable.msg_copy, AndroidUtilities.dp(54), LocaleController.getString(R.string.Copy)));
actionModeViews.add(actionMode.addItemWithWidth(delete, R.drawable.msg_delete, AndroidUtilities.dp(54), LocaleController.getString(R.string.Delete)));
}
@@ -9811,6 +9903,8 @@ private void createActionMode() {
actionMode.setItemVisibility(delete, cantDeleteMessagesCount == 0 ? View.VISIBLE : View.GONE);
actionMode.setItemVisibility(tag_message, getUserConfig().isPremium() ? View.VISIBLE : View.GONE);
actionMode.setItemVisibility(share, View.GONE);
+ if (Config.mergeMessage)
+ actionMode.getItem(merge_message).setVisibility(selectedMessagesIds[0].size() + selectedMessagesIds[1].size() != 0 ? View.VISIBLE : View.GONE);
}
private void hideTagSelector() {
@@ -10159,7 +10253,9 @@ public void run(int param) {
updateSearchUpDownButtonVisibility(true);
updatePagedownButtonVisibility(true);
searchingQuery = searchItem.getSearchField().getText().toString();
- getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
+ lastSearchedMessageId = 0;
+ getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages,
+ searchingReaction, searchingType, true);
});
if (searchingType == filter.second) {
filterPopup.putCheck();
@@ -10288,7 +10384,7 @@ private void dimBehindView(float value, boolean blur, boolean hidePagedownButton
}
scrimProgressDirection = true;
animators.add(scrimPaintAlphaAnimator = ValueAnimator.ofFloat(0, value));
-
+
if (blur) {
AndroidUtilities.makeGlobalBlurBitmap(bitmap -> {
scrimBlurBitmap = bitmap;
@@ -10387,39 +10483,72 @@ private void checkEditTextItemMenu() {
}
ActionBarMenuItem item = editTextItem.createView();
- item.addSubItem(text_spoiler, LocaleController.getString(R.string.Spoiler));
- if (chatMode == 0) {
- item.addSubItem(text_quote, LocaleController.getString(R.string.Quote));
- }
- SpannableStringBuilder stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Bold));
- stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.bold()), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.addSubItem(text_bold, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Italic));
- stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/ritalic.ttf")), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.addSubItem(text_italic, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Mono));
- stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.addSubItem(text_mono, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString("MonoCode", R.string.MonoCode));
- stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.addSubItem(text_code, stringBuilder);
- if (currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 101) {
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Strike));
- TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun();
- run.flags |= TextStyleSpan.FLAG_STYLE_STRIKE;
- stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.addSubItem(text_strike, stringBuilder);
-
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Underline));
- run = new TextStyleSpan.TextStyleRun();
- run.flags |= TextStyleSpan.FLAG_STYLE_UNDERLINE;
- stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- item.addSubItem(text_underline, stringBuilder);
- }
- item.addSubItem(text_link, LocaleController.getString(R.string.CreateLink));
- item.addSubItem(text_mention, LocaleController.getString(R.string.CreateMention));
- item.addSubItem(text_regular, LocaleController.getString(R.string.Regular));
-
+ SpannableStringBuilder stringBuilder;
+ TextStyleSpan.TextStyleRun run;
+ List enabledOrder = TextStyleItems.INSTANCE.getEnabledOrder();
+ for (int i : enabledOrder) {
+ switch (i) {
+ case 0:
+ if (chatMode == 0) {
+ item.addSubItem(text_quote, LocaleController.getString(R.string.Quote));
+ }
+ break;
+ case 1:
+ item.addSubItem(text_spoiler, LocaleController.getString(R.string.Spoiler));
+ break;
+ case 2:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Bold));
+ run = new TextStyleSpan.TextStyleRun();
+ run.flags |= TextStyleSpan.FLAG_STYLE_BOLD;
+ stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.bold()), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ item.addSubItem(text_bold, stringBuilder);
+ break;
+ case 3:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Italic));
+ run = new TextStyleSpan.TextStyleRun();
+ run.flags |= TextStyleSpan.FLAG_STYLE_ITALIC;
+ stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ item.addSubItem(text_italic, stringBuilder);
+ break;
+ case 4:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.MonoCode));
+ stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ item.addSubItem(text_code, stringBuilder);
+ break;
+ case 5:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Mono));
+ stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ item.addSubItem(text_mono, stringBuilder);
+ break;
+ case 6:
+ if (currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 101) {
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Strike));
+ run = new TextStyleSpan.TextStyleRun();
+ run.flags |= TextStyleSpan.FLAG_STYLE_STRIKE;
+ stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ item.addSubItem(text_strike, stringBuilder);
+ }
+ break;
+ case 7:
+ if (currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 101) {
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Underline));
+ run = new TextStyleSpan.TextStyleRun();
+ run.flags |= TextStyleSpan.FLAG_STYLE_UNDERLINE;
+ stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ item.addSubItem(text_underline, stringBuilder);
+ }
+ break;
+ case 8:
+ item.addSubItem(text_link, LocaleController.getString(R.string.CreateLink));
+ break;
+ case 9:
+ item.addSubItem(text_mention, LocaleController.getString(R.string.CreateMention));
+ break;
+ case 10:
+ item.addSubItem(text_regular, LocaleController.getString(R.string.Regular));
+ break;
+ }
+ }
filledEditTextItemMenu = true;
}
@@ -10818,8 +10947,8 @@ private void searchUserMessages(TLRPC.User user, TLRPC.Chat chat) {
mentionContainer.getAdapter().searchUsernameOrHashtag(null, 0, null, false, true);
searchItem.setSearchFieldHint(null);
searchItem.clearSearchText();
- getMediaDataController().searchMessagesInChat(searchingQuery = "", dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction,
- searchingType);
+ lastSearchedMessageId = 0;
+ getMediaDataController().searchMessagesInChat(searchingQuery = "", dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
}
private void updateTranslateItemVisibility() {
@@ -14375,6 +14504,7 @@ public void showFieldPanel(boolean show, MessageObject messageObjectToReply, Mes
}
nameText = AndroidUtilities.replaceCharSequence("%s", LocaleController.getString(R.string.ReplyTo), name == null ? "" : name);
}
+ nameText = StringUtils.zalgoFilter(nameText);
nameText = Emoji.replaceEmoji(nameText, replyNameTextView.getPaint().getFontMetricsInt(), false);
replyNameTextView.setText(nameText);
replyIconImageView.setContentDescription(LocaleController.getString(R.string.AccDescrReplying));
@@ -18197,7 +18327,7 @@ private void addToSelectedMessages(MessageObject messageObject, boolean outside,
if (!messageObject.canDeleteMessage(chatMode == MODE_SCHEDULED, currentChat)) {
cantDeleteMessagesCount--;
}
- boolean noforwards = getMessagesController().isChatNoForwards(currentChat);
+ boolean noforwards = !Config.ignoreChatStrict && getMessagesController().isChatNoForwards(currentChat);
if (chatMode == MODE_SCHEDULED || !messageObject.canForwardMessage() || noforwards) {
cantForwardMessagesCount--;
} else {
@@ -18234,7 +18364,7 @@ private void addToSelectedMessages(MessageObject messageObject, boolean outside,
if (!messageObject.canDeleteMessage(chatMode == MODE_SCHEDULED, currentChat)) {
cantDeleteMessagesCount++;
}
- boolean noforwards = getMessagesController().isChatNoForwards(currentChat);
+ boolean noforwards = !Config.ignoreChatStrict && getMessagesController().isChatNoForwards(currentChat);
if (chatMode == MODE_SCHEDULED || !messageObject.canForwardMessage() || noforwards) {
cantForwardMessagesCount++;
} else {
@@ -18267,6 +18397,7 @@ private void addToSelectedMessages(MessageObject messageObject, boolean outside,
ActionBarMenuItem saveItem = actionBar.createActionMode().getItem(save_to);
ActionBarMenuItem copyItem = actionBar.createActionMode().getItem(copy);
ActionBarMenuItem starItem = actionBar.createActionMode().getItem(star);
+ ActionBarMenuItem mergeMessageItem = actionBar.createActionMode().getItem(merge_message);
ActionBarMenuItem editItem = actionBar.createActionMode().getItem(edit);
ActionBarMenuItem forwardItem = actionBar.createActionMode().getItem(forward);
ActionBarMenuItem forwardNoQuoteItem = actionBar.createActionMode().getItem(OPTION_NOQUOTE_FORWARD);
@@ -18275,7 +18406,7 @@ private void addToSelectedMessages(MessageObject messageObject, boolean outside,
ActionBarMenuItem shareItem = actionBar.createActionMode().getItem(share);
createBottomMessagesActionButtons();
- boolean noforwards = getMessagesController().isChatNoForwards(currentChat) || hasSelectedNoforwardsMessage();
+ boolean noforwards = !Config.ignoreChatStrict && (getMessagesController().isChatNoForwards(currentChat) || hasSelectedNoforwardsMessage());
if (prevCantForwardCount == 0 && cantForwardMessagesCount != 0 || prevCantForwardCount != 0 && cantForwardMessagesCount == 0) {
forwardButtonAnimation = new AnimatorSet();
ArrayList animators = new ArrayList<>();
@@ -18365,6 +18496,9 @@ public void onAnimationEnd(Animator animation) {
if (deleteItem != null) {
deleteItem.setVisibility(cantDeleteMessagesCount == 0 ? View.VISIBLE : View.GONE);
}
+ if (mergeMessageItem != null) {
+ mergeMessageItem.setVisibility(selectedMessagesIds[0].size() + selectedMessagesIds[1].size() != 0 ? View.VISIBLE : View.GONE);
+ }
hasUnfavedSelected = false;
for (int a = 0; a < 2; a++) {
for (int b = 0; b < selectedMessagesCanStarIds[a].size(); b++) {
@@ -22440,6 +22574,50 @@ public void didReceivedNotification(int id, int account, final Object... args) {
updateSearchButtons((Integer) args[2], (Integer) args[4], (Integer) args[5]);
if (jumpToMessage) {
int messageId = (Integer) args[1];
+ int mask = (Integer) args[2];
+ int num = (Integer) args[4];
+ boolean firstSearch = args.length > 7 && (boolean) args[7];
+ if (Config.searchInPlace && firstSearch) {
+ int currentMessageId = getFirstVisibleMessage();
+ if (currentMessageId != 0) {
+ ArrayList foundMessageObjects = getMediaDataController().getFoundMessageObjects();
+ List foundMessageIds = new ArrayList<>();
+ for (MessageObject message: foundMessageObjects) {
+ foundMessageIds.add(message.getId());
+ }
+ Collections.sort(foundMessageIds);
+ int minFoundMessageId = Collections.min(foundMessageIds);
+ if (minFoundMessageId > currentMessageId && lastSearchedMessageId != minFoundMessageId) {
+ lastSearchedMessageId = minFoundMessageId;
+ Runnable loop = () -> {
+ getMediaDataController().setCurrentMaxMessage();
+ getMediaDataController().searchMessagesInChat(null, dialog_id, mergeDialogId, classGuid, 1, threadMessageId, searchingUserMessages,
+ searchingChatMessages, searchingReaction, searchingType, firstSearch);
+ };
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ new Thread(loop).start();
+ } else {
+ loop.run();
+ }
+ return;
+ }
+ int maxFoundMessageId = Collections.max(foundMessageIds);
+ if (currentMessageId < maxFoundMessageId) {
+ int insertionPoint = Collections.binarySearch(foundMessageIds, currentMessageId);
+ int nextLargerIndex = (insertionPoint < 0) ? Math.max(-(insertionPoint + 1) - 1, 0) : insertionPoint;
+ if (nextLargerIndex < foundMessageIds.size()) {
+ Integer nextLargerMessageId = foundMessageIds.get(nextLargerIndex);
+ if (Math.abs(nextLargerMessageId) < Math.abs(messageId)) {
+ mask = mask | 2;
+ }
+ messageId = nextLargerMessageId;
+ nextLargerIndex = foundMessageIds.size() - nextLargerIndex - 1;
+ getMediaDataController().setCurrentMessage(nextLargerIndex);
+ num = nextLargerIndex;
+ }
+ }
+ }
+ }
long did = (Long) args[3];
if (searchingReaction != null && searchingFiltered) {
if (chatAdapter.isFiltered) {
@@ -22459,6 +22637,7 @@ public void didReceivedNotification(int id, int account, final Object... args) {
setFilterMessages(false);
updateVisibleRows();
}
+ updateSearchButtons(mask, num, (Integer) args[5]);
onSearchLoadingUpdate(false);
} else if (searchingReaction != null) {
if (chatAdapter.isFiltered) {
@@ -25894,38 +26073,69 @@ public static void fillActionModeMenu(Menu menu, TLRPC.EncryptedChat encryptedCh
menu.removeItem(android.R.id.shareText);
}
int order = 6;
- if (chat) {
- menu.add(R.id.menu_groupbolditalic, R.id.menu_quote, order++, LocaleController.getString(R.string.Quote));
- }
- menu.add(R.id.menu_groupbolditalic, R.id.menu_spoiler, order++, LocaleController.getString(R.string.Spoiler));
-
- SpannableStringBuilder stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Bold));
- stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.bold()), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- menu.add(R.id.menu_groupbolditalic, R.id.menu_bold, order++, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Italic));
- stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/ritalic.ttf")), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- menu.add(R.id.menu_groupbolditalic, R.id.menu_italic, order++, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Mono));
- stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- menu.add(R.id.menu_groupbolditalic, R.id.menu_mono, order++, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString("MonoCode", R.string.MonoCode));
- stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- menu.add(R.id.menu_groupbolditalic, R.id.menu_code, order++, stringBuilder);
- if (encryptedChat == null || AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 101) {
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Strike));
- TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun();
- run.flags |= TextStyleSpan.FLAG_STYLE_STRIKE;
- stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- menu.add(R.id.menu_groupbolditalic, R.id.menu_strike, order++, stringBuilder);
- stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Underline));
- run = new TextStyleSpan.TextStyleRun();
- run.flags |= TextStyleSpan.FLAG_STYLE_UNDERLINE;
- stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- menu.add(R.id.menu_groupbolditalic, R.id.menu_underline, order++, stringBuilder);
- }
- menu.add(R.id.menu_groupbolditalic, R.id.menu_link, order++, LocaleController.getString(R.string.CreateLink));
- menu.add(R.id.menu_groupbolditalic, R.id.menu_mention, order++, LocaleController.getString(R.string.CreateMention));
- menu.add(R.id.menu_groupbolditalic, R.id.menu_regular, order++, LocaleController.getString(R.string.Regular));
+
+ SpannableStringBuilder stringBuilder;
+ TextStyleSpan.TextStyleRun run;
+ List enabledOrder = TextStyleItems.INSTANCE.getEnabledOrder();
+ for (int i : enabledOrder) {
+ switch (i) {
+ case 0:
+ if (chat) {
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_quote, order++, LocaleController.getString(R.string.Quote));
+ }
+ break;
+ case 1:
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_spoiler, order++, LocaleController.getString(R.string.Spoiler));
+ break;
+ case 2:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Bold));
+ stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.bold()), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_bold, order++, stringBuilder);
+ break;
+ case 3:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Italic));
+ stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/ritalic.ttf")), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_italic, order++, stringBuilder);
+ break;
+ case 4:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.MonoCode));
+ stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_code, order++, stringBuilder);
+ break;
+ case 5:
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Mono));
+ stringBuilder.setSpan(new TypefaceSpan(Typeface.MONOSPACE), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_mono, order++, stringBuilder);
+ break;
+ case 6:
+ if (encryptedChat == null || AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 101) {
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Strike));
+ run = new TextStyleSpan.TextStyleRun();
+ run.flags |= TextStyleSpan.FLAG_STYLE_STRIKE;
+ stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_strike, order++, stringBuilder);
+ break;
+ }
+ case 7:
+ if (encryptedChat == null || AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 101) {
+ stringBuilder = new SpannableStringBuilder(LocaleController.getString(R.string.Underline));
+ run = new TextStyleSpan.TextStyleRun();
+ run.flags |= TextStyleSpan.FLAG_STYLE_UNDERLINE;
+ stringBuilder.setSpan(new TextStyleSpan(run), 0, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_underline, order++, stringBuilder);
+ }
+ break;
+ case 8:
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_link, order++, LocaleController.getString(R.string.CreateLink));
+ break;
+ case 9:
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_mention, order++, LocaleController.getString(R.string.CreateMention));
+ break;
+ case 10:
+ menu.add(R.id.menu_groupbolditalic, R.id.menu_regular, order++, LocaleController.getString(R.string.Regular));
+ break;
+ }
+ }
}
private void updateScheduledInterface(boolean animated) {
@@ -26032,6 +26242,10 @@ private void updateBottomOverlay() {
bottomOverlayChatText.setText(LocaleController.getString(R.string.ChannelUnmute), true);
bottomOverlayChatText.setEnabled(true);
}
+ if (Config.disableChannelMuteButton) {
+ bottomOverlayChatText.setText("", false);
+ bottomOverlayChatText.setEnabled(false);
+ }
showBottomOverlayProgress(false, bottomOverlayProgress.getTag() != null);
} else if (forumTopic != null && forumTopic.closed) {
if (!ChatObject.canManageTopic(currentAccount, currentChat, forumTopic)) {
@@ -26246,7 +26460,7 @@ public void onAnimationEnd(Animator animation) {
bottomOverlayChat.setVisibility(View.VISIBLE);
chatActivityEnterView.setVisibility(View.INVISIBLE);
} else if (chatMode == MODE_PINNED ||
- currentChat != null && ((ChatObject.isNotInChat(currentChat) || !ChatObject.canWriteToChat(currentChat)) && (currentChat.join_to_send || !isThreadChat() || ChatObject.isForum(currentChat)) || forumTopic != null && forumTopic.closed && !ChatObject.canManageTopic(currentAccount, currentChat, forumTopic) || shouldDisplaySwipeToLeftToReplyInForum()) ||
+ currentChat != null && (((ChatObject.isNotInChat(currentChat) || !ChatObject.canWriteToChat(currentChat)) && !canSendMsgInCommentGroupWithoutJoin()) && (currentChat.join_to_send || !isThreadChat() || ChatObject.isForum(currentChat)) || forumTopic != null && forumTopic.closed && !ChatObject.canManageTopic(currentAccount, currentChat, forumTopic) || shouldDisplaySwipeToLeftToReplyInForum()) ||
currentUser != null && (UserObject.isDeleted(currentUser) || userBlocked || UserObject.isReplyUser(currentUser))) {
if (chatActivityEnterView.isEditingMessage()) {
chatActivityEnterView.setVisibility(View.VISIBLE);
@@ -26915,7 +27129,7 @@ public void onAnimationCancel(Animator animation) {
if (user != null) {
nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name));
} else if (chat != null) {
- nameTextView.setText(chat.title);
+ nameTextView.setText(StringUtils.zalgoFilter(chat.title));
}
} else {
if (pinnedMessageObject.isInvoice() &&
@@ -29194,7 +29408,8 @@ private boolean createMenu(View v, boolean single, boolean listView, float x, fl
allowPin = false;
}
allowPin = allowPin && message.getId() > 0 && (message.messageOwner.action == null || message.messageOwner.action instanceof TLRPC.TL_messageActionEmpty) && !message.isExpiredStory() && message.type != MessageObject.TYPE_STORY_MENTION;
- boolean noforwards = getMessagesController().isChatNoForwards(currentChat) || message.messageOwner.noforwards || getDialogId() == UserObject.VERIFY;
+ boolean noforwardsOriginal = getMessagesController().isChatNoForwards(currentChat) || message.messageOwner.noforwards || getDialogId() == UserObject.VERIFY;
+ boolean noforwards = !Config.ignoreChatStrict && noforwardsOriginal;
boolean noforwardsOrPaidMedia = noforwards || message.type == MessageObject.TYPE_PAID_MEDIA;
boolean allowUnpin = message.getDialogId() != mergeDialogId && allowPin && (pinnedMessageObjects.containsKey(message.getId()) || groupedMessages != null && !groupedMessages.messages.isEmpty() && pinnedMessageObjects.containsKey(groupedMessages.messages.get(0).getId())) && !message.isExpiredStory();
boolean allowEdit = message.canEditMessage(currentChat) && !chatActivityEnterView.hasAudioToSend() && message.getDialogId() != mergeDialogId && message.type != MessageObject.TYPE_STORY;
@@ -29543,6 +29758,9 @@ public void setAutoDeleteHistory(int time, int action) {
items.add(LocaleController.getString(R.string.SaveToGallery));
options.add(OPTION_SAVE_TO_GALLERY);
icons.add(R.drawable.msg_gallery);
+ items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
+ options.add(OPTION_SHARE_PHOTO);
+ icons.add(R.drawable.msg_shareout);
}
}
}
@@ -29582,12 +29800,23 @@ public void setAutoDeleteHistory(int time, int action) {
options.add(OPTION_SHARE);
icons.add(R.drawable.msg_shareout);
}
+ if (ConfigManager.getBooleanOrFalse(Defines.showDeleteDownloadFiles)) {
+ items.add(LocaleController.getString("DeleteDownloadedFile",
+ R.string.DeleteDownloadedFile));
+ options.add(OPTION_DELETE_DOWNLOADED_FILE);
+ icons.add(R.drawable.msg_clear);
+ }
} else if (type == 7) {
if (selectedObject.isMask()) {
items.add(LocaleController.getString(R.string.AddToMasks));
options.add(OPTION_ADD_TO_STICKERS_OR_MASKS);
icons.add(R.drawable.msg_sticker);
} else {
+// if (!selectedObject.isAnimatedSticker()) {
+ items.add(LocaleController.getString(R.string.SaveToGallery));
+ options.add(OPTION_SAVE_STICKER_TO_GALLERY);
+ icons.add(R.drawable.msg_gallery);
+// }
items.add(LocaleController.getString(R.string.AddToStickers));
options.add(OPTION_ADD_TO_STICKERS_OR_MASKS);
icons.add(R.drawable.msg_sticker);
@@ -29624,12 +29853,11 @@ public void setAutoDeleteHistory(int time, int action) {
icons.add(R.drawable.msg_callback);
}
} else if (type == 9) {
- if (!selectedObject.isAnimatedSticker()) {
- items.add(LocaleController.getString("SaveToGallery",
- R.string.SaveToGallery));
+// if (!selectedObject.isAnimatedSticker()) {
+ items.add(LocaleController.getString(R.string.SaveToGallery));
options.add(OPTION_SAVE_STICKER_TO_GALLERY);
icons.add(R.drawable.msg_gallery);
- }
+// }
TLRPC.Document document = selectedObject.getDocument();
if (!getMediaDataController().isStickerInFavorites(document)) {
if (getMediaDataController().canAddStickerToFavorites()) {
@@ -29652,7 +29880,7 @@ public void setAutoDeleteHistory(int time, int action) {
icons.add(R.drawable.msg_forward);
if (Config.showNoQuoteForward && !UserObject.isUserSelf(currentUser)) {
items.add(LocaleController.getString("NoQuoteForward", R.string.NoQuoteForward));
- options.add(95);
+ options.add(OPTION_NOQUOTE_FORWARD);
icons.add(R.drawable.msg_noquote_forward);
}
if (Config.showSaveMessages && !UserObject.isUserSelf(currentUser)) {
@@ -29674,17 +29902,37 @@ public void setAutoDeleteHistory(int time, int action) {
}
}
}
+ if (Config.showRepeatAsCopy) {
+ if (!selectedObject.isSponsored() && chatMode != MODE_SCHEDULED && (!selectedObject.needDrawBluredPreview() || selectedObject.hasExtendedMediaPreview()) &&
+ !selectedObject.isLiveLocation() && selectedObject.type != MessageObject.TYPE_PHONE_CALL &&
+ selectedObject.type != MessageObject.TYPE_GIFT_PREMIUM) {
+ boolean allowRepeat = allowChatActions && (!(isThreadChat() && !isTopic) || getMessageUtils().getMessageForRepeat(selectedObject,
+ selectedObjectGroup) != null);
+ if (allowRepeat) {
+ items.add(LocaleController.getString("RepeatAsCopy", R.string.RepeatAsCopy));
+ options.add(OPTION_REPEAT_AS_COPY);
+ icons.add(R.drawable.msg_repeat);
+ }
+ }
+ }
+ if (Config.showReverse) {
+ if (allowChatActions) {
+ items.add(LocaleController.getString("Reverse", R.string.Reverse));
+ options.add(OPTION_REVERSE);
+ icons.add(R.drawable.msg_reset);
+ }
+ }
if (Config.customQuickMessageEnabled) {
if (allowChatActions) {
items.add(ConfigManager.getStringOrDefault(Defines.customQuickMessageDisplayName, "NULL"));
options.add(Defines.customQuickMessageRow);
- icons.add(R.drawable.msg_fave);
+ icons.add(R.drawable.msg_prpr);
}
}
if (Config.showViewHistory) {
boolean allowViewHistory = currentChat != null && chatMode == 0 && !currentChat.broadcast && !(threadMessageObjects != null && threadMessageObjects.contains(message));
if (allowViewHistory) {
- items.add(LocaleController.getString("ViewUserHistory", R.string.ViewHistory));
+ items.add(LocaleController.getString("ViewHistory", R.string.ViewHistory));
options.add(OPTION_VIEW_HISTORY);
icons.add(R.drawable.msg_recent);
}
@@ -29822,6 +30070,7 @@ public void setAutoDeleteHistory(int time, int action) {
icons.add(R.drawable.msg_gallery);
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
options.add(OPTION_SHARE);
+// options.add(OPTION_SHARE_PHOTO); // fixme: crash on share photo
icons.add(R.drawable.msg_shareout);
if (ConfigManager.getBooleanOrFalse(Defines.showCopyPhoto)) {
items.add(LocaleController.getString("CopyPhoto", R.string.CopyPhoto));
@@ -29906,17 +30155,21 @@ public void setAutoDeleteHistory(int time, int action) {
Rect rect = new Rect();
List availableReacts = getMediaDataController().getEnabledReactionsList();
- boolean isReactionsViewAvailable = !isSecretChat() && !isInScheduleMode() && currentUser == null && primaryMessage.hasReactions() && (!ChatObject.isChannel(currentChat) || currentChat.megagroup) && !availableReacts.isEmpty() && primaryMessage.messageOwner.reactions.can_see_list && !primaryMessage.isSecretMedia();
+ boolean isReactionsViewAvailable = Config.showReactions && !isSecretChat() && !isInScheduleMode() && currentUser == null && primaryMessage.hasReactions() && (!ChatObject.isChannel(currentChat) || currentChat.megagroup) && !availableReacts.isEmpty() && primaryMessage.messageOwner.reactions.can_see_list && !primaryMessage.isSecretMedia();
boolean isReactionsAvailable;
- if (message.isForwardedChannelPost()) {
- TLRPC.ChatFull chatInfo = getMessagesController().getChatFull(-message.getFromChatId());
- if (chatInfo == null) {
- isReactionsAvailable = true;
- } else {
+ if (Config.showReactions) {
+ if (message.isForwardedChannelPost()) {
+ TLRPC.ChatFull chatInfo = getMessagesController().getChatFull(-message.getFromChatId());
+ if (chatInfo == null) {
+ isReactionsAvailable = true;
+ } else {
isReactionsAvailable = !isSecretChat() && chatMode != MODE_QUICK_REPLIES && !isInScheduleMode() && primaryMessage.isReactionsAvailable() && (chatInfo != null && (!(chatInfo.available_reactions instanceof TLRPC.TL_chatReactionsNone) || chatInfo.paid_reactions_available)) && !availableReacts.isEmpty();
+ }
+ } else {
+ isReactionsAvailable = !message.isSecretMedia() && chatMode != MODE_QUICK_REPLIES && !isSecretChat() && !isInScheduleMode() && primaryMessage.isReactionsAvailable() && (chatInfo != null && (!(chatInfo.available_reactions instanceof TLRPC.TL_chatReactionsNone) || chatInfo.paid_reactions_available) || (chatInfo == null && !ChatObject.isChannel(currentChat)) || currentUser != null) && !availableReacts.isEmpty();
}
} else {
- isReactionsAvailable = !message.isSecretMedia() && chatMode != MODE_QUICK_REPLIES && !isSecretChat() && !isInScheduleMode() && primaryMessage.isReactionsAvailable() && (chatInfo != null && (!(chatInfo.available_reactions instanceof TLRPC.TL_chatReactionsNone) || chatInfo.paid_reactions_available) || (chatInfo == null && !ChatObject.isChannel(currentChat)) || currentUser != null) && !availableReacts.isEmpty();
+ isReactionsAvailable = false;
}
boolean showMessageSeen = !isReactionsViewAvailable && !isInScheduleMode() && currentChat != null && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < getMessagesController().chatReadMarkExpirePeriod) && (ChatObject.isMegagroup(currentChat) || !ChatObject.isChannel(currentChat)) && chatInfo != null && chatInfo.participants_count <= getMessagesController().chatReadMarkSizeThreshold && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) && (v instanceof ChatMessageCell);
boolean showPrivateMessageSeen = !isReactionsViewAvailable && currentChat == null && currentEncryptedChat == null && (currentUser != null && !UserObject.isUserSelf(currentUser) && !UserObject.isReplyUser(currentUser) && !UserObject.isAnonymous(currentUser) && !currentUser.bot && !UserObject.isService(currentUser.id)) && (userInfo == null || !userInfo.read_dates_private) && !isInScheduleMode() && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < getMessagesController().pmReadDateExpirePeriod) && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) && (v instanceof ChatMessageCell);
@@ -30236,9 +30489,11 @@ public void onClick(View view) {
}
if (SharedConfig.messageSeenHintCount > 0 && contentView.getKeyboardHeight() < AndroidUtilities.dp(20)) {
- messageSeenPrivacyBulletin = BulletinFactory.of(Bulletin.BulletinWindow.make(getContext()), themeDelegate).createErrorBulletin(AndroidUtilities.replaceTags(LocaleController.getString(R.string.MessageSeenTooltipMessage)));
- messageSeenPrivacyBulletin.setDuration(4000);
- messageSeenPrivacyBulletin.show();
+ if (Config.hideMessageSeenTooltip) {
+ messageSeenPrivacyBulletin = BulletinFactory.of(Bulletin.BulletinWindow.make(getContext()), themeDelegate).createErrorBulletin(AndroidUtilities.replaceTags(LocaleController.getString(R.string.MessageSeenTooltipMessage)));
+ messageSeenPrivacyBulletin.setDuration(4000);
+ messageSeenPrivacyBulletin.show();
+ }
SharedConfig.updateMessageSeenHintCount(SharedConfig.messageSeenHintCount - 1);
}
@@ -30596,6 +30851,13 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
}
processSelectedOption(options.get(i));
});
+ cell.setOnLongClickListener(v2 -> {
+ if (selectedObject == null || i >= options.size()) {
+ return false;
+ }
+ processLongClickSelectedOption(options.get(i));
+ return true;
+ });
if (option == OPTION_TRANSLATE) {
// "Translate" button
MessageObject messageObject = getMessageUtils().getMessageForTranslate(selectedObject, selectedObjectGroup);
@@ -31850,7 +32112,7 @@ private void processSelectedOption(int option) {
}
case OPTION_FORWARD:
case OPTION_NOQUOTE_FORWARD: {
- setForwardParams(option == 95);
+ setForwardParams(option == OPTION_NOQUOTE_FORWARD);
forwardingMessage = selectedObject;
forwardingMessageGroup = selectedObjectGroup;
Bundle args = new Bundle();
@@ -32007,6 +32269,37 @@ private void processSelectedOption(int option) {
}
break;
}
+ case OPTION_SHARE_PHOTO: {
+ String path = selectedObject.messageOwner.attachPath;
+ if (path != null && path.length() > 0) {
+ File temp = new File(path);
+ if (!temp.exists()) {
+ path = null;
+ }
+ }
+ if (path == null || path.length() == 0) {
+ path = getFileLoader().getPathToMessage(selectedObject.messageOwner).toString();
+ }
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType(selectedObject.isVideo() ? "video/mp4" : "image/jpeg");
+ File f = new File(path);
+ if (Build.VERSION.SDK_INT >= 24) {
+ try {
+ intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", f));
+ intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ } catch (Exception ignore) {
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
+ }
+ } else {
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
+ }
+ try {
+ getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500);
+ } catch (Throwable ignore) {
+
+ }
+ break;
+ }
case OPTION_SAVE_TO_GALLERY2: {
String path = selectedObject.messageOwner.attachPath;
if (path != null && path.length() > 0) {
@@ -32523,17 +32816,7 @@ public void run(Uri arg) {
break;
}
case OPTION_SAVE_MESSAGE: {
- ArrayList messages = new ArrayList<>();
- if (selectedObjectGroup != null) {
- messages.addAll(selectedObjectGroup.messages);
- } else {
- messages.add(selectedObject);
- }
- forwardMessages(messages, false, false, true, 0, getUserConfig().getClientUserId());
- createUndoView();
- if (undoView != null) {
- undoView.showWithAction(getUserConfig().getClientUserId(), UndoView.ACTION_FWD_MESSAGES, messages.size());
- }
+ processSaveMessage();
break;
}
case OPTION_QR: {
@@ -32547,6 +32830,19 @@ public void run(Uri arg) {
processRepeatMessage();
break;
}
+ case OPTION_REPEAT_AS_COPY: {
+ if (checkSlowMode(chatActivityEnterView.getSendButton())) {
+ return;
+ }
+ processRepeatMessage(true);
+ break;
+ }
+ case OPTION_REVERSE:
+ if (checkSlowMode(chatActivityEnterView.getSendButton())) {
+ return;
+ }
+ processReverseMessage(false);
+ break;
case Defines.customQuickMessageRow: {
if (checkSlowMode(chatActivityEnterView.getSendButton())) {
return;
@@ -32692,6 +32988,87 @@ private void hideAds() {
}
}
+ private void processSaveMessage() {
+ ArrayList messages = new ArrayList<>();
+ boolean noforwards = getMessagesController().isChatNoForwards(currentChat) || selectedObject.messageOwner.noforwards;
+ if (selectedObjectGroup != null) {
+ messages.addAll(selectedObjectGroup.messages);
+ } else {
+ messages.add(selectedObject);
+ }
+ if (noforwards) {
+ // todo send message link along
+ for (MessageObject message : messages) {
+ String path = message.messageOwner.attachPath;
+ if (path != null && !path.isEmpty()) {
+ File temp = new File(path);
+ if (!temp.exists()) {
+ path = null;
+ }
+ }
+ if (path == null || path.isEmpty()) {
+ path = getFileLoader().getPathToMessage(message.messageOwner).toString();
+ }
+ ArrayList media = new ArrayList<>();
+ SendMessagesHelper.SendingMediaInfo info = new SendMessagesHelper.SendingMediaInfo();
+ info.path = path;
+ info.thumbPath = null;
+ info.videoEditedInfo = null;
+ info.isVideo = path.endsWith(".mp4");
+ info.caption = null;
+ info.entities = null;
+ info.masks = null;
+ info.ttl = 0;
+ media.add(info);
+ SendMessagesHelper.prepareSendingMedia(getAccountInstance(), media, getUserConfig().getClientUserId(), null, null, null, null, true, true, null, false, 0, 0, false, null, quickReplyShortcut, getQuickReplyId(), 0, false);
+ }
+ BulletinFactory.of(ChatActivity.this).showForwardedBulletinWithTag(getUserConfig().getClientUserId(), messages.size());
+ } else {
+ forwardMessages(messages, false, false, true, 0, getUserConfig().getClientUserId());
+ createUndoView();
+ if (undoView != null) {
+ undoView.showWithAction(getUserConfig().getClientUserId(), UndoView.ACTION_FWD_MESSAGES, messages.size());
+ }
+ }
+ }
+
+ private void processLongClickSelectedOption(int option) {
+ if (selectedObject == null || getParentActivity() == null) {
+ return;
+ }
+ switch (option) {
+ case OPTION_FORWARD -> {
+ setForwardParams(true);
+ forwardingMessage = selectedObject;
+ forwardingMessageGroup = selectedObjectGroup;
+ Bundle args = new Bundle();
+ args.putBoolean("onlySelect", true);
+ args.putInt("dialogsType", DialogsActivity.DIALOGS_TYPE_FORWARD);
+ args.putInt("messagesCount", forwardingMessageGroup == null ? 1 : forwardingMessageGroup.messages.size());
+ args.putInt("hasPoll", forwardingMessage.isPoll() ? (forwardingMessage.isPublicPoll() ? 2 : 1) : 0);
+ args.putBoolean("hasInvoice", forwardingMessage.isInvoice());
+ args.putBoolean("canSelectTopics", true);
+ DialogsActivity fragment = new DialogsActivity(args);
+ fragment.setDelegate(this);
+ presentFragment(fragment);
+ }
+ case OPTION_REPEAT -> {
+ if (checkSlowMode(chatActivityEnterView.getSendButton())) {
+ return;
+ }
+ processRepeatMessage(false, true);
+ }
+ case OPTION_REVERSE -> {
+ processReverseMessage(true);
+ }
+ default -> processSelectedOption(option);
+ }
+ selectedObject = null;
+ selectedObjectGroup = null;
+ selectedObjectToEditCaption = null;
+ closeMenu();
+ }
+
@Override
public boolean didSelectDialogs(DialogsActivity fragment, ArrayList dids, CharSequence message, boolean param, boolean notify, int scheduleDate, TopicsFragment topicsFragment) {
if ((messagePreviewParams == null && (!fragment.isQuote || replyingMessageObject == null) || fragment.isQuote && replyingMessageObject == null) && forwardingMessage == null && selectedMessagesIds[0].size() == 0 && selectedMessagesIds[1].size() == 0) {
@@ -33312,7 +33689,7 @@ public void openSearchWithText(String text) {
updateBottomOverlay();
}
if ((threadMessageId == 0 || isTopic || chatMode == MODE_SAVED) && !UserObject.isReplyUser(currentUser)) {
- openSearchKeyboard = text == null;
+ openSearchKeyboard = text == null || text.isEmpty();
if (searchItem != null) {
searchItem.openSearch(openSearchKeyboard);
}
@@ -33320,8 +33697,8 @@ public void openSearchWithText(String text) {
if (searchItem != null) {
searchItem.setSearchFieldText(text, false);
}
- getMediaDataController().searchMessagesInChat(searchingQuery = (text == null ? "" : text), dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages,
- searchingChatMessages, !TextUtils.isEmpty(text), searchingReaction, searchingType);
+ lastSearchedMessageId = 0;
+ getMediaDataController().searchMessagesInChat(searchingQuery = (text == null ? "" : text), dialog_id, mergeDialogId, classGuid, 0, threadMessageId, false, searchingUserMessages, searchingChatMessages, !TextUtils.isEmpty(text), searchingReaction, searchingType, true);
updatePinnedMessageView(true);
}
@@ -36527,7 +36904,8 @@ public void onSearchPressed(EditText editText) {
hashtagSearchTabs.tabs.scrollToTab(defaultSearchPage, defaultSearchPage);
}
- getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType);
+ lastSearchedMessageId = 0;
+ getMediaDataController().searchMessagesInChat(searchingQuery, dialog_id, mergeDialogId, classGuid, 0, threadMessageId, searchingUserMessages, searchingChatMessages, searchingReaction, searchingType, true);
}
@Override
@@ -38155,7 +38533,7 @@ public void didPressReplyMessage(ChatMessageCell cell, int id, float x, float y,
if (did < 0) {
chat = getMessagesController().getChat(-did);
}
- if (did == Long.MAX_VALUE) {
+ if (did == Long.MAX_VALUE || did != dialog_id && chat != null && (chat.left || chat.kicked)) {
if (messageObject != null && messageObject.messageOwner != null && messageObject.messageOwner.reply_to != null && !TextUtils.isEmpty(messageObject.messageOwner.reply_to.quote_text) && messageObject.replyTextEllipsized && !messageObject.replyTextRevealed && !messageObject.shouldDrawWithoutBackground()) {
messageObject.replyTextRevealed = true;
updateMessageAnimated(messageObject, true);
@@ -41064,23 +41442,50 @@ protected boolean hideKeyboardOnShow() {
return super.hideKeyboardOnShow();
}
- public boolean processRepeatMessage() {
- if ((isThreadChat() && !isTopic) || getMessagesController().isChatNoForwards(currentChat) || selectedObject.messageOwner.noforwards) {
+ public boolean processRepeatMessage(){
+ return processRepeatMessage(false, false);
+ }
+
+ public boolean processRepeatMessage(boolean asCopy) {
+ return processRepeatMessage(asCopy, false);
+ }
+
+ public boolean processRepeatMessage(boolean asCopy, boolean longClick) {
+ if (asCopy || longClick || (isThreadChat() && !isTopic) || getMessagesController().isChatNoForwards(currentChat) || selectedObject.messageOwner.noforwards) {
var messageObject = getMessageUtils().getMessageForRepeat(selectedObject, selectedObjectGroup);
if (messageObject != null) {
+ var replyToMsg = longClick ? messageObject.replyMessageObject : threadMessageObject;
if (messageObject.isAnyKindOfSticker() && !messageObject.isAnimatedEmojiStickers() && !messageObject.isAnimatedEmoji() && !messageObject.isDice()) {
Object parent = getMediaDataController().getStickerSetById(MediaDataController.getStickerSetId(selectedObject.getDocument()));
getSendMessagesHelper().sendSticker(
- selectedObject.getDocument(), null, dialog_id, threadMessageObject,
+ selectedObject.getDocument(), null, dialog_id, replyToMsg,
threadMessageObject, null, replyingQuote, null, true, 0, false, parent, quickReplyShortcut, getQuickReplyId());
return true;
} else {
- var message = messageObject.messageOwner.message;
+ String message;
+ ArrayList origin_entities;
+ if (messageObject.translated) {
+ if (messageObject.originalMessage instanceof String) {
+ message = (String) messageObject.originalMessage;
+ origin_entities = messageObject.messageOwner.entities;
+ } else if (messageObject.originalMessage instanceof Pair) {
+ Pair> pair =
+ (Pair>) messageObject.originalMessage;
+ message = pair.first;
+ origin_entities = pair.second;
+ } else {
+ message = messageObject.messageOwner.message;
+ origin_entities = messageObject.messageOwner.entities;
+ }
+ } else {
+ message = messageObject.messageOwner.message;
+ origin_entities = messageObject.messageOwner.entities;
+ }
if (!TextUtils.isEmpty(message)) {
ArrayList entities;
- if (messageObject.messageOwner.entities != null && !messageObject.messageOwner.entities.isEmpty()) {
+ if (origin_entities != null && !origin_entities.isEmpty()) {
entities = new ArrayList<>();
- for (TLRPC.MessageEntity entity : messageObject.messageOwner.entities) {
+ for (TLRPC.MessageEntity entity : origin_entities) {
if (entity instanceof TLRPC.TL_messageEntityMentionName) {
TLRPC.TL_inputMessageEntityMentionName mention = new TLRPC.TL_inputMessageEntityMentionName();
mention.length = entity.length;
@@ -41094,7 +41499,7 @@ public boolean processRepeatMessage() {
} else {
entities = null;
}
- getSendMessagesHelper().sendMessage(SendMessageParams.of(message, dialog_id, threadMessageObject, threadMessageObject, null, false, entities, null, null, true, 0, null, false));
+ getSendMessagesHelper().sendMessage(SendMessageParams.of(message, dialog_id, replyToMsg, threadMessageObject, null, false, entities, null, null, true, 0, null, false));
return true;
}
}
@@ -41111,6 +41516,43 @@ public boolean processRepeatMessage() {
return false;
}
+ public boolean processReverseMessage(boolean longClick) {
+ var messageObject = getMessageUtils().getMessageForRepeat(selectedObject, selectedObjectGroup);
+ if (messageObject != null) {
+ var replyToMsg = longClick ? messageObject : threadMessageObject;
+ if (!messageObject.isAnyKindOfSticker() || messageObject.isAnimatedEmojiStickers() || messageObject.isAnimatedEmoji() || messageObject.isDice()) {
+ var message = messageObject.messageOwner.message;
+ if (!TextUtils.isEmpty(message)) {
+ message = WordUtils.INSTANCE.replaceAntonyms(message);
+ ArrayList entities;
+ if (messageObject.messageOwner.entities != null && !messageObject.messageOwner.entities.isEmpty()) {
+ entities = new ArrayList<>();
+ for (TLRPC.MessageEntity entity : messageObject.messageOwner.entities) {
+ if (entity instanceof TLRPC.TL_messageEntityMentionName) {
+ TLRPC.TL_inputMessageEntityMentionName mention = new TLRPC.TL_inputMessageEntityMentionName();
+ mention.length = entity.length;
+ mention.offset = entity.offset;
+ mention.user_id = getMessagesController().getInputUser(((TLRPC.TL_messageEntityMentionName) entity).user_id);
+ entities.add(mention);
+ } else {
+ entities.add(entity);
+ }
+ }
+ } else {
+ entities = null;
+ }
+ getSendMessagesHelper().sendMessage(SendMessageParams.of(
+ message, dialog_id, replyToMsg,
+ threadMessageObject, null, false, entities,
+ null, null, true, 0, null, false));
+ return true;
+ }
+ return false;
+ }
+ }
+ return false;
+ }
+
@Override
public ArrayList getForwardingMessages() {
ArrayList fmessages = new ArrayList<>();
@@ -41198,7 +41640,7 @@ public void updateClip(int[] clip) {
clip[1] = chatListView.getMeasuredHeight() - (chatListView.getPaddingBottom() - AndroidUtilities.dp(3));
}
}
-
+
private void updateVisibleWallpaperActions() {
if (chatListView != null && chatAdapter != null) {
for (int i = 0; i < chatListView.getChildCount(); ++i) {
@@ -41908,6 +42350,15 @@ public boolean dispatchTouchEvent(MotionEvent event) {
}
+ private int getFirstVisibleMessage() {
+ return MessageHelper.INSTANCE.getFirstVisibleMessage(chatLayoutManager, chatListView, chatAdapter, messages);
+ }
+
+ private boolean canSendMsgInCommentGroupWithoutJoin() {
+ return currentChat != null && currentChat.megagroup && chatInfo != null && chatInfo.linked_chat_id != 0
+ && !currentChat.join_to_send && !currentChat.min;
+ }
+
private void checkHashtagStories(boolean instant) {
if (searchType != SEARCH_PUBLIC_POSTS) return;
if (messagesSearchAdapter == null) return;
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java
index 07a6b3bd08..43a82c61ad 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java
@@ -100,7 +100,7 @@
import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;
-import top.qwq2333.nullgram.utils.Log;
+import xyz.nextalone.nnngram.utils.Log;
public class ChatUsersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java
index 74c37cbf10..f2384accbe 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java
@@ -149,7 +149,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
-import top.qwq2333.nullgram.helpers.PasscodeHelper;
+import xyz.nextalone.nnngram.helpers.PasscodeHelper;
public class AlertsCreator {
public final static int PERMISSIONS_REQUEST_TOP_ICON_SIZE = 72;
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java
index 9311ed526a..675badb8cb 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java
@@ -106,6 +106,8 @@
import java.util.ArrayList;
import java.util.List;
+import xyz.nextalone.gen.Config;
+
public class AudioPlayerAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate, DownloadController.FileDownloadProgressListener {
private ActionBar actionBar;
@@ -2020,11 +2022,12 @@ private void updateTitle(boolean shutdown) {
optionsButton.setVisibility(View.VISIBLE);
}
final long dialogId = messageObject.getDialogId();
- final boolean noforwards = (
+ final boolean noforwards = !Config.ignoreChatStrict && (
dialogId < 0 && MessagesController.getInstance(currentAccount).isChatNoForwards(-dialogId) ||
MessagesController.getInstance(currentAccount).isChatNoForwards(messageObject.getChatId()) ||
messageObject.messageOwner.noforwards
);
+ optionsButton.showSubItem(5);
if (noforwards) {
optionsButton.hideSubItem(1);
optionsButton.hideSubItem(2);
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java
index 823c6533c4..062bf62382 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java
@@ -40,8 +40,8 @@
import java.util.Locale;
import kotlin.Unit;
-import top.qwq2333.nullgram.utils.APKUtils;
-import top.qwq2333.nullgram.utils.UpdateUtils;
+import xyz.nextalone.nnngram.utils.APKUtils;
+import xyz.nextalone.nnngram.utils.UpdateUtils;
public class BlockingUpdateView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate {
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 5ecb2544e9..31e77dbd7f 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java
@@ -78,6 +78,7 @@
import android.util.Property;
import android.util.TypedValue;
import android.view.ActionMode;
+import android.view.DragEvent;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
@@ -101,6 +102,7 @@
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+import android.widget.Toast;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
@@ -202,8 +204,8 @@
import java.util.List;
import java.util.Locale;
-import top.qwq2333.gen.Config;
-import top.qwq2333.nullgram.utils.PermissionUtils;
+import xyz.nextalone.gen.Config;
+import xyz.nextalone.nnngram.utils.PermissionUtils;
public class ChatActivityEnterView extends BlurredFrameLayout implements NotificationCenter.NotificationCenterDelegate, SizeNotifierFrameLayout.SizeNotifierFrameLayoutDelegate, StickersAlert.StickersAlertDelegate, SuggestEmojiView.AnchorViewDelegate {
@@ -885,6 +887,9 @@ public void run() {
private Runnable recordAudioVideoRunnable = new Runnable() {
@Override
public void run() {
+ if (Config.hideQuickSendMediaBottom) {
+ return;
+ }
if (delegate == null || parentActivity == null) {
return;
}
@@ -2894,7 +2899,10 @@ public boolean onTouchEvent(MotionEvent motionEvent) {
}
};
audioVideoButtonContainer.setSoundEffectsEnabled(false);
- sendButtonContainer.addView(audioVideoButtonContainer, LayoutHelper.createFrame(48, 48));
+ if (!Config.hideQuickSendMediaBottom)
+ sendButtonContainer.addView(audioVideoButtonContainer, LayoutHelper.createFrame(48, 48));
+ else
+ audioVideoButtonContainer.setVisibility(GONE);
audioVideoButtonContainer.setFocusable(true);
audioVideoButtonContainer.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
@@ -3123,13 +3131,22 @@ public boolean shouldDrawBackground() {
return shouldDrawBackground;
}
};
- sendButton.setVisibility(INVISIBLE);
+ if (Config.hideQuickSendMediaBottom)
+ sendButton.setVisibility(VISIBLE);
+ else
+ sendButton.setVisibility(INVISIBLE);
int color = getThemedColor(Theme.key_chat_messagePanelSend);
sendButton.setContentDescription(getString("Send", R.string.Send));
sendButton.setSoundEffectsEnabled(false);
- sendButton.setScaleX(0.1f);
- sendButton.setScaleY(0.1f);
- sendButton.setAlpha(0.0f);
+ if (Config.hideQuickSendMediaBottom) {
+ sendButton.setScaleX(1.0f);
+ sendButton.setScaleY(1.0f);
+ sendButton.setAlpha(1.0f);
+ } else {
+ sendButton.setScaleX(0.1f);
+ sendButton.setScaleY(0.1f);
+ sendButton.setAlpha(0.0f);
+ }
if (Build.VERSION.SDK_INT >= 21) {
sendButton.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(color, 24), 1));
}
@@ -4333,7 +4350,7 @@ public void dismiss() {
if (sendWhenOnlineButton != null) {
TLRPC.User user = parentFragment == null ? null : parentFragment.getCurrentUser();
- if (user != null && !user.bot && !(user.status instanceof TLRPC.TL_userStatusEmpty) && !(user.status instanceof TLRPC.TL_userStatusOnline) && !(user.status instanceof TLRPC.TL_userStatusRecently) && !(user.status instanceof TLRPC.TL_userStatusLastMonth) && !(user.status instanceof TLRPC.TL_userStatusLastWeek)) {
+ if (messageEditText != null && !TextUtils.isEmpty(messageEditText.getText()) && user != null && !user.bot && !(user.status instanceof TLRPC.TL_userStatusEmpty) && !(user.status instanceof TLRPC.TL_userStatusOnline) && !(user.status instanceof TLRPC.TL_userStatusRecently) && !(user.status instanceof TLRPC.TL_userStatusLastMonth) && !(user.status instanceof TLRPC.TL_userStatusLastWeek)) {
sendWhenOnlineButton.setVisibility(VISIBLE);
} else {
sendWhenOnlineButton.setVisibility(GONE);
@@ -4535,7 +4552,7 @@ public void didSelectDate(boolean notify, int scheduleDate) {
options.setupSelectors();
if (sendWhenOnlineButton != null) {
TLRPC.User user = parentFragment == null ? null : parentFragment.getCurrentUser();
- if (user != null && !user.bot && !(user.status instanceof TLRPC.TL_userStatusEmpty) && !(user.status instanceof TLRPC.TL_userStatusOnline) && !(user.status instanceof TLRPC.TL_userStatusRecently) && !(user.status instanceof TLRPC.TL_userStatusLastMonth) && !(user.status instanceof TLRPC.TL_userStatusLastWeek)) {
+ if (messageEditText != null && !TextUtils.isEmpty(messageEditText.getText()) && user != null && !user.bot && !(user.status instanceof TLRPC.TL_userStatusEmpty) && !(user.status instanceof TLRPC.TL_userStatusOnline) && !(user.status instanceof TLRPC.TL_userStatusRecently) && !(user.status instanceof TLRPC.TL_userStatusLastMonth) && !(user.status instanceof TLRPC.TL_userStatusLastWeek)) {
sendWhenOnlineButton.setVisibility(VISIBLE);
} else {
sendWhenOnlineButton.setVisibility(GONE);
@@ -4883,7 +4900,26 @@ public boolean onTextContextMenuItem(int id) {
return super.onTextContextMenuItem(id);
}
+ @Override
+ public boolean onDragEvent(DragEvent event) {
+ if (event.getAction() == DragEvent.ACTION_DROP) {
+ ClipData clipData = event.getClipData();
+ if (clipData != null && LaunchActivity.instance != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ LaunchActivity.instance.requestDragAndDropPermissions(event);
+ if (clipData.getItemCount() == 1 && (clipData.getDescription().hasMimeType("image/*") || clipData.getDescription().hasMimeType("video/mp4")) && !isEditingBusinessLink()) {
+ editPhoto(clipData.getItemAt(0).getUri(), clipData.getDescription().getMimeType(0));
+ return true;
+ } else if (clipData.getItemCount() > 1) {
+ Toast.makeText(getContext(), "Don't drag more than 1 file at a time", Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ }
+ }
+ return super.onDragEvent(event);
+ }
+
private void editPhoto(Uri uri, String mime) {
+ boolean isVideo = mime.contains("video");
final File file = AndroidUtilities.generatePicturePath(parentFragment != null && parentFragment.isSecretChat(), MimeTypeMap.getSingleton().getExtensionFromMimeType(mime));
Utilities.globalQueue.postRunnable(() -> {
try {
@@ -4897,7 +4933,7 @@ private void editPhoto(Uri uri, String mime) {
}
in.close();
fos.close();
- MediaController.PhotoEntry photoEntry = new MediaController.PhotoEntry(0, -1, 0, file.getAbsolutePath(), 0, false, 0, 0, 0);
+ MediaController.PhotoEntry photoEntry = new MediaController.PhotoEntry(0, -1, 0, file.getAbsolutePath(), 0, isVideo, 0, 0, 0);
ArrayList |