From b820e126d2a2d65a1ba4fa96786b667125e65903 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Thu, 9 Apr 2015 21:00:14 +0300 Subject: [PATCH] update to 2.7.0 --- TMessagesProj/build.gradle | 4 +- TMessagesProj/jni/Android.mk | 2 +- TMessagesProj/jni/image.c | 5 + .../{libtmessages.6.so => libtmessages.7.so} | Bin 1569668 -> 1569668 bytes .../{libtmessages.6.so => libtmessages.7.so} | Bin 1114980 -> 1114980 bytes .../{libtmessages.6.so => libtmessages.7.so} | Bin 1877932 -> 1877932 bytes .../telegram/android/AndroidUtilities.java | 119 +- .../org/telegram/android/ImageLoader.java | 22 +- .../org/telegram/android/ImageReceiver.java | 15 +- .../org/telegram/android/MediaController.java | 10 +- .../org/telegram/android/MessageObject.java | 62 +- .../telegram/android/MessagesController.java | 258 +- .../org/telegram/android/MessagesStorage.java | 143 +- .../org/telegram/android/NativeLoader.java | 2 +- .../telegram/android/NotificationCenter.java | 5 +- .../android/NotificationsController.java | 10 +- .../telegram/android/SecretChatHelper.java | 35 +- .../telegram/android/SendMessagesHelper.java | 273 +- .../telegram/android/WearReplyReceiver.java | 2 +- .../messenger/ConnectionsManager.java | 18 +- .../org/telegram/messenger/RPCRequest.java | 2 +- .../org/telegram/messenger/TLClassStore.java | 15 +- .../java/org/telegram/messenger/TLRPC.java | 800 +++-- .../org/telegram/messenger/UserConfig.java | 16 - .../org/telegram/messenger/Utilities.java | 12 +- .../telegram/ui/AccountPasswordActivity.java | 629 ---- .../org/telegram/ui/ActionBar/ActionBar.java | 46 +- .../ui/ActionBar/ActionBarLayout.java | 64 +- .../telegram/ui/ActionBar/BaseFragment.java | 10 +- .../ui/ActionBar/DrawerLayoutContainer.java | 2 +- .../ui/Adapters/CountrySearchAdapter.java | 2 +- .../ui/Adapters/DialogsSearchAdapter.java | 11 +- .../telegram/ui/Adapters/SearchAdapter.java | 3 +- .../org/telegram/ui/BlockedUsersActivity.java | 221 +- .../org/telegram/ui/Cells/ChatBaseCell.java | 10 +- .../telegram/ui/Cells/ChatMessageCell.java | 588 ++- .../org/telegram/ui/Cells/DialogCell.java | 12 +- .../telegram/ui/Cells/DrawerProfileCell.java | 2 +- .../org/telegram/ui/Cells/MentionCell.java | 2 +- .../ui/Cells/PhotoPickerAlbumsCell.java | 6 +- .../telegram/ui/Cells/ProfileSearchCell.java | 1 + .../org/telegram/ui/Cells/SessionCell.java | 205 ++ .../telegram/ui/Cells/SharedDocumentCell.java | 30 +- .../ui/Cells/SharedPhotoVideoCell.java | 20 +- .../org/telegram/ui/Cells/StickerCell.java | 8 +- .../java/org/telegram/ui/Cells/TextCell.java | 18 +- .../org/telegram/ui/Cells/TextDetailCell.java | 2 +- .../org/telegram/ui/Cells/TextFieldCell.java | 104 - .../ui/Cells/TextInfoPrivacyCell.java | 6 +- .../telegram/ui/Cells/TextSettingsCell.java | 14 +- .../java/org/telegram/ui/Cells/UserCell.java | 6 +- .../telegram/ui/ChangeChatNameActivity.java | 130 +- .../org/telegram/ui/ChangeNameActivity.java | 197 +- .../org/telegram/ui/ChangePhoneActivity.java | 135 +- .../telegram/ui/ChangePhoneHelpActivity.java | 235 +- .../telegram/ui/ChangeUsernameActivity.java | 225 +- .../java/org/telegram/ui/ChatActivity.java | 3159 +++++++++-------- .../telegram/ui/Components/AvatarUpdater.java | 1 + .../ui/Components/BackupImageView.java | 21 +- .../ui/Components/ChatActivityEnterView.java | 107 +- .../ui/Components/ClippingImageView.java | 3 +- .../org/telegram/ui/Components/EmojiView.java | 9 +- .../ui/Components/FrameLayoutFixed.java | 5 +- .../telegram/ui/Components/ProgressView.java | 1 + .../SizeNotifierRelativeLayout.java | 3 + .../org/telegram/ui/Components/SlideView.java | 4 + .../ui/Components/StaticLayoutEx.java | 119 + .../ui/Components/VideoTimelineView.java | 3 +- .../org/telegram/ui/ContactAddActivity.java | 343 +- .../org/telegram/ui/ContactsActivity.java | 500 ++- .../telegram/ui/CountrySelectActivity.java | 322 +- .../telegram/ui/DocumentSelectActivity.java | 404 ++- .../org/telegram/ui/GroupCreateActivity.java | 626 ++-- .../telegram/ui/GroupCreateFinalActivity.java | 336 +- .../org/telegram/ui/IdenticonActivity.java | 65 +- .../java/org/telegram/ui/IntroActivity.java | 3 +- .../telegram/ui/LanguageSelectActivity.java | 344 +- .../org/telegram/ui/LastSeenActivity.java | 252 +- .../telegram/ui/LastSeenUsersActivity.java | 220 +- .../java/org/telegram/ui/LaunchActivity.java | 77 +- .../org/telegram/ui/LocationActivity.java | 282 +- .../java/org/telegram/ui/LoginActivity.java | 921 ++++- .../java/org/telegram/ui/MediaActivity.java | 686 ++-- .../org/telegram/ui/MessagesActivity.java | 876 +++-- .../ui/NotificationsSettingsActivity.java | 710 ++-- .../org/telegram/ui/PasscodeActivity.java | 560 ++- .../telegram/ui/PhotoAlbumPickerActivity.java | 230 +- .../org/telegram/ui/PhotoCropActivity.java | 63 +- .../org/telegram/ui/PhotoPickerActivity.java | 480 ++- .../ui/PopupNotificationActivity.java | 8 +- .../telegram/ui/PrivacySettingsActivity.java | 284 +- .../java/org/telegram/ui/ProfileActivity.java | 807 +++-- .../ui/ProfileNotificationsActivity.java | 422 ++- .../org/telegram/ui/SessionsActivity.java | 475 +++ .../org/telegram/ui/SettingsActivity.java | 842 +++-- .../ui/TwoStepVerificationActivity.java | 1085 ++++++ .../org/telegram/ui/VideoEditorActivity.java | 332 +- .../org/telegram/ui/WallpapersActivity.java | 206 +- .../src/main/res/drawable-hdpi/devices.png | Bin 0 -> 1465 bytes .../res/drawable-hdpi/greydivider_top.9.png | Bin 0 -> 990 bytes .../src/main/res/drawable-hdpi/igvideo.png | Bin 0 -> 1955 bytes .../src/main/res/drawable-hdpi/link.png | Bin 0 -> 1416 bytes .../src/main/res/drawable-mdpi/devices.png | Bin 0 -> 1556 bytes .../res/drawable-mdpi/greydivider_top.9.png | Bin 0 -> 978 bytes .../src/main/res/drawable-mdpi/igvideo.png | Bin 0 -> 1553 bytes .../src/main/res/drawable-mdpi/link.png | Bin 0 -> 1250 bytes .../src/main/res/drawable-xhdpi/devices.png | Bin 0 -> 1923 bytes .../res/drawable-xhdpi/greydivider_top.9.png | Bin 0 -> 1006 bytes .../src/main/res/drawable-xhdpi/igvideo.png | Bin 0 -> 2441 bytes .../src/main/res/drawable-xhdpi/link.png | Bin 0 -> 1571 bytes .../src/main/res/drawable-xxhdpi/devices.png | Bin 0 -> 2459 bytes .../res/drawable-xxhdpi/greydivider_top.9.png | Bin 0 -> 1016 bytes .../src/main/res/drawable-xxhdpi/igvideo.png | Bin 0 -> 4398 bytes .../src/main/res/drawable-xxhdpi/link.png | Bin 0 -> 1793 bytes .../src/main/res/values-ar/strings.xml | 96 +- .../src/main/res/values-de/strings.xml | 100 +- .../src/main/res/values-es/strings.xml | 94 +- .../src/main/res/values-it/strings.xml | 110 +- .../src/main/res/values-ko/strings.xml | 96 +- .../src/main/res/values-nl/strings.xml | 96 +- .../src/main/res/values-pt-rBR/strings.xml | 96 +- .../src/main/res/values-pt-rPT/strings.xml | 96 +- TMessagesProj/src/main/res/values/strings.xml | 92 +- 123 files changed, 12466 insertions(+), 9380 deletions(-) rename TMessagesProj/libs/armeabi-v7a/{libtmessages.6.so => libtmessages.7.so} (85%) rename TMessagesProj/libs/armeabi/{libtmessages.6.so => libtmessages.7.so} (78%) rename TMessagesProj/libs/x86/{libtmessages.6.so => libtmessages.7.so} (73%) delete mode 100644 TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java delete mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Cells/TextFieldCell.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/StaticLayoutEx.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/devices.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/greydivider_top.9.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/igvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/link.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/devices.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/greydivider_top.9.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/igvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/link.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/devices.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/greydivider_top.9.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/igvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/link.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/devices.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/greydivider_top.9.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/igvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/link.png diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 09f4e23bb..7aa13b57d 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -82,7 +82,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 22 - versionCode 479 - versionName "2.6.1" + versionCode 492 + versionName "2.7.0" } } diff --git a/TMessagesProj/jni/Android.mk b/TMessagesProj/jni/Android.mk index ae2c63233..f9b84ba96 100755 --- a/TMessagesProj/jni/Android.mk +++ b/TMessagesProj/jni/Android.mk @@ -104,7 +104,7 @@ include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_STATIC_LIBRARIES := webp sqlite -LOCAL_MODULE := tmessages.6 +LOCAL_MODULE := tmessages.7 LOCAL_CFLAGS := -w -std=gnu99 -O2 -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math diff --git a/TMessagesProj/jni/image.c b/TMessagesProj/jni/image.c index 06c5e9f3b..85a859007 100644 --- a/TMessagesProj/jni/image.c +++ b/TMessagesProj/jni/image.c @@ -419,6 +419,11 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_calcCDT(JNIEnv *env, jclass free(cdfsMin); } +JNIEXPORT int Java_org_telegram_messenger_Utilities_pinBitmap(JNIEnv *env, jclass class, jobject bitmap) { + unsigned char *pixels; + return AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 ? 1 : 0; +} + JNIEXPORT void Java_org_telegram_messenger_Utilities_loadBitmap(JNIEnv *env, jclass class, jstring path, jobject bitmap, int scale, int width, int height, int stride) { AndroidBitmapInfo info; diff --git a/TMessagesProj/libs/armeabi-v7a/libtmessages.6.so b/TMessagesProj/libs/armeabi-v7a/libtmessages.7.so similarity index 85% rename from TMessagesProj/libs/armeabi-v7a/libtmessages.6.so rename to TMessagesProj/libs/armeabi-v7a/libtmessages.7.so index 41f66ec834d2e771514e4336c78deead9682478c..c086f4a989c2f83452bf05ec2db3525961882e72 100755 GIT binary patch delta 91060 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%0AOy@3tK{I?tMP~kQ}YYU%d5e$%Jn7UMuaO7 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 delta 91038 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 z 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 diff --git a/TMessagesProj/libs/armeabi/libtmessages.6.so b/TMessagesProj/libs/armeabi/libtmessages.7.so similarity index 78% rename from TMessagesProj/libs/armeabi/libtmessages.6.so rename to TMessagesProj/libs/armeabi/libtmessages.7.so index aa46c0891ad4ab4536372dc58f9bc7edaa6a042f..42ad265ae06b64d963bb557ac47dbf4bcf9221f9 100755 GIT binary patch delta 105578 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 diff --git a/TMessagesProj/libs/x86/libtmessages.6.so b/TMessagesProj/libs/x86/libtmessages.7.so similarity index 73% rename from TMessagesProj/libs/x86/libtmessages.6.so rename to TMessagesProj/libs/x86/libtmessages.7.so index e455cf5adf2e60b02842e4cf070aaced635bb4bd..aaa768eaccfc250e89639f43ed53c62516e457fe 100755 GIT binary patch delta 162518 zcmZ6U2b>ed+kj{H`sI$~IC{GPM{fZX6+r?5N)IAcN20r*^#mnKqK22;;2|NOqkgIA*(FA?4 z{|imruk7D|y&uLaB(eq`ojk{HOR;SRB(t(oIqO{jhC_F0z#VC|m;9R(uvN7?dK0D843n zb&^=B*khq;10U()p2|^&Rbkh#6mgd_XaIXd$>IoYA~SfKv>&01lS!WbumP&4i&~if}3Wt+1bZAlDK5 z4`BNpx|pE&1Y82Yt=LA7a&^+paosYNvExU;_=-3fh(SSTI=JFFlDotk>Pgsrr!IOc zhi}0C1pW#ZU3GDggk=HFz`-8zdaRg6271LacoS_W0tmb+!Fw=p_R+-|mB38NeRc6M zd6Ev-Ngfo>z%IBXf%n59xSopt8!V_HnJ*b%qpIvMJwL)Vk`cH|i_-Euf)06)5)YA5 zxWD2DVE;&6tW)fTouhOyQf2#b*yq;8PQ`m**BD*g!AOzG9)e58>7u7S%0Iyc!&5{Z zWf7TW3JK_sZ-D*i z!<;N+2A+qPW>t&yL7Ct_Sgc7Bja60r2>YJXg;TZQ->|K9lCY?%xd7X5Vlq+s?9BUd zutOKiR0-=cWJ+GF8-lS@}+*72;zj?72mZ9}{oWoFvFagjc|#AW2M9`c1HJT9W9b;_rg(Gn2%_j4B!beW~x8 zBtB94@3ZAJ_gRv7ML9TwLFj=bQC%7674ZLgk~nUSI;aMRMkR?eG_rKq0(O(Zpo-rO zcD$P;Iw~Fw+kezWT{Z2^fnCRRah~2Kr9~X-WYl#^7e%T7xv>8a-CXn3g~RY&D!n!y1kOL1=v9^WgzYrD z9Mv+x`{9tKnrN(eA?(_cB!;R49+Ui7lDMGa?}XiFSYoOPY&R@&lf>$rXa+xoLwk}$ z3l)F-cT!N2Bwkd4b8u7UDeNN|sK{E^3CkLi8EOKD64(iQt#SQe*iH?_>>q&LdTG-N zEj_m;$A`~Xh-V}WpOf(XgyC`temE?H!Pcf#I*@rlYM^}CYxQr|;KR{&vG9A0&w}Dno}n2>kPt#3E(^ncxxFOJCP9kS+T+ zY-2v&rAnmd;-FG|rmY3P0LNzLc5ooKnplawjNcP>qi?QwB5D@CNM z5-fvD9!V0ZDu>U)1@z4aRD`djJqg67(7)lWaBS*Nsl*gag0WLWUD#bYK33Yp-YV51 z(-#@^hye(E2?kSPCkC;>wG2*&YpD`E35OEw%V0lk9-9w;giBb&J2_R#8ode!{Ym0> z)g-kz8F;rQiPt0SNfT`mIC02y9I3K?unh+bREZ}`{qsrUeZ?L)LezUZHElK!P zjlBum-%Ju*Yeh2fBP_UTcvk5z!Tt}E#Piahha6U{LKS_KB)(7)8p4k0$>Mftfc_5H z`Ein%q)saLz#^O^@>QprBJHmxiBa{U_C=EaWmKq9@(dj2s^SY3|1H>CH(5-9>3=M^ z5V(I%67ot!@=tJ}L$X*(+e$toBm9~qx~dFagM)Bms!Zx_RpF+|qK(qGhHZ{y(L$YK zx=L=AEdEsm90!M{C5z4)<6k;hfxyQ}_7zn{Pr`08;8qTI!eTZhpw~(JGT6m6@JXc) zz|O(Rq7xaD`tM*b2@FyCv#_mYvbduBGj|K;t;u4Pyc(4enjr{Kyt>#LpE=VAqypkFcr)OAz=d(G2Cl2fLq27V}h%ye1tyoh&|5`nTY~i^-xH zXBXLo2Vv))Wbv8u_cd&LFWDT%Kf@)kT!Tvc(=z^ho@5{@NU4FKOZ@Cq85WPEh;lVE zHiX?zq=u7W3?>^Z6W3o7;YG}5!-^}i}S;NxSn$G0UUz! z6n_JYGjaXzumkR_^jBeT0_SiN2`1R*)vAx>*|>w27&zcQ%0XwCm3!4ZPk?5>T}da) zbJ4kY!_0%7|Hk!er2fAY(N5VvCG`pXD(r=0#rhET!!k3n-oAxHaBMz3Rf~GEUq}(3 zD}(bGgcCTKn@@p@DWaj$SA@d}To<-qV!BcK7H|pNRB?M5AI?{Nmy8d`GB~g{^OXHE zH&InXjlsZug&Zm_fPGg}#3O>ee3BmlD@j3iha4kU0>I0So@{tno! zrJ6PBaUm#45V)lSxV?%n0~UI!kUdgnUfG zZ%Gwv^@u-@_!&V-cB*+!`v(rgvSMU{$qWixg*exM9qgr-E0@4wSYE%%46KJmPO5lU@zZbs?xff+^%YA$uF=vH z$W0XsmG~FL&PupZv)Vtft9q&!tn|8_WZ`X!b76OlRP$=Bh1A1$D}5JO)Qs~G*aa_A z`bl=tML6xLqAXgoVxEjpKUK&;mSZIcc6gTJ$6z1)nBo^;XX#rt^E{3Qsp6QD9ztqw zm?|Dtd<^!(T@?QV2X9U_?-c2EQ8Y>ww<>)_*a<(XxE>sW=PAAwb~mP2S~Qpa>oO0B{wCP5 zJk`9})>+!atyKIT9s~gdu{mKN98BQ*;Sk(eMVJmdR-}sAiWkCu*rr8GSOf=F#_iX` zwxU$gLfJn9JK<@HJ=>)N1YBW6dd?m=2+vWxA9k&ZH_;Jk4`-_ckHdlDRPiCpQ`z&v zaLLwG!Ff8uSEN161!jcP>yx2vsgdh#><5WF1P%lRDnc9B2RBfBHyngxCnA@0@ItC+ zr1T?UCmhpHgT19M))~d^s*JomEmYbhFR!)p^;A(=k7nUJEF1?@%_YF^GRA?_$h{a@ zgv+qIbY5PbZhy0Ma~`*{-b@w0s`9qY$9PYwd2QJZE_plETyqYB?SWJ=K-o``_Ip#! zJMs%*=liK5b{bm;`{CzQakjzk4^lb~ zci6W-RUA+b&cg*C#yN?Kb$*m8`YF8?E`eWHTnBbh8$^pVSd#{&Z`dn(3aGI8sscM> z68n<7k9$U>_Wt)_;fXKctFF%087vMJPdE1Ga}!1{R-4IJ78T1QlO^gA39{W|Tc5y)g#gRTEAU zly`+{!mc`LVoXxBgl%DOewt{k+Po+1rb%K`ts4$ENfT3424+cpw=}_>vq&FU1qYjR z-L3S`!2Vfj>SV}0mNyW%mZgb-Du)MPF)vNH6o+6RH6U-5$Z6y+*pZNd6t3FBJ=4q! zg&MHEH&+4)jkm7b{C)FVE9HQcbcE zcHPSZ8&$%W;4m4?QW*|N`{Fb)P1zrj`qkX4QTFFyM@gFSqmSHU$zrV?=7z}kD#v!% zaWzdWR(uN_T2BcT_k(SZ#CaU-gfFQK%$2+$O{`M(MQ{-AsQ3xkwlTuddn~&VxDY(8 z3=YBKF&@6E5*&k_?b5}5RYR9x$EGx~L)lkuMh4+m6gPo=n|XGlGSpq_siD}4yB92u zq_OB_9LYAlA3>l^y11w!cwjHj3J)t@2ivKU43)r3(*E%@!3!6W_#eXJN$yrD{daH> zj;$yDfL%|enUArrNqf1Kc5GPF<9s?zj00p&YBk3*SIsXdZU&b$PZz^gN?l<8m~?Y3 zJ_xpPH|-8(KLZww=bIHj4BOvL6ThgEY?AT4>EeZyXnHR;XD;z=PB$M5mSNy{EL}`c z5%$A@(sUso-OCJq3Aeok=s#oP%V9vuWmPvjFzOYgGx0rF}vTY==wWu}XhX z+Mi1^8~?b}!*iA1;%SM4v~*!pC9V(KsN&7apc@=)nQmSl4VK)B8c_NfaNy>2b51UV zLvN?c+n|vWZ-T?$q({b^tihLI+k|v+D(3$qDd>|f{!&%)6YO-Sn>oy3uCtF$H%rt3 zcFrWj%6s{wSjm*X6S{R#RI>_v~ONM`?nLkaq;uoFG4 z8`0Ywqy@(=?Ha=cFlCMC+c`w3(WGt{FMTlfHpD<|Y(J*Ud#Vu|H|*xg`E(U$HXMZO zD*Ymux2Y~QspE09%oOjacG)h)znZ5Gu^+abNEg2E;Vb>8;^2>0*WQm(!XiwGYn}+&+%vyCw!93?5Y6P)1m95l2;ocCfux zmiaPDPq?67oF~G*nili6pBHwYPZ!ITzhc<&h(%0M1>VwHp62ti#1ATgmoaeFkMpOn z9fz^izzH~fDP8cUNhHHzIOwy8{}ju!dM}C~!!1h`e;Z^#c9t7U&=^|G- z7zI1uwutd6hf`tEJj=|$LO9UCVqPGZz`mpmvj(@o?sXRNi)!f|us1nN^iT=D3kMU} z^Mj0#;P9+8NXsxUyspB|Z!*OgHTz_6|Id*g*H?l|5;zYICva2Pl@YhU8TP}LXn{SV zGlD=ni+EV&_#W7vl4V{CPk=)WE#_@Oue8rL9f(!1>sE^xr{Zst`h@s9VP~Uw{14z@ zPAopllc0=nn?>+mS)@&m!S2*7u~k*sf3PpXf$b(TR5|7#P2|D8+b!mE#(#>$m%NF5~FC@wc+YtmVSg8i$ z$E0|h&VijhE#|8_OW+_cjKuC^mBIzKEOQO~0_?KH^&d#iiR+KSUWY|YicKt+5%`)| z%wcC^F7@#C9na3kH@Aw^@-Go4=(6s5s#@(`I2<-p+)fWWJLcq>~5K5-r)NL4rXPU*FitR zz6AY$a7l$M^YT1b-ur4{@tC*fnjrAEiFcxoa7p)ghVF*Fy=n8*Xa)wrPWcXxYV-Ty zf?iqXmEwbNz#gBv*TDXJ;_)Ao@y~lK=IgjG$Os7z-j)UolUNfShC@R#L=9DiKf+=} zd}b?$-7pVdBQDP%tU(;4mEO zW)Uq^27Z%_gQY6NS7Bd5{Ayfrd8ftWH-c?UkuElXUj5zRn5*uNmdbl4g8EzB^VP4|XN z7G;RjDuaVz?_&AlU^KqlgFtwgdR2+1z>dNUu~BuR2jL(u7RK}sOZ(!uel_e{n;}wF zd;|7Bl3~8W_YCYP%`jhh-UXLzjI-xW1mV}>OQHjCpkaK)aujwqiSs4c#|kD^f{Go8 zzbWppHtc>Q?ym*xYZPBmb%vcyP4Ctf3a;ezdP z2SM1q341lHj!V86kADTWC&aJDrK^8eJbnY%{iH=qCw}Doe~T0(WS|dhrv_qeJOK{- zGen=vXs>+;_O{P9uP|4@fqOH}r$+|t>>uZCuow{MGT44HLq3g&p8o>~y#3+^LFwS_ z3~^h9Xo5e<2=`=~6USdte?C)8Q1ie=*f%h)&*(&fTyd@rhsZ!|;%NeV4`zrjb19;n zdT&ACOwKeXo-WehG^bzHBz@qL@(gi8@erveLo*dmgdKlmh$<>Wv!uRZrWmPCR!d-a zZk$)c1^;CTjaLvN88D>5KL`{*1KaKK2(Q4--!sH-D#3SP@8$SR`4JqfWD&gG74df% zc2~2Q&$)huMRwfZ-*BLMrtrjacm;top$)T~RB3v=MykRAsx(&OMsS!KnxxhXZQ#)L zc!oN{BB4q9z}{0C;(v%`jSqos`#ArfR#i3*LFglkd7pGT>}Zw6yT8#03t?Z2Ec21q zYS@Opiqby@hgfjPJ6ke==U@SkQ2ZY3WPLG7@t1IT6R$WYt13H+!1ZT_`CE{a(g0qk zBAkUCZL-XpYHn&il59*!hx?WB3Z>h2YZ4+i^x#|y$cS> z5End=Dy#_m;kk2L9amvU!)}O7TVId$0pus2qL|msE}~D$m2BY5a6Nt!XlO_ez+Uy`|ijx@3EI)V1r}R!Bf&9 zCGMpX*bO_lf{T^-bJ*q16b@BmM`8N`i}`z+Q?U2`Ofg6$coq(g%@lnVU-lqyjAx2g z38Z!>!355M9TPGIZ<9twYi+6jpGEwj95jKw+&YrW8#y7~1_xl-gCyS#iz%66baIpj zzyWaxX?yVoL?MEjIS{4OIf<#TqA7+ix(=4G01e^~Cq!8aE3HfRmlPlk@E8fXEB zu#Y`txCIU@%oH_Lf?cJ4ar~ls5bWrfrQWh(X*dOeo!_IxuA-O92%Iuv4pzgyhb`iO z8U>r+5*)}IG_s0cl$;R%f3PTw$Nv~ESjt&j#XkxMWAWwE@QjRbQ#=Eicax#zndS}6 z%CLV`ob9l4U7VZ2!O~1oL6!JcxMaIUELI8jghMPHV>gQ3uut8|i7XB0OM{JZ2PXA!+(Pp+0BaNL$9)++~3z`g_rZ%GH+GQ}lT#rvd#nIxbxa2O5}f1`?jT-xu* z6uPoM4SQe86z{7h`44u^wul$Zao>{&?X$#J%0YG5^$NpCjoT)0m4R^ z1O?9cW&Kb&=kCuGt<$3p$4CxYL`9XrV%XI=OZ-pq6R`8sOtDzi*f!X^kY$2O@C`Uf zh6bw)9e@L0FwWn<{CQ1sw=7{-30CY)74rKqp}4i=yW;wO zu#veg?Y|^rzth=8-8X z!IVB!SOV99U1T7pZwGt)KV+JVVJ8By$|Am13G{*;owCfO-B9V^Xxx4>94fYm?#g~4 z?8iRVN7lpP1p6mo$C}73;Yc6Z-iPrYCc-?G<2@LZ{Kzm-O>z+SUbTpqR02Q3{@z*U zM05_e!JAZkOJC-NWATZs4(zyY5nEOKcCepLTu1ReeHniRCo;{S|G6;;@jH<}l))?+ zf$NXhC@F$n@F40b|l9a%hTbK1okYJ z4iM~75!S%|Ozzex-UQoh7W1j;v#=MQt}@_^o)=>B@cw>_2W1brin|yME^eshU>~!L~cq{YiQL{~3XkMP_rA<3Hi>!7Q;| z@inRcBujj)9A@-K@p7E2!+|65CpFDs*Pbl%HH@xs=({X&T=^R*_5aHfucoS7Lo=j< zvaHyf$YO)vGtbJ{+`G4qk@sFJ*}z6(58P-e8od8aWC($x!T)@FMKpktGf) zdmF>SMkjAV`jJl22tjBYIZ_U8hrJ1-U?A*!krFHYbl8cWCqj|c!oB^VosKL zLg}BC@!_2+{_C*oAql#`G0KM;1UpvFB)Fa<%VC`)uxIbH}mR%My1;1bvi z$9^Nc4K69pGGAWU3;R~n<|_UX$!oGilFGnY*uOSQ{I2+#)R%DnkNp5O`(ASN2LHOe=A*X2BCkDd7@3YJ|*2YLZY*+dM*#24kMoA&;hGPqi z$Ke1xUD>}1J3f!we-0OT5X2&!MG%Bz5h@O%69%bL<)8sv0>7sCcG&ermU-dgf&*}D zoKJ!MhqKJz)-H#AU&gL{(!>_nBfiQKtChny5R|~Nas35c@OAvw&#!P8{#n^ygoEG2 z=LHKTvHi-;FD4dQgY{t7sVwo0nnyaoj=!=*#f+%F|6qPf<@%3hcUn|134?I;Y_W#f zRyueH_O{6u-BqW07!KYP=e4l?mTa+KW#~~EAC67sJ~&i*v3Dzvw|lmE5AT5VvLIVj zP+q@<{nN6|TWZH)Ux#e-CgT~{@j$l7SEe!w-|&mh@G0P!{~2gDw-LpFZs@FQK~XD5)O@u>u17_C*v7f zA@$fdRrVjiwyxRc&6VrJ?k7hGVmB*Vao;9*cV%Hw5jw)&Uh#$+2#2ums`P7Ne|i=1 zx*Eb;U`MyO{%aY(v`N3bx&>aF`R-q1Ze=*yx_hnwW?%Qln$1@^%mRdQ8EQ$KJ`#l2uLymZe!BRvJfv(4q<3y2*fvdx!VUxUN2 zp+!saE?hDyTU1qUuE2iSqqyxD;=8j&L&cL}H#}DH({K=uW#hXs%yD4^Pb-5841yPa zj=xP`2i}>$&0&86w}W3#;Lh-y3EUlir}W~0RvtHV)GaEN=aBkfPAQSb`4$$_v&~yF z70It1zM_iVL-LGl^G%S4;Q${ViQW2r3l7iDHqX|-!_GO`=9;zcIIeLD5ag-^hmE5i z;l~s|0y`eeHcw7p!1jl-MIEKLjK?9|O!3`tLFvVN^Rz%|^?|K;C$q=Em-)HM#etnX zVq>;o^%f~u=ZSRdXW|8)0S93D%`ABec?OPc6*+hjwr|T8%k-%JN7(UJw)rCNDcHL^ zTQtU2#=imw5~@3Q5?x_mf}qtT+Uv!5K{~-f_?)WQha~S{n59M?u7tx4D~P{T0;Mv( zyMo!Fo`*wlri%Y6?07ZXd?vSFzD^W67N1ss#=zO2g8AcxGtyzz3g+E7eKPjw5l2dt zA-Pcn!4EDXTvhVT70i$H)rAXwjSsB0aF|cJ#JbY$9%(SGg1BAfus2+Cf84=f8R5rl z@w;k*X>jO5w)x{%FC6$MTO3juS`XXWRS=hzzb&x;fePlM?;Ws?hj? z+!ikJTg{8;UU2w`RXh_r6^=w89*Q~Oh6o&@gqu_emcXuWt>#w-OJOe#sgOtko`jv# zHRwBN^%lyJ%yZ;=5os+)D8fIM9%fS2af{U#BH$ixK&hF^Tci$|EyKiRDI$D*wLzjcq%2D!O!8HZ+qfx z`ZEH--2J6WupACE542bO4_rV7zfu!RdI1UAtm2fK`)k9FYF1&W1Y5%a+BjduzZ>@R z`L5U+a43AplhBDKNe6u0>X3@C2$o-m&{c_7!OnwL^Y^PyNF z!H=ziPrF2#I%EY zR4^Yc^@RhRykhHtu~I+2f~cZu$OGH0R#92S-#UZw7fh&umoYeyzyWyaqp>EcC_aPT zb1RrX`TZT<$;?RsBQxhY_=N<%3csGf=`(491kRl)$KNXz%wg03gTOBp#QUlSZi3yv zRWK)#K~kT}q8dzo;tz2eyZ) zLdLb6`K(;#+Rw(Tv@TroxYfKja4Q^QDsHRd_lKSDS;cdz*N=k30c-SIK=PjTG#TL? ztC*?`7Q(J~t>(LP#c&Wk>PR2i4Ex`=n)e=FhQlyfis<*kA%<-a#Ydz)^F&qU|2*ta zC$q@;KkGp()mD)(?*?vt19!WDhuy#vZs0{X@FQ`S_pF6@E-r|0*$w<5?EA@T{!Hmd z`26~+B3G5@Be z*05i*nO9W3-~!!d-k}%?`x1C29E4*hv!$>|irYU1JK)&3e;KwV+eA|A{Qn_>K#I-0 zRQd|`rNwW&9EV-$HuLe~zi=4-Rh8H_mtP2%R27R3va395C*bmoJoIIZz$G51&HNt1a0Je-w#bEr?8S57f*v+esLtohVbRAH86i@?3HHsZ9%)lK zF}(=e6ZCsvCmdUneFeJ`_$2IcBZ&2Z3kU*mtW7H}Ajb*%dT=O#Z-oo`+RPPAA88NE zrj{8T54-x=gjMle*bTcBFJHj<-=84Zh=Fj$4Yo@M3H&bXOW?2IZ~~uzo&9a*ot1y! z68IjKU>4`)Z~`}4$oO;JV>5q6eFp|^m{Ald!9chG?yh*2A5qO|hF`f}2UY%&RbkpcqA={K)p zNPfU(uB*Gij#cqS9=M1`bG~geZ$(d+5#FaN!NS@doyLZV;47zAH!Eq88c*VSk?-u?Ddm2O-$mH^;nI zx&Vj!<(N++_)!DBF2}smXe4{(fE-R;(fA!Y=fI1JZT2J>Lsz<7d> z!rrkt=2Z3~?1!0HA{l%W4#52te*@dc<%o@{KqsVrQjVA(y>{}53kbx_9P{;>G%p4P zIp*WGs<3l9aJFqWO`d*S}^bxpZagKShwG$35&oNg7d*Rq7+xQbN@r&d7V{ibTgibcu71+TShkGcl_Am!) zbD|3XxoB%H1?!XmcEa}caUKM_68Hhwo50IqKipL%@Hi|U$uXayyb6c5aEn>psyXD8UUC&#=p z=?fRYcgAkoj6o2H3L;gu0Cv3-uYvWjH-Wdqet0>F$tr#qj%_jn`)}Y+q8+J+!EO57?$v6ulIWh245Z^YV8g z9E6`y{x-_^NfpI!vh&LX{RkYX6~$D=hhQJvQ}GEn46j!#e+OtAQPF&glM9Dfvc#IK z32c9~qByMV+rwf*d`Z(^#)r+%kWNJ4cI1jbRfHw5t97n4y2Q1p>ik0df z$op_f*Ie@h`d`D&hLyyAb-{j0va3?$OE|K?S7CSe${zEUMD8+5z*EQAqAVW{_N{FG zX!Q;_z$b#cs0<8*?V~E2kLf2$dv|4XoX>}CJlSif?AJ(rS{3ti15d+_LQfU(AB!59 zqt_6)Z;3xT{6HGqUe)XaU&93n{5xDyP*r@c+Wa~kc&MtVl@#??o8B3kUsYUJ`c|;d zQ&oJO9MyM)y`H5wP&vF0fooY+^Fyq2;UIiU>5E`z!kt4O99Uk}90jkzwzXBwsrv)i z0mu5lVX5asbmT8m;8So%jw72KHem#@P4a&?@Rb`_FI`rU=c%|N7Du|}CmJ_!?Hf4% z25xo(x4waIxq&XXeT&Rp+*1CMy^>w*U-W)w_%pv$D$(?%DR zjy{-MI{mw9ul4(`N?zkzTF#nI#57vzS}IcsyWDc%#O?0VH5cj+d>3uGE(G82jl4oD z&vJ5GjeIV9SN37-EzySv)1qqe7hIWkI7r{v%kf2YvE^BIY0AY$o^O%Lt&E*-^F_84 zLiw)LAm}BfuSbe}>oKzNrDu_gd=j2-LiRMr6WRYj{s-Y+!VR+Z*=E3UlP?N=$T6R@ z71Jn*91Uyv)U9}m13q^qa!7DO>01|THnEUg zzeOrH1F78hqN$H;BpEo&@zK&gm#Q{cfy9mE7xvot>gGe;4gsu9qFG~a@)bN+&&^KkX||7gzXac_u=soE#Fgtrx2$R z`zn0wA>^-^h<~t=AGo=M{w2QEEK(7Cjo=%0x$)V|$To>cf(Qa`85N1k*ziYFM4Gbw zAG+h%>|*CD#NrM1*mjEe^4mfeDMVQMVUr&(if!L;ye6e|`{jBmdN_$+XU-w?5 z$FMlTF1NeT)FYISLAqd_R=Va&UUfb+8+oTzeyG69-jP%q5cVtGf2EN&zV!5!szd+4 z!#~7u5C(~Tj{RnAhQMPfrrh|#xR?RUZ~VyZXO7=s=VNkWD0>y`&l7%z9iM9xRR|ZC zj=0)(bO6mWNRHrDUMb0Mx5({bQap@2BZ}fKcq)7^`*-Z`!8_Q8V}Cjp2f5tx2utwC zH(GgQf97g##@if?WB<1_`&#{+-#EICU1P#h_EDvsuQl^*Bqy;=zFpT6%_Hpcj}!Sx z;VOG2mD1zb-h=!!`)yK>eKBDtym+KcPV}F2nKN9Ye ze-Y_66nlU%?00hf6_KCd_%Zgya3!37PlSzB@`uRe=O+p|{)*!gbaOba%JD162N248 z`}eU2*^i;$jK3z>?BsX=ds}>l(e1^ydulHsMq@AqgE0vIhrtyL>?m&`JV3aFeIPd5 z3Aud|3C z;jM66y!RknN`B;al8{e!vu5N+fXIhpn~Tj0luB-Ekjd?Q^lQ&tJ)@Y6@VHX^O4t_% zzp%@VuU(5GcKPiv`B#AW5MpF4Q4UWc?gn&n`6suBRUD7!Y9aPJ!E~^ui$AnvLQs-MtTphpXRs;y8i5PJBfh!>6heZqK5U z+a08G&={ShwW|Fx9*PkcV!D9vD-~rq$8Q?DlC+vlwqeppB{UZG4;(vCx92#Wa3$ft z$Z8m8lC<0=YdO5Yeg<(i34Ka9hrKCdQ?}bn{QCR&;B;-H?HC-;}D1P zilo?RkOEq;et~_2(FbgBGlz2fiAaxfT*SUW$;Kf6o#WZY`V_5xizE))kd4;~`x{pb3C7L6Z|au=j=uBh2*=Uj>9BAo&>w0xEUvdi109BbBxv_ zvl6Z%?9Dy|`DntrgsJRrV!PRxl%_S(G-G|5R<-U?B!9~tj|P_Av04QGiI?};A2bf8 zX?a5n5PgX{L^z93e&^;}OyyP&SuadqLN0%8;XpSD*&uit;X*>W{Y|)(-KOHz;n-tz zPS^5Uw&w5yOb@bG;rIgX#_{&=ZvTAT5gVfGhh_BLWK@ zw<#)=$Ilu4>ua4dS}2qIjZO8nwk^KLhx~h+ZuXU^rYZHi#5{m(F!~Jk%k0k?7wcB)hq2Zz8|C6wOftLW3&S8 zj4}0o$Y-p%pLTr7xPHIZO?$!UHdY&biH7;K->YATioLZEeUtapFP3)mr z#UHhc?#)kMQ+V5^MD=Xr;#jSo_KQ(#oaWXFj78(L>h&LQTvMzWn;$Bki~W$eJ@KW> zvST)3TsvE_g`Qeul#kO|>$w$-n&Y)4mHMsB5r5>6PI6JWC@a746*oDF4B@X9DxcV4lzxb;vIY8=>MVm1~x-T*hOMvHA9q zqegr%u;}Z-g9en#d+-l`u*`UAg4Ws60)6qE#%l_@wlFSD(Aw&GPZ_NyGCr>v{U&Oy zvh$9RP7$)lSx_~y=|fK$0V(dcHO8m zS!-+W#l86AuKBm_=}zv7X6L7WL}kjhqwGZ&%6A$wCR1ZY#-o$9e%e9f_+)Kuh3yYV z;xsNg+xmR@X~R2(1{`I)J4GvEy109)*0GY|#iDn9t>Sz0I}}|g;;6i4SOK0?T~Eot0a~ z_;s4rO3(Bdl^)QRq^I)afryoiSJr5ivz+vUESc?a`AFlv2egLzEsKql4``jV^G2iT zS{?0Mqx*ENP0q86a>TOJvn|B575!e`V6;&*U2|w(8hfT|^R!dOO$GG11IEAtZI@nS zp^-d8yGgH9X0)F{4bV?#Xbm;md4{%A``Z{flX~83te!~}I`~ZOcI|cJ)J*L@*-d9r z&2x;ov$Q7G9j{vj#k5lyH|3W(k}W8F$at>SsTE zf3EoBmk()%3+1?&tsT)08U5#IO)Edm)0;@OhL;_Vlp(*o!bqcJ4rA(d@;jLLOwM^i5t^Le|b=QSleUV{}5gEH^X>Hdr~`Tw41B7t7zL8 zv2CtwyO+ObES{@%%6V@C-Ie&biTIdqd^VSYpE0h?)mm#FqvbrUN%j3ac%nJesQ>vq zp)rm77zOiaghInVPs?v|sLhq@a?F%ZUt<$*$}#arouXiQ>jSx>xV!BmXQfEz3zvtC ztMjzlS~a8Qd}?}wabUhSh~A#JK&z$Keah&#fXZED6fDr%YsZWo3$(lRrZbFl3$!M( zXD`%N>G^Ao?F-R9W}H~4ZDX{rS)|qH-1*8P9PKyK7i-NL>e(n7{Or{Ow+XSvu{QOgcu3Wz^yGGH~@&(3{W!iuW zE#%Cs`rPeHjbE2(4RX8kWR7XC^(-+1N6GSrt0@0*;|i^kcEqT>LTjSmvBGe!&}!&y4jaQ)X!#vG z@F!3sg$kFqjvn@=FTN2yyeaNv_6{o_N9?H0sfcy7Lu;=Y|68Fwsx2_?S;@(T0lJdW zesyCJUFJn2zep>gU3V90y|kl-wu-=I^jW2~%ba(AWCn5;T{3d!Y1NGqd(~uP`zmdq zUVDt871M$LGV+SG>3W6zMoBT$r@n1W zT*E?dsPX6;dQ@NI^EDJRsi*PB8tru^dEZ(ZX{E7$t>(}hjWqsStM$;{F*>hfNPK6^ zUPu3CvX{YSqh5)28xz!U@?YaXS1X-)PEFZP#p1lPM*8f<95*lj+xV$OJE;veK3vav z_JnckBbrZ}ZG86#{&R;JmQv0ex%V5*O10g3hoQ!?Qmttv+fW{|mUVX&U5Yhw%SR3S zquL#mc+{iXTHQL-`1?`n?FqxXLAyy--v;etNgK85No_@r@%TpVZasa7@!Lji7}eU@ zpk)UegADC1Ce|knZL?mf#Be{VRWV$TaZ>x$nEV(;8gA@;42z~l#wM+w{{1;)*e2>m zSd0fZaiZF6Y}!OEP|KUN0a?NOE?+M^7XHU-EBvag*=A-v-8I5^X^YmJF7(3|?Op=M z<7DorG465BI7f_6AJ?wv?h(c(PiPB}-u0w5(;~gJJ{)mk?0b^58q>z%Cs{+ZG9J#7{zjCbGD)@mW6Pe6NDYh+~Y)rRXIA1a%? zSNkwc)5}^P#3qu?~5yJR0-0KaF;uX$|ym-!n#hrnRXVj)-kr&JpfCnX)G9EMucNg)Y8O zw*52hW<6I~lu8Tj>$(iT(sDGJnXk1+a#ZTeW?#Qf zj)xQ;F`oWL>zggbMH}{AyMBF5>5;N4-)IF%B~1&K z4LYYyu+#{TlKyPOur9mvBqeywOyS$>TJuVkqa_%s%G~s`NV&_ZRnqrs+Cbx{%K9^r z+KhCnNPR|Yv$Tr-rhf84qfb@+C)s_f=||JGrezs*^(B$Q)zj-%b&MhH=A2{qhBBJ$ zwU&KhEn7XS%@|`}J-tXjG1=%>UtcTJsIPnUuP2p_%GdwY^^@a`K8^Gy4P+CpsdRxc zZ`aPV5c%(C5{_g*HhFSMG#gtQ>4Pg{F_^YEnMgOj!ao-*K z1igS1@6gL+ukNJ(EpeJt|4jd{x6!e)eogzG;LeiYQB)9$$`*Ezb=Pf zU;Rs68&DQ<>CIB4c#z(Ri-DU6^lxu5vI&i)gYPhIelpdiWzhbl1$+5NZxixPyVO5%>x4xsf6tw#N zL7QwcN5pa{qj2c^*2Z608z1553wA==j+-K;-&>b2;I;ySx5-iAB)wsJEJwyGlk`fS zXyVez$WJ2~*rGD<366?o28g>Mz?ic(-piO^3LL&qju{_4pKz-jGuFoC43*M?$nY8d z*Ldr_-;cMp{Pn@xkRHY8HE+atxIEq}BaXKYJT~4s=;(N(>twxo#i*|#Tcra`-k$3= zmQ2>`->gipVEXfTYvapjt?yq+<=~_=l0Hd^_=c{N394YYI?$_i$s>6up)_5iFXbw^#N0XQW=Ys(L+21$<>~{D-yiS&sf- zC$zmCt=E68D_&u-gJ3K5`tKCI;Xqlh7|90y_r}H@`VaN{U%Y{>gHL02&e{sMwo=&! z5nZXQdu!w0$l@_v(f&rkR6Vb5e#CXou7%O5Z%1RrSFT2~u;aMlpQ`tkeeT*+ypxij|UUtN7LDh82hb}bY2ItRYKAU^)mhe{b-ZkWTI%9 zm%4qEJ6Ph6?2^Q-c+Hz=idPrkd%rPdy8bd34>b$)`W5aa7Hzms7SuJ|=v|<{PN&mm z=nZp+L{(K#^}U;H77riJg`?g&Po30?qv3EyagH>|!E%UnvTBAtRCfOpK<$Iq>C~`dv*cf!4dC$++>voi}iq|B|ie1(Et3MR?ZexKQtr@j?{0?krokkQsWA%)^?( zX#R)nIuNac*A(wQ6y=R?)`-lWTcYxzJ5vwsM zN0vpSilbr9bFyz*8y~Ya4w4k-jN#1xHkDa9nsc7>NsD`Jv69*x7@fiSckHFojkPgL zlc5KQrwTuuPB8@a$S(;?qn&ve-7x3g{IVS${RvIC4=?Nau>OojO`l$(cdZ+s7}18b zE^oyp8os>IiW?RjZ*5ijm~l^`ev7uxSXHRoYp4!&*1F;%!>xF?>;SC;)>egAjD3ar z7QNPRWAswJkh?D@mg)`YGL~g}uj;Y^3Ip0d)~3|l$nsN7SaXrijw8nOWvnBP8>^P- zb+r{`JD2HJO?$|AXSseyraMyK@+4K3yn;sO{z>sly_Q`%vo@AW>Uq326`9yezcLyY>7x^Ut}oIjN}rcjnLhu+XQA@>K0bFSpA@cL zam44e;<(SkuZ#`F`h>{(_*7qpEOVI5)KMdQwQg^Ilx(gkmWv03Z$~mcSc^={G8M_E z9*C@{ZG}gTp{w;q)<}%Vaw8JMSht#$VCAwpYxJu;>oRI>VEII_QNPM{Y7IlbU)x=_ z*wFvZ*7ui}O@B`Bpvx-UrspNemDzTEU9$e|Ph}%sW?3f}qp#|xbs2GYG~#akN1Oib zM`a^E)E%1kT-n->^bwWi+W)A2TZ)!l*6^7AU#d+06e}rhS=md!>myjjm1X^@zo*Lt z{?d5_o>JEGj6S-ewzaGzDXF7XuGlO7A7}3Y7S-|fk9+U#-g{a077-N`1r-$#6@tBD zuPC-yQ8dOFBZ3OCMj?v@*NrIZn8YMTlh_T3%8ez8Ef{0L-W5Aov0@Fs&$+u8^L@YX z^M9Xzo+r+pIcLtaGiT16Id?G4FU=qSSRWc_YQ=jejK@x&mXxlhR!6jpx-+%S$nkns z4O2A_e)Ra2=j)m{GVsDos)_23FwN(wR}Dl@pc z&X~#g>u9=c;d5H*aotS09RIYr-ZI*>&PF^2nRfBi-XSIk)93mxV@y6Aj_U{FO%wQs zmGm|Vrd1r#jWx}aI9;DQ*)&h3e$6qt`Zd?|oxtb3WN{fLU*2nmK0CwI!OZ*3U`Ls$ zGntS}OvBCau%s+C{myrtsYiZeTEg+oXX@v^HKp+U>AQN&_ohOQzj0gdzQUxK`I9&G zAuCNSJh(;rx0$AMCV1{9Z8EildvwbtQ!U%n*^uX-cbifj!)LR?O{M@3%5kLHyUx~q zH=A|~G(g)-E(>_OsWsW;zncznP1uXyO|AK&BYN{4rpgxn^Z`9)kEybWtlvLOKhu=w zm@f0wwF9O&Gq;6JK5W{l8PkeBe_`Hf zAu-J`@5I?lpS#FB&qA~JwRxzBJB(?|&Aa(hX?p7wW)B|QX4fCh+i{_qrdwBfCR7 zlbhxu8y~Y-k9cf;W#Wf!*29X-gE*Y-oX^bx@K|hkZvLUdbtqN!^W$Y{D;VU+r|ltW zF6pehZ1f9r2sc}2FU-Adw!%%u%?ySjY%?peSWfc;HtV^9WrC%&YlrJMGZlLT_9y!V zy`Rl;9_KE-o@#+sfoPVqTsF}(Rj^dyNE9nts+jm|@p_NSmNQO6YGRez%p4vs+&A`#kjcRLfxt z|J0T&<==NI9alCd_ zxBg-Ip5sSe)7R%%woncm`KRSEe|nD|bHJkDSi4(~`^(aT<7TmS2Q8s~+ErshLe&{O zY+o*c9^L?xkzESHV5_z}x@RPG3d3!6r+r3d^y`rk(_A6vLIedKA& zRsm_XOO}3yKDlBE;+E+@Ua_1p)bn-AJTu8+fd%11Pz!f09vl~^|8dXK%h+NHErUtP z6b?wYf|->7k3}p^N6Br3ZiOYZmp$@*WzS z{K!(4LL(MGw$vw&;A5i;<|h_7rz){>Pc04k8%y-=Pc4%T1^>*_k_%?mB1;SY_F~q# z2#tUXp~%vj>%i_7St^2~^xP87^XD?yfS15R0l!2=z`k^0Us+;J{DFCF)Zb_;yc&Ol z;{g5a-xkfpbz-+UVHY=RLm!F#x57A$*@XdTlQOTk$I9C?h1(8uAuo3vuujhEP#oA(N9>tqMYS?l(4t5-_SD zbR&|A!c5zOapg!~-*wst%wg*)3h(hl=CHhqLZr>>Ee1Cbp?*Rz|H&NI*H37~tzhYX zLKj+Ke!@K8oCJfz3H#K*NKu_R3gVXbhtoc8j-Facn1wBe*#d-?{FFI*RDkd;Jc{gY zRbd*xe-s;C4c!AeP^pwQ}~7?w5BlKQygK`x7WEb zRc{a^tl(&%f`wK}`QbqP5I7u~&S_t$2Zsn(OfXeF>j-_dYja)|@1*M$TvbFn?U(d% zb%Zq>u6!zm3Gon5XP8g}w41_&J=`IEVz?l3+|O{933WK`wElC1(3Phq))xj~b@y!` z^fpm*8Vf^7@|y@pj191p$c-pZ!1)@F3UHJ*||RH z>~LElE$BIP^RC-CiH5*e&~G+9;tHA~B1jga|CYh;Bk{E}jkTCRE27nAJ@{sB0uU z+D+(6yHIx_UZg$xec>1WaRa?oUtudp9`SxcxJ0^asPMBuOW-46jR2!7ZH!P);=O#> z&QFDY*pYlD2rC3K_&*cckz|{u36f#4Bnw!He^}WVyD*yT$Ijb@vHVRB)-6@|#B-8| zAq^Lt_I$QCRcJ?xeumK9^DJKVgIpW=!)G8rjjfr1WrUSBLm14T74?BLh0l0y06RMy zD|w0jb(&CU*ai+k_ACG8&9bE&iGe;aVZ33=*l?Hb?c5m4GFJ-yJ%b4egmWWy(^W!! z&w?As0F`rNw%&V{;LY&|uCr0AAw19UVYugMm4yci9D9NUM9duz~jVJs5Kzz2aU>44<=~#qAT|b#0z4r@0(&n*WXvG)p)tmn*>@Zg4Ur?41n}cW^cpehQk|}UVPKN z*6(^$uCT-C(J7&+S-i8cEDW_rtlK%E0)Jp58+A@-LHolw0sDh~_nZ*Uw@nvc7w>xD zqh@X2mJT;p%2kS_4}Y0GHvFt-j!hfWS(QsdPgiC4P#H+5vYSR__tQ@9 zx~D~K@;55GZO=hvw;dp%%De+pZWxu_SF`R@Cetqo^Zo~?D+Z?m7pJ+dX5TiN{XaPs zlyI7J8JZ2c__DBnI<=>yU533cgM=V^MUWD#HMeEW~s37fO35A;VRLw%SP>84= z6Y<9M2WW4CIZaD@NM+E?qiPmd{a-jw|G%)7(xT1(KY0INShHWR2wrXfPfh**V8^7Z zLIhv5mNmaBTqsQ<;Gm2DQ@if_7=jRTP4F8@6+yR1;faAZHLG5rnso>+OPcWTu24e- zy9#^=hHR=?C>=3(qrnKFJ`vr`yY6dgkJPM3lxvLb6Z%EM0=&B#l#JK}VcBp^@SRS4 z2r`HvM>xz7h!PR083tqTz=#eu>?>;4G0LLWA>2dFIz4cCBYz>_URst`6X$j z7W#DWjsN@Ea{|&r1Je!x6Yd@8=v(NrcN9KTBqOEEBcCmfe1)nlT zos^GCN)|xjb-~-u7@bsOfN4-Wyp8~XiXu`S=`7%e5Lnth0%k-vc&k~M7uM&7P^CPv zk0_sV1*)J__yJlR#w0T54I$iv%D8BAZU~ji5N!#instySmlfR*8a8=LhZ>=LNUa)BeW@3%{obA!_M4<{)Zpw zmT<$9mb7~om@QxMD?_U{+%+&5zEh4(D9|)t2%Juow5*{D(hif*J&foJiiebkGHTWn z_o7d`52;hL@=3l?#@!q$4JkuuM`&Qg1gS)epm#Px7%cA5FX#=-8}iK&sYU_xJfcG+ zrs+?b1Q5DY87 z&OFmutJ{Kq83K1*(cI$bLX5vHL^O2K{b}TY2BK`bVqov9HFRR7~9!>J$L0nEEd*EXY=m}Wxb7JSGDk5Y-$(~ zV9KPkt#@$Ffz5qK*arvh?z_Sth<8uB2Ll2}wR=Je|NJ|>*?qF%Cb6xBu;M-RkcR?i zA&0^ zGf=E$CO1it*p#Dr4Mww~SzfT%iKaJ1{M&FLhKkMjQs1zTLdAM?rV16qahyLKD#Ese z-=em7-b!b}Mq>45g)33X%zn7aNYh{e|6ue0UHOrIzyi)*O+ReTj6&lFXp*T!w6`-O zPjA{7vD#dczN4iW2eD$I?Zogh*_(jpoc8QYq|~2Mzvv0=#Cs6cdrf@aQ@NM;0PY>8^b?yXvBz!~&nQl7Z%#_0KE2;h z9OPSg7UR&~>}Zc=qNdWPA2W&*9Zq{P`>UT=TsrThfiAf3mgHRhe19>|Mq@NWjOR#N zMv9jW%X|!tGF%qp4Ut_oUfjta_hmy9#ZlxhNfe85m4TZ~u{i|VI!W|{yw;o~CSw3s zO%jh=$<>`Ien-363^Cjz?=C8)CC1*Lfpr+k(q@QJP$Z{kh@Bx)RcDId^8pXpzL{bb zKI{R@pDEViwL;xzmKb5?Z}BY3A^zl%`J#l$YlnzKhQ58S*wRF2+IiwSj!q2oG0`~P z%|{i`3=1%UnB)awHo}Yw7Ki~n7pz+si7LnW>J=7?Kf^brA7CV?jrEsH#IZQ`Jl5mB z62Gy~X>FO9M0W|x#Mwc?_q+|i3@o<*M|&TrpipNQc0xcIS)`~1cWRT@p;|F9}^QIghN5(-cUHaq_>mk|?3qn7-T(olJ%2^=>bJ4o+ zgV=^c7drna_MlVLkK)fJ{?>IpYPFbdqDZ85;ys#;_2N#69O+q@B>vV3J!*?s*~I4@ z)#J8{({Q80?*1;;^GGO*YOz+9vEUuz)(TohfUV#oURIfYn4PU+(^`2u?OHANW`}sh z8e86#ZI5QBc8bHi!|J%{(}@qQHBffV76*C0lc8_S7A29+e>ui~ zV7L6KtP{A4j`pGU=avZr9CPj4ne~j=fIGoj zoe>AaO}Xrh7zzP8bVh8Cq47Q|)(6!2tjMP4wnS0r>Bo?6-1x!!-NuzsqR=zl@G-ae zXLc~~2xQH?i4eGLCFSz!mE

{1qkn%OXnhlPTX(lAqm<^6Q!lCc7DjwKWI}MiGTQ zxp7Ic&Qz?Akr~i{%{zx>1IN`lu_MBypPm!*;7TsdPG5keB7Jc|Y{^HLW=$@NDKw%N zp|cY7`xnJH9OpOaF_*=|CR(xAL~N@_Z;CA;z(476x5P^jljVBU9T6d5a4kL*tA`Z! zMk8kKb?aU&22eD)H~P~L=-%`X=?8>(8Tp^v zG%;C^#dQAkmn`N9L<|!91ls525^wUnNVr`6-%|iPfTpwqrP*bu?#xsptfbop|#@(iDCe)F_ zpxYYOk%rU0SV!uF2HdP81tQb4u2dfyvsGOwfQ!_J)s=#=HS2TVlTuAwRaUxzR9#)R z9Gqs*Gaa;9=IZSlNaZ~E)7@B1OY|sL&ul4GlxUhdNL>K>bd)mS2G!Sfk)Y2oAzh_< z=y&NTsj_GGIMSPw3*Lop~rQXrXV_x6-1+V=`5m$l!5&qr-$TFV*f&s zXmde4JisH;*)Ib`ZPrf%r_|E8u9|XHjFMFpu=J;KO6XXEVo01EG?xj*))F9o?dMsWl&PiJgs?wqtKwoFFyA zhbu=Cr0U)Y=TW3Xy@Em-->HE~cE1aW=>Wnf{? zkIknaHs}0EwrHZ%n>>XRrC)hl4EuJHRJ)3eVkmw{u#gRqEZyP#V%WziQbvV97ta+zu5_cHyN-Yuz1-(g8;%GE z+NGolZh~#@0`C&uwo9dbXb1UP`hu_5nay1)J>#2o)>FU1!Y1+mR>B1g+|J9Sv2^9P zOu}_I(&bWwnX~JeKS=`(FZOC_hl#Ye|D!#)@z&8k9MAI zQZ1jt5MXDXaO;`Knt*6Oh}Iu$lOFMWbZ7nA4ym7sFZzo$-z~jojSU9{PHy&CHfgui z-J0Ce4d=3ByQQw!qWt$rgDs>^_e;$c+PO|i;U1;xfeec#Pk(kw+Q*Ugc1E)CbPIV7 z+5n;0=cNUP!oNfc3`*j%gnbR^RSCXhnCI7}vDNd8BUNd9$MNjb=f)NK8RT3X6e!_3 z9p`dHggNrr*c(!n3WUIJ6M*C8o)PJ1?4gjhJ4VXZ-HYK4HPi?HD4a4xk0BHpf`mUegAI^8jB8E_x!7DiJcf~&dU)W> zhK)d`6pFDlrKqJWrQq&MDaNFdM_t444WJY%B+z4?fe-SiYbKw0D5W^_g?qGw9_y>e zH1HT>#9TD>_zta#(&HjM?gP_7k7-XoZne^*x_ZKcO9&jWW(6vU0Dp^6v} znEXhGy3-HQ6uu}>Z~n0dB57^~=uvU>|C2gJ#W zof*Rj;~kja zX13=)kVQbQy}*izPa*RQvo7T(>s!LC?^&sTO{|!;Tisby3u_xuTXPSLGIa*PB*y*- zXk#|J(#jejX0HUWEtW~Gt@WhLblbu7t8C+j*3$#6I8bpCb=*15ZN8iC!d#&-$PNN~`Pwoa$}tsY3| z*pEyY9Z2}wOVe=mjDa>Fp{)37|eGa-b0#)yKMvBo2t+eB+TK77)bCRw+e_;cQDz$9xA;x@^8nJ4L*YV|kl!0D7i`aY)=&6r`GXQrhx zhf;{?JW9bQ!>Steiz$Vme@Q9IEkzfpzHhB6#~0n#n}28h8*A#e-h74ePzE7T@hv)kI;Q1W}N zEsfZ)LzIt#M=3=sPg$|-FgWL}hA-g)5^N|)_|uts%th;AL-}4soB5(udh;9B76#h_ zD*^#~>R0Yr&l#(?(AwSbYCN+Zk;u;b+Zvz*jJ{u-s61;M7%P&0$y#i^Zzct8@`Qp; zV*|{dLuowBo|s0o!0K6|s7gIpzpTung2=L~0Y!7iF$ z7fpzZh7xc`!rvOkqH4Lg*FrAZ6-wNPvba!J$xw9rRxFFEjZr`|YZEwxMb&YEbqE~H zqUyT9x&-1qp)hnD0uqL{pk?7maP*=C{NF=@iKGN=K*FCMz+xg$0_-CI7WHS%>jA`2 z)dLYW`T9sODD`Qqbz1|^rSr)m%kgYUDuNQL9=zZ4^U|~c&wBa`(HXZ85g%Ox z!{B&tMDclN^sARWw+JK{H$A5tJJ)SbRiP$62W!+v37{7)=!L8Hm#*4hdj8B8Env-G zd2XPFzw-QSZMI6RpJv;| z`?`Tfr2#aa>caSV*}mr|O>qHdyll&8_bvneSWsoaAB??;@kBPLEaH@JPhg$P*$iD= z4lTX?DeGL`1(vs^@c1mhtB>sxhfpbB+XFJeDxhr$7O7w>q!FkH2vg>VP9dq}N-850 z1L==)@Vo`sj__wjvq4o*Y0)RFc~xX%KC6KU%cL40Sd@XbBXqE;Zp))dt^ra*xNVpC zTOYEhAP`|nf>8v*6M_U9~7Trxl&|FYQxn!uyB1PVnvim}4M_!uVc zz*aWuxNQi5E06xc2shR!{kzX!oZw(sD; z)3^U^^RjTu*b$Rl3GRh^Ci!q#%J!AJS}Fu|D=fAT53H9x0&!*&OF1?LZpWzxZi1eA zRew3S41a5&9`&Bwji=7mlM${3$!s7WBL)rSd2mwpVo^=xKe$cIyQ#dGCZVbPJAa@D z8`Vq>r$Wu-%Q&~OsV(Fo+--KDgkK8{tPq z-gnLag5J))ZzTtZj&z|5;mQrdNjx;IUSJw7+43jj^{DV;a5^R`1S312v1hI1z%ZZx zr9=oyr0ohn7M^W?VM(-=l)_U5t>u7_{auV!{*QXjspe8tOW6|oEo@7oN8HD@L%Z}8`jjTx$TX~4rpPdYLcWG3p>t)PrN?WzJUtJO{p;BR$gQSId35soG%qvf#W(p@%crh)do4v+P7WIjK%T2Uk;^8TA4X-$2tO(4!V;RxzCB<(v-O(ih|E*5-7S zO=lC@%Mqn#yUG+|LW9zp1?C@P+uB2HPq4G?<({;NJIGPo9yYmy+>Kkv{_G&P@(*hN z&-_r2ANff5fIlrK(T|{17Ti$|4>;5A-$Yl-zDrc^2Ad2j(mEaG*6Iel@Cpw55`Cx% zc=@iQT!-rJBzHwHu;crgRm#4d6YhcA=6$Z`DXRxG9~$PqOy7z zH!Mv4R&y2=jW!3S>&elw7tc#W*}|SOKE)rZ@9HUAcv~vw5EBevO3ie3thYP}=Y+a_ zoWEUqQe5zyzHM}Uz38<2RC$NVv_5iB&<`kGP!XO*T+@a_ z9PaGMKi=jEZedIH2|q>`v3Y<}_Tb}#KJt0qHu4p~*2^%8Ub({fEd^NzDzB@tg{KF+_fkBqmlKO}j=ca3~!MNv5r4 zC`SHiE!J|F{DOZO!kT;_w;?CX2M{kWCo#`?{8M7tE%cXCoEyK?FASFvIgUWj5%PD& z_xc~pYfZF2#L3gBt~fb?|I?p+GDc3OJ#~z{0Nzk4#u6?o_I(cArs`2 zKE`)ab=!rhsq}Vy{_6+EhhiDe+1asjAcv2-#>!5z+{ejyFZ2w%KVGh4ONP${AMH}8 z>vL8yQT~>jq;E}>@hwhKIo5oF+yG&Wi4)`&e5sTArU~+CURhZN;)_$T;b&gRzML$l zle2S*Jl2zW8Ipb7nX#SyG)0a;aO=4#a&0^%Ax)KQduG!R7+PUBi<~OgkWM1QxfZbt zW2VY=xy$U^saTKs>=1};=Bkh=gSgauCVVDWBg`a_Iwd$?+mNBSZ;*D>Ae`D z^qgfZmc#gZF>K#rxi;S@Mt`yx!_7B~(bXlgU-!UpY<5rRq zmUAOoAxOh$D+t{FxVR`6O$r*gE8pL(@X-=O=T|jYth~dbmdo9-kAJgVuH8C+jv=<@ z{6DumCixAcTjJ69k{wm_BbMPOUlymO2AbgwgwykGArbX+rUqUBTfz@zwiR-X)|2nP zD0WaQu#eD^efjr`V*G|)r;?@eM?C~SHBbX*%1#YzglxiqcQd5<9xQPMRI-EZULgna zkufZPh5RAHw7dNvf7Lz_jYFNpit0RB_@elZuW_OG8%+)>LEXldA94~};vdSUCCx&q z@ANu9$`UvI!haNbb{to595e@b)B`VQrti zq;lN<8NYIO(d3>bDep?Bxlf=%flq0#e%y$*mzf_I2UL`kp zKLPdM`C~+S{`t+1iyb1Oo6S(h#nFQtqSFyt?RD{;)#(%iKwxX4{mOlT0k}G~9ga_j zgT7h4GpB^^{rT+hDmhKk3aLGduIocq%Vv)Ik_}%Y_vVJPEoT-U^ei?zbw)B$r+ooYg3Q@Y zO2gQPF?pRl-uja}H-Do(XC2mh*`=Gkal!DdF4$4zsj>s;__<**3=JfmhbRlW*$NH*^b}jsr8HjrO`|b9G?Gl z`9F=Pk)+o$-xAKSLVBaDoo3Pu)kftFTT~={Vvbq;0rvoLk=nFVm<02zf*4I`F17? zm$Gg<LsJ%n7!8fn@ja_~Sgyf8aI)@)Wqr~eIv|N=xlgdV%hMBN| z%{wiB+uFT4NOW9-7YaeESF)l?)^dUUpB5XU7+QikV%Ou($ZKg-DxQ-YmwjiRO1gV8 zMgRDmT-qew+eYIuPEWZgAH$cNJy@SSY~%?&^vQYhBwk9)BJ_(j?A29yyO;^xiiN1} zxF&a?_hf_{@<CsqB4imd#KMLmX^DP+$c%l=Z&A1U+nmwKfq@@!7ry@J3FY~5425pliw zR4(H11^%TXIaG@Io{(1;F|X&cT|BmopuTMBa~zk$2C>`E<=>Qmp2mLHRn1CmisG3s z`CBQ3TVoA}0y2b}=d2F4R5-cv5 zNzK4;dMT4Q$!i8dY?2=1t@v=_BM7z8#Yw&KqxR?`R7MjK(EJL@Px;;*Bq;)eS6 zI?8^Fcx^aABblR~az-*6Kw3ZcNqr?mJoW*hAYb(r3nC!`*@_0r%39lD0lCzJl%I7U zyY^Z`sa{8RK~u~QS)FuvblMN=Nez``lQeEH@hR%b-ZW97xp{iGriyNshV`f1TTx7o zR0iYa#nF+$*KMVw^7zVdQyb;DB<6Lc><`%&U6n$pOgL>&dbypUdJUYUdK#*~7;Cm^E%$vwgzORHy!&(~^Hqhn1NEcM4&5H{n2no^; zmD|+doRP|>7_49QmZOv`UK$rl=%N7q&1ftMDXbQOoBdhKF-kFCYP}vAuROI#?*&q} z?!%fVA(r%5HG-gfl9UmhJ~V*a+-46Sv*$N&HGa&!Xq8WrV(m90>aLGs_a9+(6o%5IJPbMfsO_En-V#~brm?;Vr?dN_3iu&EDijRl%K^cPbMcp=2 z>Ca1iX#!_iSln!7q_{vMs64wcTlrY3Y5*(EEGkXOm)=terJMBTbFe5RFNHwH>oE>x zA_m^mD5zg>D%f4TJPhO;Jtker=cTFwfh%9?Q5lM4k-Rtq`&5rvqD(Z43tm5>I`s=n zm9xC~>kERg9==ohTcn;(2s)jwSNc&|Wfqq|AQ0x`YNZn=^}KH&uj-Z7D%H)?tKTMY z%_Z4zfaceNZgbe9X<#z6`%o*GpvcOPFbU7GLr z4JJvyYX|Y_EaiQ#Jfq&cTO-s5$498oR|E`ZrFA7yyn2P0e5B9S6~rwSvfIBYeGy95 zdW#ZY!ovX`+qNh@k*#dSW{9FeTa`HR*d;0oZMjvc#{qeCo6-Orr0vQC#Z~=qJn?q- z>r#Vt=XNEC6MsEV1t537E0=f__&Qtp8wI}FrA#g7YTtwFBh=~j0!OHcH_-pJc`S6d z5@{{v>Wc#d@ab-)F-m6cR;t%>cj+;@)Dm6V7yvToHdpTXn{aT6Nwd956sn)ISLs1xdvPze4s`YJy~;-te}ZUd?bqY>VLU*!?++yr zWt!wDbBOql93_B=^K+D*<-?5jjXaE*-i;~)(f;_2k%L)}{mK)mYA$hFNs%5(k_nvl z98|`GQ^P~b(vlI*0H^ORDToxrgRhsc@u6^q%Svy3-C^Y{Ctlr8EHFp8ibNb19an~c z!_(tRTnPsZG8=tD>0UC=kiG{eF(}&t2D3val>OqdJ;Vc(by7j7dLip{+UU=Y(~9HW z$)c8EvV2*>8KrHxe|IeZva4VEfip@MsD_=y@$^Q$(m7=~HS6<>B^|5IDqd11m$dD_ z^iD_bYVyqiX$y4U~wfa-*FumAbWLJ4xO|M{gF z5QOz_G%ZF)}Z-exIrEoHv=j=j34Olj--00+@xcx4Mq zI{(wSM-(%LpRS0p{&pWDtV=WE$NKM~_rvb2qRj^$XGSPTo>l?!0%yTG8gfSxL=t$1;Hn!Agt`idSc z+3&5w2jSGC%c&niTcr@TA=_SF_2(0YvWw-_4?UL-eO=6{sb6E`W8eF#Ww@zqsE_(f zuq%JYD@@(4o4j#dgueiQ(@1`1>qo@}uSmE*EtR}&DQoJh4uJvtwXf>S1?ii8)fi6d zGmWY`H%_lmQLV@g%#MY;*$=vRpHc=i(G4XJBwTI@ZV*8y+)zRcL1)}htbx1WhN1@( zF3+`Tt@l%FiWyU>QXh66fHm4sVeuyZ_}`I- zvi9BP5$gE^_H4@iI+yuZQ7a=ry+sw3i3=uBd00$U)Hs~AI#*Szmied5(YIx$S2fCf zTUBM!d!JGneH3e6P4$Da98gW2A}vTV7?ot|FRQ7itS__i=l<^ z)z|!7YW^9f3KL)qyBEiA#!BWRf$%KL(#rEaKD|FNzb z&@ys)2=%z8zhSW9<|6DUsO-%^g`M)uBgDWZY{9>d$UpJ#+T=__`(`BUqMp!48O#!| z#z+=}%bdz=RJ__$+zmYn+0fU;t7YhYtn9JsXm~PM?Ig7-9>0%HQfqPHY-*AkjPR|W zlGIjQ<)>t)w+$RgD*{V*w2A&Cg46$w!k_|8jp+ ze&lv>yKa&J8r#@pHIVAwHC6qyfO6a&_6XWYlfZS0$@Wxymoj8g=(` z*B$$A-51X??sK&YKj$oqUxGG#q__WE?MRi+o1yxfzAf{J9lgMNi_6Ox!>Aveq57a& zhH9JY0khS5CWH?3aiG~BvWX5f!GrzaP=oo)NAx2OwF$=`Kg>LxY6V=e)o_ApIO{}7 zD}A(6Z9>(oOh+GQO8@HP0)U3Gp00+LRK`%5qW8>DE1B@O9}*U$s#bVp9R%0+vIC3N zAa1Mvcrm&QKUm!*(5Vad7(L@!vN20gqn|#1iQ0#1y!Ex}-?BaIV%Hg`SAHM-hVpr6 zBb)wteysqq=?w|V$b@m|bmSJfq+;1!w^Zcm?Ut$u-mQMkr;-gX8YLlInK%SF?2(3W zMV7}M%En}G{OgGI$G>Z%aS9>}z0ema30H!`o@J^-Brk&vyTD?8Q7e|sj5lt^G^ZmB zhicayS*Gs%MP0>7@8N)lMSYGn-}nzDuHoI3`0giDkK0I;Jt1%~PR_7On@cFC25Qc2 zL{Ky-c{G;a8}yxgIF#8tm@rewa1S#$06$irTL=zkPhldXQrbqqcIuOg-L zE4{&u^sa4x*`Vf(IhtPzM|Co`0&3EX;G2!~VAs^lkHs0>_02|gHgdQ6iMa3-Rp!gi z?S>llG5|)83aaHf@$m`5P1L9CRjnA$V+3J5|3L3E*~LGw8yr4LdA-=O9Q6ZfxB(RG zW1jofAgP`KZP~|~?pHgAH*$$^6ieH$HWQZ{04$LGY8np1M+n8}g)BfsZbB?JUeL7;#$$<|V-#@fA`y(0m0bQb=VYiQ| zRXw``tM)yn27R5(${$zTV$=s6SErc7^xed*tbXYfGCeZe8Kaev&1#)dJByF92?!Y}ef zQ7;_=JaI%^<1ISW_+`&FT%&c_hVyFm+6#ZDs(k;WDuj=qr1SHK#rA1tZi2t7x$75S zP^&ln$eo*1aA!YN^v-{xOJUpv)tg0JR2%mE97z1>i)#P$-rdbf z2Er(j7?9r-kgN1ih(Zo|>`3Ez4-C&9j1M&O|4N1f1MjThvl)ErsQUD8Fomd zEa2LH3zfdT-k5-V)EPic-ZaIaeH)ThGHJc?>l^f2*Rv*hYGd)qZ&Vr%!8~m8zZw9} z>UnAxoy8&F{B zI=i6`=A?1IQo*91^fxzQG<$}9Y1}I`!X3X}F<;&4;k95T5tLtQG<`3EwidBl57k6C zNCrJpKbCMDao7A(ZOCz}b@OYrrp3F;5-2$=b#r)je)%0Vo}1^gmYh~zDh*7^p2c(7 zU`|^oB{70tI@n823zFIy&;bVv;kEZ_dm2!>!&VAk<9R@X7ia9pbYS5B8L?jZHx?5I zXeM3@6@N7V91VEwrnqkrVLG$bCasQ`ZUAN3C6l&NytX{#^G+Im8Vt?VKn_bwf21UP`1odYeZz{Jhd8>@-{7z(up>0 z1f_X4ttq9IWNjs-f5=)SrIMnp;X4jxn-r}D!A}&e1EtMX?R8oDBLur%^1-`5IaaRm z>BI;ecJWzPH%)86_Z!M)YFZDf`mCl+r6PSxYabDuU0P$3HjCQ7XbLWLv?+wW;HCLf z`o>H9f#)*x6=gJU+{;5B8~5^Mwb$GNeOoy#pA$)Yr0nU$*7#^G`FdN~9UpD3SU8HHsigtzjn~5} zYi(f>Od=fQ*q~AN$U0~p^lHzt5nl6P2y)usLG1^nHt(EPP~;s$kA+8 zkan?#$pB^#cZnQkpcKtQEW8!?BNY3`*CS};P<>9YHi4@UwUGGS8HSA?npV{#C3~Jf zBoP)!#ah}9@ryX(j1a|I+UJtR0Oky3qe8VH@#JVi!Fe011&co#KnVL2fRtnaFJsxu zQ0=y8|Agoy{Z4J|5-)x`lAvmOZkV>wBwim*(8p{}JuOB|HUJB|Ur#F#(?1{#6heLN zmbiQv0Wek?XrJI}WGF$K`>>Xcv_GU_u>{@f&E&?~WHE0DLAd{E3@OK?pK7d4m%NNj z){Dh7(Jr`F>_V(qy>(OVN6t!%4bRgxMaIKs+EC7`>_Fo2Rd-_m^PTo4SJ?0tT7;N8 zfb#q3-?q?ji5T6Vpp#L|KT^9X4eLkHt**M1W$$qY*vPgNm(e$D%rFJ|Bl2e2q|-HHn?^KAm%F{Zc8#XAoO5!K2Z_rs+ps z7bmt(J(gG}`DMEacob-1t+2hXi&Kv!HMjrKexgtE_6QiC3{h&{4VND-he z=^!-rJGc)3Pf0k*4tLaQO5>ub@}jl~c-8#)78$H!C#@o{ea{+o(gxJc)n6CSZW~xp zO+5prP1+%6yP{@&Kb@79uV!VxRZ$bvtoED%v0a@sUt`&J0<(nW`pZt5#PMMn%-ls= z&DY9cKX=h;@zpZeg)Z8Ayk7>>x@zHklML3TtJb2

Z@$pR^()`w4db|6F404SW~i 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 bolds = new ArrayList<>(); - while ((start = str.indexOf("")) != -1) { - int end = str.indexOf("") - 3; - str = str.replaceFirst("", "").replaceFirst("", ""); - bolds.add(start); - bolds.add(end); + public static Spannable replaceTags(String str) { + try { + int start = -1; + int startColor = -1; + int end = -1; + StringBuilder stringBuilder = new StringBuilder(str); + while ((start = stringBuilder.indexOf("
")) != -1) { + stringBuilder.replace(start, start + 4, "\n"); + } + while ((start = stringBuilder.indexOf("
")) != -1) { + stringBuilder.replace(start, start + 5, "\n"); + } + ArrayList bolds = new ArrayList<>(); + ArrayList colors = new ArrayList<>(); + while ((start = stringBuilder.indexOf("")) != -1 || (startColor = stringBuilder.indexOf(""); + stringBuilder.replace(end, end + 4, ""); + bolds.add(start); + bolds.add(end); + } else if (startColor != -1) { + stringBuilder.replace(startColor, startColor + 2, ""); + end = stringBuilder.indexOf(">", startColor); + int color = Color.parseColor(stringBuilder.substring(startColor, end)); + stringBuilder.replace(startColor, end + 1, ""); + end = stringBuilder.indexOf("
"); + stringBuilder.replace(end, end + 4, ""); + colors.add(startColor); + colors.add(end); + colors.add(color); + } + } + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(stringBuilder); + for (int a = 0; a < bolds.size() / 2; a++) { + spannableStringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), bolds.get(a * 2), bolds.get(a * 2 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + for (int a = 0; a < colors.size() / 3; a++) { + spannableStringBuilder.setSpan(new ForegroundColorSpan(colors.get(a * 3 + 2)), colors.get(a * 3), colors.get(a * 3 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + return spannableStringBuilder; + } catch (Exception e) { + FileLog.e("tmessages", e); } - SpannableStringBuilder stringBuilder = new SpannableStringBuilder(str); - for (int a = 0; a < bolds.size() / 2; a++) { - TypefaceSpan span = new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - stringBuilder.setSpan(span, bolds.get(a * 2), bolds.get(a * 2 + 1), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - } - return stringBuilder; + return new SpannableStringBuilder(str); } public static boolean needShowPasscode(boolean reset) { @@ -569,6 +605,61 @@ public class AndroidUtilities { (UserConfig.appLocked || UserConfig.autoLockIn != 0 && UserConfig.lastPauseTime != 0 && !UserConfig.appLocked && (UserConfig.lastPauseTime + UserConfig.autoLockIn) <= ConnectionsManager.getInstance().getCurrentTime()); } + public static void shakeTextView(final TextView textView, final float x, final int num) { + if (num == 6) { + ViewProxy.setTranslationX(textView, 0); + textView.clearAnimation(); + return; + } + AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); + animatorSetProxy.playTogether(ObjectAnimatorProxy.ofFloat(textView, "translationX", AndroidUtilities.dp(x))); + animatorSetProxy.setDuration(50); + animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + shakeTextView(textView, num == 5 ? 0 : -x, num + 1); + } + }); + animatorSetProxy.start(); + } + + + + /*public static String ellipsize(String text, int maxLines, int maxWidth, TextPaint paint) { + if (text == null || paint == null) { + return null; + } + int count; + int offset = 0; + StringBuilder result = null; + TextView + for (int a = 0; a < maxLines; a++) { + count = paint.breakText(text, true, maxWidth, null); + if (a != maxLines - 1) { + if (result == null) { + result = new StringBuilder(count * maxLines + 1); + } + boolean foundSpace = false; + for (int c = count - 1; c >= offset; c--) { + if (text.charAt(c) == ' ') { + foundSpace = true; + result.append(text.substring(offset, c - 1)); + offset = c - 1; + } + } + if (!foundSpace) { + offset = count; + } + text = text.substring(0, offset); + } else if (maxLines == 1) { + return text.substring(0, count); + } else { + result.append(text.substring(0, count)); + } + } + return result.toString(); + }*/ + /*public static void turnOffHardwareAcceleration(Window window) { if (window == null || Build.MODEL == null || Build.VERSION.SDK_INT < 11) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java index 2cca9e968..fb6363697 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java @@ -645,9 +645,13 @@ public class ImageLoader { } else { opts.inPreferredConfig = Bitmap.Config.RGB_565; } + //if (Build.VERSION.SDK_INT < 21) { + // opts.inPurgeable = true; + //} + opts.inDither = false; if (mediaId != null) { - image = MediaStore.Images.Thumbnails.getThumbnail(ApplicationLoader.applicationContext.getContentResolver(), mediaId, MediaStore.Images.Thumbnails.MINI_KIND, null); + image = MediaStore.Images.Thumbnails.getThumbnail(ApplicationLoader.applicationContext.getContentResolver(), mediaId, MediaStore.Images.Thumbnails.MINI_KIND, opts); } if (image == null) { if (isWebp) { @@ -1981,6 +1985,15 @@ public class ImageLoader { } } } + } else if (message.media instanceof TLRPC.TL_messageMediaWebPage) { + if (message.media.webpage.photo != null) { + for (TLRPC.PhotoSize size : message.media.webpage.photo.sizes) { + if (size instanceof TLRPC.TL_photoCachedSize) { + photoSize = size; + break; + } + } + } } if (photoSize != null && photoSize.bytes != null && photoSize.bytes.length != 0) { if (photoSize.location instanceof TLRPC.TL_fileLocationUnavailable) { @@ -2018,6 +2031,13 @@ public class ImageLoader { message.media.video.thumb = newPhotoSize; } else if (message.media instanceof TLRPC.TL_messageMediaDocument) { message.media.document.thumb = newPhotoSize; + } else if (message.media instanceof TLRPC.TL_messageMediaWebPage) { + for (int a = 0; a < message.media.webpage.photo.sizes.size(); a++) { + if (message.media.webpage.photo.sizes.get(a) instanceof TLRPC.TL_photoCachedSize) { + message.media.webpage.photo.sizes.set(a, newPhotoSize); + break; + } + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java index fa79c264b..6f50bdc59 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java @@ -68,7 +68,6 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private Matrix shaderMatrix; private int alpha = 255; private boolean isPressed; - private boolean disableRecycle; private int orientation; private boolean centerRotation; private ImageReceiverDelegate delegate; @@ -224,10 +223,6 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg setImageBitmap(bitmap != null ? new BitmapDrawable(null, bitmap) : null); } - public void setDisableRecycle(boolean value) { - disableRecycle = value; - } - public void setImageBitmap(Drawable bitmap) { ImageLoader.getInstance().cancelLoadingForImageReceiver(this, 0); recycleBitmap(null, false); @@ -497,10 +492,18 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg return imageX; } + public int getImageX2() { + return imageX + imageW; + } + public int getImageY() { return imageY; } + public int getImageY2() { + return imageY + imageH; + } + public int getImageWidth() { return imageW; } @@ -682,7 +685,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (newKey != null) { newBitmap = ImageLoader.getInstance().getImageFromMemory(newKey); } - if (key == null || image == null || image == newBitmap || disableRecycle) { + if (key == null || image == null || image == newBitmap) { return; } Bitmap bitmap = image.getBitmap(); diff --git a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java index 0fd27e2ad..629268341 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java @@ -1105,8 +1105,16 @@ public class MediaController implements NotificationCenter.NotificationCenterDel if (proximitySensor != null && audioTrackPlayer == null && audioPlayer == null || isPaused || (useFrontSpeaker == (event.values[0] < proximitySensor.getMaximumRange() / 10))) { return; } + boolean newValue = event.values[0] < proximitySensor.getMaximumRange() / 10; + try { + if (newValue && NotificationsController.getInstance().audioManager.isWiredHeadsetOn()) { + return; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } ignoreProximity = true; - useFrontSpeaker = event.values[0] < proximitySensor.getMaximumRange() / 10; + useFrontSpeaker = newValue; NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioRouteChanged, useFrontSpeaker); MessageObject currentMessageObject = playingMessageObject; float progress = playingMessageObject.audioProgress; diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java index 8c5f00ab2..525c91eba 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java @@ -41,6 +41,7 @@ public class MessageObject { public TLRPC.Message messageOwner; public CharSequence messageText; + public CharSequence linkDescription; public MessageObject replyMessageObject; public int type; public int contentType; @@ -273,7 +274,7 @@ public class MessageObject { messageText = LocaleController.formatString("YouCreatedBroadcastList", R.string.YouCreatedBroadcastList); } } - } else if (message.media != null && !(message.media instanceof TLRPC.TL_messageMediaEmpty)) { + } else if (!isMediaEmpty()) { if (message.media instanceof TLRPC.TL_messageMediaPhoto) { messageText = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); } else if (message.media instanceof TLRPC.TL_messageMediaVideo) { @@ -309,22 +310,22 @@ public class MessageObject { messageText = Emoji.replaceEmoji(messageText, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20)); if (message instanceof TLRPC.TL_message || message instanceof TLRPC.TL_messageForwarded_old2) { - if (message.media == null || message.media instanceof TLRPC.TL_messageMediaEmpty) { + if (isMediaEmpty()) { contentType = type = 0; - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaPhoto) { + } else if (message.media instanceof TLRPC.TL_messageMediaPhoto) { contentType = type = 1; - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaGeo) { + } else if (message.media instanceof TLRPC.TL_messageMediaGeo) { contentType = 1; type = 4; - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaVideo) { + } else if (message.media instanceof TLRPC.TL_messageMediaVideo) { contentType = 1; type = 3; - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaContact) { + } else if (message.media instanceof TLRPC.TL_messageMediaContact) { contentType = 3; type = 12; - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaUnsupported) { + } else if (message.media instanceof TLRPC.TL_messageMediaUnsupported) { contentType = type = 0; - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaDocument) { + } else if (message.media instanceof TLRPC.TL_messageMediaDocument) { contentType = 1; if (message.media.document.mime_type != null) { if (message.media.document.mime_type.equals("image/gif") && message.media.document.thumb != null && !(message.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty)) { @@ -340,7 +341,7 @@ public class MessageObject { } else { type = 9; } - } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaAudio) { + } else if (message.media instanceof TLRPC.TL_messageMediaAudio) { contentType = type = 2; } } else if (message instanceof TLRPC.TL_messageService) { @@ -433,6 +434,24 @@ public class MessageObject { photoObject.location = messageOwner.media.document.thumb.location; } } + } else if (messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) { + if (messageOwner.media.webpage.photo != null) { + if (!update || photoThumbs == null) { + photoThumbs = new ArrayList<>(messageOwner.media.webpage.photo.sizes); + } else if (photoThumbs != null && !photoThumbs.isEmpty()) { + for (TLRPC.PhotoSize photoObject : photoThumbs) { + for (TLRPC.PhotoSize size : messageOwner.media.webpage.photo.sizes) { + if (size instanceof TLRPC.TL_photoSizeEmpty) { + continue; + } + if (size.type.equals(photoObject.type)) { + photoObject.location = size.location; + break; + } + } + } + } + } } } } @@ -538,11 +557,24 @@ public class MessageObject { return false; } + public void generateLinkDescription() { + if (linkDescription != null) { + return; + } + if (messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && messageOwner.media.webpage instanceof TLRPC.TL_webPage && messageOwner.media.webpage.description != null) { + linkDescription = Spannable.Factory.getInstance().newSpannable(messageOwner.media.webpage.description); + if (containsUrls(linkDescription)) { + Linkify.addLinks((Spannable) linkDescription, Linkify.WEB_URLS); + } + } + } + private void generateLayout() { if (type != 0 || messageOwner.to_id == null || messageText == null || messageText.length() == 0) { return; } + generateLinkDescription(); textLayoutBlocks = new ArrayList<>(); if (messageText instanceof Spannable && containsUrls(messageText)) { @@ -781,7 +813,7 @@ public class MessageObject { } public boolean isSending() { - return messageOwner.send_state == MESSAGE_SEND_STATE_SENDING; + return messageOwner.send_state == MESSAGE_SEND_STATE_SENDING && messageOwner.id < 0; } public boolean isSendError() { @@ -789,7 +821,7 @@ public class MessageObject { } public boolean isSent() { - return messageOwner.send_state == MESSAGE_SEND_STATE_SENT; + return messageOwner.send_state == MESSAGE_SEND_STATE_SENT || messageOwner.id > 0; } public String getSecretTimeString() { @@ -944,4 +976,12 @@ public class MessageObject { public boolean isReply() { return !(replyMessageObject != null && replyMessageObject.messageOwner instanceof TLRPC.TL_messageEmpty) && messageOwner.reply_to_msg_id != 0 && (messageOwner.flags & TLRPC.MESSAGE_FLAG_REPLY) != 0; } + + public boolean isMediaEmpty() { + return isMediaEmpty(messageOwner); + } + + public static boolean isMediaEmpty(TLRPC.Message message) { + return message == null || message.media == null || message.media instanceof TLRPC.TL_messageMediaEmpty || message.media instanceof TLRPC.TL_messageMediaWebPage; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index 7f37da1f0..6d2b29972 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -13,7 +13,6 @@ import android.app.AlertDialog; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.os.Build; -import android.text.Html; import android.util.Base64; import android.util.SparseArray; @@ -179,7 +178,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } public void updateConfig(final TLRPC.TL_config config) { - AndroidUtilities.runOnUIThread(new Runnable() { + AndroidUtilities.runOnUIThread(new Runnable() { //TODO use new config params @Override public void run() { maxBroadcastCount = config.broadcast_size_max; @@ -1307,12 +1306,12 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (label.length() != 0) { if (count > 1) { if (arr.size() > 2) { - newPrintingStrings.put(key, Html.fromHtml(String.format("%s %s", label, LocaleController.formatPluralString("AndMoreTyping", arr.size() - 2)))); + newPrintingStrings.put(key, String.format("%s %s", label, LocaleController.formatPluralString("AndMoreTyping", arr.size() - 2))); } else { - newPrintingStrings.put(key, Html.fromHtml(String.format("%s %s", label, LocaleController.getString("AreTyping", R.string.AreTyping)))); + newPrintingStrings.put(key, String.format("%s %s", label, LocaleController.getString("AreTyping", R.string.AreTyping))); } } else { - newPrintingStrings.put(key, Html.fromHtml(String.format("%s %s", label, LocaleController.getString("IsTyping", R.string.IsTyping)))); + newPrintingStrings.put(key, String.format("%s %s", label, LocaleController.getString("IsTyping", R.string.IsTyping))); } } } @@ -1472,12 +1471,21 @@ public class MessagesController implements NotificationCenter.NotificationCenter for (TLRPC.Message message : messagesRes.messages) { message.dialog_id = dialog_id; objects.add(new MessageObject(message, usersLocal, true)); - if (isCache && message.media instanceof TLRPC.TL_messageMediaUnsupported) { - if (message.media.bytes.length == 0 || message.media.bytes.length == 1 && message.media.bytes[0] < TLRPC.LAYER) { - if (messagesToReload == null) { - messagesToReload = new ArrayList<>(); + if (isCache) { + if (message.media instanceof TLRPC.TL_messageMediaUnsupported) { + if (message.media.bytes.length == 0 || message.media.bytes.length == 1 && message.media.bytes[0] < TLRPC.LAYER) { + if (messagesToReload == null) { + messagesToReload = new ArrayList<>(); + } + messagesToReload.add(message.id); + } + } else if (message.media instanceof TLRPC.TL_messageMediaWebPage) { + if (message.media.webpage instanceof TLRPC.TL_webPagePending && message.media.webpage.date <= ConnectionsManager.getInstance().getCurrentTime()) { + if (messagesToReload == null) { + messagesToReload = new ArrayList<>(); + } + messagesToReload.add(message.id); } - messagesToReload.add(message.id); } } } @@ -1941,7 +1949,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - public long createChat(String title, ArrayList selectedContacts, final TLRPC.InputFile uploadedAvatar, boolean isBroadcast) { + public long createChat(String title, ArrayList selectedContacts, boolean isBroadcast) { if (isBroadcast) { TLRPC.TL_chat chat = new TLRPC.TL_chat(); chat.id = UserConfig.lastBroadcastId; @@ -2015,35 +2023,21 @@ public class MessagesController implements NotificationCenter.NotificationCenter }); return; } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - + final TLRPC.Updates updates = (TLRPC.Updates) response; + processUpdates(updates, false); AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { - putUsers(res.users, false); - putChats(res.chats, false); - final ArrayList messagesObj = new ArrayList<>(); - messagesObj.add(new MessageObject(res.message, users, true)); - TLRPC.Chat chat = res.chats.get(0); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id); - if (uploadedAvatar != null) { - changeChatAvatar(chat.id, uploadedAvatar); + putUsers(updates.users, false); + putChats(updates.chats, false); + TLRPC.Chat chat = null; + if (updates.chats != null && !updates.chats.isEmpty()) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, updates.chats.get(0).id); + } else { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidFailCreate); } } }); - - final ArrayList messages = new ArrayList<>(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true, false, 0); - - if (res instanceof TLRPC.TL_messages_statedMessage) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.message.date, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessageLink) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date, res.pts_count); - } } }); } @@ -2066,48 +2060,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (error != null) { return; } - - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - putUsers(res.users, false); - putChats(res.chats, false); - final ArrayList messagesObj = new ArrayList<>(); - messagesObj.add(new MessageObject(res.message, users, true)); - TLRPC.Chat chat = res.chats.get(0); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); - - if (info != null) { - for (TLRPC.TL_chatParticipant p : info.participants) { - if (p.user_id == user.id) { - return; - } - } - TLRPC.TL_chatParticipant newPart = new TLRPC.TL_chatParticipant(); - newPart.user_id = user.id; - newPart.inviter_id = UserConfig.getClientUserId(); - newPart.date = ConnectionsManager.getInstance().getCurrentTime(); - info.participants.add(0, newPart); - MessagesStorage.getInstance().updateChatInfo(info.chat_id, info, true); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatInfoDidLoaded, info.chat_id, info); - } - } - }); - - final ArrayList messages = new ArrayList<>(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true, false, 0); - - if (res instanceof TLRPC.TL_messages_statedMessage) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.message.date, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessageLink) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date, res.pts_count); - } + processUpdates((TLRPC.Updates) response, false); } }); } else { @@ -2150,57 +2103,15 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (error != null) { return; } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; + final TLRPC.Updates updates = (TLRPC.Updates) response; + processUpdates(updates, false); if (user.id == UserConfig.getClientUserId()) { - res.chats = null; - } - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - putUsers(res.users, false); - putChats(res.chats, false); - if (user.id != UserConfig.getClientUserId()) { - final ArrayList messagesObj = new ArrayList<>(); - messagesObj.add(new MessageObject(res.message, users, true)); - TLRPC.Chat chat = res.chats.get(0); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + MessagesController.getInstance().deleteDialog(-chat_id, 0, false); } - boolean changed = false; - if (info != null) { - for (int a = 0; a < info.participants.size(); a++) { - TLRPC.TL_chatParticipant p = info.participants.get(a); - if (p.user_id == user.id) { - info.participants.remove(a); - changed = true; - break; - } - } - if (changed) { - MessagesStorage.getInstance().updateChatInfo(chat_id, info, true); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatInfoDidLoaded, info.chat_id, info); - } else { - MessagesStorage.getInstance().updateChatInfo(chat_id, user.id, true, 0, 0); - } - } else { - MessagesStorage.getInstance().updateChatInfo(chat_id, user.id, true, 0, 0); - } - } - }); - - if (user.id != UserConfig.getClientUserId()) { - final ArrayList messages = new ArrayList<>(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true, false, 0); - } - - if (res instanceof TLRPC.TL_messages_statedMessage) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.message.date, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessageLink) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date, res.pts_count); + }); } } }); @@ -2243,32 +2154,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (error != null) { return; } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - putUsers(res.users, false); - putChats(res.chats, false); - final ArrayList messagesObj = new ArrayList<>(); - messagesObj.add(new MessageObject(res.message, users, true)); - TLRPC.Chat chat = res.chats.get(0); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_NAME); - } - }); - - final ArrayList messages = new ArrayList<>(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true, false, 0); - - if (res instanceof TLRPC.TL_messages_statedMessage) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.message.date, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessageLink) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date, res.pts_count); - } + processUpdates((TLRPC.Updates) response, false); } }); } else { @@ -2298,34 +2184,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (error != null) { return; } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - - final ArrayList messages = new ArrayList<>(); - messages.add(res.message); - ImageLoader.saveMessagesThumbs(messages); - - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - putUsers(res.users, false); - putChats(res.chats, false); - final ArrayList messagesObj = new ArrayList<>(); - messagesObj.add(new MessageObject(res.message, users, true)); - TLRPC.Chat chat = res.chats.get(0); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_AVATAR); - } - }); - - MessagesStorage.getInstance().putMessages(messages, true, true, false, 0); - - if (res instanceof TLRPC.TL_messages_statedMessage) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.message.date, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessageLink) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date, res.pts_count); - } + processUpdates((TLRPC.Updates) response, false); } }); } @@ -2617,6 +2476,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter req.pts = MessagesStorage.lastPtsValue; req.date = MessagesStorage.lastDateValue; req.qts = MessagesStorage.lastQtsValue; + if (req.date == 0) { + req.date = ConnectionsManager.getInstance().getCurrentTime(); + } FileLog.e("tmessages", "start getDifference with date = " + MessagesStorage.lastDateValue + " pts = " + MessagesStorage.lastPtsValue + " seq = " + MessagesStorage.lastSeqValue); if (ConnectionsManager.getInstance().getConnectionState() == 0) { ConnectionsManager.getInstance().setConnectionState(3); @@ -2681,7 +2543,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter Integer oldId = entry.getKey(); SendMessagesHelper.getInstance().processSentMessage(oldId); Integer newId = entry.getValue(); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newId, null); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newId, null, false); } } }); @@ -2860,9 +2722,18 @@ public class MessagesController implements NotificationCenter.NotificationCenter TLRPC.User user = getUser(updates.user_id); TLRPC.User user2 = null; + if (user == null) { + user = MessagesStorage.getInstance().getUserSync(updates.user_id); + putUser(user, true); + } + boolean needFwdUser = false; if (updates.fwd_from_id != 0) { user2 = getUser(updates.fwd_from_id); + if (user2 == null) { + user2 = MessagesStorage.getInstance().getUserSync(updates.fwd_from_id); + putUser(user2, true); + } needFwdUser = true; } @@ -2870,7 +2741,12 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (updates instanceof TLRPC.TL_updateShortMessage) { missingData = user == null || needFwdUser && user2 == null; } else { - missingData = getChat(updates.chat_id) == null || user == null || needFwdUser && user2 == null; + TLRPC.Chat chat = getChat(updates.chat_id); + if (chat == null) { + chat = MessagesStorage.getInstance().getChatSync(updates.chat_id); + putChat(chat, true); + } + missingData = chat == null || user == null || needFwdUser && user2 == null; } if (user != null && user.status != null && user.status.expires <= 0) { onlinePrivacy.put(user.id, ConnectionsManager.getInstance().getCurrentTime()); @@ -3036,7 +2912,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter } if (processUpdate) { processUpdateArray(updates.updates, updates.users, updates.chats); - MessagesStorage.lastDateValue = updates.date; + if (updates.date != 0) { + MessagesStorage.lastDateValue = updates.date; + } if (updates.seq != 0) { MessagesStorage.lastSeqValue = updates.seq; } @@ -3113,6 +2991,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter long currentTime = System.currentTimeMillis(); final HashMap> messages = new HashMap<>(); + final HashMap webPages = new HashMap<>(); final ArrayList pushMessages = new ArrayList<>(); final ArrayList messagesArr = new ArrayList<>(); final HashMap markAsReadMessagesInbox = new HashMap<>(); @@ -3305,6 +3184,12 @@ public class MessagesController implements NotificationCenter.NotificationCenter } else if (update instanceof TLRPC.TL_updateActivation) { //DEPRECATED } else if (update instanceof TLRPC.TL_updateNewAuthorization) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.newSessionReceived); + } + }); TLRPC.TL_messageService newMessage = new TLRPC.TL_messageService(); newMessage.action = new TLRPC.TL_messageActionLoginUnknownLocation(); newMessage.action.title = update.device; @@ -3438,6 +3323,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter pushMessages.add(obj); } else if (update instanceof TLRPC.TL_updatePrivacy) { updatesOnMainThread.add(update); + } else if (update instanceof TLRPC.TL_updateWebPage) { + webPages.put(update.webpage.id, update.webpage); } } if (!messages.isEmpty()) { @@ -3612,6 +3499,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage.getInstance().updateUsers(dbUsers, false, true, true); } + if (!webPages.isEmpty()) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didReceivedWebpagesInUpdates, webPages); + } + if (!messages.isEmpty()) { for (HashMap.Entry> entry : messages.entrySet()) { Long key = entry.getKey(); @@ -3701,6 +3592,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); + if (!webPages.isEmpty()) { + MessagesStorage.getInstance().putWebPages(webPages); + } if (!markAsReadMessagesInbox.isEmpty() || !markAsReadMessagesOutbox.isEmpty() || !markAsReadEncrypted.isEmpty()) { if (!markAsReadMessagesInbox.isEmpty() || !markAsReadMessagesOutbox.isEmpty()) { MessagesStorage.getInstance().updateDialogsWithReadedMessages(markAsReadMessagesInbox, true); diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java index 1f3962192..d2b7981df 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java @@ -123,6 +123,7 @@ public class MessagesStorage { database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, PRIMARY KEY (id, type));").stepThis().dispose(); database.executeFast("CREATE TABLE stickers(id INTEGER PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose(); + database.executeFast("CREATE TABLE webpage_pending(id INTEGER, mid INTEGER, PRIMARY KEY (id, mid));").stepThis().dispose(); database.executeFast("CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)").stepThis().dispose(); database.executeFast("CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))").stepThis().dispose(); @@ -163,7 +164,7 @@ public class MessagesStorage { database.executeFast("CREATE TABLE keyvalue(id TEXT PRIMARY KEY, value TEXT)").stepThis().dispose(); //version - database.executeFast("PRAGMA user_version = 15").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 16").stepThis().dispose(); } else { try { SQLiteCursor cursor = database.queryFinalized("SELECT seq, pts, date, qts, lsv, sg, pbytes FROM params WHERE id = 1"); @@ -194,7 +195,7 @@ public class MessagesStorage { } } int version = database.executeInt("PRAGMA user_version"); - if (version < 15) { + if (version < 16) { updateDbToLastVersion(version); } } @@ -379,6 +380,11 @@ public class MessagesStorage { database.executeFast("PRAGMA user_version = 15").stepThis().dispose(); version = 15; } + if (version == 15 && version < 16) { + database.executeFast("CREATE TABLE IF NOT EXISTS webpage_pending(id INTEGER, mid INTEGER, PRIMARY KEY (id, mid));").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 16").stepThis().dispose(); + version = 16; + } } catch (Exception e) { FileLog.e("tmessages", e); } @@ -2660,6 +2666,79 @@ public class MessagesStorage { return -1; } + public void putWebPages(final HashMap webPages) { + if (webPages == null || webPages.isEmpty()) { + return; + } + storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + try { + String ids = TextUtils.join(",", webPages.keySet()); + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM webpage_pending WHERE id IN (%s)", ids)); + ArrayList mids = new ArrayList<>(); + while (cursor.next()) { + mids.add(cursor.intValue(0)); + } + cursor.dispose(); + + if (mids.isEmpty()) { + return; + } + final ArrayList messages = new ArrayList<>(); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, data FROM messages WHERE mid IN (%s)", TextUtils.join(",", mids))); + while (cursor.next()) { + int mid = cursor.intValue(0); + ByteBufferDesc data = buffersStorage.getFreeBuffer(cursor.byteArrayLength(1)); + if (data != null && cursor.byteBufferValue(1, data.buffer) != 0) { + TLRPC.Message message = (TLRPC.Message)TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (message.media instanceof TLRPC.TL_messageMediaWebPage) { + message.id = mid; + message.media.webpage = webPages.get(message.media.webpage.id); + messages.add(message); + } + } + buffersStorage.reuseFreeBuffer(data); + } + cursor.dispose(); + + database.executeFast(String.format(Locale.US, "DELETE FROM webpage_pending WHERE id IN (%s)", ids)).stepThis().dispose(); + + if (messages.isEmpty()) { + return; + } + + database.beginTransaction(); + + SQLitePreparedStatement state = database.executeFast("UPDATE messages SET data = ? WHERE mid = ?"); + for (TLRPC.Message message : messages) { + ByteBufferDesc data = buffersStorage.getFreeBuffer(message.getObjectSize()); + message.serializeToStream(data); + + state.requery(); + state.bindByteBuffer(1, data.buffer); + state.bindInteger(2, message.id); + state.step(); + + buffersStorage.reuseFreeBuffer(data); + } + state.dispose(); + + database.commitTransaction(); + + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didReceivedWebpages, messages); + } + }); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + }); + } + private void putMessagesInternal(final ArrayList messages, final boolean withTransaction, final boolean isBroadcast, final int downloadMask) { try { if (withTransaction) { @@ -2677,6 +2756,7 @@ public class MessagesStorage { SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media_v2 VALUES(?, ?, ?, ?, ?)"); SQLitePreparedStatement state3 = database.executeFast("REPLACE INTO randoms VALUES(?, ?)"); SQLitePreparedStatement state4 = database.executeFast("REPLACE INTO download_queue VALUES(?, ?, ?, ?)"); + SQLitePreparedStatement state5 = database.executeFast("REPLACE INTO webpage_pending VALUES(?, ?)"); for (TLRPC.Message message : messages) { long dialog_id = message.dialog_id; @@ -2810,15 +2890,23 @@ public class MessagesStorage { state2.bindByteBuffer(5, data.buffer); state2.step(); } + + if (message.media instanceof TLRPC.TL_messageMediaWebPage && message.media.webpage instanceof TLRPC.TL_webPagePending) { + state5.requery(); + state5.bindLong(1, message.media.webpage.id); + state5.bindInteger(2, message.id); + state5.step(); + } + buffersStorage.reuseFreeBuffer(data); - if (downloadMask != 0) { + if (message.date >= ConnectionsManager.getInstance().getCurrentTime() - 60 * 60 * 24 && downloadMask != 0) { if (message.media instanceof TLRPC.TL_messageMediaAudio || message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo || message.media instanceof TLRPC.TL_messageMediaDocument) { int type = 0; long id = 0; TLObject object = null; if (message.media instanceof TLRPC.TL_messageMediaAudio) { - if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_AUDIO) != 0) { + if ((downloadMask & MediaController.AUTODOWNLOAD_MASK_AUDIO) != 0 && message.media.audio.size < 1024 * 1024 * 5) { id = message.media.audio.id; type = MediaController.AUTODOWNLOAD_MASK_AUDIO; object = message.media.audio; @@ -2864,6 +2952,7 @@ public class MessagesStorage { state2.dispose(); state3.dispose(); state4.dispose(); + state5.dispose(); state = database.executeFast("REPLACE INTO dialogs(did, date, unread_count, last_mid) VALUES(?, ?, ?, ?)"); for (HashMap.Entry pair : messagesMap.entrySet()) { @@ -3543,11 +3632,19 @@ public class MessagesStorage { } private void fixUnsupportedMedia(TLRPC.Message message) { - if (message != null && message.media instanceof TLRPC.TL_messageMediaUnsupported && message.media.bytes != null) { + if (message == null) { + return; + } + boolean ok = false; + if (message.media instanceof TLRPC.TL_messageMediaUnsupported_old) { if (message.media.bytes.length == 0) { message.media.bytes = new byte[1]; message.media.bytes[0] = TLRPC.LAYER; } + } else if (message.media instanceof TLRPC.TL_messageMediaUnsupported) { + message.media = new TLRPC.TL_messageMediaUnsupported_old(); + message.media.bytes = new byte[1]; + message.media.bytes[0] = TLRPC.LAYER; } } @@ -3802,6 +3899,42 @@ public class MessagesStorage { }); } + public TLRPC.User getUserSync(final int user_id) { + final Semaphore semaphore = new Semaphore(0); + final TLRPC.User[] user = new TLRPC.User[1]; + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + user[0] = getUser(user_id); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return user[0]; + } + + public TLRPC.Chat getChatSync(final int user_id) { + final Semaphore semaphore = new Semaphore(0); + final TLRPC.Chat[] chat = new TLRPC.Chat[1]; + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + chat[0] = getChat(user_id); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return chat[0]; + } + public TLRPC.User getUser(final int user_id) { TLRPC.User user = null; try { diff --git a/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java b/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java index 17e55ea26..6eab0a11b 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java @@ -23,7 +23,7 @@ import java.util.zip.ZipFile; public class NativeLoader { - private final static int LIB_VERSION = 6; + private final static int LIB_VERSION = 7; private final static String LIB_NAME = "tmessages." + LIB_VERSION; private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so"; private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so"; diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java index b21a9fd2e..962de6977 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java @@ -49,9 +49,13 @@ public class NotificationCenter { public static final int recentImagesDidLoaded = totalEvents++; public static final int replaceMessagesObjects = totalEvents++; public static final int didSetPasscode = totalEvents++; + public static final int didSetTwoStepPassword = totalEvents++; public static final int screenStateChanged = totalEvents++; public static final int appSwitchedToForeground = totalEvents++; public static final int didLoadedReplyMessages = totalEvents++; + public static final int newSessionReceived = totalEvents++; + public static final int didReceivedWebpages = totalEvents++; + public static final int didReceivedWebpagesInUpdates = totalEvents++; public static final int httpFileDidLoaded = totalEvents++; public static final int httpFileDidFailedLoad = totalEvents++; @@ -64,7 +68,6 @@ public class NotificationCenter { public static final int didReceiveSmsCode = totalEvents++; public static final int emojiDidLoaded = totalEvents++; public static final int appDidLogout = totalEvents++; - public static final int needPasswordEnter = totalEvents++; public static final int FileDidUpload = totalEvents++; public static final int FileDidFailUpload = totalEvents++; diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index 9395c0c4b..1f31a687b 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -71,7 +71,7 @@ public class NotificationsController { private long lastSoundPlay; private MediaPlayer mediaPlayerIn; private MediaPlayer mediaPlayerOut; - private AudioManager audioManager; + protected AudioManager audioManager; private static volatile NotificationsController Instance = null; public static NotificationsController getInstance() { @@ -171,7 +171,7 @@ public class NotificationsController { msg = LocaleController.formatString("NotificationUnrecognizedDevice", R.string.NotificationUnrecognizedDevice, UserConfig.getCurrentUser().first_name, date, messageObject.messageOwner.action.title, messageObject.messageOwner.action.address); } } else { - if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty) { + if (messageObject.isMediaEmpty()) { if (!shortMessage) { if (messageObject.messageOwner.message != null && messageObject.messageOwner.message.length() != 0) { msg = LocaleController.formatString("NotificationMessageText", R.string.NotificationMessageText, ContactsController.formatName(user.first_name, user.last_name), messageObject.messageOwner.message); @@ -236,7 +236,7 @@ public class NotificationsController { msg = messageObject.messageText.toString(); } } else { - if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty) { + if (messageObject.isMediaEmpty()) { if (!shortMessage && messageObject.messageOwner.message != null && messageObject.messageOwner.message.length() != 0) { msg = LocaleController.formatString("NotificationMessageGroupText", R.string.NotificationMessageGroupText, ContactsController.formatName(user.first_name, user.last_name), chat.title, messageObject.messageOwner.message); } else { @@ -868,7 +868,7 @@ public class NotificationsController { AssetFileDescriptor assetFileDescriptor = ApplicationLoader.applicationContext.getResources().openRawResourceFd(R.raw.sound_in); if (assetFileDescriptor != null) { mediaPlayerIn = new MediaPlayer(); - mediaPlayerIn.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); + mediaPlayerIn.setAudioStreamType(AudioManager.STREAM_SYSTEM); mediaPlayerIn.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); mediaPlayerIn.setLooping(false); assetFileDescriptor.close(); @@ -938,7 +938,7 @@ public class NotificationsController { AssetFileDescriptor assetFileDescriptor = ApplicationLoader.applicationContext.getResources().openRawResourceFd(R.raw.sound_out); if (assetFileDescriptor != null) { mediaPlayerOut = new MediaPlayer(); - mediaPlayerOut.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); + mediaPlayerOut.setAudioStreamType(AudioManager.STREAM_SYSTEM); mediaPlayerOut.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); mediaPlayerOut.setLooping(false); assetFileDescriptor.close(); diff --git a/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java b/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java index e9d672fc0..6a34ea267 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java @@ -119,7 +119,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -224,7 +224,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -252,7 +252,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -283,7 +283,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -312,7 +312,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -343,7 +343,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -375,7 +375,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -406,7 +406,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -436,7 +436,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -464,7 +464,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -500,7 +500,7 @@ public class SecretChatHelper { reqSend = new TLRPC.TL_decryptedMessageService(); } else { reqSend = new TLRPC.TL_decryptedMessageService_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } @@ -659,7 +659,7 @@ public class SecretChatHelper { int myLayer = Math.max(17, AndroidUtilities.getMyLayerVersion(chat.layer)); layer.layer = Math.min(myLayer, AndroidUtilities.getPeerLayerVersion(chat.layer)); layer.message = req; - layer.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + layer.random_bytes = new byte[15]; Utilities.random.nextBytes(layer.random_bytes); toEncryptObject = layer; @@ -795,7 +795,7 @@ public class SecretChatHelper { @Override public void run() { newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; - NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, newMsgObj.id, newMsgObj.id, newMsgObj); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, newMsgObj.id, newMsgObj.id, newMsgObj, false); SendMessagesHelper.getInstance().processSentMessage(newMsgObj.id); if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { SendMessagesHelper.getInstance().stopVideoService(attachPath); @@ -1104,10 +1104,7 @@ public class SecretChatHelper { } byte[] salt = new byte[256]; - for (int a = 0; a < 256; a++) { - salt[a] = (byte) (Utilities.random.nextDouble() * 256); - } - + Utilities.random.nextBytes(salt); BigInteger p = new BigInteger(1, MessagesStorage.secretPBytes); BigInteger g_b = BigInteger.valueOf(MessagesStorage.secretG); g_b = g_b.modPow(new BigInteger(1, salt), p); @@ -1409,9 +1406,7 @@ public class SecretChatHelper { return; } final byte[] salt = new byte[256]; - for (int a = 0; a < 256; a++) { - salt[a] = (byte) (Utilities.random.nextDouble() * 256); - } + Utilities.random.nextBytes(salt); BigInteger i_g_a = BigInteger.valueOf(MessagesStorage.secretG); i_g_a = i_g_a.modPow(new BigInteger(1, salt), new BigInteger(1, MessagesStorage.secretPBytes)); diff --git a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java index 21639752d..35e6bedea 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java @@ -447,7 +447,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (messageObject == null) { return; } - if (messageObject.messageOwner.media != null && !(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (messageObject.messageOwner.media != null && !(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty) && !(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage)) { if (messageObject.messageOwner.media.photo instanceof TLRPC.TL_photo) { sendMessage((TLRPC.TL_photo) messageObject.messageOwner.media.photo, null, null, did, messageObject.replyMessageObject); } else if (messageObject.messageOwner.media.audio instanceof TLRPC.TL_audio) { @@ -471,14 +471,18 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter sendMessage(messageObject, did); } } else if (messageObject.messageOwner.message != null) { - sendMessage(messageObject.messageOwner.message, did, messageObject.replyMessageObject); + TLRPC.WebPage webPage = null; + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) { + webPage = messageObject.messageOwner.media.webpage; + } + sendMessage(messageObject.messageOwner.message, did, messageObject.replyMessageObject, webPage, true); } else { sendMessage(messageObject, did); } } public void sendMessage(TLRPC.User user, long peer, MessageObject reply_to_msg) { - sendMessage(null, null, null, null, null, null, user, null, null, null, peer, false, null, reply_to_msg); + sendMessage(null, null, null, null, null, null, user, null, null, null, peer, false, null, reply_to_msg, null, true); } public void sendMessage(ArrayList messages, long peer) { @@ -567,67 +571,74 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter req.id = ids; final ArrayList newMsgObjArr = arr; + final HashMap messagesByRandomIdsFinal = messagesByRandomIds; ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { @Override public void run(TLObject response, TLRPC.TL_error error) { if (error == null) { - final TLRPC.messages_StatedMessages res = (TLRPC.messages_StatedMessages) response; - if (newMsgObjArr.size() != res.messages.size()) { - MessagesController.getInstance().getDifference(); - return; - } - if (res instanceof TLRPC.TL_messages_statedMessages) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, -1, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessagesLinks) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, -1, res.pts_count); - } - for (int a = 0; a < res.messages.size(); a++) { - TLRPC.Message message = res.messages.get(a); - final TLRPC.Message newMsgObj = newMsgObjArr.get(a); - if (newMsgObj == null) { - continue; + HashMap newMessagesByIds = new HashMap<>(); + TLRPC.Updates updates = (TLRPC.Updates) response; + for (int a = 0; a < updates.updates.size(); a++) { + TLRPC.Update update = updates.updates.get(a); + if (update instanceof TLRPC.TL_updateMessageID) { + newMessagesByIds.put(update.id, update.random_id); + updates.updates.remove(a); + a--; } - final int oldId = newMsgObj.id; - final ArrayList sentMessages = new ArrayList<>(); - sentMessages.add(message); - newMsgObj.id = message.id; - processSentMessage(newMsgObj, message, null); - MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { - @Override - public void run() { - MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.random_id, oldId, newMsgObj.id, 0, false); - MessagesStorage.getInstance().putMessages(sentMessages, true, false, false, 0); - AndroidUtilities.runOnUIThread(new Runnable() { + } + for (TLRPC.Update update : updates.updates) { + if (update instanceof TLRPC.TL_updateNewMessage) { + MessagesController.getInstance().processNewDifferenceParams(-1, update.pts, -1, update.pts_count); + TLRPC.Message message = ((TLRPC.TL_updateNewMessage) update).message; + Long random_id = newMessagesByIds.get(message.id); + if (random_id != null) { + final TLRPC.Message newMsgObj = messagesByRandomIdsFinal.get(random_id); + if (newMsgObj == null) { + continue; + } + newMsgObjArr.remove(newMsgObj); + final int oldId = newMsgObj.id; + final ArrayList sentMessages = new ArrayList<>(); + sentMessages.add(message); + newMsgObj.id = message.id; + processSentMessage(newMsgObj, message, null); + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { @Override public void run() { - newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; - NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newMsgObj.id, newMsgObj); - processSentMessage(oldId); - removeFromSendingMessages(oldId); + MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.random_id, oldId, newMsgObj.id, 0, false); + MessagesStorage.getInstance().putMessages(sentMessages, true, false, false, 0); + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; + NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newMsgObj.id, newMsgObj, false); + processSentMessage(oldId); + removeFromSendingMessages(oldId); + } + }); + if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { + stopVideoService(newMsgObj.attachPath); + } } }); - if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { - stopVideoService(newMsgObj.attachPath); - } } - }); + } } - } else { - for (final TLRPC.Message newMsgObj : newMsgObjArr) { - MessagesStorage.getInstance().markMessageAsSendError(newMsgObj.id); - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR; - NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, newMsgObj.id); - processSentMessage(newMsgObj.id); - if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { - stopVideoService(newMsgObj.attachPath); - } - removeFromSendingMessages(newMsgObj.id); + } + for (final TLRPC.Message newMsgObj : newMsgObjArr) { + MessagesStorage.getInstance().markMessageAsSendError(newMsgObj.id); + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR; + NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, newMsgObj.id); + processSentMessage(newMsgObj.id); + if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { + stopVideoService(newMsgObj.attachPath); } - }); - } + removeFromSendingMessages(newMsgObj.id); + } + }); } } }, null, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassCanCompress, ConnectionsManager.DEFAULT_DATACENTER_ID); @@ -644,38 +655,38 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } public void sendMessage(MessageObject message) { - sendMessage(null, null, null, null, null, message, null, null, null, null, message.getDialogId(), true, message.messageOwner.attachPath, null); + sendMessage(null, null, null, null, null, message, null, null, null, null, message.getDialogId(), true, message.messageOwner.attachPath, null, null, true); } public void sendMessage(MessageObject message, long peer) { - sendMessage(null, null, null, null, null, message, null, null, null, null, peer, false, message.messageOwner.attachPath, null); + sendMessage(null, null, null, null, null, message, null, null, null, null, peer, false, message.messageOwner.attachPath, null, null, true); } public void sendMessage(TLRPC.TL_document document, String originalPath, String path, long peer, MessageObject reply_to_msg) { - sendMessage(null, null, null, null, null, null, null, document, null, originalPath, peer, false, path, reply_to_msg); + sendMessage(null, null, null, null, null, null, null, document, null, originalPath, peer, false, path, reply_to_msg, null, true); } - public void sendMessage(String message, long peer, MessageObject reply_to_msg) { - sendMessage(message, null, null, null, null, null, null, null, null, null, peer, false, null, reply_to_msg); + public void sendMessage(String message, long peer, MessageObject reply_to_msg, TLRPC.WebPage webPage, boolean searchLinks) { + sendMessage(message, null, null, null, null, null, null, null, null, null, peer, false, null, reply_to_msg, webPage, searchLinks); } public void sendMessage(double lat, double lon, long peer, MessageObject reply_to_msg) { - sendMessage(null, lat, lon, null, null, null, null, null, null, null, peer, false, null, reply_to_msg); + sendMessage(null, lat, lon, null, null, null, null, null, null, null, peer, false, null, reply_to_msg, null, true); } public void sendMessage(TLRPC.TL_photo photo, String originalPath, String path, long peer, MessageObject reply_to_msg) { - sendMessage(null, null, null, photo, null, null, null, null, null, originalPath, peer, false, path, reply_to_msg); + sendMessage(null, null, null, photo, null, null, null, null, null, originalPath, peer, false, path, reply_to_msg, null, true); } public void sendMessage(TLRPC.TL_video video, String originalPath, String path, long peer, MessageObject reply_to_msg) { - sendMessage(null, null, null, null, video, null, null, null, null, originalPath, peer, false, path, reply_to_msg); + sendMessage(null, null, null, null, video, null, null, null, null, originalPath, peer, false, path, reply_to_msg, null, true); } public void sendMessage(TLRPC.TL_audio audio, String path, long peer, MessageObject reply_to_msg) { - sendMessage(null, null, null, null, null, null, null, null, audio, null, peer, false, path, reply_to_msg); + sendMessage(null, null, null, null, null, null, null, null, audio, null, peer, false, path, reply_to_msg, null, true); } - private void sendMessage(String message, Double lat, Double lon, TLRPC.TL_photo photo, TLRPC.TL_video video, MessageObject msgObj, TLRPC.User user, TLRPC.TL_document document, TLRPC.TL_audio audio, String originalPath, long peer, boolean retry, String path, MessageObject reply_to_msg) { + private void sendMessage(String message, Double lat, Double lon, TLRPC.TL_photo photo, TLRPC.TL_video video, MessageObject msgObj, TLRPC.User user, TLRPC.TL_document document, TLRPC.TL_audio audio, String originalPath, long peer, boolean retry, String path, MessageObject reply_to_msg, TLRPC.WebPage webPage, boolean searchLinks) { if (peer == 0) { return; } @@ -741,7 +752,12 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } else { newMsg = new TLRPC.TL_message(); } - newMsg.media = new TLRPC.TL_messageMediaEmpty(); + if (encryptedChat != null || webPage == null) { + newMsg.media = new TLRPC.TL_messageMediaEmpty(); + } else { + newMsg.media = new TLRPC.TL_messageMediaWebPage(); + newMsg.media.webpage = webPage; + } type = 0; newMsg.message = message; } else if (lat != null && lon != null) { @@ -860,6 +876,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (lower_id != 0) { if (high_id == 1) { if (currentChatInfo == null) { + MessagesStorage.getInstance().markMessageAsSendError(newMsg.id); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, newMsg.id); processSentMessage(newMsg.id); return; } @@ -932,9 +950,14 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (encryptedChat == null) { if (sendToPeers != null) { TLRPC.TL_messages_sendBroadcast reqSend = new TLRPC.TL_messages_sendBroadcast(); + ArrayList random_ids = new ArrayList<>(); + for (int a = 0; a < sendToPeers.size(); a++) { + random_ids.add(Utilities.random.nextLong()); + } reqSend.message = message; reqSend.contacts = sendToPeers; reqSend.media = new TLRPC.TL_inputMediaEmpty(); + reqSend.random_id = random_ids; performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); } else { TLRPC.TL_messages_sendMessage reqSend = new TLRPC.TL_messages_sendMessage(); @@ -942,8 +965,12 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter reqSend.peer = sendToPeer; reqSend.random_id = newMsg.random_id; if (reply_to_msg != null) { + reqSend.flags |= 1; reqSend.reply_to_msg_id = reply_to_msg.getId(); } + if (!searchLinks) { + reqSend.flags |= 2; + } performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); } } else { @@ -953,7 +980,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter reqSend.ttl = newMsg.ttl; } else { reqSend = new TLRPC.TL_decryptedMessage_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } reqSend.random_id = newMsg.random_id; @@ -1065,8 +1092,13 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (sendToPeers != null) { TLRPC.TL_messages_sendBroadcast request = new TLRPC.TL_messages_sendBroadcast(); + ArrayList random_ids = new ArrayList<>(); + for (int a = 0; a < sendToPeers.size(); a++) { + random_ids.add(Utilities.random.nextLong()); + } request.contacts = sendToPeers; request.media = inputMedia; + request.random_id = random_ids; request.message = ""; if (delayedMessage != null) { delayedMessage.sendRequest = request; @@ -1078,6 +1110,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter request.random_id = newMsg.random_id; request.media = inputMedia; if (reply_to_msg != null) { + request.flags |= 1; request.reply_to_msg_id = reply_to_msg.getId(); } if (delayedMessage != null) { @@ -1121,7 +1154,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter reqSend.ttl = newMsg.ttl; } else { reqSend = new TLRPC.TL_decryptedMessage_old(); - reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))]; + reqSend.random_bytes = new byte[15]; Utilities.random.nextBytes(reqSend.random_bytes); } reqSend.random_id = newMsg.random_id; @@ -1424,82 +1457,82 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { @Override public void run(TLObject response, TLRPC.TL_error error) { + boolean isSentError = false; if (error == null) { final int oldId = newMsgObj.id; final boolean isBroadcast = req instanceof TLRPC.TL_messages_sendBroadcast; final ArrayList sentMessages = new ArrayList<>(); final String attachPath = newMsgObj.attachPath; - + final boolean mediaUpdated = response instanceof TLRPC.messages_SentMessage && !(((TLRPC.messages_SentMessage) response).media instanceof TLRPC.TL_messageMediaEmpty); if (response instanceof TLRPC.messages_SentMessage) { TLRPC.messages_SentMessage res = (TLRPC.messages_SentMessage) response; - newMsgObj.id = res.id; + newMsgObj.local_id = newMsgObj.id = res.id; newMsgObj.date = res.date; + newMsgObj.media = res.media; if (res instanceof TLRPC.TL_messages_sentMessage) { MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.date, res.pts_count); } else if (res instanceof TLRPC.TL_messages_sentMessageLink) { MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.date, res.pts_count); } - } else if (response instanceof TLRPC.messages_StatedMessage) { - TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - sentMessages.add(res.message); - newMsgObj.id = res.message.id; - processSentMessage(newMsgObj, res.message, originalPath); - if (res instanceof TLRPC.TL_messages_statedMessage) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.message.date, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessageLink) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date, res.pts_count); - } - } else if (response instanceof TLRPC.messages_StatedMessages) { - TLRPC.messages_StatedMessages res = (TLRPC.messages_StatedMessages) response; - if (!res.messages.isEmpty()) { - sentMessages.addAll(res.messages); - TLRPC.Message message = res.messages.get(0); - if (!isBroadcast) { - newMsgObj.id = message.id; + sentMessages.add(newMsgObj); + } else if (response instanceof TLRPC.Updates) { + TLRPC.TL_updateNewMessage newMessage = null; + for (TLRPC.Update update : ((TLRPC.Updates) response).updates) { + if (update instanceof TLRPC.TL_updateNewMessage) { + newMessage = (TLRPC.TL_updateNewMessage) update; + break; } - processSentMessage(newMsgObj, message, originalPath); } - if (res instanceof TLRPC.TL_messages_statedMessages) { - MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, -1, res.pts_count); - } else if (res instanceof TLRPC.TL_messages_statedMessagesLinks) { - MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, -1, res.pts_count); + if (newMessage != null) { + sentMessages.add(newMessage.message); + newMsgObj.id = newMessage.message.id; + processSentMessage(newMsgObj, newMessage.message, originalPath); + MessagesController.getInstance().processNewDifferenceParams(-1, newMessage.pts, -1, newMessage.pts_count); + } else { + isSentError = true; } } - MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { - @Override - public void run() { - MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.random_id, oldId, (isBroadcast ? oldId : newMsgObj.id), 0, false); - MessagesStorage.getInstance().putMessages(sentMessages, true, false, isBroadcast, 0); - if (isBroadcast) { - ArrayList currentMessage = new ArrayList<>(); - currentMessage.add(newMsgObj); - newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; - MessagesStorage.getInstance().putMessages(currentMessage, true, false, false, 0); - } - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { + + if (!isSentError) { + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.random_id, oldId, (isBroadcast ? oldId : newMsgObj.id), 0, false); + MessagesStorage.getInstance().putMessages(sentMessages, true, false, isBroadcast, 0); + if (isBroadcast) { + ArrayList currentMessage = new ArrayList<>(); + currentMessage.add(newMsgObj); newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; - if (isBroadcast) { - for (TLRPC.Message message : sentMessages) { - ArrayList arr = new ArrayList<>(); - MessageObject messageObject = new MessageObject(message, null, false); - arr.add(messageObject); - MessagesController.getInstance().updateInterfaceWithMessages(messageObject.getDialogId(), arr, isBroadcast); - } - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); - } - NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, (isBroadcast ? oldId : newMsgObj.id), newMsgObj); - processSentMessage(oldId); - removeFromSendingMessages(oldId); + MessagesStorage.getInstance().putMessages(currentMessage, true, false, false, 0); + } + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; + if (isBroadcast) { + for (TLRPC.Message message : sentMessages) { + ArrayList arr = new ArrayList<>(); + MessageObject messageObject = new MessageObject(message, null, false); + arr.add(messageObject); + MessagesController.getInstance().updateInterfaceWithMessages(messageObject.getDialogId(), arr, isBroadcast); + } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, (isBroadcast ? oldId : newMsgObj.id), newMsgObj, mediaUpdated); + processSentMessage(oldId); + removeFromSendingMessages(oldId); + } + }); + if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { + stopVideoService(attachPath); } - }); - if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) { - stopVideoService(attachPath); } - } - }); + }); + } } else { + isSentError = true; + } + if (isSentError) { MessagesStorage.getInstance().markMessageAsSendError(newMsgObj.id); AndroidUtilities.runOnUIThread(new Runnable() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java b/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java index e94dc43c2..dfde54421 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java @@ -31,7 +31,7 @@ public class WearReplyReceiver extends BroadcastReceiver { if (dialog_id == 0 || max_id == 0) { return; } - SendMessagesHelper.getInstance().sendMessage(text.toString(), dialog_id, null); + SendMessagesHelper.getInstance().sendMessage(text.toString(), dialog_id, null, null, true); MessagesController.getInstance().markDialogAsRead(dialog_id, max_id, max_id, 0, 0, true, false); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java index 0149b8340..3d8fa2a10 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java @@ -1037,11 +1037,6 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. for (int i = 0; i < runningRequests.size(); i++) { RPCRequest request = runningRequests.get(i); - if (UserConfig.waitingForPasswordEnter && (request.flags & RPCRequest.RPCRequestClassWithoutLogin) == 0) { - FileLog.e("tmessages", "skip request " + request.rawRequest + ", need password enter"); - continue; - } - int datacenterId = request.runningDatacenterId; if (datacenterId == DEFAULT_DATACENTER_ID) { if (movingToDatacenterId != DEFAULT_DATACENTER_ID) { @@ -1244,11 +1239,6 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. continue; } - if (UserConfig.waitingForPasswordEnter && (request.flags & RPCRequest.RPCRequestClassWithoutLogin) == 0) { - FileLog.e("tmessages", "skip request " + request.rawRequest + ", need password enter"); - continue; - } - int datacenterId = request.runningDatacenterId; if (datacenterId == DEFAULT_DATACENTER_ID) { if (movingToDatacenterId != DEFAULT_DATACENTER_ID && (request.flags & RPCRequest.RPCRequestClassEnableUnauthorized) == 0) { @@ -2183,10 +2173,6 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. } }); } - if (request.rawRequest instanceof TLRPC.TL_auth_checkPassword) { - UserConfig.setWaitingForPasswordEnter(false); - UserConfig.saveConfig(false); - } request.completionBlock.run(resultContainer.result, null); } } @@ -2194,7 +2180,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. if (implicitError != null && implicitError.code == 401) { isError = true; if (implicitError.text != null && implicitError.text.contains("SESSION_PASSWORD_NEEDED")) { - UserConfig.setWaitingForPasswordEnter(true); + /*UserConfig.setWaitingForPasswordEnter(true); TODO UserConfig.saveConfig(false); if (UserConfig.isClientActivated()) { discardResponse = true; @@ -2204,7 +2190,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. NotificationCenter.getInstance().postNotificationName(NotificationCenter.needPasswordEnter); } }); - } + }*/ } else if (datacenter.datacenterId == currentDatacenterId || datacenter.datacenterId == movingToDatacenterId) { if ((request.flags & RPCRequest.RPCRequestClassGeneric) != 0 && UserConfig.isClientActivated()) { UserConfig.clearConfig(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/RPCRequest.java b/TMessagesProj/src/main/java/org/telegram/messenger/RPCRequest.java index 4e7454e07..180c9446b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/RPCRequest.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/RPCRequest.java @@ -63,7 +63,7 @@ public class RPCRequest { boolean initRequest = false; - ArrayList respondsToMessageIds = new ArrayList(); + ArrayList respondsToMessageIds = new ArrayList<>(); public void addRespondMessageId(long messageId) { respondsToMessageIds.add(messageId); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java index 016c62fe3..c3e862ad6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java @@ -124,8 +124,6 @@ public class TLClassStore { classStore.put(TLRPC.TL_boolTrue.constructor, TLRPC.TL_boolTrue.class); classStore.put(TLRPC.TL_boolFalse.constructor, TLRPC.TL_boolFalse.class); classStore.put(TLRPC.TL_auth_exportedAuthorization.constructor, TLRPC.TL_auth_exportedAuthorization.class); - classStore.put(TLRPC.TL_messages_statedMessagesLinks.constructor, TLRPC.TL_messages_statedMessagesLinks.class); - classStore.put(TLRPC.TL_messages_statedMessages.constructor, TLRPC.TL_messages_statedMessages.class); classStore.put(TLRPC.TL_inputNotifyChats.constructor, TLRPC.TL_inputNotifyChats.class); classStore.put(TLRPC.TL_inputNotifyPeer.constructor, TLRPC.TL_inputNotifyPeer.class); classStore.put(TLRPC.TL_inputNotifyUsers.constructor, TLRPC.TL_inputNotifyUsers.class); @@ -322,8 +320,6 @@ public class TLClassStore { classStore.put(TLRPC.TL_contactFound.constructor, TLRPC.TL_contactFound.class); classStore.put(TLRPC.TL_inputFileBig.constructor, TLRPC.TL_inputFileBig.class); classStore.put(TLRPC.TL_inputFile.constructor, TLRPC.TL_inputFile.class); - classStore.put(TLRPC.TL_messages_statedMessageLink.constructor, TLRPC.TL_messages_statedMessageLink.class); - classStore.put(TLRPC.TL_messages_statedMessage.constructor, TLRPC.TL_messages_statedMessage.class); classStore.put(TLRPC.TL_userFull.constructor, TLRPC.TL_userFull.class); classStore.put(TLRPC.TL_updates_state.constructor, TLRPC.TL_updates_state.class); classStore.put(TLRPC.TL_resPQ.constructor, TLRPC.TL_resPQ.class); @@ -377,6 +373,17 @@ public class TLClassStore { classStore.put(TLRPC.TL_contactLinkHasPhone.constructor, TLRPC.TL_contactLinkHasPhone.class); classStore.put(TLRPC.TL_contactLinkContact.constructor, TLRPC.TL_contactLinkContact.class); classStore.put(TLRPC.TL_messages_affectedMessages.constructor, TLRPC.TL_messages_affectedMessages.class); + classStore.put(TLRPC.TL_updateWebPage.constructor, TLRPC.TL_updateWebPage.class); + classStore.put(TLRPC.TL_webPagePending.constructor, TLRPC.TL_webPagePending.class); + classStore.put(TLRPC.TL_webPageEmpty.constructor, TLRPC.TL_webPageEmpty.class); + classStore.put(TLRPC.TL_webPage.constructor, TLRPC.TL_webPage.class); + classStore.put(TLRPC.TL_messageMediaWebPage.constructor, TLRPC.TL_messageMediaWebPage.class); + classStore.put(TLRPC.TL_authorization.constructor, TLRPC.TL_authorization.class); + classStore.put(TLRPC.TL_account_authorizations.constructor, TLRPC.TL_account_authorizations.class); + classStore.put(TLRPC.TL_account_passwordSettings.constructor, TLRPC.TL_account_passwordSettings.class); + classStore.put(TLRPC.TL_account_passwordInputSettings.constructor, TLRPC.TL_account_passwordInputSettings.class); + classStore.put(TLRPC.TL_auth_passwordRecovery.constructor, TLRPC.TL_auth_passwordRecovery.class); + classStore.put(TLRPC.TL_messages_getWebPagePreview.constructor, TLRPC.TL_messages_getWebPagePreview.class); classStore.put(TLRPC.TL_messageMediaUnsupported_old.constructor, TLRPC.TL_messageMediaUnsupported_old.class); classStore.put(TLRPC.TL_userSelf_old2.constructor, TLRPC.TL_userSelf_old2.class); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java index cd766543f..0789e6cbe 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java @@ -19,7 +19,7 @@ public class TLRPC { public static final int MESSAGE_FLAG_FWD = 4; public static final int MESSAGE_FLAG_REPLY = 8; public static final int MESSAGE_FLAG_MENTION = 16; - public static final int LAYER = 25; + public static final int LAYER = 27; public static class ChatPhoto extends TLObject { public FileLocation photo_small; @@ -272,6 +272,21 @@ public class TLRPC { } } + public static class TL_account_passwordSettings extends TLObject { + public static int constructor = 0xb7b72ab3; + + public String email; + + public void readParams(AbsSerializedData stream) { + email = stream.readString(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(email); + } + } + public static class DocumentAttribute extends TLObject { public int duration; public String file_name; @@ -653,6 +668,57 @@ public class TLRPC { } } + public static class TL_authorization extends TLObject { + public static int constructor = 0x7bf2e6f6; + + public long hash; + public int flags; + public String device_model; + public String platform; + public String system_version; + public int api_id; + public String app_name; + public String app_version; + public int date_created; + public int date_active; + public String ip; + public String country; + public String region; + + public void readParams(AbsSerializedData stream) { + hash = stream.readInt64(); + flags = stream.readInt32(); + device_model = stream.readString(); + platform = stream.readString(); + system_version = stream.readString(); + api_id = stream.readInt32(); + app_name = stream.readString(); + app_version = stream.readString(); + date_created = stream.readInt32(); + date_active = stream.readInt32(); + ip = stream.readString(); + country = stream.readString(); + region = stream.readString(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(hash); + stream.writeInt32(flags); + stream.writeString(device_model); + stream.writeString(platform); + stream.writeString(system_version); + stream.writeInt32(api_id); + stream.writeString(app_name); + stream.writeString(app_version); + stream.writeInt32(date_created); + stream.writeInt32(date_active); + stream.writeString(ip); + stream.writeString(country); + stream.writeString(region); + } + } + public static class DestroySessionRes extends TLObject { public long session_id; } @@ -1114,6 +1180,7 @@ public class TLRPC { public static class MessageMedia extends TLObject { public Video video; public Photo photo; + public WebPage webpage; public Document document; public GeoPoint geo; public Audio audio; @@ -1152,6 +1219,20 @@ public class TLRPC { } } + public static class TL_messageMediaWebPage extends MessageMedia { + public static int constructor = 0xa32dd600; + + + public void readParams(AbsSerializedData stream) { + webpage = (WebPage)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + webpage.serializeToStream(stream); + } + } + public static class TL_messageMediaDocument extends MessageMedia { public static int constructor = 0x2fda2204; @@ -2035,124 +2116,144 @@ public class TLRPC { } } - public static class messages_StatedMessages extends TLObject { - public ArrayList messages = new ArrayList<>(); - public ArrayList chats = new ArrayList<>(); - public ArrayList users = new ArrayList<>(); - public int pts; - public int pts_count; - public ArrayList links = new ArrayList<>(); - public int seq; + public static class WebPage extends TLObject { + public long id; + public int date; + public int flags; + public String url; + public String display_url; + public String type; + public String site_name; + public String title; + public String description; + public Photo photo; + public String embed_url; + public String embed_type; + public int embed_width; + public int embed_height; + public int duration; + public String author; } - public static class TL_messages_statedMessagesLinks extends messages_StatedMessages { - public static int constructor = 0x51be5d19; + public static class TL_webPagePending extends WebPage { + public static int constructor = 0xc586da1c; public void readParams(AbsSerializedData stream) { - stream.readInt32(); - int count = stream.readInt32(); - for (int a = 0; a < count; a++) { - messages.add((Message)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - chats.add((Chat)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - users.add((User)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - pts = stream.readInt32(); - pts_count = stream.readInt32(); - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - links.add((TL_contacts_link)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - seq = stream.readInt32(); + id = stream.readInt64(); + date = stream.readInt32(); } public void serializeToStream(AbsSerializedData stream) { stream.writeInt32(constructor); - stream.writeInt32(0x1cb5c415); - int count = messages.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - messages.get(a).serializeToStream(stream); - } - stream.writeInt32(0x1cb5c415); - count = chats.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - chats.get(a).serializeToStream(stream); - } - stream.writeInt32(0x1cb5c415); - count = users.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - users.get(a).serializeToStream(stream); - } - stream.writeInt32(pts); - stream.writeInt32(pts_count); - stream.writeInt32(0x1cb5c415); - count = links.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - links.get(a).serializeToStream(stream); - } - stream.writeInt32(seq); + stream.writeInt64(id); + stream.writeInt32(date); } } - public static class TL_messages_statedMessages extends messages_StatedMessages { - public static int constructor = 0x7d84b48; + public static class TL_webPageEmpty extends WebPage { + public static int constructor = 0xeb1477e8; public void readParams(AbsSerializedData stream) { - stream.readInt32(); - int count = stream.readInt32(); - for (int a = 0; a < count; a++) { - messages.add((Message)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - chats.add((Chat)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - users.add((User)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - pts = stream.readInt32(); - pts_count = stream.readInt32(); + id = stream.readInt64(); } public void serializeToStream(AbsSerializedData stream) { stream.writeInt32(constructor); - stream.writeInt32(0x1cb5c415); - int count = messages.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - messages.get(a).serializeToStream(stream); + stream.writeInt64(id); + } + } + + public static class TL_auth_passwordRecovery extends TLObject { + public static int constructor = 0x137948a5; + + public String email_pattern; + + public void readParams(AbsSerializedData stream) { + email_pattern = stream.readString(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(email_pattern); + } + } + + public static class TL_webPage extends WebPage { + public static int constructor = 0xa31ea0b5; + + public void readParams(AbsSerializedData stream) { + flags = stream.readInt32(); + id = stream.readInt64(); + url = stream.readString(); + display_url = stream.readString(); + if ((flags & 1) != 0) { + type = stream.readString(); } - stream.writeInt32(0x1cb5c415); - count = chats.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - chats.get(a).serializeToStream(stream); + if ((flags & 2) != 0) { + site_name = stream.readString(); } - stream.writeInt32(0x1cb5c415); - count = users.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - users.get(a).serializeToStream(stream); + if ((flags & 4) != 0) { + title = stream.readString(); + } + if ((flags & 8) != 0) { + description = stream.readString(); + } + if ((flags & 16) != 0) { + photo = (Photo) TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); + } + if ((flags & 32) != 0) { + embed_url = stream.readString(); + embed_type = stream.readString(); + } + if ((flags & 64) != 0) { + embed_width = stream.readInt32(); + embed_height = stream.readInt32(); + } + if ((flags & 128) != 0) { + duration = stream.readInt32(); + } + if ((flags & 256) != 0) { + author = stream.readString(); + } + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeInt64(id); + stream.writeString(url); + stream.writeString(display_url); + if ((flags & 1) != 0) { + stream.writeString(type); + } + if ((flags & 2) != 0) { + stream.writeString(site_name); + } + if ((flags & 4) != 0) { + stream.writeString(title); + } + if ((flags & 8) != 0) { + stream.writeString(description); + } + if ((flags & 16) != 0) { + photo.serializeToStream(stream); + } + if ((flags & 32) != 0) { + stream.writeString(embed_url); + stream.writeString(embed_type); + } + if ((flags & 64) != 0) { + stream.writeInt32(embed_width); + stream.writeInt32(embed_height); + } + if ((flags & 128) != 0) { + stream.writeInt32(duration); + } + if ((flags & 256) != 0) { + stream.writeString(author); } - stream.writeInt32(pts); - stream.writeInt32(pts_count); } } @@ -2317,7 +2418,7 @@ public class TLRPC { stream.readInt32(); int count = stream.readInt32(); for (int a = 0; a < count; a++) { - users.add((User)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); + users.add((User) TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); } } @@ -3536,6 +3637,7 @@ public class TLRPC { public static class messages_SentMessage extends TLObject { public int id; public int date; + public MessageMedia media; public int pts; public int pts_count; public ArrayList links = new ArrayList<>(); @@ -3543,12 +3645,13 @@ public class TLRPC { } public static class TL_messages_sentMessage extends messages_SentMessage { - public static int constructor = 0x900eac40; + public static int constructor = 0x4c3d47f3; public void readParams(AbsSerializedData stream) { id = stream.readInt32(); date = stream.readInt32(); + media = (MessageMedia)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); pts = stream.readInt32(); pts_count = stream.readInt32(); } @@ -3557,18 +3660,20 @@ public class TLRPC { stream.writeInt32(constructor); stream.writeInt32(id); stream.writeInt32(date); + media.serializeToStream(stream); stream.writeInt32(pts); stream.writeInt32(pts_count); } } public static class TL_messages_sentMessageLink extends messages_SentMessage { - public static int constructor = 0xe923400d; + public static int constructor = 0x35a1a663; public void readParams(AbsSerializedData stream) { id = stream.readInt32(); date = stream.readInt32(); + media = (MessageMedia)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); pts = stream.readInt32(); pts_count = stream.readInt32(); stream.readInt32(); @@ -3583,6 +3688,7 @@ public class TLRPC { stream.writeInt32(constructor); stream.writeInt32(id); stream.writeInt32(date); + media.serializeToStream(stream); stream.writeInt32(pts); stream.writeInt32(pts_count); stream.writeInt32(0x1cb5c415); @@ -3820,6 +3926,7 @@ public class TLRPC { public int pts_count; public int max_id; public int version; + public WebPage webpage; public String type; public MessageMedia media; public boolean popup; @@ -3971,6 +4078,20 @@ public class TLRPC { } } + public static class TL_updateWebPage extends Update { + public static int constructor = 0x2cc36971; + + + public void readParams(AbsSerializedData stream) { + webpage = (WebPage)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + webpage.serializeToStream(stream); + } + } + public static class TL_updateServiceNotification extends Update { public static int constructor = 0x382dd3e4; @@ -4765,16 +4886,20 @@ public class TLRPC { public byte[] current_salt; public byte[] new_salt; public String hint; + public boolean has_recovery; + public String email_unconfirmed_pattern; } public static class TL_account_password extends account_Password { - public static int constructor = 0x739e5f72; + public static int constructor = 0x7c18141c; public void readParams(AbsSerializedData stream) { current_salt = stream.readByteArray(); new_salt = stream.readByteArray(); hint = stream.readString(); + has_recovery = stream.readBool(); + email_unconfirmed_pattern = stream.readString(); } public void serializeToStream(AbsSerializedData stream) { @@ -4782,20 +4907,24 @@ public class TLRPC { stream.writeByteArray(current_salt); stream.writeByteArray(new_salt); stream.writeString(hint); + stream.writeBool(has_recovery); + stream.writeString(email_unconfirmed_pattern); } } public static class TL_account_noPassword extends account_Password { - public static int constructor = 0x5770e7a9; + public static int constructor = 0x96dabc18; public void readParams(AbsSerializedData stream) { new_salt = stream.readByteArray(); + email_unconfirmed_pattern = stream.readString(); } public void serializeToStream(AbsSerializedData stream) { stream.writeInt32(constructor); stream.writeByteArray(new_salt); + stream.writeString(email_unconfirmed_pattern); } } @@ -5055,7 +5184,7 @@ public class TLRPC { } public static class TL_config extends TLObject { - public static int constructor = 0x3e6f732a; + public static int constructor = 0x68bac247; public int date; public int expires; @@ -5064,6 +5193,7 @@ public class TLRPC { public ArrayList dc_options = new ArrayList<>(); public int chat_size_max; public int broadcast_size_max; + public int forwarded_count_max; public int online_update_period_ms; public int offline_blur_timeout_ms; public int offline_idle_timeout_ms; @@ -5085,6 +5215,7 @@ public class TLRPC { } chat_size_max = stream.readInt32(); broadcast_size_max = stream.readInt32(); + forwarded_count_max = stream.readInt32(); online_update_period_ms = stream.readInt32(); offline_blur_timeout_ms = stream.readInt32(); offline_idle_timeout_ms = stream.readInt32(); @@ -5113,6 +5244,7 @@ public class TLRPC { } stream.writeInt32(chat_size_max); stream.writeInt32(broadcast_size_max); + stream.writeInt32(forwarded_count_max); stream.writeInt32(online_update_period_ms); stream.writeInt32(offline_blur_timeout_ms); stream.writeInt32(offline_idle_timeout_ms); @@ -5315,7 +5447,7 @@ public class TLRPC { public String phone_number; - public Class responseClass () { + public Class responseClass() { return TL_account_sentChangePhoneCode.class; } @@ -5354,66 +5486,6 @@ public class TLRPC { } } - public static class TL_account_getPassword extends TLObject { - public static int constructor = 0x548a30f5; - - - public Class responseClass () { - return account_Password.class; - } - - public void serializeToStream(AbsSerializedData stream) { - stream.writeInt32(constructor); - } - } - - public static class TL_account_setPassword extends TLObject { - public static int constructor = 0xdd2a4d8f; - - public byte[] current_password_hash; - public byte[] new_salt; - public byte[] new_password_hash; - public String hint; - - public Class responseClass () { - return Bool.class; - } - - public void readParams(AbsSerializedData stream) { - current_password_hash = stream.readByteArray(); - new_salt = stream.readByteArray(); - new_password_hash = stream.readByteArray(); - hint = stream.readString(); - } - - public void serializeToStream(AbsSerializedData stream) { - stream.writeInt32(constructor); - stream.writeByteArray(current_password_hash); - stream.writeByteArray(new_salt); - stream.writeByteArray(new_password_hash); - stream.writeString(hint); - } - } - - public static class TL_auth_checkPassword extends TLObject { - public static int constructor = 0xa63011e; - - public byte[] password_hash; - - public Class responseClass () { - return TL_auth_authorization.class; - } - - public void readParams(AbsSerializedData stream) { - password_hash = stream.readByteArray(); - } - - public void serializeToStream(AbsSerializedData stream) { - stream.writeInt32(constructor); - stream.writeByteArray(password_hash); - } - } - public static class TL_account_updateDeviceLocked extends TLObject { public static int constructor = 0x38df3532; @@ -5433,6 +5505,38 @@ public class TLRPC { } } + public static class TL_account_getAuthorizations extends TLObject { + public static int constructor = 0xe320c158; + + + public Class responseClass () { + return TL_account_authorizations.class; + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_account_resetAuthorization extends TLObject { + public static int constructor = 0xdf77f3bc; + + public long hash; + + public Class responseClass () { + return Bool.class; + } + + public void readParams(AbsSerializedData stream) { + hash = stream.readInt64(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(hash); + } + } + public static class TL_messages_getAllStickers extends TLObject { public static int constructor = 0xaa3bc868; @@ -5452,6 +5556,25 @@ public class TLRPC { } } + public static class TL_messages_getWebPagePreview extends TLObject { + public static int constructor = 0x25223e24; + + public String message; + + public Class responseClass () { + return MessageMedia.class; + } + + public void readParams(AbsSerializedData stream) { + message = stream.readString(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(message); + } + } + public static class TL_account_checkUsername extends TLObject { public static int constructor = 0x2714d86c; @@ -6483,109 +6606,6 @@ public class TLRPC { } } - public static class messages_StatedMessage extends TLObject { - public Message message; - public ArrayList chats = new ArrayList<>(); - public ArrayList users = new ArrayList<>(); - public int pts; - public int pts_count; - public ArrayList links = new ArrayList<>(); - public int seq; - } - - public static class TL_messages_statedMessageLink extends messages_StatedMessage { - public static int constructor = 0x948a288; - - - public void readParams(AbsSerializedData stream) { - message = (Message)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); - stream.readInt32(); - int count = stream.readInt32(); - for (int a = 0; a < count; a++) { - chats.add((Chat)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - users.add((User)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - pts = stream.readInt32(); - pts_count = stream.readInt32(); - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - links.add((TL_contacts_link)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - seq = stream.readInt32(); - } - - public void serializeToStream(AbsSerializedData stream) { - stream.writeInt32(constructor); - message.serializeToStream(stream); - stream.writeInt32(0x1cb5c415); - int count = chats.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - chats.get(a).serializeToStream(stream); - } - stream.writeInt32(0x1cb5c415); - count = users.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - users.get(a).serializeToStream(stream); - } - stream.writeInt32(pts); - stream.writeInt32(pts_count); - stream.writeInt32(0x1cb5c415); - count = links.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - links.get(a).serializeToStream(stream); - } - stream.writeInt32(seq); - } - } - - public static class TL_messages_statedMessage extends messages_StatedMessage { - public static int constructor = 0x96240c6a; - - - public void readParams(AbsSerializedData stream) { - message = (Message)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); - stream.readInt32(); - int count = stream.readInt32(); - for (int a = 0; a < count; a++) { - chats.add((Chat)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - stream.readInt32(); - count = stream.readInt32(); - for (int a = 0; a < count; a++) { - users.add((User)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); - } - pts = stream.readInt32(); - pts_count = stream.readInt32(); - } - - public void serializeToStream(AbsSerializedData stream) { - stream.writeInt32(constructor); - message.serializeToStream(stream); - stream.writeInt32(0x1cb5c415); - int count = chats.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - chats.get(a).serializeToStream(stream); - } - stream.writeInt32(0x1cb5c415); - count = users.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - users.get(a).serializeToStream(stream); - } - stream.writeInt32(pts); - stream.writeInt32(pts_count); - } - } - public static class TL_userFull extends TLObject { public static int constructor = 0x771095da; @@ -7283,6 +7303,41 @@ public class TLRPC { } } + public static class TL_account_passwordInputSettings extends TLObject { + public static int constructor = 0xbcfc532c; + + public int flags; + public byte[] new_salt; + public byte[] new_password_hash; + public String hint; + public String email; + + public void readParams(AbsSerializedData stream) { + flags = stream.readInt32(); + if ((flags & 1) != 0) { + new_salt = stream.readByteArray(); + new_password_hash = stream.readByteArray(); + hint = stream.readString(); + } + if ((flags & 2) != 0) { + email = stream.readString(); + } + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + if ((flags & 1) != 0) { + stream.writeByteArray(new_salt); + stream.writeByteArray(new_password_hash); + stream.writeString(hint); + } + if ((flags & 2) != 0) { + stream.writeString(email); + } + } + } + public static class TL_dcOption extends TLObject { public static int constructor = 0x2ec2a43c; @@ -7489,6 +7544,30 @@ public class TLRPC { } } + public static class TL_account_authorizations extends TLObject { + public static int constructor = 0x1250abde; + + public ArrayList authorizations = new ArrayList<>(); + + public void readParams(AbsSerializedData stream) { + stream.readInt32(); + int count = stream.readInt32(); + for (int a = 0; a < count; a++) { + authorizations.add((TL_authorization)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); + } + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(0x1cb5c415); + int count = authorizations.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + authorizations.get(a).serializeToStream(stream); + } + } + } + public static class TL_req_pq extends TLObject { public static int constructor = 0x60469778; @@ -8375,8 +8454,9 @@ public class TLRPC { } public static class TL_messages_sendMessage extends TLObject { - public static int constructor = 0x1ca852a1; + public static int constructor = 0x9add8f26; + public int flags; public InputPeer peer; public int reply_to_msg_id; public String message; @@ -8387,58 +8467,71 @@ public class TLRPC { } public void readParams(AbsSerializedData stream) { + flags = stream.readInt32(); peer = (InputPeer)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); - reply_to_msg_id = stream.readInt32(); + if ((flags & 1) != 0) { + reply_to_msg_id = stream.readInt32(); + } message = stream.readString(); random_id = stream.readInt64(); } public void serializeToStream(AbsSerializedData stream) { stream.writeInt32(constructor); + stream.writeInt32(flags); peer.serializeToStream(stream); - stream.writeInt32(reply_to_msg_id); + if ((flags & 1) != 0) { + stream.writeInt32(reply_to_msg_id); + } stream.writeString(message); stream.writeInt64(random_id); } } public static class TL_messages_sendMedia extends TLObject { - public static int constructor = 0xfcee7fc0; + public static int constructor = 0x2d7923b1; + public int flags; public InputPeer peer; public int reply_to_msg_id; public InputMedia media; public long random_id; public Class responseClass () { - return messages_StatedMessage.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { + flags = stream.readInt32(); peer = (InputPeer)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); - reply_to_msg_id = stream.readInt32(); + if ((flags & 1) != 0) { + reply_to_msg_id = stream.readInt32(); + } media = (InputMedia)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); random_id = stream.readInt64(); } public void serializeToStream(AbsSerializedData stream) { stream.writeInt32(constructor); + stream.writeInt32(flags); peer.serializeToStream(stream); - stream.writeInt32(reply_to_msg_id); + if ((flags & 1) != 0) { + stream.writeInt32(reply_to_msg_id); + } media.serializeToStream(stream); stream.writeInt64(random_id); } } public static class TL_messages_forwardMessages extends TLObject { - public static int constructor = 0xded42045; + public static int constructor = 0x55e1728d; public InputPeer peer; public ArrayList id = new ArrayList<>(); public ArrayList random_id = new ArrayList<>(); public Class responseClass () { - return messages_StatedMessages.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8521,13 +8614,13 @@ public class TLRPC { } public static class TL_messages_editChatTitle extends TLObject { - public static int constructor = 0xb4bc68b5; + public static int constructor = 0xdc452855; public int chat_id; public String title; public Class responseClass () { - return messages_StatedMessage.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8543,13 +8636,13 @@ public class TLRPC { } public static class TL_messages_editChatPhoto extends TLObject { - public static int constructor = 0xd881821d; + public static int constructor = 0xca4c79d8; public int chat_id; public InputChatPhoto photo; public Class responseClass () { - return messages_StatedMessage.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8565,14 +8658,14 @@ public class TLRPC { } public static class TL_messages_addChatUser extends TLObject { - public static int constructor = 0x2ee9ee9e; + public static int constructor = 0xf9a0aa09; public int chat_id; public InputUser user_id; public int fwd_limit; public Class responseClass () { - return messages_StatedMessage.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8590,13 +8683,13 @@ public class TLRPC { } public static class TL_messages_deleteChatUser extends TLObject { - public static int constructor = 0xc3c5cd23; + public static int constructor = 0xe0611f16; public int chat_id; public InputUser user_id; public Class responseClass () { - return messages_StatedMessage.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8612,13 +8705,13 @@ public class TLRPC { } public static class TL_messages_createChat extends TLObject { - public static int constructor = 0x419d9aee; + public static int constructor = 0x9cb126e; public ArrayList users = new ArrayList<>(); public String title; public Class responseClass () { - return messages_StatedMessage.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8635,8 +8728,8 @@ public class TLRPC { stream.writeInt32(0x1cb5c415); int count = users.size(); stream.writeInt32(count); - for (InputUser user : users) { - user.serializeToStream(stream); + for (int a = 0; a < count; a++) { + users.get(a).serializeToStream(stream); } stream.writeString(title); } @@ -8911,14 +9004,14 @@ public class TLRPC { } public static class TL_messages_forwardMessage extends TLObject { - public static int constructor = 0x3f3f4f2; + public static int constructor = 0x33963bf9; public InputPeer peer; public int id; public long random_id; - public Class responseClass() { - return messages_StatedMessage.class; + public Class responseClass () { + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8936,14 +9029,15 @@ public class TLRPC { } public static class TL_messages_sendBroadcast extends TLObject { - public static int constructor = 0x41bb0972; + public static int constructor = 0xbf73f4da; public ArrayList contacts = new ArrayList<>(); + public ArrayList random_id = new ArrayList<>(); public String message; public InputMedia media; public Class responseClass () { - return messages_StatedMessages.class; + return Updates.class; } public void readParams(AbsSerializedData stream) { @@ -8952,6 +9046,11 @@ public class TLRPC { for (int a = 0; a < count; a++) { contacts.add((InputUser)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32())); } + stream.readInt32(); + count = stream.readInt32(); + for (int a = 0; a < count; a++) { + random_id.add(stream.readInt64()); + } message = stream.readString(); media = (InputMedia)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); } @@ -8961,8 +9060,14 @@ public class TLRPC { stream.writeInt32(0x1cb5c415); int count = contacts.size(); stream.writeInt32(count); - for (InputUser contact : contacts) { - contact.serializeToStream(stream); + for (int a = 0; a < count; a++) { + contacts.get(a).serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + count = random_id.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + stream.writeInt64(random_id.get(a)); } stream.writeString(message); media.serializeToStream(stream); @@ -9432,6 +9537,111 @@ public class TLRPC { } } + public static class TL_account_getPassword extends TLObject { + public static int constructor = 0x548a30f5; + + + public Class responseClass () { + return account_Password.class; + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_account_getPasswordSettings extends TLObject { + public static int constructor = 0xbc8d11bb; + + public byte[] current_password_hash; + + public Class responseClass () { + return TL_account_passwordSettings.class; + } + + public void readParams(AbsSerializedData stream) { + current_password_hash = stream.readByteArray(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeByteArray(current_password_hash); + } + } + + public static class TL_account_updatePasswordSettings extends TLObject { + public static int constructor = 0xfa7c4b86; + + public byte[] current_password_hash; + public TL_account_passwordInputSettings new_settings; + + public Class responseClass () { + return Bool.class; + } + + public void readParams(AbsSerializedData stream) { + current_password_hash = stream.readByteArray(); + new_settings = (TL_account_passwordInputSettings)TLClassStore.Instance().TLdeserialize(stream, stream.readInt32()); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeByteArray(current_password_hash); + new_settings.serializeToStream(stream); + } + } + + public static class TL_auth_checkPassword extends TLObject { + public static int constructor = 0xa63011e; + + public byte[] password_hash; + + public Class responseClass () { + return TL_auth_authorization.class; + } + + public void readParams(AbsSerializedData stream) { + password_hash = stream.readByteArray(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeByteArray(password_hash); + } + } + + public static class TL_auth_requestPasswordRecovery extends TLObject { + public static int constructor = 0xd897bc66; + + + public Class responseClass () { + return TL_auth_passwordRecovery.class; + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_auth_recoverPassword extends TLObject { + public static int constructor = 0x4ea56e92; + + public String code; + + public Class responseClass () { + return TL_auth_authorization.class; + } + + public void readParams(AbsSerializedData stream) { + code = stream.readString(); + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(code); + } + } + //manually created public static class TL_documentAttributeSticker_old extends TL_documentAttributeSticker { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index 6974ca94c..42e44a7ca 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -30,7 +30,6 @@ public class UserConfig { private final static Object sync = new Object(); public static boolean saveIncomingPhotos = false; public static int contactsVersion = 1; - public static boolean waitingForPasswordEnter = false; public static String passcodeHash = ""; public static boolean appLocked = false; public static int passcodeType = 0; @@ -67,7 +66,6 @@ public class UserConfig { editor.putInt("lastBroadcastId", lastBroadcastId); editor.putBoolean("registeredForInternalPush", registeredForInternalPush); editor.putBoolean("blockedUsersLoaded", blockedUsersLoaded); - editor.putBoolean("waitingForPasswordEnter", waitingForPasswordEnter); editor.putString("passcodeHash1", passcodeHash); editor.putBoolean("appLocked", appLocked); editor.putInt("passcodeType", passcodeType); @@ -101,18 +99,6 @@ public class UserConfig { } } - public static boolean isWaitingForPasswordEnter() { - synchronized (sync) { - return waitingForPasswordEnter; - } - } - - public static void setWaitingForPasswordEnter(boolean value) { - synchronized (sync) { - waitingForPasswordEnter = value; - } - } - public static int getClientUserId() { synchronized (sync) { return currentUser != null ? currentUser.id : 0; @@ -208,7 +194,6 @@ public class UserConfig { lastBroadcastId = preferences.getInt("lastBroadcastId", -1); registeredForInternalPush = preferences.getBoolean("registeredForInternalPush", false); blockedUsersLoaded = preferences.getBoolean("blockedUsersLoaded", false); - waitingForPasswordEnter = preferences.getBoolean("waitingForPasswordEnter", false); passcodeHash = preferences.getString("passcodeHash1", ""); appLocked = preferences.getBoolean("appLocked", false); passcodeType = preferences.getInt("passcodeType", 0); @@ -231,7 +216,6 @@ public class UserConfig { currentUser = null; registeredForInternalPush = false; registeredForPush = false; - waitingForPasswordEnter = false; contactsHash = ""; importHash = ""; lastSendMessageId = -210000; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java index 47e2c951b..3a42f6c6f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java @@ -21,7 +21,6 @@ import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; -import android.text.Html; import android.text.SpannableStringBuilder; import android.util.Base64; @@ -29,6 +28,8 @@ import net.hockeyapp.android.CrashManager; import net.hockeyapp.android.CrashManagerListener; import net.hockeyapp.android.UpdateManager; +import org.telegram.android.AndroidUtilities; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -108,6 +109,7 @@ public class Utilities { public native static long doPQNative(long _what); public native static void loadBitmap(String path, Bitmap bitmap, int scale, int width, int height, int stride); + public native static int pinBitmap(Bitmap bitmap); public native static void blurBitmap(Object bitmap, int radius); public native static void calcCDT(ByteBuffer hsvBuffer, int width, int height, ByteBuffer buffer); public native static Bitmap loadWebpImage(ByteBuffer buffer, int len, BitmapFactory.Options options); @@ -145,6 +147,9 @@ public class Utilities { } public static String bytesToHex(byte[] bytes) { + if (bytes == null) { + return ""; + } char[] hexChars = new char[bytes.length * 2]; int v; for (int j = 0; j < bytes.length; j++) { @@ -156,6 +161,9 @@ public class Utilities { } public static byte[] hexToBytes(String hex) { + if (hex == null) { + return null; + } int len = hex.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { @@ -685,7 +693,7 @@ public class Utilities { builder.append(" "); } query.trim(); - builder.append(Html.fromHtml("" + query + "")); + builder.append(AndroidUtilities.replaceTags("" + query + "")); lastIndex = end; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java deleted file mode 100644 index a7c4f6b2c..000000000 --- a/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java +++ /dev/null @@ -1,629 +0,0 @@ -/* - * This is the source code of Telegram for Android v. 2.0.x. - * It is licensed under GNU GPL v. 2 or later. - * You should have received a copy of the license in this archive (see LICENSE). - * - * Copyright Nikolai Kudashov, 2013-2014. - */ - -package org.telegram.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.ProgressDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.FrameLayout; -import android.widget.ListView; -import android.widget.ProgressBar; - -import org.telegram.android.AndroidUtilities; -import org.telegram.android.ContactsController; -import org.telegram.android.LocaleController; -import org.telegram.android.MessagesController; -import org.telegram.android.MessagesStorage; -import org.telegram.android.NotificationCenter; -import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.ConnectionsManager; -import org.telegram.messenger.FileLog; -import org.telegram.messenger.R; -import org.telegram.messenger.RPCRequest; -import org.telegram.messenger.TLObject; -import org.telegram.messenger.TLRPC; -import org.telegram.messenger.UserConfig; -import org.telegram.messenger.Utilities; -import org.telegram.ui.ActionBar.ActionBar; -import org.telegram.ui.ActionBar.ActionBarMenu; -import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.Adapters.BaseFragmentAdapter; -import org.telegram.ui.Cells.HeaderCell; -import org.telegram.ui.Cells.TextFieldCell; -import org.telegram.ui.Cells.TextInfoPrivacyCell; -import org.telegram.ui.Cells.TextSettingsCell; - -import java.util.ArrayList; - -public class AccountPasswordActivity extends BaseFragment { - - private ListAdapter listAdapter; - private TextFieldCell oldPasswordCell; - private TextFieldCell newPasswordCell; - private TextFieldCell verifyPasswordCell; - private TextFieldCell hintPasswordCell; - private View doneButton; - private ProgressDialog progressDialog; - - private int type; - private boolean hasPassword; - private boolean loading; - private byte[] new_salt; - private String hint; - private byte[] current_salt; - - private int changePasswordSectionRow; - private int oldPasswordRow; - private int newPasswordRow; - private int verifyPasswordRow; - private int hintRow; - private int passwordDetailRow; - private int deleteAccountSection; - private int deleteAccountRow; - private int deleteAccountDetailRow; - private int rowCount; - - private final static int done_button = 1; - - public AccountPasswordActivity(int type) { - super(); - this.type = type; - } - - @Override - public boolean onFragmentCreate() { - super.onFragmentCreate(); - - getCurrentPassword(); - - return true; - } - - @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - if (type == 0) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - } - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("Password", R.string.Password)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - doneWithPassword(); - } - } - }); - - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - doneButton.setVisibility(loading ? View.GONE : View.VISIBLE); - - if (type == 0) { - oldPasswordCell = new TextFieldCell(getParentActivity()); - oldPasswordCell.setFieldTitleAndHint(LocaleController.getString("OldPassword", R.string.OldPassword), LocaleController.getString("EnterOldPassword", R.string.EnterOldPassword), AndroidUtilities.dp(10), true); - oldPasswordCell.setBackgroundColor(0xffffffff); - newPasswordCell = new TextFieldCell(getParentActivity()); - newPasswordCell.setFieldTitleAndHint(LocaleController.getString("NewPassword", R.string.NewPassword), LocaleController.getString("EnterNewPassword", R.string.EnterNewPassword), 0, true); - newPasswordCell.setBackgroundColor(0xffffffff); - verifyPasswordCell = new TextFieldCell(getParentActivity()); - verifyPasswordCell.setFieldTitleAndHint(null, LocaleController.getString("VerifyNewPassword", R.string.VerifyNewPassword), AndroidUtilities.dp(10), true); - verifyPasswordCell.setBackgroundColor(0xffffffff); - hintPasswordCell = new TextFieldCell(getParentActivity()); - hintPasswordCell.setFieldTitleAndHint(LocaleController.getString("PasswordHint", R.string.PasswordHint), LocaleController.getString("EnterHint", R.string.EnterHint), AndroidUtilities.dp(22), false); - hintPasswordCell.setBackgroundColor(0xffffffff); - if (hint != null) { - hintPasswordCell.setFieldText(hint); - } - } else if (type == 1) { - oldPasswordCell = new TextFieldCell(getParentActivity()); - oldPasswordCell.setFieldTitleAndHint(null, LocaleController.getString("EnterYourPassword", R.string.EnterYourPassword), AndroidUtilities.dp(22), true); - oldPasswordCell.setBackgroundColor(0xffffffff); - } - - listAdapter = new ListAdapter(getParentActivity()); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - frameLayout.setBackgroundColor(0xfff0f0f0); - - FrameLayout progressView = new FrameLayout(getParentActivity()); - frameLayout.addView(progressView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - progressView.setLayoutParams(layoutParams); - - ProgressBar progressBar = new ProgressBar(getParentActivity()); - progressView.addView(progressBar); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER; - progressView.setLayoutParams(layoutParams); - - ListView listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - listView.setDrawSelectorOnTop(true); - listView.setEmptyView(progressView); - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (i == deleteAccountRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureDeleteAccount", R.string.AreYouSureDeleteAccount)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureDeleteAccount2", R.string.AreYouSureDeleteAccount2)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - TLRPC.TL_account_deleteAccount req = new TLRPC.TL_account_deleteAccount(); - req.reason = "Forgot password"; - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(TLObject response, TLRPC.TL_error error) { - if (error == null) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.clear().commit(); - MessagesController.getInstance().unregistedPush(); - MessagesController.getInstance().logOut(); - UserConfig.clearConfig(); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.appDidLogout); - MessagesStorage.getInstance().cleanUp(false); - MessagesController.getInstance().cleanUp(); - ContactsController.getInstance().deleteAllAppAccounts(); - } - }); - } - } - }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassWithoutLogin); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - } - }); - - updateRows(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } - } - return fragmentView; - } - - @Override - public void onResume() { - super.onResume(); - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } - } - - private void updateRows() { - rowCount = 0; - if (!loading) { - if (type == 0) { - changePasswordSectionRow = rowCount++; - oldPasswordRow = hasPassword ? rowCount++ : -1; - newPasswordRow = rowCount++; - verifyPasswordRow = rowCount++; - hintRow = rowCount++; - passwordDetailRow = rowCount++; - deleteAccountSection = -1; - deleteAccountRow = -1; - deleteAccountDetailRow = -1; - } else if (type == 1) { - changePasswordSectionRow = rowCount++; - oldPasswordRow = rowCount++; - passwordDetailRow = rowCount++; - deleteAccountSection = rowCount++; - deleteAccountDetailRow = rowCount++; - verifyPasswordRow = -1; - newPasswordRow = -1; - hintRow = -1; - deleteAccountRow = -1; - } - doneButton.setVisibility(View.VISIBLE); - } - listAdapter.notifyDataSetChanged(); - } - - private void ShowAlert(final String text) { - if (text == null || getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(text); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - showAlertDialog(builder); - } - - private void needShowProgress() { - if (getParentActivity() == null || getParentActivity().isFinishing() || progressDialog != null) { - return; - } - progressDialog = new ProgressDialog(getParentActivity()); - progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.setCancelable(false); - progressDialog.show(); - } - - private void needHideProgress() { - if (progressDialog == null) { - return; - } - try { - progressDialog.dismiss(); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - progressDialog = null; - } - - private void getCurrentPassword() { - loading = true; - TLRPC.TL_account_getPassword req = new TLRPC.TL_account_getPassword(); - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - loading = false; - TLRPC.account_Password res = (TLRPC.account_Password) response; - if (res instanceof TLRPC.TL_account_noPassword) { - hasPassword = false; - new_salt = res.new_salt; - hint = null; - current_salt = null; - } else if (res instanceof TLRPC.TL_account_password) { - hasPassword = true; - new_salt = res.new_salt; - hint = res.hint; - current_salt = res.current_salt; - } else { - new_salt = null; - hint = null; - current_salt = null; - } - if (new_salt != null) { - byte[] salt = new byte[new_salt.length + 16]; - Utilities.random.nextBytes(salt); - System.arraycopy(new_salt, 0, salt, 0, new_salt.length); - new_salt = salt; - } - if (type == 0 && hintPasswordCell != null && hint != null) { - hintPasswordCell.setFieldText(hint); - } - updateRows(); - } - }); - } - }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); - } - - private void doneWithPassword() { - if (type == 0) { - String oldPassword = oldPasswordCell.getFieldText(); - String newPassword = newPasswordCell.getFieldText(); - String verifyPasswrod = verifyPasswordCell.getFieldText(); - String hint = hintPasswordCell.getFieldText(); - if (hasPassword) { - if (oldPassword.length() == 0) { - ShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); - return; - } - } - if (newPassword.length() == 0) { - ShowAlert(LocaleController.getString("PasswordNewIncorrect", R.string.PasswordNewIncorrect)); - return; - } - if (!newPassword.equals(verifyPasswrod)) { - ShowAlert(LocaleController.getString("PasswordDoNotMatch", R.string.PasswordDoNotMatch)); - return; - } - if (hint.toLowerCase().contains(newPassword.toLowerCase())) { - ShowAlert(LocaleController.getString("HintIncorrect", R.string.HintIncorrect)); - return; - } - byte[] oldPasswordBytes = null; - byte[] newPasswordBytes = null; - try { - oldPasswordBytes = oldPassword.getBytes("UTF-8"); - newPasswordBytes = newPassword.getBytes("UTF-8"); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - - TLRPC.TL_account_setPassword req = new TLRPC.TL_account_setPassword(); - req.hint = hintPasswordCell.getFieldText(); - if (req.hint == null) { - req.hint = ""; - } - if (hasPassword) { - byte[] hash = new byte[current_salt.length * 2 + oldPasswordBytes.length]; - System.arraycopy(current_salt, 0, hash, 0, current_salt.length); - System.arraycopy(oldPasswordBytes, 0, hash, oldPasswordBytes.length, oldPasswordBytes.length); - System.arraycopy(current_salt, 0, hash, hash.length - current_salt.length, current_salt.length); - req.current_password_hash = Utilities.computeSHA256(hash, 0, hash.length); - } else { - req.current_password_hash = new byte[0]; - } - - needShowProgress(); - byte[] hash = new byte[new_salt.length * 2 + newPasswordBytes.length]; - System.arraycopy(new_salt, 0, hash, 0, new_salt.length); - System.arraycopy(newPasswordBytes, 0, hash, newPasswordBytes.length, newPasswordBytes.length); - System.arraycopy(new_salt, 0, hash, hash.length - new_salt.length, new_salt.length); - req.new_password_hash = Utilities.computeSHA256(hash, 0, hash.length); - req.new_salt = new_salt; - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - needHideProgress(); - if (error == null) { - UserConfig.registeredForPush = false; - UserConfig.registeredForInternalPush = false; - UserConfig.saveConfig(false); - MessagesController.getInstance().registerForPush(UserConfig.pushString); - ConnectionsManager.getInstance().initPushConnection(); - finishFragment(); - } else { - if (error.text.contains("PASSWORD_HASH_INVALID")) { - ShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); - } else if (error.text.contains("NEW_PASSWORD_BAD")) { - ShowAlert(LocaleController.getString("PasswordNewIncorrect", R.string.PasswordNewIncorrect)); - } else if (error.text.startsWith("FLOOD_WAIT")) { - ShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); - } else { - ShowAlert(error.text); - } - } - } - }); - } - }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors); - } else if (type == 1) { - String oldPassword = oldPasswordCell.getFieldText(); - if (oldPassword.length() == 0) { - ShowAlert(LocaleController.getString("PasswordIncorrect", R.string.PasswordIncorrect)); - return; - } - byte[] oldPasswordBytes = null; - try { - oldPasswordBytes = oldPassword.getBytes("UTF-8"); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - - needShowProgress(); - byte[] hash = new byte[current_salt.length * 2 + oldPasswordBytes.length]; - System.arraycopy(current_salt, 0, hash, 0, current_salt.length); - System.arraycopy(oldPasswordBytes, 0, hash, oldPasswordBytes.length, oldPasswordBytes.length); - System.arraycopy(current_salt, 0, hash, hash.length - current_salt.length, current_salt.length); - - TLRPC.TL_auth_checkPassword req = new TLRPC.TL_auth_checkPassword(); - req.password_hash = Utilities.computeSHA256(hash, 0, hash.length); - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - needHideProgress(); - if (error == null) { - if (UserConfig.isClientActivated()) { - presentFragment(new MessagesActivity(null), true); - UserConfig.registeredForPush = false; - UserConfig.registeredForInternalPush = false; - UserConfig.saveConfig(false); - MessagesController.getInstance().registerForPush(UserConfig.pushString); - ConnectionsManager.getInstance().initPushConnection(); - } else { - TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization)response; - UserConfig.clearConfig(); - MessagesController.getInstance().cleanUp(); - UserConfig.setCurrentUser(res.user); - UserConfig.saveConfig(true); - MessagesStorage.getInstance().cleanUp(true); - ArrayList users = new ArrayList<>(); - users.add(res.user); - MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); - MessagesController.getInstance().putUser(res.user, false); - ContactsController.getInstance().checkAppAccount(); - MessagesController.getInstance().getBlockedUsers(true); - presentFragment(new MessagesActivity(null), true); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); - ConnectionsManager.getInstance().initPushConnection(); - } - } else { - if (error.text.contains("PASSWORD_HASH_INVALID")) { - ShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); - } else if (error.text.startsWith("FLOOD_WAIT")) { - ShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); - } else { - ShowAlert(error.text); - } - } - } - }); - } - }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); - } - } - - private class ListAdapter extends BaseFragmentAdapter { - private Context mContext; - - public ListAdapter(Context context) { - mContext = context; - } - - @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int i) { - return i == deleteAccountRow; - } - - @Override - public int getCount() { - return rowCount; - } - - @Override - public Object getItem(int i) { - return null; - } - - @Override - public long getItemId(int i) { - return i; - } - - @Override - public boolean hasStableIds() { - return false; - } - - @Override - public View getView(int i, View view, ViewGroup viewGroup) { - int viewType = getItemViewType(i); - if (viewType == 0) { - if (view == null) { - view = new TextInfoPrivacyCell(mContext); - } - if (i == passwordDetailRow) { - if (type == 0) { - ((TextInfoPrivacyCell) view).setText(LocaleController.getString("PasswordImportant", R.string.PasswordImportant)); - } else if (type == 1) { - ((TextInfoPrivacyCell) view).setText(hint == null || hint.length() == 0 ? "" : LocaleController.formatString("PasswordHintDetail", R.string.PasswordHintDetail, hint)); - } - ((TextInfoPrivacyCell) view).setTextColor(0xffcf3030); - if (deleteAccountDetailRow != -1) { - view.setBackgroundResource(R.drawable.greydivider); - } else { - view.setBackgroundResource(R.drawable.greydivider_bottom); - } - } else if (i == deleteAccountDetailRow) { - ((TextInfoPrivacyCell) view).setText(LocaleController.getString("DeleteAccountImportant", R.string.DeleteAccountImportant)); - ((TextInfoPrivacyCell) view).setTextColor(0xffcf3030); - view.setBackgroundResource(R.drawable.greydivider_bottom); - } - } else if (viewType == 1) { - if (view == null) { - view = new HeaderCell(mContext); - view.setBackgroundColor(0xffffffff); - } - if (i == changePasswordSectionRow) { - if (type == 0) { - ((HeaderCell) view).setText(LocaleController.getString("ChangePassword", R.string.ChangePassword)); - } else if (type == 1) { - ((HeaderCell) view).setText(LocaleController.getString("EnterPassword", R.string.EnterPassword)); - } - } else if (i == deleteAccountSection) { - ((HeaderCell) view).setText(LocaleController.getString("PasswordDeleteAccountTitle", R.string.PasswordDeleteAccountTitle)); - } - } else if (viewType == 2) { - return newPasswordCell; - } else if (viewType == 3) { - return oldPasswordCell; - } else if (viewType == 4) { - return verifyPasswordCell; - } else if (viewType == 5) { - return hintPasswordCell; - } else if (viewType == 6) { - if (view == null) { - view = new TextSettingsCell(mContext); - view.setBackgroundColor(0xffffffff); - } - TextSettingsCell textCell = (TextSettingsCell) view; - if (i == deleteAccountRow) { - textCell.setText(LocaleController.getString("PasswordDeleteAccount", R.string.PasswordDeleteAccount), false); - } - } - return view; - } - - @Override - public int getItemViewType(int i) { - if (i == passwordDetailRow || i == deleteAccountDetailRow) { - return 0; - } else if (i == changePasswordSectionRow || i == deleteAccountSection) { - return 1; - } else if (i == newPasswordRow) { - return 2; - } else if (i == oldPasswordRow) { - return 3; - } else if (i == verifyPasswordRow) { - return 4; - } else if (i == hintRow) { - return 5; - } else if (i == deleteAccountRow) { - return 6; - } - return 0; - } - - @Override - public int getViewTypeCount() { - return 7; - } - - @Override - public boolean isEmpty() { - return rowCount == 0; - } - } -} 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 a04d43228..8c94548bf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java @@ -121,18 +121,10 @@ public class ActionBar extends FrameLayout { } int x = 0; - if (backButtonImageView != null) { - if (AndroidUtilities.isTablet()) { - x = AndroidUtilities.dp(80); - } else { - x = AndroidUtilities.dp(72); - } + if (backButtonImageView != null && backButtonImageView.getVisibility() == VISIBLE) { + x = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 80 : 72); } else { - if (AndroidUtilities.isTablet()) { - x = AndroidUtilities.dp(26); - } else { - x = AndroidUtilities.dp(18); - } + x = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18); } if (menu != null) { @@ -202,17 +194,31 @@ public class ActionBar extends FrameLayout { } public void setBackButtonDrawable(Drawable drawable) { + boolean reposition = false; if (backButtonImageView == null) { createBackButtonImage(); + } else { + reposition = true; } + backButtonImageView.setVisibility(drawable == null ? GONE : VISIBLE); backButtonImageView.setImageDrawable(drawable); + if (reposition) { + positionTitle(getMeasuredWidth(), getMeasuredHeight()); + } } public void setBackButtonImage(int resource) { + boolean reposition = false; if (backButtonImageView == null) { createBackButtonImage(); + } else { + reposition = true; } + backButtonImageView.setVisibility(resource == 0 ? GONE : VISIBLE); backButtonImageView.setImageResource(resource); + if (reposition) { + positionTitle(getMeasuredWidth(), getMeasuredHeight()); + } } private void createSubtitleTextView() { @@ -234,7 +240,7 @@ public class ActionBar extends FrameLayout { createSubtitleTextView(); } if (subTitleTextView != null) { - subTitleTextView.setVisibility(value != null && !isSearchFieldVisible ? VISIBLE : GONE); + subTitleTextView.setVisibility(value != null && !isSearchFieldVisible ? VISIBLE : INVISIBLE); subTitleTextView.setText(value); positionTitle(getMeasuredWidth(), getMeasuredHeight()); } @@ -276,7 +282,7 @@ public class ActionBar extends FrameLayout { } if (titleTextView != null) { lastTitle = value; - titleTextView.setVisibility(value != null && !isSearchFieldVisible ? VISIBLE : GONE); + titleTextView.setVisibility(value != null && !isSearchFieldVisible ? VISIBLE : INVISIBLE); titleTextView.setText(value); positionTitle(getMeasuredWidth(), getMeasuredHeight()); } @@ -344,7 +350,7 @@ public class ActionBar extends FrameLayout { layoutParams.width = LayoutParams.FILL_PARENT; layoutParams.gravity = Gravity.RIGHT; actionMode.setLayoutParams(layoutParams); - actionMode.setVisibility(GONE); + actionMode.setVisibility(INVISIBLE); if (occupyStatusBar) { actionModeTop = new View(getContext()); @@ -355,7 +361,7 @@ public class ActionBar extends FrameLayout { layoutParams.width = LayoutParams.FILL_PARENT; layoutParams.gravity = Gravity.TOP | Gravity.LEFT; actionModeTop.setLayoutParams(layoutParams); - actionModeTop.setVisibility(GONE); + actionModeTop.setVisibility(INVISIBLE); } return actionMode; @@ -381,9 +387,9 @@ public class ActionBar extends FrameLayout { if (actionMode == null) { return; } - actionMode.setVisibility(GONE); + actionMode.setVisibility(INVISIBLE); if (occupyStatusBar && actionModeTop != null) { - actionModeTop.setVisibility(GONE); + actionModeTop.setVisibility(INVISIBLE); } if (titleFrameLayout != null) { titleFrameLayout.setVisibility(VISIBLE); @@ -400,10 +406,10 @@ public class ActionBar extends FrameLayout { protected void onSearchFieldVisibilityChanged(boolean visible) { isSearchFieldVisible = visible; if (titleTextView != null) { - titleTextView.setVisibility(visible ? GONE : VISIBLE); + titleTextView.setVisibility(visible ? INVISIBLE : VISIBLE); } if (subTitleTextView != null) { - subTitleTextView.setVisibility(visible ? GONE : VISIBLE); + subTitleTextView.setVisibility(visible ? INVISIBLE : VISIBLE); } Drawable drawable = backButtonImageView.getDrawable(); if (drawable != null && drawable instanceof MenuDrawable) { @@ -460,7 +466,7 @@ public class ActionBar extends FrameLayout { createTitleTextView(); } if (titleTextView != null) { - titleTextView.setVisibility(textToSet != null && !isSearchFieldVisible ? VISIBLE : GONE); + titleTextView.setVisibility(textToSet != null && !isSearchFieldVisible ? VISIBLE : INVISIBLE); titleTextView.setText(textToSet); positionTitle(getMeasuredWidth(), getMeasuredHeight()); } 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 16fb026d2..c49768f8a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -303,7 +303,7 @@ public class ActionBarLayout extends FrameLayout { } } } - containerViewBack.setVisibility(View.GONE); + containerViewBack.setVisibility(View.INVISIBLE); //AndroidUtilities.unlockOrientation(parentActivity); startedTracking = false; animationInProgress = false; @@ -321,7 +321,15 @@ public class ActionBarLayout extends FrameLayout { beginTrackingSent = false; BaseFragment lastFragment = fragmentsStack.get(fragmentsStack.size() - 2); - View fragmentView = lastFragment.createView(parentActivity.getLayoutInflater()); + View fragmentView = lastFragment.fragmentView; + if (fragmentView == null) { + fragmentView = lastFragment.createView(parentActivity, parentActivity.getLayoutInflater()); + } else { + ViewGroup parent = (ViewGroup) fragmentView.getParent(); + if (parent != null) { + parent.removeView(fragmentView); + } + } ViewGroup parent = (ViewGroup) fragmentView.getParent(); if (parent != null) { parent.removeView(fragmentView); @@ -342,7 +350,7 @@ public class ActionBarLayout extends FrameLayout { layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; fragmentView.setLayoutParams(layoutParams); - if (fragmentView.getBackground() == null) { + if (!lastFragment.hasOwnBackground && fragmentView.getBackground() == null) { fragmentView.setBackgroundColor(0xffffffff); } lastFragment.onResume(); @@ -372,7 +380,7 @@ public class ActionBarLayout extends FrameLayout { int dx = Math.max(0, (int) (ev.getX() - startedTrackingX)); int dy = Math.abs((int) ev.getY() - startedTrackingY); velocityTracker.addMovement(ev); - if (maybeStartTracking && !startedTracking && dx >= AndroidUtilities.dp(10) && Math.abs(dx) / 3 > dy) { + if (maybeStartTracking && !startedTracking && dx >= AndroidUtilities.getPixelsInCM(0.3f, true) && Math.abs(dx) / 3 > dy) { prepareForMoving(ev); } else if (startedTracking) { if (!beginTrackingSent) { @@ -531,7 +539,7 @@ public class ActionBarLayout extends FrameLayout { } } } - containerViewBack.setVisibility(View.GONE); + containerViewBack.setVisibility(View.INVISIBLE); } public boolean presentFragment(BaseFragment fragment) { @@ -555,7 +563,15 @@ public class ActionBarLayout extends FrameLayout { final BaseFragment currentFragment = !fragmentsStack.isEmpty() ? fragmentsStack.get(fragmentsStack.size() - 1) : null; fragment.setParentLayout(this); - View fragmentView = fragment.createView(parentActivity.getLayoutInflater()); + View fragmentView = fragment.fragmentView; + if (fragmentView == null) { + fragmentView = fragment.createView(parentActivity, parentActivity.getLayoutInflater()); + } else { + ViewGroup parent = (ViewGroup) fragmentView.getParent(); + if (parent != null) { + parent.removeView(fragmentView); + } + } if (fragment.needAddActionBar() && fragment.actionBar != null) { if (removeActionBarExtraHeight) { fragment.actionBar.setOccupyStatusBar(false); @@ -576,7 +592,7 @@ public class ActionBarLayout extends FrameLayout { fragmentsStack.add(fragment); fragment.onResume(); currentActionBar = fragment.actionBar; - if (fragmentView.getBackground() == null) { + if (!fragment.hasOwnBackground && fragmentView.getBackground() == null) { fragmentView.setBackgroundColor(0xffffffff); } @@ -707,7 +723,7 @@ public class ActionBarLayout extends FrameLayout { fragment.onFragmentDestroy(); fragment.setParentLayout(null); fragmentsStack.remove(fragment); - containerViewBack.setVisibility(View.GONE); + containerViewBack.setVisibility(View.INVISIBLE); bringChildToFront(containerView); } @@ -733,7 +749,15 @@ public class ActionBarLayout extends FrameLayout { containerView.setVisibility(View.VISIBLE); previousFragment.setParentLayout(this); - View fragmentView = previousFragment.createView(parentActivity.getLayoutInflater()); + View fragmentView = previousFragment.fragmentView; + if (fragmentView == null) { + fragmentView = previousFragment.createView(parentActivity, parentActivity.getLayoutInflater()); + } else { + ViewGroup parent = (ViewGroup) fragmentView.getParent(); + if (parent != null) { + parent.removeView(fragmentView); + } + } if (previousFragment.needAddActionBar() && previousFragment.actionBar != null) { if (removeActionBarExtraHeight) { previousFragment.actionBar.setOccupyStatusBar(false); @@ -752,7 +776,7 @@ public class ActionBarLayout extends FrameLayout { fragmentView.setLayoutParams(layoutParams); previousFragment.onResume(); currentActionBar = previousFragment.actionBar; - if (fragmentView.getBackground() == null) { + if (!previousFragment.hasOwnBackground && fragmentView.getBackground() == null) { fragmentView.setBackgroundColor(0xffffffff); } @@ -804,9 +828,9 @@ public class ActionBarLayout extends FrameLayout { @Override public void run() { removeFragmentFromStack(currentFragment); - setVisibility(GONE); + setVisibility(INVISIBLE); if (backgroundView != null) { - backgroundView.setVisibility(GONE); + backgroundView.setVisibility(INVISIBLE); } if (drawerLayoutContainer != null) { drawerLayoutContainer.setAllowOpenDrawer(true, false); @@ -843,9 +867,9 @@ public class ActionBarLayout extends FrameLayout { currentAnimation.start(); } else { removeFragmentFromStack(currentFragment); - setVisibility(GONE); + setVisibility(INVISIBLE); if (backgroundView != null) { - backgroundView.setVisibility(GONE); + backgroundView.setVisibility(INVISIBLE); } } } @@ -857,7 +881,15 @@ public class ActionBarLayout extends FrameLayout { } BaseFragment previousFragment = fragmentsStack.get(fragmentsStack.size() - 1); previousFragment.setParentLayout(this); - View fragmentView = previousFragment.createView(parentActivity.getLayoutInflater()); + View fragmentView = previousFragment.fragmentView; + if (fragmentView == null) { + fragmentView = previousFragment.createView(parentActivity, parentActivity.getLayoutInflater()); + } else { + ViewGroup parent = (ViewGroup) fragmentView.getParent(); + if (parent != null) { + parent.removeView(fragmentView); + } + } if (previousFragment.needAddActionBar() && previousFragment.actionBar != null) { if (removeActionBarExtraHeight) { previousFragment.actionBar.setOccupyStatusBar(false); @@ -876,7 +908,7 @@ public class ActionBarLayout extends FrameLayout { fragmentView.setLayoutParams(layoutParams); previousFragment.onResume(); currentActionBar = previousFragment.actionBar; - if (fragmentView.getBackground() == null) { + if (!previousFragment.hasOwnBackground && fragmentView.getBackground() == null) { fragmentView.setBackgroundColor(0xffffffff); } } 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 1fdf62d77..b6592a2d9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -10,6 +10,7 @@ package org.telegram.ui.ActionBar; import android.app.Activity; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -31,6 +32,7 @@ public class BaseFragment { protected int classGuid = 0; protected Bundle arguments; protected boolean swipeBackEnabled = true; + protected boolean hasOwnBackground = false; public BaseFragment() { classGuid = ConnectionsManager.getInstance().generateClassGuid(); @@ -41,7 +43,7 @@ public class BaseFragment { classGuid = ConnectionsManager.getInstance().generateClassGuid(); } - public View createView(LayoutInflater inflater) { + public View createView(Context context, LayoutInflater inflater) { return null; } @@ -201,9 +203,9 @@ public class BaseFragment { return true; } - public void showAlertDialog(AlertDialog.Builder builder) { + public AlertDialog showAlertDialog(AlertDialog.Builder builder) { if (parentLayout == null || parentLayout.checkTransitionAnimation() || parentLayout.animationInProgress || parentLayout.startedTracking) { - return; + return null; } try { if (visibleDialog != null) { @@ -223,9 +225,11 @@ public class BaseFragment { onDialogDismiss(); } }); + return visibleDialog; } catch (Exception e) { FileLog.e("tmessages", e); } + return null; } protected void onDialogDismiss() { 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 bbed0a058..aa136bf16 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java @@ -301,7 +301,7 @@ public class DrawerLayoutContainer extends FrameLayout { float dx = (int) (ev.getX() - startedTrackingX); float dy = Math.abs((int) ev.getY() - startedTrackingY); velocityTracker.addMovement(ev); - if (maybeStartTracking && !startedTracking && (dx > 0 && dx / 3.0f > Math.abs(dy) || dx < 0 && Math.abs(dx) >= Math.abs(dy) && Math.abs(dx) >= AndroidUtilities.dp(10))) { + if (maybeStartTracking && !startedTracking && (dx > 0 && dx / 3.0f > Math.abs(dy) && Math.abs(dx) >= AndroidUtilities.getPixelsInCM(0.2f, true) || dx < 0 && Math.abs(dx) >= Math.abs(dy) && Math.abs(dx) >= AndroidUtilities.getPixelsInCM(0.3f, true))) { prepareForDrawerOpen(ev); startedTrackingX = (int) ev.getX(); requestDisallowInterceptTouchEvent(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java index 8414dd5bd..8c39b844a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java @@ -73,7 +73,7 @@ public class CountrySearchAdapter extends BaseFragmentAdapter { return; } long time = System.currentTimeMillis(); - ArrayList resultArray = new ArrayList(); + ArrayList resultArray = new ArrayList<>(); String n = query.substring(0, 1); ArrayList arr = countries.get(n.toUpperCase()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java index 452d09d17..9a426aeb2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -9,7 +9,6 @@ package org.telegram.ui.Adapters; import android.content.Context; -import android.text.Html; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -348,7 +347,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapter { user.status.expires = cursor.intValue(7); } if (found == 1) { - dialogSearchResult.name = Html.fromHtml("" + ContactsController.formatName(user.first_name, user.last_name) + ""); + dialogSearchResult.name = AndroidUtilities.replaceTags("" + ContactsController.formatName(user.first_name, user.last_name) + ""); } else { dialogSearchResult.name = Utilities.generateSearchName("@" + user.username, null, "@" + q); } @@ -534,6 +533,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapter { notifyDataSetChanged(); return; } + searchResultMessages.clear(); searchResultHashtags.clear(); for (HashtagObject hashtagObject : hashtags) { searchResultHashtags.add(hashtagObject.hashtag); @@ -670,10 +670,11 @@ public class DialogsSearchAdapter extends BaseSearchAdapter { ((ProfileSearchCell) view).useSeparator = (i != getCount() - 1 && i != localCount - 1 && i != localCount + globalCount - 1); Object obj = getItem(i); if (obj instanceof TLRPC.User) { - user = MessagesController.getInstance().getUser(((TLRPC.User) obj).id); + /*user = MessagesController.getInstance().getUser(((TLRPC.User) obj).id); if (user == null) { user = (TLRPC.User) obj; - } + }*/ + user = (TLRPC.User) obj; } else if (obj instanceof TLRPC.Chat) { chat = MessagesController.getInstance().getChat(((TLRPC.Chat) obj).id); } else if (obj instanceof TLRPC.EncryptedChat) { @@ -697,7 +698,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapter { foundUserName = foundUserName.substring(1); } try { - username = Html.fromHtml(String.format("@%s%s", user.username.substring(0, foundUserName.length()), user.username.substring(foundUserName.length()))); + username = AndroidUtilities.replaceTags(String.format("@%s%s", user.username.substring(0, foundUserName.length()), user.username.substring(foundUserName.length()))); } catch (Exception e) { username = user.username; FileLog.e("tmessages", e); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java index 5a114dfdc..cf7ce7c1f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java @@ -9,7 +9,6 @@ package org.telegram.ui.Adapters; import android.content.Context; -import android.text.Html; import android.view.View; import android.view.ViewGroup; @@ -257,7 +256,7 @@ public class SearchAdapter extends BaseSearchAdapter { foundUserName = foundUserName.substring(1); } try { - username = Html.fromHtml(String.format("@%s%s", user.username.substring(0, foundUserName.length()), user.username.substring(foundUserName.length()))); + username = AndroidUtilities.replaceTags(String.format("@%s%s", user.username.substring(0, foundUserName.length()), user.username.substring(foundUserName.length()))); } catch (Exception e) { username = user.username; FileLog.e("tmessages", e); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java index ef1e5475f..5982e413b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java @@ -64,131 +64,124 @@ public class BlockedUsersActivity extends BaseFragment implements NotificationCe } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("BlockedUsers", R.string.BlockedUsers)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == block_user) { - Bundle args = new Bundle(); - args.putBoolean("onlyUsers", true); - args.putBoolean("destroyAfterSelect", true); - args.putBoolean("returnAsResult", true); - ContactsActivity fragment = new ContactsActivity(args); - fragment.setDelegate(BlockedUsersActivity.this); - presentFragment(fragment); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("BlockedUsers", R.string.BlockedUsers)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == block_user) { + Bundle args = new Bundle(); + args.putBoolean("onlyUsers", true); + args.putBoolean("destroyAfterSelect", true); + args.putBoolean("returnAsResult", true); + ContactsActivity fragment = new ContactsActivity(args); + fragment.setDelegate(BlockedUsersActivity.this); + presentFragment(fragment); } - }); + } + }); - ActionBarMenu menu = actionBar.createMenu(); - menu.addItem(block_user, R.drawable.plus); + ActionBarMenu menu = actionBar.createMenu(); + menu.addItem(block_user, R.drawable.plus); - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; - emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(20); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setVisibility(View.INVISIBLE); - emptyTextView.setText(LocaleController.getString("NoBlocked", R.string.NoBlocked)); - frameLayout.addView(emptyTextView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - emptyTextView.setLayoutParams(layoutParams); - emptyTextView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { + emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff808080); + emptyTextView.setTextSize(20); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setVisibility(View.INVISIBLE); + emptyTextView.setText(LocaleController.getString("NoBlocked", R.string.NoBlocked)); + frameLayout.addView(emptyTextView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + emptyTextView.setLayoutParams(layoutParams); + emptyTextView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + progressView = new FrameLayout(context); + frameLayout.addView(progressView); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + progressView.setLayoutParams(layoutParams); + + ProgressBar progressBar = new ProgressBar(context); + progressView.addView(progressBar); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER; + progressView.setLayoutParams(layoutParams); + + listView = new ListView(context); + listView.setEmptyView(emptyTextView); + listView.setVerticalScrollBarEnabled(false); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setAdapter(listViewAdapter = new ListAdapter(context)); + if (Build.VERSION.SDK_INT >= 11) { + listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); + } + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (i < MessagesController.getInstance().blockedUsers.size()) { + Bundle args = new Bundle(); + args.putInt("user_id", MessagesController.getInstance().blockedUsers.get(i)); + presentFragment(new ProfileActivity(args)); + } + } + }); + + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + if (i < 0 || i >= MessagesController.getInstance().blockedUsers.size() || getParentActivity() == null) { return true; } - }); + selectedUserId = MessagesController.getInstance().blockedUsers.get(i); - progressView = new FrameLayout(getParentActivity()); - frameLayout.addView(progressView); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - progressView.setLayoutParams(layoutParams); - - ProgressBar progressBar = new ProgressBar(getParentActivity()); - progressView.addView(progressBar); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER; - progressView.setLayoutParams(layoutParams); - - listView = new ListView(getParentActivity()); - listView.setEmptyView(emptyTextView); - listView.setVerticalScrollBarEnabled(false); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setAdapter(listViewAdapter = new ListAdapter(getParentActivity())); - if (Build.VERSION.SDK_INT >= 11) { - listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (i < MessagesController.getInstance().blockedUsers.size()) { - Bundle args = new Bundle(); - args.putInt("user_id", MessagesController.getInstance().blockedUsers.get(i)); - presentFragment(new ProfileActivity(args)); - } - } - }); - - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { - if (i < 0 || i >= MessagesController.getInstance().blockedUsers.size() || getParentActivity() == null) { - return true; - } - selectedUserId = MessagesController.getInstance().blockedUsers.get(i); - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items = new CharSequence[] {LocaleController.getString("Unblock", R.string.Unblock)}; - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (i == 0) { - MessagesController.getInstance().unblockUser(selectedUserId); - } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + CharSequence[] items = new CharSequence[]{LocaleController.getString("Unblock", R.string.Unblock)}; + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + MessagesController.getInstance().unblockUser(selectedUserId); } - }); - showAlertDialog(builder); + } + }); + showAlertDialog(builder); - return true; - } - }); - - if (MessagesController.getInstance().loadingBlockedUsers) { - progressView.setVisibility(View.VISIBLE); - emptyTextView.setVisibility(View.GONE); - listView.setEmptyView(null); - } else { - progressView.setVisibility(View.GONE); - listView.setEmptyView(emptyTextView); + return true; } + }); + + if (MessagesController.getInstance().loadingBlockedUsers) { + progressView.setVisibility(View.VISIBLE); + emptyTextView.setVisibility(View.GONE); + listView.setEmptyView(null); } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + progressView.setVisibility(View.GONE); + listView.setEmptyView(emptyTextView); } return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java index 3fb3d1105..a56e53678 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java @@ -14,7 +14,6 @@ import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.Drawable; -import android.text.Html; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -83,9 +82,9 @@ public class ChatBaseCell extends BaseCell { private static TextPaint timeMediaPaint; private static TextPaint namePaint; private static TextPaint forwardNamePaint; - private static TextPaint replyNamePaint; - private static TextPaint replyTextPaint; - private static Paint replyLinePaint; + protected static TextPaint replyNamePaint; + protected static TextPaint replyTextPaint; + protected static Paint replyLinePaint; protected int backgroundWidth = 100; @@ -191,6 +190,7 @@ public class ChatBaseCell extends BaseCell { replyTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); replyTextPaint.setTextSize(AndroidUtilities.dp(14)); + replyTextPaint.linkColor = 0xff316f9f; replyLinePaint = new Paint(); } @@ -362,7 +362,7 @@ public class ChatBaseCell extends BaseCell { forwardedNameWidth = getMaxNameWidth(); CharSequence str = TextUtils.ellipsize(currentForwardNameString.replace("\n", " "), forwardNamePaint, forwardedNameWidth - AndroidUtilities.dp(40), TextUtils.TruncateAt.END); - str = Html.fromHtml(String.format("%s
%s %s", LocaleController.getString("ForwardedMessage", R.string.ForwardedMessage), LocaleController.getString("From", R.string.From), str)); + str = AndroidUtilities.replaceTags(String.format("%s\n%s %s", LocaleController.getString("ForwardedMessage", R.string.ForwardedMessage), LocaleController.getString("From", R.string.From), str)); forwardedNameLayout = new StaticLayout(str, forwardNamePaint, forwardedNameWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); if (forwardedNameLayout.getLineCount() > 1) { forwardedNameWidth = Math.max((int) Math.ceil(forwardedNameLayout.getLineWidth(0)), (int) Math.ceil(forwardedNameLayout.getLineWidth(1))); 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 f1f324e61..9098aaf1d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -9,35 +9,128 @@ package org.telegram.ui.Cells; import android.content.Context; +import android.content.Intent; import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.provider.Browser; +import android.text.Layout; import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; import android.text.style.ClickableSpan; import android.view.MotionEvent; import org.telegram.android.AndroidUtilities; +import org.telegram.android.ImageReceiver; +import org.telegram.android.MediaController; +import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.android.MessageObject; +import org.telegram.messenger.R; +import org.telegram.messenger.TLRPC; +import org.telegram.ui.Components.StaticLayoutEx; import org.telegram.ui.Components.URLSpanNoUnderline; +import java.util.Locale; + public class ChatMessageCell extends ChatBaseCell { private int textX, textY; private int totalHeight = 0; private ClickableSpan pressedLink; + private int linkBlockNum; + private MyPath urlPath = new MyPath(); + private boolean linkPreviewPressed; + private static Paint urlPaint; private int lastVisibleBlockNum = 0; private int firstVisibleBlockNum = 0; private int totalVisibleBlocksCount = 0; + private ImageReceiver linkImageView; + private boolean isSmallImage; + private boolean drawLinkImageView; + private boolean hasLinkPreview; + private int linkPreviewHeight; + private boolean isInstagram; + private int smallImageX; + private int descriptionY; + private int durationWidth; + private StaticLayout siteNameLayout; + private StaticLayout titleLayout; + private StaticLayout descriptionLayout; + private StaticLayout durationLayout; + private StaticLayout authorLayout; + private static TextPaint durationPaint; + private TLRPC.PhotoSize currentPhotoObject; + private TLRPC.PhotoSize currentPhotoObjectThumb; + private boolean imageCleared; + + private static Drawable igvideoDrawable; + + private class MyPath extends Path { + + private StaticLayout currentLayout; + private int currentLine; + private float lastTop = -1; + + public void setCurrentLayout(StaticLayout layout, int start) { + currentLayout = layout; + currentLine = layout.getLineForOffset(start); + lastTop = -1; + } + + @Override + public void addRect(float left, float top, float right, float bottom, Direction dir) { + if (lastTop == -1) { + lastTop = top; + } else if (lastTop != top) { + lastTop = top; + currentLine++; + } + float lineRight = currentLayout.getLineRight(currentLine); + float lineLeft = currentLayout.getLineLeft(currentLine); + if (left >= lineRight) { + return; + } + if (right > lineRight) { + right = lineRight; + } + if (left < lineLeft) { + left = lineLeft; + } + super.addRect(left, top, right, bottom, dir); + } + } + public ChatMessageCell(Context context) { super(context); drawForwardedName = true; + linkImageView = new ImageReceiver(this); + if (urlPaint == null) { + urlPaint = new Paint(); + urlPaint.setColor(0x33316f9f); + } + } + + private void resetPressedLink() { + if (pressedLink != null) { + pressedLink = null; + } + linkPreviewPressed = false; + invalidate(); } @Override public boolean onTouchEvent(MotionEvent event) { + boolean result = false; if (currentMessageObject != null && currentMessageObject.textLayoutBlocks != null && !currentMessageObject.textLayoutBlocks.isEmpty() && currentMessageObject.messageText instanceof Spannable && !isPressed) { - if (event.getAction() == MotionEvent.ACTION_DOWN || pressedLink != null && event.getAction() == MotionEvent.ACTION_UP) { + if (event.getAction() == MotionEvent.ACTION_DOWN || (linkPreviewPressed || pressedLink != null) && event.getAction() == MotionEvent.ACTION_UP) { int x = (int)event.getX(); int y = (int)event.getY(); if (x >= textX && y >= textY && x <= textX + currentMessageObject.textWidth && y <= textY + currentMessageObject.textHeight) { @@ -55,11 +148,19 @@ public class ChatMessageCell extends ChatBaseCell { if (left <= x && left + block.textLayout.getLineWidth(line) >= x) { Spannable buffer = (Spannable)currentMessageObject.messageText; ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); - if (link.length != 0) { if (event.getAction() == MotionEvent.ACTION_DOWN) { + resetPressedLink(); pressedLink = link[0]; - return true; + linkBlockNum = blockNum; + try { + int start = buffer.getSpanStart(pressedLink) - block.charactersOffset; + urlPath.setCurrentLayout(block.textLayout, start); + block.textLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink) - block.charactersOffset, urlPath); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + result = true; } else { if (link[0] == pressedLink) { try { @@ -76,30 +177,98 @@ public class ChatMessageCell extends ChatBaseCell { } catch (Exception e) { FileLog.e("tmessages", e); } - return true; + resetPressedLink(); + result = true; } } } else { - pressedLink = null; + resetPressedLink(); } } else { - pressedLink = null; + resetPressedLink(); } } catch (Exception e) { - pressedLink = null; + resetPressedLink(); FileLog.e("tmessages", e); } } else { - pressedLink = null; + resetPressedLink(); + } + } else if (hasLinkPreview && x >= textX && x <= textX + backgroundWidth && y >= textY + currentMessageObject.textHeight && y <= textY + currentMessageObject.textHeight + linkPreviewHeight + AndroidUtilities.dp(8)) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + resetPressedLink(); + if (drawLinkImageView && linkImageView.isInsideImage(x, y)) { + linkPreviewPressed = true; + result = true; + } else { + if (descriptionLayout != null && y >= descriptionY) { + try { + x -= textX + AndroidUtilities.dp(10); + y -= descriptionY; + final int line = descriptionLayout.getLineForVertical(y); + final int off = descriptionLayout.getOffsetForHorizontal(line, x); + + final float left = descriptionLayout.getLineLeft(line); + if (left <= x && left + descriptionLayout.getLineWidth(line) >= x) { + Spannable buffer = (Spannable) currentMessageObject.linkDescription; + ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); + if (link.length != 0) { + resetPressedLink(); + pressedLink = link[0]; + linkPreviewPressed = true; + linkBlockNum = -10; + result = true; + try { + int start = buffer.getSpanStart(pressedLink); + urlPath.setCurrentLayout(descriptionLayout, start); + descriptionLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink), urlPath); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else { + resetPressedLink(); + } + } else { + resetPressedLink(); + } + } catch (Exception e) { + resetPressedLink(); + FileLog.e("tmessages", e); + } + } + } + } else if (linkPreviewPressed) { + try { + if (pressedLink != null) { + pressedLink.onClick(this); + } else { + Uri uri = Uri.parse(currentMessageObject.messageOwner.media.webpage.url); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName()); + getContext().startActivity(intent); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + resetPressedLink(); + result = true; } } else { - pressedLink = null; + resetPressedLink(); } + } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { + resetPressedLink(); } } else { - pressedLink = null; + resetPressedLink(); } - return super.onTouchEvent(event); + if (result && event.getAction() == MotionEvent.ACTION_DOWN) { + startCheckLongPress(); + } + if (event.getAction() != MotionEvent.ACTION_DOWN && event.getAction() != MotionEvent.ACTION_MOVE) { + cancelCheckLongPress(); + } + return result || super.onTouchEvent(event); } public void setVisiblePart(int position, int height) { @@ -137,6 +306,51 @@ public class ChatMessageCell extends ChatBaseCell { return left1 <= right2; } + private StaticLayout generateStaticLayout(CharSequence text, TextPaint paint, int maxWidth, int smallWidth, int linesCount, int maxLines) { + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text); + int addedChars = 0; + StaticLayout layout = new StaticLayout(text, paint, smallWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + for (int a = 0; a < linesCount; a++) { + int pos = layout.getLineEnd(a); + if (pos == text.length()) { + break; + } + pos--; + if (stringBuilder.charAt(pos + addedChars) == ' ') { + stringBuilder.replace(pos + addedChars, pos + addedChars + 1, "\n"); + } else { + stringBuilder.insert(pos + addedChars, "\n"); + addedChars++; + } + if (a == layout.getLineCount() - 1 || a == maxLines - 1) { + break; + } + } + return StaticLayoutEx.createStaticLayout(stringBuilder, paint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, AndroidUtilities.dp(1), false, TextUtils.TruncateAt.END, maxWidth, maxLines); + } + + @Override + protected boolean isUserDataChanged() { + if (imageCleared || !hasLinkPreview && currentMessageObject.messageOwner.media != null && currentMessageObject.messageOwner.media.webpage instanceof TLRPC.TL_webPage) { + return true; + } + //suppress warning + return super.isUserDataChanged(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (linkImageView != null) { + linkImageView.clearImage(); + if (currentPhotoObject != null) { + imageCleared = true; + currentPhotoObject = null; + currentPhotoObjectThumb = null; + } + } + } + @Override public void setMessageObject(MessageObject messageObject) { if (currentMessageObject != messageObject || isUserDataChanged()) { @@ -144,7 +358,21 @@ public class ChatMessageCell extends ChatBaseCell { firstVisibleBlockNum = 0; lastVisibleBlockNum = 0; } - pressedLink = null; + drawLinkImageView = false; + hasLinkPreview = false; + resetPressedLink(); + linkPreviewPressed = false; + linkPreviewHeight = 0; + smallImageX = 0; + isInstagram = false; + durationLayout = null; + descriptionLayout = null; + titleLayout = null; + siteNameLayout = null; + authorLayout = null; + currentPhotoObject = null; + imageCleared = false; + currentPhotoObjectThumb = null; int maxWidth; if (AndroidUtilities.isTablet()) { @@ -182,7 +410,215 @@ public class ChatMessageCell extends ChatBaseCell { timeMore += AndroidUtilities.dp(20.5f); } - if (maxWidth - messageObject.lastLineWidth < timeMore) { + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && messageObject.messageOwner.media.webpage instanceof TLRPC.TL_webPage) { + int linkPreviewMaxWidth; + if (AndroidUtilities.isTablet()) { + if (currentMessageObject.messageOwner.to_id.chat_id != 0 && !currentMessageObject.isOut()) { + linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(122); + } else { + linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80); + } + } else { + if (currentMessageObject.messageOwner.to_id.chat_id != 0 && !currentMessageObject.isOut()) { + linkPreviewMaxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122); + } else { + linkPreviewMaxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(80); + } + } + int additinalWidth = AndroidUtilities.dp(10); + int restLinesCount = 3; + int additionalHeight = 0; + linkPreviewMaxWidth -= additinalWidth; + + hasLinkPreview = true; + TLRPC.TL_webPage webPage = (TLRPC.TL_webPage) messageObject.messageOwner.media.webpage; + + if (currentMessageObject.photoThumbs == null && webPage.photo != null) { + currentMessageObject.generateThumbs(true); + } + + if (MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_PHOTO)) { + isSmallImage = webPage.description != null && webPage.type != null && (webPage.type.equals("app") || webPage.type.equals("profile") || webPage.type.equals("article")) && currentMessageObject.photoThumbs != null; + } + + if (webPage.site_name != null) { + try { + int width = (int) Math.ceil(replyNamePaint.measureText(webPage.site_name)); + siteNameLayout = new StaticLayout(webPage.site_name, replyNamePaint, Math.min(width, linkPreviewMaxWidth), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + int height = siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1); + linkPreviewHeight += height; + totalHeight += height; + additionalHeight += height; + maxChildWidth = Math.max(maxChildWidth, width + additinalWidth); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + if (webPage.title != null) { + try { + if (linkPreviewHeight != 0) { + linkPreviewHeight += AndroidUtilities.dp(2); + totalHeight += AndroidUtilities.dp(2); + } + int restLines = 0; + if (!isSmallImage || webPage.description == null) { + titleLayout = StaticLayoutEx.createStaticLayout(webPage.title, replyNamePaint, linkPreviewMaxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, AndroidUtilities.dp(1), false, TextUtils.TruncateAt.END, linkPreviewMaxWidth, 2); + } else { + restLines = restLinesCount; + titleLayout = generateStaticLayout(webPage.title, replyNamePaint, linkPreviewMaxWidth, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 2), restLinesCount, 2); + restLinesCount -= titleLayout.getLineCount(); + } + int height = titleLayout.getLineBottom(titleLayout.getLineCount() - 1); + linkPreviewHeight += height; + totalHeight += height; + for (int a = 0; a < titleLayout.getLineCount(); a++) { + int width = (int) Math.ceil(titleLayout.getLineWidth(a)); + if (a < restLines) { + smallImageX = Math.max(smallImageX, width); + width += AndroidUtilities.dp(48 + 2); + } + maxChildWidth = Math.max(maxChildWidth, width + additinalWidth); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + if (webPage.author != null) { + try { + if (linkPreviewHeight != 0) { + linkPreviewHeight += AndroidUtilities.dp(2); + totalHeight += AndroidUtilities.dp(2); + } + int width = Math.min((int) Math.ceil(replyNamePaint.measureText(webPage.author)), linkPreviewMaxWidth); + if (restLinesCount == 3 && (!isSmallImage || webPage.description == null)) { + authorLayout = new StaticLayout(webPage.author, replyNamePaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + } else { + authorLayout = generateStaticLayout(webPage.author, replyNamePaint, width, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 2), restLinesCount, 1); + restLinesCount -= authorLayout.getLineCount(); + } + int height = authorLayout.getLineBottom(authorLayout.getLineCount() - 1); + linkPreviewHeight += height; + totalHeight += height; + maxChildWidth = Math.max(maxChildWidth, width + additinalWidth); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + if (webPage.description != null) { + try { + currentMessageObject.generateLinkDescription(); + if (linkPreviewHeight != 0) { + linkPreviewHeight += AndroidUtilities.dp(2); + totalHeight += AndroidUtilities.dp(2); + } + int restLines = 0; + if (restLinesCount == 3 && !isSmallImage) { + descriptionLayout = StaticLayoutEx.createStaticLayout(messageObject.linkDescription, replyTextPaint, linkPreviewMaxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, AndroidUtilities.dp(1), false, TextUtils.TruncateAt.END, linkPreviewMaxWidth, 6); + } else { + restLines = restLinesCount; + descriptionLayout = generateStaticLayout(messageObject.linkDescription, replyTextPaint, linkPreviewMaxWidth, linkPreviewMaxWidth - AndroidUtilities.dp(48 + 2), restLinesCount, 6); + } + int height = descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1); + linkPreviewHeight += height; + totalHeight += height; + for (int a = 0; a < descriptionLayout.getLineCount(); a++) { + int width = (int) Math.ceil(descriptionLayout.getLineWidth(a)); + if (a < restLines) { + smallImageX = Math.max(smallImageX, width); + width += AndroidUtilities.dp(48 + 2); + } + maxChildWidth = Math.max(maxChildWidth, width + additinalWidth); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + if (webPage.photo != null && MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_PHOTO)) { + boolean smallImage = webPage.type != null && (webPage.type.equals("app") || webPage.type.equals("profile") || webPage.type.equals("article")); + if (smallImage && descriptionLayout != null && descriptionLayout.getLineCount() == 1) { + smallImage = false; + isSmallImage = false; + } + int maxPhotoWidth = smallImage ? AndroidUtilities.dp(48) : linkPreviewMaxWidth; + currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, maxPhotoWidth); + currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80); + if (currentPhotoObjectThumb == currentPhotoObject) { + currentPhotoObjectThumb = null; + } + if (currentPhotoObject != null) { + if (linkPreviewHeight != 0) { + linkPreviewHeight += AndroidUtilities.dp(2); + totalHeight += AndroidUtilities.dp(2); + } + + maxChildWidth = Math.max(maxChildWidth, maxPhotoWidth + additinalWidth); + currentPhotoObject.size = -1; + if (currentPhotoObjectThumb != null) { + currentPhotoObjectThumb.size = -1; + } + + int width; + int height; + if (smallImage) { + width = height = maxPhotoWidth; + } else { + width = currentPhotoObject.w; + height = currentPhotoObject.h; + float scale = width / (float) maxPhotoWidth; + width /= scale; + height /= scale; + if (height > AndroidUtilities.displaySize.y / 3) { + height = AndroidUtilities.displaySize.y / 3; + } + } + if (isSmallImage) { + if (AndroidUtilities.dp(50) + additionalHeight > linkPreviewHeight) { + totalHeight += AndroidUtilities.dp(50) + additionalHeight - linkPreviewHeight + AndroidUtilities.dp(8); + linkPreviewHeight = AndroidUtilities.dp(50) + additionalHeight; + } + linkPreviewHeight -= AndroidUtilities.dp(8); + } else { + totalHeight += height + AndroidUtilities.dp(12); + linkPreviewHeight += height; + } + + linkImageView.setImageCoords(0, 0, width, height); + linkImageView.setImage(currentPhotoObject.location, String.format(Locale.US, "%d_%d", width, height), currentPhotoObjectThumb != null ? currentPhotoObjectThumb.location : null, String.format(Locale.US, "%d_%d_b", width, height), 0, false); + drawLinkImageView = true; + + if (webPage.site_name != null) { + if (webPage.site_name.toLowerCase().equals("instagram") && webPage.type != null && webPage.type.equals("video")) { + isInstagram = true; + if (igvideoDrawable == null) { + igvideoDrawable = getResources().getDrawable(R.drawable.igvideo); + } + } + } + } + + if (webPage.duration != 0) { + if (durationPaint == null) { + durationPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + durationPaint.setTextSize(AndroidUtilities.dp(12)); + durationPaint.setColor(0xffffffff); + } + int minutes = webPage.duration / 60; + int seconds = webPage.duration - minutes * 60; + String str = String.format("%d:%02d", minutes, seconds); + durationWidth = (int) Math.ceil(durationPaint.measureText(str)); + durationLayout = new StaticLayout(str, durationPaint, durationWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + } + } else { + linkPreviewHeight -= AndroidUtilities.dp(6); + totalHeight += AndroidUtilities.dp(4); + } + } + + if (hasLinkPreview || maxWidth - messageObject.lastLineWidth < timeMore) { totalHeight += AndroidUtilities.dp(14); backgroundWidth = Math.max(maxChildWidth, messageObject.lastLineWidth) + AndroidUtilities.dp(29); } else { @@ -217,7 +653,7 @@ public class ChatMessageCell extends ChatBaseCell { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - if (currentMessageObject == null || currentMessageObject.textLayoutBlocks == null || currentMessageObject.textLayoutBlocks.isEmpty() || firstVisibleBlockNum < 0) { + if (currentMessageObject == null || currentMessageObject.textLayoutBlocks == null || currentMessageObject.textLayoutBlocks.isEmpty()) { return; } @@ -229,19 +665,121 @@ public class ChatMessageCell extends ChatBaseCell { textY = AndroidUtilities.dp(10) + namesOffset; } - for (int a = firstVisibleBlockNum; a <= lastVisibleBlockNum; a++) { - if (a >= currentMessageObject.textLayoutBlocks.size()) { - break; + if (firstVisibleBlockNum >= 0) { + for (int a = firstVisibleBlockNum; a <= lastVisibleBlockNum; a++) { + if (a >= currentMessageObject.textLayoutBlocks.size()) { + break; + } + MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a); + canvas.save(); + canvas.translate(textX - (int) Math.ceil(block.textXOffset), textY + block.textYOffset); + if (pressedLink != null && a == linkBlockNum) { + canvas.drawPath(urlPath, urlPaint); + } + try { + block.textLayout.draw(canvas); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + canvas.restore(); } - MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a); - canvas.save(); - canvas.translate(textX - (int)Math.ceil(block.textXOffset), textY + block.textYOffset); - try { - block.textLayout.draw(canvas); - } catch (Exception e) { - FileLog.e("tmessages", e); + } + + if (hasLinkPreview) { + int startY = textY + currentMessageObject.textHeight + AndroidUtilities.dp(8); + int linkPreviewY = startY; + int smallImageStartY = 0; + replyLinePaint.setColor(currentMessageObject.isOut() ? 0xff8dc97a : 0xff6c9fd2); + + canvas.drawRect(textX, linkPreviewY - AndroidUtilities.dp(3), textX + AndroidUtilities.dp(2), linkPreviewY + linkPreviewHeight + AndroidUtilities.dp(3), replyLinePaint); + + if (siteNameLayout != null) { + replyNamePaint.setColor(currentMessageObject.isOut() ? 0xff70b15c : 0xff4b91cf); + canvas.save(); + canvas.translate(textX + AndroidUtilities.dp(10), linkPreviewY - AndroidUtilities.dp(3)); + siteNameLayout.draw(canvas); + canvas.restore(); + linkPreviewY += siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1); + } + + if (titleLayout != null) { + if (linkPreviewY != startY) { + linkPreviewY += AndroidUtilities.dp(2); + } + replyNamePaint.setColor(0xff000000); + smallImageStartY = linkPreviewY - AndroidUtilities.dp(1); + canvas.save(); + canvas.translate(textX + AndroidUtilities.dp(10), linkPreviewY - AndroidUtilities.dp(3)); + titleLayout.draw(canvas); + canvas.restore(); + linkPreviewY += titleLayout.getLineBottom(titleLayout.getLineCount() - 1); + } + + if (authorLayout != null) { + if (linkPreviewY != startY) { + linkPreviewY += AndroidUtilities.dp(2); + } + if (smallImageStartY == 0) { + smallImageStartY = linkPreviewY - AndroidUtilities.dp(1); + } + replyNamePaint.setColor(0xff000000); + canvas.save(); + canvas.translate(textX + AndroidUtilities.dp(10), linkPreviewY - AndroidUtilities.dp(3)); + authorLayout.draw(canvas); + canvas.restore(); + linkPreviewY += authorLayout.getLineBottom(authorLayout.getLineCount() - 1); + } + + if (descriptionLayout != null) { + if (linkPreviewY != startY) { + linkPreviewY += AndroidUtilities.dp(2); + } + if (smallImageStartY == 0) { + smallImageStartY = linkPreviewY - AndroidUtilities.dp(1); + } + replyTextPaint.setColor(0xff000000); + descriptionY = linkPreviewY - AndroidUtilities.dp(3); + canvas.save(); + canvas.translate(textX + AndroidUtilities.dp(10), descriptionY); + if (pressedLink != null && linkBlockNum == -10) { + canvas.drawPath(urlPath, urlPaint); + } + descriptionLayout.draw(canvas); + canvas.restore(); + linkPreviewY += descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1); + } + + if (drawLinkImageView) { + if (linkPreviewY != startY) { + linkPreviewY += AndroidUtilities.dp(2); + } + + if (isSmallImage) { + linkImageView.setImageCoords(textX + smallImageX + AndroidUtilities.dp(12), smallImageStartY, linkImageView.getImageWidth(), linkImageView.getImageHeight()); + } else { + linkImageView.setImageCoords(textX + AndroidUtilities.dp(10), linkPreviewY, linkImageView.getImageWidth(), linkImageView.getImageHeight()); + } + linkImageView.draw(canvas); + + if (isInstagram && igvideoDrawable != null) { + int x = linkImageView.getImageX() + linkImageView.getImageWidth() - igvideoDrawable.getIntrinsicWidth() - AndroidUtilities.dp(4); + int y = linkImageView.getImageY() + AndroidUtilities.dp(4); + igvideoDrawable.setBounds(x, y, x + igvideoDrawable.getIntrinsicWidth(), y + igvideoDrawable.getIntrinsicHeight()); + igvideoDrawable.draw(canvas); + } + + if (durationLayout != null) { + int x = linkImageView.getImageX() + linkImageView.getImageWidth() - AndroidUtilities.dp(8) - durationWidth; + int y = linkImageView.getImageY() + linkImageView.getImageHeight() - AndroidUtilities.dp(19); + mediaBackgroundDrawable.setBounds(x - AndroidUtilities.dp(4), y - AndroidUtilities.dp(1.5f), x + durationWidth + AndroidUtilities.dp(4), y + AndroidUtilities.dp(14.5f)); + mediaBackgroundDrawable.draw(canvas); + + canvas.save(); + canvas.translate(x, y); + durationLayout.draw(canvas); + canvas.restore(); + } } - canvas.restore(); } } } 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 cc8828f2d..85f79f6bf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -12,7 +12,6 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.Drawable; -import android.text.Html; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -132,6 +131,7 @@ public class DialogCell extends BaseCell { messagePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); messagePaint.setTextSize(AndroidUtilities.dp(16)); messagePaint.setColor(0xff8f8f8f); + messagePaint.linkColor = 0xff8f8f8f; linePaint = new Paint(); linePaint.setColor(0xffdcdcdc); @@ -341,9 +341,9 @@ public class DialogCell extends BaseCell { } } checkMessage = false; - if (message.messageOwner.media != null && !(message.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (message.messageOwner.media != null && !message.isMediaEmpty()) { currentMessagePaint = messagePrintingPaint; - messageString = Emoji.replaceEmoji(Html.fromHtml(String.format("%s: %s", name, message.messageText)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, message.messageText)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); } else { if (message.messageOwner.message != null) { String mess = message.messageOwner.message; @@ -351,12 +351,12 @@ public class DialogCell extends BaseCell { mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - messageString = Emoji.replaceEmoji(Html.fromHtml(String.format("%s: %s", name, mess.replace("<", "<").replace(">", ">"))), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess.replace("<", "<").replace(">", ">"))), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); } } } else { messageString = message.messageText; - if (message.messageOwner.media != null && !(message.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (message.messageOwner.media != null && !message.isMediaEmpty()) { currentMessagePaint = messagePrintingPaint; } } @@ -370,7 +370,7 @@ public class DialogCell extends BaseCell { drawCount = false; } - if (message.isOut() && message.isOut()) { + if (message.isOut()) { if (message.isSending()) { drawCheck1 = false; drawCheck2 = false; 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 74ee0a85b..706323fd6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java @@ -58,7 +58,7 @@ public class DrawerProfileCell extends FrameLayout { shadowView.setLayoutParams(layoutParams); avatarImageView = new BackupImageView(context); - avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(32)); + avatarImageView.getImageReceiver().setRoundRadius(AndroidUtilities.dp(32)); addView(avatarImageView); layoutParams = (LayoutParams) avatarImageView.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(64); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java index 5ad6e43ef..67111a811 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java @@ -37,7 +37,7 @@ public class MentionCell extends LinearLayout { avatarDrawable.setSmallStyle(true); imageView = new BackupImageView(context); - imageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(14)); + imageView.setRoundRadius(AndroidUtilities.dp(14)); addView(imageView); LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(12); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java index b20ed7c78..16540b5da 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java @@ -117,7 +117,7 @@ public class PhotoPickerAlbumsCell extends FrameLayoutFixed { for (int a = 0; a < 4; a++) { albumViews[a] = new AlbumView(context); addView(albumViews[a]); - albumViews[a].setVisibility(GONE); + albumViews[a].setVisibility(INVISIBLE); albumViews[a].setTag(a); albumViews[a].setOnClickListener(new OnClickListener() { @Override @@ -132,7 +132,7 @@ public class PhotoPickerAlbumsCell extends FrameLayoutFixed { public void setAlbumsCount(int count) { for (int a = 0; a < albumViews.length; a++) { - albumViews[a].setVisibility(a < count ? VISIBLE : GONE); + albumViews[a].setVisibility(a < count ? VISIBLE : INVISIBLE); } albumsCount = count; } @@ -156,7 +156,7 @@ public class PhotoPickerAlbumsCell extends FrameLayoutFixed { albumView.nameTextView.setText(albumEntry.bucketName); albumView.countTextView.setText(String.format("%d", albumEntry.photos.size())); } else { - albumViews[a].setVisibility(GONE); + albumViews[a].setVisibility(INVISIBLE); } } 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 a44ea6906..b6ce6a2f8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java @@ -30,6 +30,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.ui.Components.AvatarDrawable; public class ProfileSearchCell extends BaseCell { + private static TextPaint namePaint; private static TextPaint nameEncryptedPaint; private static TextPaint onlinePaint; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java new file mode 100644 index 000000000..924a851f7 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java @@ -0,0 +1,205 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.messenger.R; +import org.telegram.messenger.TLRPC; + +import java.util.Locale; + +public class SessionCell extends FrameLayout { + + private TextView nameTextView; + private TextView onlineTextView; + private TextView detailTextView; + private TextView detailExTextView; + boolean needDivider; + private static Paint paint; + + public SessionCell(Context context) { + super(context); + + if (paint == null) { + paint = new Paint(); + paint.setColor(0xffd9d9d9); + paint.setStrokeWidth(1); + } + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.HORIZONTAL); + linearLayout.setWeightSum(1); + addView(linearLayout); + LayoutParams layoutParams = (LayoutParams) linearLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(30); + layoutParams.leftMargin = AndroidUtilities.dp(17); + layoutParams.rightMargin = AndroidUtilities.dp(17); + layoutParams.topMargin = AndroidUtilities.dp(11); + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + linearLayout.setLayoutParams(layoutParams); + + nameTextView = new TextView(context); + nameTextView.setTextColor(0xff212121); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + nameTextView.setLines(1); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setEllipsize(TextUtils.TruncateAt.END); + nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + + onlineTextView = new TextView(context); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + onlineTextView.setGravity((LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP); + + if (LocaleController.isRTL) { + linearLayout.addView(onlineTextView); + linearLayout.addView(nameTextView); + } else { + linearLayout.addView(nameTextView); + linearLayout.addView(onlineTextView); + } + + LinearLayout.LayoutParams layoutParams2 = (LinearLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams2.width = 0; + layoutParams2.height = LayoutParams.MATCH_PARENT; + layoutParams2.weight = 1; + if (LocaleController.isRTL) { + layoutParams2.leftMargin = AndroidUtilities.dp(10); + } else { + layoutParams2.rightMargin = AndroidUtilities.dp(10); + } + layoutParams2.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + nameTextView.setLayoutParams(layoutParams2); + + layoutParams2 = (LinearLayout.LayoutParams) onlineTextView.getLayoutParams(); + layoutParams2.width = LayoutParams.WRAP_CONTENT; + layoutParams2.height = LayoutParams.MATCH_PARENT; + layoutParams2.topMargin = AndroidUtilities.dp(2); + layoutParams2.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP; + onlineTextView.setLayoutParams(layoutParams2); + + detailTextView = new TextView(context); + detailTextView.setTextColor(0xff212121); + detailTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + detailTextView.setLines(1); + detailTextView.setMaxLines(1); + detailTextView.setSingleLine(true); + detailTextView.setEllipsize(TextUtils.TruncateAt.END); + detailTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + addView(detailTextView); + layoutParams = (LayoutParams) detailTextView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(17); + layoutParams.rightMargin = AndroidUtilities.dp(17); + layoutParams.topMargin = AndroidUtilities.dp(36); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + detailTextView.setLayoutParams(layoutParams); + + detailExTextView = new TextView(context); + detailExTextView.setTextColor(0xff999999); + detailExTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + detailExTextView.setLines(1); + detailExTextView.setMaxLines(1); + detailExTextView.setSingleLine(true); + detailExTextView.setEllipsize(TextUtils.TruncateAt.END); + detailExTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + addView(detailExTextView); + layoutParams = (LayoutParams) detailExTextView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(17); + layoutParams.rightMargin = AndroidUtilities.dp(17); + layoutParams.topMargin = AndroidUtilities.dp(59); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + detailExTextView.setLayoutParams(layoutParams); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(90) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY)); + } + + public void setSession(TLRPC.TL_authorization session, boolean divider) { + needDivider = divider; + + nameTextView.setText(String.format(Locale.US, "%s %s", session.app_name, session.app_version)); + if ((session.flags & 1) != 0) { + onlineTextView.setText(LocaleController.getString("Online", R.string.Online)); + onlineTextView.setTextColor(0xff2f8cc9); + } else { + onlineTextView.setText(LocaleController.stringForMessageListDate(session.date_active)); + onlineTextView.setTextColor(0xff999999); + } + + StringBuilder stringBuilder = new StringBuilder(); + if (session.ip.length() != 0) { + stringBuilder.append(session.ip); + } + if (session.country.length() != 0) { + if (stringBuilder.length() != 0) { + stringBuilder.append(" "); + } + stringBuilder.append("— "); + stringBuilder.append(session.country); + } + detailExTextView.setText(stringBuilder); + + stringBuilder = new StringBuilder(); + if (session.device_model.length() != 0) { + stringBuilder.append(session.device_model); + } + if (session.system_version.length() != 0 || session.platform.length() != 0) { + if (stringBuilder.length() != 0) { + stringBuilder.append(", "); + } + if (session.platform.length() != 0) { + stringBuilder.append(session.platform); + } + if (session.system_version.length() != 0) { + if (session.platform.length() != 0) { + stringBuilder.append(" "); + } + stringBuilder.append(session.system_version); + } + } + + if ((session.flags & 2) == 0) { + if (stringBuilder.length() != 0) { + stringBuilder.append(", "); + } + stringBuilder.append(LocaleController.getString("UnofficialApp", R.string.UnofficialApp)); + stringBuilder.append(" (ID: "); + stringBuilder.append(session.api_id); + stringBuilder.append(")"); + } + + detailTextView.setText(stringBuilder); + } + + @Override + protected void onDraw(Canvas canvas) { + if (needDivider) { + canvas.drawLine(getPaddingLeft(), getHeight() - 1, getWidth() - getPaddingRight(), getHeight() - 1, paint); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java index 1938fea35..a41172b06 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java @@ -36,7 +36,7 @@ import org.telegram.ui.Components.LineProgressView; import java.io.File; import java.util.Date; -public class SharedDocumentCell extends FrameLayout implements MediaController.FileDownloadProgressListener { +public class SharedDocumentCell extends FrameLayout implements MediaController.FileDownloadProgressListener { private ImageView placeholderImabeView; private BackupImageView thumbImageView; @@ -106,11 +106,11 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. extTextView.setLayoutParams(layoutParams); thumbImageView = new BackupImageView(context); - thumbImageView.imageReceiver.setDelegate(new ImageReceiver.ImageReceiverDelegate() { + thumbImageView.getImageReceiver().setDelegate(new ImageReceiver.ImageReceiverDelegate() { @Override public void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb) { - extTextView.setVisibility(set ? GONE : VISIBLE); - placeholderImabeView.setVisibility(set ? GONE : VISIBLE); + extTextView.setVisibility(set ? INVISIBLE : VISIBLE); + placeholderImabeView.setVisibility(set ? INVISIBLE : VISIBLE); } }); addView(thumbImageView); @@ -143,7 +143,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. nameTextView.setLayoutParams(layoutParams); statusImageView = new ImageView(context); - statusImageView.setVisibility(GONE); + statusImageView.setVisibility(INVISIBLE); addView(statusImageView); layoutParams = (LayoutParams) statusImageView.getLayoutParams(); layoutParams.width = LayoutParams.WRAP_CONTENT; @@ -184,7 +184,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. progressView.setLayoutParams(layoutParams); checkBox = new CheckBox(context, R.drawable.round_check2); - checkBox.setVisibility(GONE); + checkBox.setVisibility(INVISIBLE); addView(checkBox); layoutParams = (LayoutParams) checkBox.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(22); @@ -229,13 +229,13 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. extTextView.setVisibility(VISIBLE); extTextView.setText(type); } else { - extTextView.setVisibility(GONE); + extTextView.setVisibility(INVISIBLE); } if (resId == 0) { placeholderImabeView.setImageResource(getThumbForNameOrMime(text, type)); placeholderImabeView.setVisibility(VISIBLE); } else { - placeholderImabeView.setVisibility(GONE); + placeholderImabeView.setVisibility(INVISIBLE); } if (thumb != null || resId != 0) { if (thumb != null) { @@ -245,7 +245,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. } thumbImageView.setVisibility(VISIBLE); } else { - thumbImageView.setVisibility(GONE); + thumbImageView.setVisibility(INVISIBLE); } } @@ -277,7 +277,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. nameTextView.setText(name); extTextView.setText((idx = name.lastIndexOf(".")) == -1 ? "" : name.substring(idx + 1).toLowerCase()); if (document.messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty) { - thumbImageView.setVisibility(GONE); + thumbImageView.setVisibility(INVISIBLE); thumbImageView.setImageBitmap(null); } else { thumbImageView.setVisibility(VISIBLE); @@ -291,7 +291,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. dateTextView.setText(""); placeholderImabeView.setVisibility(VISIBLE); extTextView.setVisibility(VISIBLE); - thumbImageView.setVisibility(GONE); + thumbImageView.setVisibility(INVISIBLE); thumbImageView.setImageBitmap(null); } @@ -312,7 +312,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. } loaded = false; if (fileName == null) { - statusImageView.setVisibility(GONE); + statusImageView.setVisibility(INVISIBLE); dateTextView.setPadding(0, 0, 0, 0); loading = false; loaded = true; @@ -331,15 +331,15 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. } progressView.setProgress(progress, false); } else { - progressView.setVisibility(GONE); + progressView.setVisibility(INVISIBLE); } } } else { loading = false; loaded = true; - progressView.setVisibility(GONE); + progressView.setVisibility(INVISIBLE); progressView.setProgress(0, false); - statusImageView.setVisibility(GONE); + statusImageView.setVisibility(INVISIBLE); dateTextView.setPadding(0, 0, 0, 0); MediaController.getInstance().removeLoadingFileObserver(this); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java index 32719d2a3..7b6085d45 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java @@ -55,8 +55,8 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed { super(context); imageView = new BackupImageView(context); - imageView.imageReceiver.setNeedsQualityThumb(true); - imageView.imageReceiver.setShouldGenerateQualityThumb(true); + imageView.getImageReceiver().setNeedsQualityThumb(true); + imageView.getImageReceiver().setShouldGenerateQualityThumb(true); addView(imageView); LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; @@ -105,7 +105,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed { selector.setLayoutParams(layoutParams); checkBox = new CheckBox(context, R.drawable.round_check2); - checkBox.setVisibility(GONE); + checkBox.setVisibility(INVISIBLE); addView(checkBox); layoutParams = (LayoutParams) checkBox.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(22); @@ -134,7 +134,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed { for (int a = 0; a < 6; a++) { photoVideoViews[a] = new PhotoVideoView(context); addView(photoVideoViews[a]); - photoVideoViews[a].setVisibility(GONE); + photoVideoViews[a].setVisibility(INVISIBLE); photoVideoViews[a].setTag(a); photoVideoViews[a].setOnClickListener(new OnClickListener() { @Override @@ -164,7 +164,7 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed { public void setItemsCount(int count) { for (int a = 0; a < photoVideoViews.length; a++) { - photoVideoViews[a].setVisibility(a < count ? VISIBLE : GONE); + photoVideoViews[a].setVisibility(a < count ? VISIBLE : INVISIBLE); } itemsCount = count; } @@ -202,8 +202,8 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed { photoVideoViews[a].setVisibility(VISIBLE); PhotoVideoView photoVideoView = photoVideoViews[a]; - photoVideoView.imageView.imageReceiver.setParentMessageObject(messageObject); - photoVideoView.imageView.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(messageObject), false); + photoVideoView.imageView.getImageReceiver().setParentMessageObject(messageObject); + photoVideoView.imageView.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(messageObject), false); if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo && messageObject.messageOwner.media.video != null) { photoVideoView.videoInfoContainer.setVisibility(VISIBLE); int duration = messageObject.messageOwner.media.video.duration; @@ -217,15 +217,15 @@ public class SharedPhotoVideoCell extends FrameLayoutFixed { photoVideoView.imageView.setImageResource(R.drawable.photo_placeholder_in); } } else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && messageObject.messageOwner.media.photo != null && !messageObject.photoThumbs.isEmpty()) { - photoVideoView.videoInfoContainer.setVisibility(GONE); + photoVideoView.videoInfoContainer.setVisibility(INVISIBLE); TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80); photoVideoView.imageView.setImage(null, null, null, ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.photo_placeholder_in), null, photoSize.location, "b", 0); } else { - photoVideoView.videoInfoContainer.setVisibility(GONE); + photoVideoView.videoInfoContainer.setVisibility(INVISIBLE); photoVideoView.imageView.setImageResource(R.drawable.photo_placeholder_in); } } else { - photoVideoViews[a].setVisibility(GONE); + photoVideoViews[a].setVisibility(INVISIBLE); messageObjects[a] = null; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java index 59b9c4ddf..34e04c69b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java @@ -26,9 +26,7 @@ public class StickerCell extends FrameLayoutFixed { super(context); imageView = new BackupImageView(context); - imageView.imageReceiver.setAspectFit(true); - imageView.imageReceiver.setDisableRecycle(true); - imageView.processDetach = false; + imageView.setAspectFit(true); addView(imageView); LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(66); @@ -45,8 +43,8 @@ public class StickerCell extends FrameLayoutFixed { @Override public void setPressed(boolean pressed) { - if (imageView.imageReceiver.getPressed() != pressed) { - imageView.imageReceiver.setPressed(pressed); + if (imageView.getImageReceiver().getPressed() != pressed) { + imageView.getImageReceiver().setPressed(pressed); imageView.invalidate(); } super.setPressed(pressed); 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 0c05b6e53..d86331002 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java @@ -97,32 +97,32 @@ public class TextCell extends FrameLayout { public void setText(String text) { textView.setText(text); - imageView.setVisibility(GONE); - valueTextView.setVisibility(GONE); - valueImageView.setVisibility(GONE); + imageView.setVisibility(INVISIBLE); + valueTextView.setVisibility(INVISIBLE); + valueImageView.setVisibility(INVISIBLE); } public void setTextAndIcon(String text, int resId) { textView.setText(text); imageView.setImageResource(resId); imageView.setVisibility(VISIBLE); - valueTextView.setVisibility(GONE); - valueImageView.setVisibility(GONE); + valueTextView.setVisibility(INVISIBLE); + valueImageView.setVisibility(INVISIBLE); } public void setTextAndValue(String text, String value) { textView.setText(text); valueTextView.setText(value); valueTextView.setVisibility(VISIBLE); - imageView.setVisibility(GONE); - valueImageView.setVisibility(GONE); + imageView.setVisibility(INVISIBLE); + valueImageView.setVisibility(INVISIBLE); } public void setTextAndValueDrawable(String text, Drawable drawable) { textView.setText(text); valueImageView.setVisibility(VISIBLE); valueImageView.setImageDrawable(drawable); - valueTextView.setVisibility(GONE); - imageView.setVisibility(GONE); + valueTextView.setVisibility(INVISIBLE); + imageView.setVisibility(INVISIBLE); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java index 86afa6085..513daf871 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java @@ -82,7 +82,7 @@ public class TextDetailCell extends FrameLayout { public void setTextAndValue(String text, String value) { textView.setText(text); valueTextView.setText(value); - imageView.setVisibility(GONE); + imageView.setVisibility(INVISIBLE); } public void setTextAndValueAndIcon(String text, String value, int resId) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextFieldCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextFieldCell.java deleted file mode 100644 index 3d8cb7cde..000000000 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextFieldCell.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * This is the source code of Telegram for Android v. 2.0.x. - * It is licensed under GNU GPL v. 2 or later. - * You should have received a copy of the license in this archive (see LICENSE). - * - * Copyright Nikolai Kudashov, 2013-2014. - */ - -package org.telegram.ui.Cells; - -import android.content.Context; -import android.graphics.Typeface; -import android.text.InputType; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.inputmethod.EditorInfo; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.TextView; - -import org.telegram.android.AndroidUtilities; -import org.telegram.android.LocaleController; - -public class TextFieldCell extends LinearLayout { - - private TextView textView; - private EditText editText; - - public TextFieldCell(Context context) { - super(context); - setOrientation(VERTICAL); - - textView = new TextView(context); - textView.setTextColor(0xff505050); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); - addView(textView); - LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(17); - layoutParams.height = LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(17); - layoutParams.rightMargin = AndroidUtilities.dp(17); - layoutParams.width = LayoutParams.MATCH_PARENT; - textView.setLayoutParams(layoutParams); - - editText = new EditText(context); - editText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - editText.setHintTextColor(0xffbebebe); - editText.setTextColor(0xff212121); - editText.setMaxLines(1); - editText.setLines(1); - editText.setSingleLine(true); - editText.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - editText.setImeOptions(EditorInfo.IME_ACTION_DONE); - AndroidUtilities.clearCursorDrawable(editText); - addView(editText); - layoutParams = (LayoutParams) editText.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(10); - layoutParams.bottomMargin = AndroidUtilities.dp(17); - layoutParams.height = AndroidUtilities.dp(30); - layoutParams.leftMargin = AndroidUtilities.dp(17); - layoutParams.rightMargin = AndroidUtilities.dp(17); - layoutParams.width = LayoutParams.MATCH_PARENT; - editText.setLayoutParams(layoutParams); - editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_DONE) { - textView.clearFocus(); - AndroidUtilities.hideKeyboard(textView); - return true; - } - return false; - } - }); - } - - public void setFieldText(String text) { - editText.setText(text); - } - - public String getFieldText() { - return editText.getText().toString(); - } - - public void setFieldTitleAndHint(String title, String hint, int bottom, boolean password) { - editText.setHint(hint); - LayoutParams layoutParams = (LayoutParams) editText.getLayoutParams(); - layoutParams.bottomMargin = bottom; - editText.setLayoutParams(layoutParams); - if (password) { - editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); - editText.setTypeface(Typeface.DEFAULT); - } else { - editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - } - if (title != null) { - textView.setText(title); - textView.setVisibility(VISIBLE); - } else { - textView.setVisibility(GONE); - } - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java index b16c84c70..6c8bcffa6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java @@ -25,10 +25,10 @@ public class TextInfoPrivacyCell extends FrameLayout { super(context); textView = new TextView(context); - textView.setTextColor(0xffa3a3a3); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + textView.setTextColor(0xff808080); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - textView.setPadding(0, AndroidUtilities.dp(6), 0, AndroidUtilities.dp(16)); + textView.setPadding(0, AndroidUtilities.dp(10), 0, AndroidUtilities.dp(17)); addView(textView); LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams(); layoutParams.width = LayoutParams.WRAP_CONTENT; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java index e6c0414c2..e3c3ffb58 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java @@ -74,7 +74,7 @@ public class TextSettingsCell extends FrameLayout { valueImageView = new ImageView(context); valueImageView.setScaleType(ImageView.ScaleType.CENTER); - valueImageView.setVisibility(GONE); + valueImageView.setVisibility(INVISIBLE); addView(valueImageView); layoutParams = (LayoutParams) valueImageView.getLayoutParams(); layoutParams.width = LayoutParams.WRAP_CONTENT; @@ -109,20 +109,20 @@ public class TextSettingsCell extends FrameLayout { public void setText(String text, boolean divider) { textView.setText(text); - valueTextView.setVisibility(GONE); - valueImageView.setVisibility(GONE); + valueTextView.setVisibility(INVISIBLE); + valueImageView.setVisibility(INVISIBLE); needDivider = divider; setWillNotDraw(!divider); } public void setTextAndValue(String text, String value, boolean divider) { textView.setText(text); - valueImageView.setVisibility(GONE); + valueImageView.setVisibility(INVISIBLE); if (value != null) { valueTextView.setText(value); valueTextView.setVisibility(VISIBLE); } else { - valueTextView.setVisibility(GONE); + valueTextView.setVisibility(INVISIBLE); } needDivider = divider; setWillNotDraw(!divider); @@ -130,12 +130,12 @@ public class TextSettingsCell extends FrameLayout { public void setTextAndIcon(String text, int resId, boolean divider) { textView.setText(text); - valueTextView.setVisibility(GONE); + valueTextView.setVisibility(INVISIBLE); if (resId != 0) { valueImageView.setVisibility(VISIBLE); valueImageView.setImageResource(resId); } else { - valueImageView.setVisibility(GONE); + valueImageView.setVisibility(INVISIBLE); } needDivider = divider; setWillNotDraw(!divider); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java index c5bda3824..909be3b41 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java @@ -54,7 +54,7 @@ public class UserCell extends FrameLayout { super(context); avatarImageView = new BackupImageView(context); - avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(24)); + avatarImageView.setRoundRadius(AndroidUtilities.dp(24)); addView(avatarImageView); LayoutParams layoutParams = (LayoutParams) avatarImageView.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(48); @@ -113,7 +113,7 @@ public class UserCell extends FrameLayout { imageView.setLayoutParams(layoutParams); checkBox = new CheckBox(context, R.drawable.round_check2); - checkBox.setVisibility(GONE); + checkBox.setVisibility(INVISIBLE); addView(checkBox); layoutParams = (LayoutParams) checkBox.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(22); @@ -228,7 +228,7 @@ public class UserCell extends FrameLayout { } } - imageView.setVisibility(currentDrawable == 0 ? GONE : VISIBLE); + imageView.setVisibility(currentDrawable == 0 ? INVISIBLE : VISIBLE); imageView.setImageResource(currentDrawable); avatarImageView.setImage(photo, "50_50", avatarDrawable); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java index 5213e61c9..eb94acb69 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import android.app.Activity; +import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.InputType; @@ -55,85 +56,78 @@ public class ChangeChatNameActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (firstNameField.getText().length() != 0) { + saveName(); finishFragment(); - } else if (id == done_button) { - if (firstNameField.getText().length() != 0) { - saveName(); - finishFragment(); - } } } - }); + } + }); - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + ActionBarMenu menu = actionBar.createMenu(); + doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - TLRPC.Chat currentChat = MessagesController.getInstance().getChat(chat_id); + TLRPC.Chat currentChat = MessagesController.getInstance().getChat(chat_id); - fragmentView = new LinearLayout(getParentActivity()); - fragmentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - ((LinearLayout) fragmentView).setOrientation(LinearLayout.VERTICAL); - fragmentView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { + fragmentView = new LinearLayout(context); + fragmentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + ((LinearLayout) fragmentView).setOrientation(LinearLayout.VERTICAL); + fragmentView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + firstNameField = new EditText(context); + firstNameField.setText(currentChat.title); + firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + firstNameField.setHintTextColor(0xff979797); + firstNameField.setTextColor(0xff212121); + firstNameField.setMaxLines(3); + firstNameField.setPadding(0, 0, 0, 0); + firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + firstNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); + firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + AndroidUtilities.clearCursorDrawable(firstNameField); + firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_DONE && doneButton != null) { + doneButton.performClick(); return true; } - }); - - firstNameField = new EditText(getParentActivity()); - firstNameField.setText(currentChat.title); - firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - firstNameField.setHintTextColor(0xff979797); - firstNameField.setTextColor(0xff212121); - firstNameField.setMaxLines(3); - firstNameField.setPadding(0, 0, 0, 0); - firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - firstNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); - firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - AndroidUtilities.clearCursorDrawable(firstNameField); - firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_DONE && doneButton != null) { - doneButton.performClick(); - return true; - } - return false; - } - }); - - ((LinearLayout) fragmentView).addView(firstNameField); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)firstNameField.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(24); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - firstNameField.setLayoutParams(layoutParams); - - if (chat_id > 0) { - firstNameField.setHint(LocaleController.getString("GroupName", R.string.GroupName)); - } else { - firstNameField.setHint(LocaleController.getString("EnterListName", R.string.EnterListName)); + return false; } - firstNameField.setSelection(firstNameField.length()); + }); + + ((LinearLayout) fragmentView).addView(firstNameField); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) firstNameField.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(24); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + firstNameField.setLayoutParams(layoutParams); + + if (chat_id > 0) { + firstNameField.setHint(LocaleController.getString("GroupName", R.string.GroupName)); } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + firstNameField.setHint(LocaleController.getString("EnterListName", R.string.EnterListName)); } + firstNameField.setSelection(firstNameField.length()); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java index 465b38ff1..4c672106e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import android.app.Activity; +import android.content.Context; import android.content.SharedPreferences; import android.text.InputType; import android.util.TypedValue; @@ -48,117 +49,111 @@ public class ChangeNameActivity extends BaseFragment { private final static int done_button = 1; @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (firstNameField.getText().length() != 0) { + saveName(); finishFragment(); - } else if (id == done_button) { - if (firstNameField.getText().length() != 0) { - saveName(); - finishFragment(); - } } } - }); - - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); - if (user == null) { - user = UserConfig.getCurrentUser(); } + }); - fragmentView = new LinearLayout(getParentActivity()); - fragmentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - ((LinearLayout) fragmentView).setOrientation(LinearLayout.VERTICAL); - fragmentView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { + ActionBarMenu menu = actionBar.createMenu(); + doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); + if (user == null) { + user = UserConfig.getCurrentUser(); + } + + fragmentView = new LinearLayout(context); + fragmentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + ((LinearLayout) fragmentView).setOrientation(LinearLayout.VERTICAL); + fragmentView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + firstNameField = new EditText(context); + firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + firstNameField.setHintTextColor(0xff979797); + firstNameField.setTextColor(0xff212121); + firstNameField.setMaxLines(1); + firstNameField.setLines(1); + firstNameField.setSingleLine(true); + firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + firstNameField.setImeOptions(EditorInfo.IME_ACTION_NEXT); + firstNameField.setHint(LocaleController.getString("FirstName", R.string.FirstName)); + AndroidUtilities.clearCursorDrawable(firstNameField); + ((LinearLayout) fragmentView).addView(firstNameField); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) firstNameField.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(24); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + firstNameField.setLayoutParams(layoutParams); + firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT) { + lastNameField.requestFocus(); + lastNameField.setSelection(lastNameField.length()); return true; } - }); - - firstNameField = new EditText(getParentActivity()); - firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - firstNameField.setHintTextColor(0xff979797); - firstNameField.setTextColor(0xff212121); - firstNameField.setMaxLines(1); - firstNameField.setLines(1); - firstNameField.setSingleLine(true); - firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - firstNameField.setImeOptions(EditorInfo.IME_ACTION_NEXT); - firstNameField.setHint(LocaleController.getString("FirstName", R.string.FirstName)); - AndroidUtilities.clearCursorDrawable(firstNameField); - ((LinearLayout) fragmentView).addView(firstNameField); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)firstNameField.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(24); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - firstNameField.setLayoutParams(layoutParams); - firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_NEXT) { - lastNameField.requestFocus(); - lastNameField.setSelection(lastNameField.length()); - return true; - } - return false; - } - }); - - lastNameField = new EditText(getParentActivity()); - lastNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - lastNameField.setHintTextColor(0xff979797); - lastNameField.setTextColor(0xff212121); - lastNameField.setMaxLines(1); - lastNameField.setLines(1); - lastNameField.setSingleLine(true); - lastNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - lastNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - lastNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); - lastNameField.setHint(LocaleController.getString("LastName", R.string.LastName)); - AndroidUtilities.clearCursorDrawable(lastNameField); - ((LinearLayout) fragmentView).addView(lastNameField); - layoutParams = (LinearLayout.LayoutParams)lastNameField.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(16); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - lastNameField.setLayoutParams(layoutParams); - lastNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_DONE) { - doneButton.performClick(); - return true; - } - return false; - } - }); - - if (user != null) { - firstNameField.setText(user.first_name); - firstNameField.setSelection(firstNameField.length()); - lastNameField.setText(user.last_name); + return false; } - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + }); + + lastNameField = new EditText(context); + lastNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + lastNameField.setHintTextColor(0xff979797); + lastNameField.setTextColor(0xff212121); + lastNameField.setMaxLines(1); + lastNameField.setLines(1); + lastNameField.setSingleLine(true); + lastNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + lastNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + lastNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); + lastNameField.setHint(LocaleController.getString("LastName", R.string.LastName)); + AndroidUtilities.clearCursorDrawable(lastNameField); + ((LinearLayout) fragmentView).addView(lastNameField); + layoutParams = (LinearLayout.LayoutParams) lastNameField.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(16); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + lastNameField.setLayoutParams(layoutParams); + lastNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_DONE) { + doneButton.performClick(); + return true; + } + return false; } + }); + + if (user != null) { + firstNameField.setText(user.first_name); + firstNameField.setSelection(firstNameField.length()); + lastNameField.setText(user.last_name); } + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java index 18f5423df..01e54b550 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java @@ -25,7 +25,6 @@ import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.inputmethod.EditorInfo; @@ -101,80 +100,74 @@ public class ChangePhoneActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == done_button) { - views[currentViewNum].onNextPressed(); - } else if (id == -1) { - finishFragment(); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == done_button) { + views[currentViewNum].onNextPressed(); + } else if (id == -1) { + finishFragment(); + } + } + }); + + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + fragmentView = new ScrollView(context); + ScrollView scrollView = (ScrollView) fragmentView; + scrollView.setFillViewport(true); + + FrameLayout frameLayout = new FrameLayout(context); + scrollView.addView(frameLayout); + ScrollView.LayoutParams layoutParams = (ScrollView.LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = ScrollView.LayoutParams.MATCH_PARENT; + layoutParams.height = ScrollView.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + frameLayout.setLayoutParams(layoutParams); + + views[0] = new PhoneView(context); + views[0].setVisibility(View.VISIBLE); + frameLayout.addView(views[0]); + FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) views[0].getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.leftMargin = AndroidUtilities.dp(16); + layoutParams1.rightMargin = AndroidUtilities.dp(16); + layoutParams1.topMargin = AndroidUtilities.dp(30); + layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; + views[0].setLayoutParams(layoutParams1); + + views[1] = new LoginActivitySmsView(context); + views[1].setVisibility(View.GONE); + frameLayout.addView(views[1]); + layoutParams1 = (FrameLayout.LayoutParams) views[1].getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.leftMargin = AndroidUtilities.dp(16); + layoutParams1.rightMargin = AndroidUtilities.dp(16); + layoutParams1.topMargin = AndroidUtilities.dp(30); + layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; + views[1].setLayoutParams(layoutParams1); + + try { + if (views[0] == null || views[1] == null) { + FrameLayout parent = (FrameLayout) ((ScrollView) fragmentView).getChildAt(0); + for (int a = 0; a < views.length; a++) { + if (views[a] == null) { + views[a] = (SlideView) parent.getChildAt(a); } } - }); - - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - fragmentView = new ScrollView(getParentActivity()); - ScrollView scrollView = (ScrollView) fragmentView; - scrollView.setFillViewport(true); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - scrollView.addView(frameLayout); - ScrollView.LayoutParams layoutParams = (ScrollView.LayoutParams) frameLayout.getLayoutParams(); - layoutParams.width = ScrollView.LayoutParams.MATCH_PARENT; - layoutParams.height = ScrollView.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - frameLayout.setLayoutParams(layoutParams); - - views[0] = new PhoneView(getParentActivity()); - views[0].setVisibility(View.VISIBLE); - frameLayout.addView(views[0]); - FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) views[0].getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.leftMargin = AndroidUtilities.dp(16); - layoutParams1.rightMargin = AndroidUtilities.dp(16); - layoutParams1.topMargin = AndroidUtilities.dp(30); - layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; - views[0].setLayoutParams(layoutParams1); - - views[1] = new LoginActivitySmsView(getParentActivity()); - views[1].setVisibility(View.GONE); - frameLayout.addView(views[1]); - layoutParams1 = (FrameLayout.LayoutParams) views[1].getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.leftMargin = AndroidUtilities.dp(16); - layoutParams1.rightMargin = AndroidUtilities.dp(16); - layoutParams1.topMargin = AndroidUtilities.dp(30); - layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; - views[1].setLayoutParams(layoutParams1); - - try { - if (views[0] == null || views[1] == null) { - FrameLayout parent = (FrameLayout)((ScrollView) fragmentView).getChildAt(0); - for (int a = 0; a < views.length; a++) { - if (views[a] == null) { - views[a] = (SlideView)parent.getChildAt(a); - } - } - } - } catch (Exception e) { - FileLog.e("tmessages", e); - } - - actionBar.setTitle(views[0].getHeaderName()); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } + } catch (Exception e) { + FileLog.e("tmessages", e); } + + actionBar.setTitle(views[0].getHeaderName()); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java index a2f952728..3da860185 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java @@ -9,13 +9,13 @@ package org.telegram.ui; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; @@ -35,129 +35,122 @@ import org.telegram.ui.ActionBar.BaseFragment; public class ChangePhoneHelpActivity extends BaseFragment { @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - - TLRPC.User user = UserConfig.getCurrentUser(); - String value; - if (user != null && user.phone != null && user.phone.length() != 0) { - value = PhoneFormat.getInstance().format("+" + user.phone); - } else { - value = LocaleController.getString("NumberUnknown", R.string.NumberUnknown); - } - - actionBar.setTitle(value); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } - } - }); - - fragmentView = new RelativeLayout(getParentActivity()); - fragmentView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - RelativeLayout relativeLayout = (RelativeLayout) fragmentView; - - ScrollView scrollView = new ScrollView(getParentActivity()); - relativeLayout.addView(scrollView); - RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) scrollView.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); - scrollView.setLayoutParams(layoutParams3); - - LinearLayout linearLayout = new LinearLayout(getParentActivity()); - linearLayout.setOrientation(LinearLayout.VERTICAL); - linearLayout.setPadding(0, AndroidUtilities.dp(20), 0, AndroidUtilities.dp(20)); - scrollView.addView(linearLayout); - ScrollView.LayoutParams layoutParams = (ScrollView.LayoutParams) linearLayout.getLayoutParams(); - layoutParams.width = ScrollView.LayoutParams.MATCH_PARENT; - layoutParams.height = ScrollView.LayoutParams.WRAP_CONTENT; - linearLayout.setLayoutParams(layoutParams); - - ImageView imageView = new ImageView(getParentActivity()); - imageView.setImageResource(R.drawable.phone_change); - linearLayout.addView(imageView); - LinearLayout.LayoutParams layoutParams2 = (LinearLayout.LayoutParams)imageView.getLayoutParams(); - layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.CENTER_HORIZONTAL; - imageView.setLayoutParams(layoutParams2); - - TextView textView = new TextView(getParentActivity()); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - textView.setGravity(Gravity.CENTER_HORIZONTAL); - textView.setTextColor(0xff212121); - - try { - textView.setText(AndroidUtilities.replaceBold(LocaleController.getString("PhoneNumberHelp", R.string.PhoneNumberHelp))); - } catch (Exception e) { - FileLog.e("tmessages", e); - textView.setText(LocaleController.getString("PhoneNumberHelp", R.string.PhoneNumberHelp)); - } - linearLayout.addView(textView); - layoutParams2 = (LinearLayout.LayoutParams)textView.getLayoutParams(); - layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.CENTER_HORIZONTAL; - layoutParams2.leftMargin = AndroidUtilities.dp(20); - layoutParams2.rightMargin = AndroidUtilities.dp(20); - layoutParams2.topMargin = AndroidUtilities.dp(56); - textView.setLayoutParams(layoutParams2); - - textView = new TextView(getParentActivity()); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - textView.setGravity(Gravity.CENTER_HORIZONTAL); - textView.setTextColor(0xff4d83b3); - textView.setText(LocaleController.getString("PhoneNumberChange", R.string.PhoneNumberChange)); - textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - textView.setPadding(0, AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10)); - linearLayout.addView(textView); - layoutParams2 = (LinearLayout.LayoutParams)textView.getLayoutParams(); - layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.CENTER_HORIZONTAL; - layoutParams2.leftMargin = AndroidUtilities.dp(20); - layoutParams2.rightMargin = AndroidUtilities.dp(20); - layoutParams2.topMargin = AndroidUtilities.dp(46); - textView.setLayoutParams(layoutParams2); - - textView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("PhoneNumberAlert", R.string.PhoneNumberAlert)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - presentFragment(new ChangePhoneActivity(), true); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - }); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + TLRPC.User user = UserConfig.getCurrentUser(); + String value; + if (user != null && user.phone != null && user.phone.length() != 0) { + value = PhoneFormat.getInstance().format("+" + user.phone); } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + value = LocaleController.getString("NumberUnknown", R.string.NumberUnknown); } + + actionBar.setTitle(value); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + fragmentView = new RelativeLayout(context); + fragmentView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + RelativeLayout relativeLayout = (RelativeLayout) fragmentView; + + ScrollView scrollView = new ScrollView(context); + relativeLayout.addView(scrollView); + RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) scrollView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE); + scrollView.setLayoutParams(layoutParams3); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + linearLayout.setPadding(0, AndroidUtilities.dp(20), 0, AndroidUtilities.dp(20)); + scrollView.addView(linearLayout); + ScrollView.LayoutParams layoutParams = (ScrollView.LayoutParams) linearLayout.getLayoutParams(); + layoutParams.width = ScrollView.LayoutParams.MATCH_PARENT; + layoutParams.height = ScrollView.LayoutParams.WRAP_CONTENT; + linearLayout.setLayoutParams(layoutParams); + + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.phone_change); + linearLayout.addView(imageView); + LinearLayout.LayoutParams layoutParams2 = (LinearLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER_HORIZONTAL; + imageView.setLayoutParams(layoutParams2); + + TextView textView = new TextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + textView.setGravity(Gravity.CENTER_HORIZONTAL); + textView.setTextColor(0xff212121); + + try { + textView.setText(AndroidUtilities.replaceTags(LocaleController.getString("PhoneNumberHelp", R.string.PhoneNumberHelp))); + } catch (Exception e) { + FileLog.e("tmessages", e); + textView.setText(LocaleController.getString("PhoneNumberHelp", R.string.PhoneNumberHelp)); + } + linearLayout.addView(textView); + layoutParams2 = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams2.leftMargin = AndroidUtilities.dp(20); + layoutParams2.rightMargin = AndroidUtilities.dp(20); + layoutParams2.topMargin = AndroidUtilities.dp(56); + textView.setLayoutParams(layoutParams2); + + textView = new TextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + textView.setGravity(Gravity.CENTER_HORIZONTAL); + textView.setTextColor(0xff4d83b3); + textView.setText(LocaleController.getString("PhoneNumberChange", R.string.PhoneNumberChange)); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setPadding(0, AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10)); + linearLayout.addView(textView); + layoutParams2 = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams2.leftMargin = AndroidUtilities.dp(20); + layoutParams2.rightMargin = AndroidUtilities.dp(20); + layoutParams2.topMargin = AndroidUtilities.dp(46); + textView.setLayoutParams(layoutParams2); + + textView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("PhoneNumberAlert", R.string.PhoneNumberAlert)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + presentFragment(new ChangePhoneActivity(), true); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + }); + return fragmentView; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java index 0f5d84290..e0169de83 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java @@ -11,6 +11,7 @@ package org.telegram.ui; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.text.Editable; @@ -61,130 +62,124 @@ public class ChangeUsernameActivity extends BaseFragment { private final static int done_button = 1; @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("Username", R.string.Username)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - saveName(); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("Username", R.string.Username)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + saveName(); } - }); - - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); - if (user == null) { - user = UserConfig.getCurrentUser(); } + }); - fragmentView = new LinearLayout(getParentActivity()); - fragmentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - ((LinearLayout) fragmentView).setOrientation(LinearLayout.VERTICAL); - fragmentView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { + ActionBarMenu menu = actionBar.createMenu(); + doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); + if (user == null) { + user = UserConfig.getCurrentUser(); + } + + fragmentView = new LinearLayout(context); + fragmentView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + ((LinearLayout) fragmentView).setOrientation(LinearLayout.VERTICAL); + fragmentView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + firstNameField = new EditText(context); + firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + firstNameField.setHintTextColor(0xff979797); + firstNameField.setTextColor(0xff212121); + firstNameField.setMaxLines(1); + firstNameField.setLines(1); + firstNameField.setPadding(0, 0, 0, 0); + firstNameField.setSingleLine(true); + firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + firstNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); + firstNameField.setHint(LocaleController.getString("UsernamePlaceholder", R.string.UsernamePlaceholder)); + AndroidUtilities.clearCursorDrawable(firstNameField); + firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_DONE && doneButton != null) { + doneButton.performClick(); return true; } - }); - - firstNameField = new EditText(getParentActivity()); - firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - firstNameField.setHintTextColor(0xff979797); - firstNameField.setTextColor(0xff212121); - firstNameField.setMaxLines(1); - firstNameField.setLines(1); - firstNameField.setPadding(0, 0, 0, 0); - firstNameField.setSingleLine(true); - firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - firstNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); - firstNameField.setHint(LocaleController.getString("UsernamePlaceholder", R.string.UsernamePlaceholder)); - AndroidUtilities.clearCursorDrawable(firstNameField); - firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_DONE && doneButton != null) { - doneButton.performClick(); - return true; - } - return false; - } - }); - - ((LinearLayout) fragmentView).addView(firstNameField); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)firstNameField.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(24); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - firstNameField.setLayoutParams(layoutParams); - - if (user != null && user.username != null && user.username.length() > 0) { - firstNameField.setText(user.username); - firstNameField.setSelection(firstNameField.length()); + return false; } + }); - checkTextView = new TextView(getParentActivity()); - checkTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - checkTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - ((LinearLayout) fragmentView).addView(checkTextView); - layoutParams = (LinearLayout.LayoutParams)checkTextView.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(12); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - checkTextView.setLayoutParams(layoutParams); + ((LinearLayout) fragmentView).addView(firstNameField); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) firstNameField.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(24); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + firstNameField.setLayoutParams(layoutParams); - TextView helpTextView = new TextView(getParentActivity()); - helpTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - helpTextView.setTextColor(0xff6d6d72); - helpTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - helpTextView.setText(Html.fromHtml(LocaleController.getString("UsernameHelp", R.string.UsernameHelp))); - ((LinearLayout) fragmentView).addView(helpTextView); - layoutParams = (LinearLayout.LayoutParams)helpTextView.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(10); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - helpTextView.setLayoutParams(layoutParams); - - firstNameField.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { - - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { - checkUserName(firstNameField.getText().toString(), false); - } - - @Override - public void afterTextChanged(Editable editable) { - - } - }); - - checkTextView.setVisibility(View.GONE); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + if (user != null && user.username != null && user.username.length() > 0) { + firstNameField.setText(user.username); + firstNameField.setSelection(firstNameField.length()); } + + checkTextView = new TextView(context); + checkTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + checkTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + ((LinearLayout) fragmentView).addView(checkTextView); + layoutParams = (LinearLayout.LayoutParams) checkTextView.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(12); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + checkTextView.setLayoutParams(layoutParams); + + TextView helpTextView = new TextView(context); + helpTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + helpTextView.setTextColor(0xff6d6d72); + helpTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + helpTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("UsernameHelp", R.string.UsernameHelp))); + ((LinearLayout) fragmentView).addView(helpTextView); + layoutParams = (LinearLayout.LayoutParams) helpTextView.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(10); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + helpTextView.setLayoutParams(layoutParams); + + firstNameField.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + checkUserName(firstNameField.getText().toString(), false); + } + + @Override + public void afterTextChanged(Editable editable) { + + } + }); + + checkTextView.setVisibility(View.GONE); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index ce9cd1f9c..801c41d59 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -27,7 +27,6 @@ import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.widget.LinearLayoutManager; -import android.text.Html; import android.text.TextUtils; import android.util.Base64; import android.util.SparseArray; @@ -166,6 +165,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private MessageObject replyingMessageObject; private boolean paused = true; private boolean readWhenResume = false; + private TLRPC.FileLocation replyImageLocation; + private long linkSearchRequestId; + private TLRPC.WebPage foundWebPage; + private String pendingLinkSearchString; + private Runnable pendingWebPageTimeoutRunnable; + private Runnable waitingForCharaterEnterRunnable; private boolean openAnimationEnded = false; @@ -381,7 +386,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } } - dialog_id = ((long)encId) << 32; + dialog_id = ((long) encId) << 32; maxMessageId = Integer.MIN_VALUE; minMessageId = Integer.MAX_VALUE; MediaController.getInstance().startMediaObserver(); @@ -415,6 +420,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not NotificationCenter.getInstance().addObserver(this, NotificationCenter.replaceMessagesObjects); NotificationCenter.getInstance().addObserver(this, NotificationCenter.notificationsSettingsUpdated); NotificationCenter.getInstance().addObserver(this, NotificationCenter.didLoadedReplyMessages); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.didReceivedWebpages); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.didReceivedWebpagesInUpdates); super.onFragmentCreate(); @@ -451,12 +458,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (chatActivityEnterView != null) { chatActivityEnterView.onDestroy(); } - if (avatarImageView != null) { - avatarImageView.setImageDrawable(null); - } - if (replyImageView != null) { - replyImageView.setImageDrawable(null); - } NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messagesDidLoaded); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.emojiDidLoaded); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces); @@ -483,6 +484,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not NotificationCenter.getInstance().removeObserver(this, NotificationCenter.replaceMessagesObjects); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.notificationsSettingsUpdated); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didLoadedReplyMessages); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didReceivedWebpages); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didReceivedWebpagesInUpdates); + if (AndroidUtilities.isTablet()) { NotificationCenter.getInstance().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, true); } @@ -503,1444 +507,1531 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - lastPrintString = null; - lastStatus = null; + public View createView(Context context, LayoutInflater inflater) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(final int id) { - if (id == attach_photo || id == attach_gallery || id == attach_document || id == attach_video) { - String action = null; - if (currentChat != null) { - if (currentChat.participants_count > MessagesController.getInstance().groupBigSize) { - if (id == attach_photo || id == attach_gallery) { - action = "bigchat_upload_photo"; - } else { - action = "bigchat_upload_document"; - } + lastPrintString = null; + lastStatus = null; + hasOwnBackground = true; + + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(final int id) { + if (id == attach_photo || id == attach_gallery || id == attach_document || id == attach_video) { + String action = null; + if (currentChat != null) { + if (currentChat.participants_count > MessagesController.getInstance().groupBigSize) { + if (id == attach_photo || id == attach_gallery) { + action = "bigchat_upload_photo"; } else { - if (id == attach_photo || id == attach_gallery) { - action = "chat_upload_photo"; - } else { - action = "chat_upload_document"; - } + action = "bigchat_upload_document"; } } else { if (id == attach_photo || id == attach_gallery) { - action = "pm_upload_photo"; + action = "chat_upload_photo"; } else { - action = "pm_upload_document"; + action = "chat_upload_document"; } } - if (action != null && !MessagesController.isFeatureEnabled(action, ChatActivity.this)) { - return; + } else { + if (id == attach_photo || id == attach_gallery) { + action = "pm_upload_photo"; + } else { + action = "pm_upload_document"; } } - if (id == -1) { - finishFragment(); - } else if (id == -2) { - selectedMessagesIds.clear(); - selectedMessagesCanCopyIds.clear(); - actionBar.hideActionMode(); - updateVisibleRows(); - } else if (id == attach_photo) { - try { - Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - File image = Utilities.generatePicturePath(); - if (image != null) { - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); - currentPicturePath = image.getAbsolutePath(); - } - startActivityForResult(takePictureIntent, 0); - } catch (Exception e) { - FileLog.e("tmessages", e); + if (action != null && !MessagesController.isFeatureEnabled(action, ChatActivity.this)) { + return; + } + } + if (id == -1) { + finishFragment(); + } else if (id == -2) { + selectedMessagesIds.clear(); + selectedMessagesCanCopyIds.clear(); + actionBar.hideActionMode(); + updateVisibleRows(); + } else if (id == attach_photo) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File image = Utilities.generatePicturePath(); + if (image != null) { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); + currentPicturePath = image.getAbsolutePath(); + } + startActivityForResult(takePictureIntent, 0); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (id == attach_gallery) { + PhotoAlbumPickerActivity fragment = new PhotoAlbumPickerActivity(false); + fragment.setDelegate(new PhotoAlbumPickerActivity.PhotoAlbumPickerActivityDelegate() { + @Override + public void didSelectPhotos(ArrayList photos, ArrayList webPhotos) { + SendMessagesHelper.prepareSendingPhotos(photos, null, dialog_id, replyingMessageObject); + SendMessagesHelper.prepareSendingPhotosSearch(webPhotos, dialog_id, replyingMessageObject); + showReplyPanel(false, null, null, null, false, true); } - } else if (id == attach_gallery) { - PhotoAlbumPickerActivity fragment = new PhotoAlbumPickerActivity(false); - fragment.setDelegate(new PhotoAlbumPickerActivity.PhotoAlbumPickerActivityDelegate() { - @Override - public void didSelectPhotos(ArrayList photos, ArrayList webPhotos) { - SendMessagesHelper.prepareSendingPhotos(photos, null, dialog_id, replyingMessageObject); - SendMessagesHelper.prepareSendingPhotosSearch(webPhotos, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); - } - @Override - public void startPhotoSelectActivity() { - try { - Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); - photoPickerIntent.setType("image/*"); - startActivityForResult(photoPickerIntent, 1); - } catch (Exception e) { - FileLog.e("tmessages", e); - } + @Override + public void startPhotoSelectActivity() { + try { + Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); + photoPickerIntent.setType("image/*"); + startActivityForResult(photoPickerIntent, 1); + } catch (Exception e) { + FileLog.e("tmessages", e); } - }); - presentFragment(fragment); - } else if (id == attach_video) { - try { - Intent pickIntent = new Intent(); - pickIntent.setType("video/*"); - pickIntent.setAction(Intent.ACTION_GET_CONTENT); - pickIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536)); - Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); - File video = Utilities.generateVideoPath(); - if (video != null) { - if (Build.VERSION.SDK_INT >= 18) { - takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video)); - } - takeVideoIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536)); - currentPicturePath = video.getAbsolutePath(); + } + }); + presentFragment(fragment); + } else if (id == attach_video) { + try { + Intent pickIntent = new Intent(); + pickIntent.setType("video/*"); + pickIntent.setAction(Intent.ACTION_GET_CONTENT); + pickIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536)); + Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); + File video = Utilities.generateVideoPath(); + if (video != null) { + if (Build.VERSION.SDK_INT >= 18) { + takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video)); } - Intent chooserIntent = Intent.createChooser(pickIntent, null); - chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{takeVideoIntent}); + takeVideoIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536)); + currentPicturePath = video.getAbsolutePath(); + } + Intent chooserIntent = Intent.createChooser(pickIntent, null); + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{takeVideoIntent}); - startActivityForResult(chooserIntent, 2); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else if (id == attach_location) { - if (!isGoogleMapsInstalled()) { - return; - } - LocationActivity fragment = new LocationActivity(); - fragment.setDelegate(new LocationActivity.LocationActivityDelegate() { - @Override - public void didSelectLocation(double latitude, double longitude) { - SendMessagesHelper.getInstance().sendMessage(latitude, longitude, dialog_id, replyingMessageObject); - moveScrollToLastMessage(); - showReplyForMessageObjectOrForward(false, null, null, true); - if (paused) { - scrollToTopOnResume = true; - } - } - }); - presentFragment(fragment); - } else if (id == attach_document) { - DocumentSelectActivity fragment = new DocumentSelectActivity(); - fragment.setDelegate(new DocumentSelectActivity.DocumentSelectActivityDelegate() { - @Override - public void didSelectFiles(DocumentSelectActivity activity, ArrayList files) { - activity.finishFragment(); - SendMessagesHelper.prepareSendingDocuments(files, files, null, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + startActivityForResult(chooserIntent, 2); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (id == attach_location) { + if (!isGoogleMapsInstalled()) { + return; + } + LocationActivity fragment = new LocationActivity(); + fragment.setDelegate(new LocationActivity.LocationActivityDelegate() { + @Override + public void didSelectLocation(double latitude, double longitude) { + SendMessagesHelper.getInstance().sendMessage(latitude, longitude, dialog_id, replyingMessageObject); + moveScrollToLastMessage(); + showReplyPanel(false, null, null, null, false, true); + if (paused) { + scrollToTopOnResume = true; } + } + }); + presentFragment(fragment); + } else if (id == attach_document) { + DocumentSelectActivity fragment = new DocumentSelectActivity(); + fragment.setDelegate(new DocumentSelectActivity.DocumentSelectActivityDelegate() { + @Override + public void didSelectFiles(DocumentSelectActivity activity, ArrayList files) { + activity.finishFragment(); + SendMessagesHelper.prepareSendingDocuments(files, files, null, null, dialog_id, replyingMessageObject); + showReplyPanel(false, null, null, null, false, true); + } - @Override - public void startDocumentSelectActivity() { - try { - Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); - photoPickerIntent.setType("*/*"); - startActivityForResult(photoPickerIntent, 21); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } - }); - presentFragment(fragment); - } else if (id == copy) { - String str = ""; - ArrayList ids = new ArrayList<>(selectedMessagesCanCopyIds.keySet()); - if (currentEncryptedChat == null) { - Collections.sort(ids); - } else { - Collections.sort(ids, Collections.reverseOrder()); - } - for (Integer messageId : ids) { - MessageObject messageObject = selectedMessagesCanCopyIds.get(messageId); - if (str.length() != 0) { - str += "\n"; - } - if (messageObject.messageOwner.message != null) { - str += messageObject.messageOwner.message; - } else { - str += messageObject.messageText; + @Override + public void startDocumentSelectActivity() { + try { + Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); + photoPickerIntent.setType("*/*"); + startActivityForResult(photoPickerIntent, 21); + } catch (Exception e) { + FileLog.e("tmessages", e); } } + }); + presentFragment(fragment); + } else if (id == copy) { + String str = ""; + ArrayList ids = new ArrayList<>(selectedMessagesCanCopyIds.keySet()); + if (currentEncryptedChat == null) { + Collections.sort(ids); + } else { + Collections.sort(ids, Collections.reverseOrder()); + } + for (Integer messageId : ids) { + MessageObject messageObject = selectedMessagesCanCopyIds.get(messageId); if (str.length() != 0) { - if (Build.VERSION.SDK_INT < 11) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setText(str); - } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", str); - clipboard.setPrimaryClip(clip); - } + str += "\n"; } - selectedMessagesIds.clear(); - selectedMessagesCanCopyIds.clear(); - actionBar.hideActionMode(); - updateVisibleRows(); - } else if (id == delete) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("messages", selectedMessagesIds.size()))); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ArrayList ids = new ArrayList<>(selectedMessagesIds.keySet()); - ArrayList random_ids = null; - if (currentEncryptedChat != null) { - random_ids = new ArrayList<>(); - for (HashMap.Entry entry : selectedMessagesIds.entrySet()) { - MessageObject msg = entry.getValue(); - if (msg.messageOwner.random_id != 0 && msg.type != 10) { - random_ids.add(msg.messageOwner.random_id); - } - } - } - MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat); - actionBar.hideActionMode(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (id == forward) { - Bundle args = new Bundle(); - args.putBoolean("onlySelect", true); - args.putBoolean("serverOnly", true); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(ChatActivity.this); - presentFragment(fragment); - } else if (id == chat_enc_timer) { - if (getParentActivity() == null) { - return; - } - showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat)); - } else if (id == clear_history || id == delete_chat) { - if (getParentActivity() == null) { - return; - } - final boolean isChat = (int)dialog_id < 0 && (int)(dialog_id >> 32) != 1; - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - if (id == clear_history) { - builder.setMessage(LocaleController.getString("AreYouSureClearHistory", R.string.AreYouSureClearHistory)); + if (messageObject.messageOwner.message != null) { + str += messageObject.messageOwner.message; } else { - if (isChat) { - builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); - } else { - builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); - } + str += messageObject.messageText; } - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - MessagesController.getInstance().deleteDialog(dialog_id, 0, id == clear_history); - if (id != clear_history) { - if (isChat) { - MessagesController.getInstance().deleteUserFromChat((int) -dialog_id, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null); - } - finishFragment(); - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (id == share_contact) { - if (currentUser == null || getParentActivity() == null) { - return; - } - if (currentUser.phone != null && currentUser.phone.length() != 0) { - Bundle args = new Bundle(); - args.putInt("user_id", currentUser.id); - args.putBoolean("addContact", true); - presentFragment(new ContactAddActivity(args)); + } + if (str.length() != 0) { + if (Build.VERSION.SDK_INT < 11) { + android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + clipboard.setText(str); } else { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureShareMyContactInfo", R.string.AreYouSureShareMyContactInfo)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - SendMessagesHelper.getInstance().sendMessage(UserConfig.getCurrentUser(), dialog_id, replyingMessageObject); - moveScrollToLastMessage(); - showReplyForMessageObjectOrForward(false, null, null, true); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - } else if (id == mute) { - boolean muted = MessagesController.getInstance().isDialogMuted(dialog_id); - if (!muted) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("Notifications", R.string.Notifications)); - CharSequence[] items = new CharSequence[]{ - LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 1)), - LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 8)), - LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Days", 2)), - LocaleController.getString("MuteDisable", R.string.MuteDisable) - }; - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - int untilTime = ConnectionsManager.getInstance().getCurrentTime(); - if (i == 0) { - untilTime += 60 * 60; - } else if (i == 1) { - untilTime += 60 * 60 * 8; - } else if (i == 2) { - untilTime += 60 * 60 * 48; - } else if (i == 3) { - untilTime = Integer.MAX_VALUE; - } - - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - long flags = 0; - if (i == 3) { - editor.putInt("notify2_" + dialog_id, 2); - flags = 1; - } else { - editor.putInt("notify2_" + dialog_id, 3); - editor.putInt("notifyuntil_" + dialog_id, untilTime); - flags = ((long)untilTime << 32) | 1; - } - MessagesStorage.getInstance().setDialogFlags(dialog_id, flags); - editor.commit(); - TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); - if (dialog != null) { - dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); - dialog.notify_settings.mute_until = untilTime; - } - NotificationsController.updateServerNotificationsSettings(dialog_id); - } - } - ); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("notify2_" + dialog_id, 0); - MessagesStorage.getInstance().setDialogFlags(dialog_id, 0); - editor.commit(); - TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); - if (dialog != null) { - dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); - } - NotificationsController.updateServerNotificationsSettings(dialog_id); - } - } else if (id == reply) { - if (selectedMessagesIds.size() == 1) { - ArrayList ids = new ArrayList<>(selectedMessagesIds.keySet()); - MessageObject messageObject = messagesDict.get(ids.get(0)); - if (messageObject != null && messageObject.messageOwner.id > 0) { - showReplyForMessageObjectOrForward(true, messageObject, null, true); - } - } - selectedMessagesIds.clear(); - selectedMessagesCanCopyIds.clear(); - actionBar.hideActionMode(); - updateVisibleRows(); - } - } - }); - - avatarContainer = new FrameLayoutFixed(getParentActivity()); - avatarContainer.setBackgroundResource(R.drawable.bar_selector); - avatarContainer.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); - actionBar.addView(avatarContainer); - FrameLayout.LayoutParams layoutParams2 = (FrameLayout.LayoutParams) avatarContainer.getLayoutParams(); - layoutParams2.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.rightMargin = AndroidUtilities.dp(40); - layoutParams2.leftMargin = AndroidUtilities.dp(56); - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - avatarContainer.setLayoutParams(layoutParams2); - avatarContainer.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (currentUser != null) { - Bundle args = new Bundle(); - args.putInt("user_id", currentUser.id); - if (currentEncryptedChat != null) { - args.putLong("dialog_id", dialog_id); - } - presentFragment(new ProfileActivity(args)); - } else if (currentChat != null) { - Bundle args = new Bundle(); - args.putInt("chat_id", currentChat.id); - ProfileActivity fragment = new ProfileActivity(args); - fragment.setChatInfo(info); - presentFragment(fragment); - } - } - }); - - if (currentChat != null) { - int count = currentChat.participants_count; - if (info != null) { - count = info.participants.size(); - } - if (count == 0 || currentChat.left || currentChat instanceof TLRPC.TL_chatForbidden || info != null && info instanceof TLRPC.TL_chatParticipantsForbidden) { - avatarContainer.setEnabled(false); - } - } - - avatarImageView = new BackupImageView(getParentActivity()); - avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(21)); - avatarImageView.processDetach = false; - avatarContainer.addView(avatarImageView); - layoutParams2 = (FrameLayout.LayoutParams) avatarImageView.getLayoutParams(); - layoutParams2.width = AndroidUtilities.dp(42); - layoutParams2.height = AndroidUtilities.dp(42); - layoutParams2.topMargin = AndroidUtilities.dp(3); - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - avatarImageView.setLayoutParams(layoutParams2); - - if (currentEncryptedChat != null) { - timeItem = new ImageView(getParentActivity()); - timeItem.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(5), AndroidUtilities.dp(5)); - timeItem.setScaleType(ImageView.ScaleType.CENTER); - avatarContainer.addView(timeItem); - timerDrawable = new TimerDrawable(getParentActivity()); - - layoutParams2 = (FrameLayout.LayoutParams) timeItem.getLayoutParams(); - layoutParams2.width = AndroidUtilities.dp(34); - layoutParams2.height = AndroidUtilities.dp(34); - layoutParams2.topMargin = AndroidUtilities.dp(18); - layoutParams2.leftMargin = AndroidUtilities.dp(16); - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - timeItem.setLayoutParams(layoutParams2); - timeItem.setImageDrawable(timerDrawable); - - timeItem.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (getParentActivity() == null) { - return; - } - showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat)); - } - }); - } - - nameTextView = new TextView(getParentActivity()); - nameTextView.setTextColor(0xffffffff); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - nameTextView.setLines(1); - nameTextView.setMaxLines(1); - nameTextView.setSingleLine(true); - nameTextView.setEllipsize(TextUtils.TruncateAt.END); - nameTextView.setGravity(Gravity.LEFT); - nameTextView.setCompoundDrawablePadding(AndroidUtilities.dp(4)); - nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - avatarContainer.addView(nameTextView); - layoutParams2 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.leftMargin = AndroidUtilities.dp(54); - layoutParams2.bottomMargin = AndroidUtilities.dp(22); - layoutParams2.gravity = Gravity.BOTTOM; - nameTextView.setLayoutParams(layoutParams2); - - onlineTextView = new TextView(getParentActivity()); - onlineTextView.setTextColor(0xffd7e8f7); - onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - onlineTextView.setLines(1); - onlineTextView.setMaxLines(1); - onlineTextView.setSingleLine(true); - onlineTextView.setEllipsize(TextUtils.TruncateAt.END); - onlineTextView.setGravity(Gravity.LEFT); - avatarContainer.addView(onlineTextView); - layoutParams2 = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.leftMargin = AndroidUtilities.dp(54); - layoutParams2.bottomMargin = AndroidUtilities.dp(4); - layoutParams2.gravity = Gravity.BOTTOM; - onlineTextView.setLayoutParams(layoutParams2); - - ActionBarMenu menu = actionBar.createMenu(); - - headerItem = menu.addItem(0, R.drawable.ic_ab_other); - if (currentUser != null) { - addContactItem = headerItem.addSubItem(share_contact, "", 0); - } - if (currentEncryptedChat != null) { - timeItem2 = headerItem.addSubItem(chat_enc_timer, LocaleController.getString("SetTimer", R.string.SetTimer), 0); - } - headerItem.addSubItem(clear_history, LocaleController.getString("ClearHistory", R.string.ClearHistory), 0); - if (currentChat != null && !isBroadcast) { - headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteAndExit", R.string.DeleteAndExit), 0); - } else { - headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteChatUser", R.string.DeleteChatUser), 0); - } - muteItem = headerItem.addSubItem(mute, null, 0); - - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) headerItem.getLayoutParams(); - layoutParams.rightMargin = AndroidUtilities.dp(-48); - headerItem.setLayoutParams(layoutParams); - - updateTitle(); - updateSubtitle(); - updateTitleIcons(); - - attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other); - attachItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo); - attachItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery); - attachItem.addSubItem(attach_video, LocaleController.getString("ChatVideo", R.string.ChatVideo), R.drawable.ic_attach_video); - attachItem.addSubItem(attach_document, LocaleController.getString("ChatDocument", R.string.ChatDocument), R.drawable.ic_ab_doc); - attachItem.addSubItem(attach_location, LocaleController.getString("ChatLocation", R.string.ChatLocation), R.drawable.ic_attach_location); - attachItem.setVisibility(View.INVISIBLE); - - menuItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_attach); - menuItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo); - menuItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery); - menuItem.addSubItem(attach_video, LocaleController.getString("ChatVideo", R.string.ChatVideo), R.drawable.ic_attach_video); - menuItem.addSubItem(attach_document, LocaleController.getString("ChatDocument", R.string.ChatDocument), R.drawable.ic_ab_doc); - menuItem.addSubItem(attach_location, LocaleController.getString("ChatLocation", R.string.ChatLocation), R.drawable.ic_attach_location); - menuItem.setShowFromBottom(true); - menuItem.setBackgroundDrawable(null); - - actionModeViews.clear(); - - final ActionBarMenu actionMode = actionBar.createActionMode(); - actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - - selectedMessagesCountTextView = new TextView(actionMode.getContext()); - selectedMessagesCountTextView.setTextSize(18); - selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - selectedMessagesCountTextView.setTextColor(0xff737373); - selectedMessagesCountTextView.setSingleLine(true); - selectedMessagesCountTextView.setLines(1); - selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); - selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); - selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); - selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - actionMode.addView(selectedMessagesCountTextView); - layoutParams = (LinearLayout.LayoutParams)selectedMessagesCountTextView.getLayoutParams(); - layoutParams.weight = 1; - layoutParams.width = 0; - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - selectedMessagesCountTextView.setLayoutParams(layoutParams); - - if (currentEncryptedChat == null) { - actionModeViews.add(actionMode.addItem(copy, R.drawable.ic_ab_fwd_copy, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - if (!isBroadcast) { - actionModeViews.add(actionMode.addItem(reply, R.drawable.ic_ab_reply, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - } - actionModeViews.add(actionMode.addItem(forward, R.drawable.ic_ab_fwd_forward, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - } else { - actionModeViews.add(actionMode.addItem(copy, R.drawable.ic_ab_fwd_copy, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - } - actionMode.getItem(copy).setVisibility(selectedMessagesCanCopyIds.size() != 0 ? View.VISIBLE : View.GONE); - if (actionMode.getItem(reply) != null) { - actionMode.getItem(reply).setVisibility(selectedMessagesIds.size() == 1 ? View.VISIBLE : View.GONE); - } - checkActionBarMenu(); - - fragmentView = new SizeNotifierRelativeLayout(getParentActivity()); - SizeNotifierRelativeLayout contentView = (SizeNotifierRelativeLayout) fragmentView; - - contentView.setBackgroundImage(ApplicationLoader.getCachedWallpaper()); - - emptyViewContainer = new FrameLayout(getParentActivity()); - emptyViewContainer.setPadding(0, 0, 0, AndroidUtilities.dp(48)); - emptyViewContainer.setVisibility(View.INVISIBLE); - contentView.addView(emptyViewContainer); - RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) emptyViewContainer.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; - emptyViewContainer.setLayoutParams(layoutParams3); - emptyViewContainer.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - if (currentEncryptedChat == null) { - TextView emptyView = new TextView(getParentActivity()); - if (currentUser != null && currentUser.id != 777000 && (currentUser.id / 1000 == 333 || currentUser.id % 1000 == 0)) { - emptyView.setText(LocaleController.getString("GotAQuestion", R.string.GotAQuestion)); - } else { - emptyView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); - } - emptyView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - emptyView.setGravity(Gravity.CENTER); - emptyView.setTextColor(0xffffffff); - emptyView.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_black : R.drawable.system_blue); - emptyView.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(1), AndroidUtilities.dp(7), AndroidUtilities.dp(1)); - emptyViewContainer.addView(emptyView); - layoutParams2 = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.CENTER; - emptyView.setLayoutParams(layoutParams2); - } else { - LinearLayout secretChatPlaceholder = new LinearLayout(getParentActivity()); - secretChatPlaceholder.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_black : R.drawable.system_blue); - secretChatPlaceholder.setPadding(AndroidUtilities.dp(16), AndroidUtilities.dp(12), AndroidUtilities.dp(16), AndroidUtilities.dp(12)); - secretChatPlaceholder.setOrientation(LinearLayout.VERTICAL); - emptyViewContainer.addView(secretChatPlaceholder); - layoutParams2 = (FrameLayout.LayoutParams) secretChatPlaceholder.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.CENTER; - secretChatPlaceholder.setLayoutParams(layoutParams2); - - secretViewStatusTextView = new TextView(getParentActivity()); - secretViewStatusTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - secretViewStatusTextView.setTextColor(0xffffffff); - secretViewStatusTextView.setGravity(Gravity.CENTER_HORIZONTAL); - secretViewStatusTextView.setMaxWidth(AndroidUtilities.dp(210)); - if (currentEncryptedChat.admin_id == UserConfig.getClientUserId()) { - if (currentUser.first_name.length() > 0) { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.first_name)); - } else { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.last_name)); - } - } else { - if (currentUser.first_name.length() > 0) { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.first_name)); - } else { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.last_name)); - } - } - secretChatPlaceholder.addView(secretViewStatusTextView); - layoutParams = (LinearLayout.LayoutParams) secretViewStatusTextView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER_HORIZONTAL; - secretViewStatusTextView.setLayoutParams(layoutParams); - - TextView textView = new TextView(getParentActivity()); - textView.setText(LocaleController.getString("EncryptedDescriptionTitle", R.string.EncryptedDescriptionTitle)); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - textView.setTextColor(0xffffffff); - textView.setGravity(Gravity.CENTER_HORIZONTAL); - textView.setMaxWidth(AndroidUtilities.dp(260)); - secretChatPlaceholder.addView(textView); - layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.topMargin = AndroidUtilities.dp(8); - layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; - textView.setLayoutParams(layoutParams); - - for (int a = 0; a < 4; a++) { - LinearLayout linearLayout = new LinearLayout(getParentActivity()); - linearLayout.setOrientation(LinearLayout.HORIZONTAL); - secretChatPlaceholder.addView(linearLayout); - layoutParams = (LinearLayout.LayoutParams) linearLayout.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.topMargin = AndroidUtilities.dp(8); - layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; - linearLayout.setLayoutParams(layoutParams); - - ImageView imageView = new ImageView(getParentActivity()); - imageView.setImageResource(R.drawable.ic_lock_white); - - textView = new TextView(getParentActivity()); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - textView.setTextColor(0xffffffff); - textView.setGravity(Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - textView.setMaxWidth(AndroidUtilities.dp(260)); - - switch (a) { - case 0: - textView.setText(LocaleController.getString("EncryptedDescription1", R.string.EncryptedDescription1)); - break; - case 1: - textView.setText(LocaleController.getString("EncryptedDescription2", R.string.EncryptedDescription2)); - break; - case 2: - textView.setText(LocaleController.getString("EncryptedDescription3", R.string.EncryptedDescription3)); - break; - case 3: - textView.setText(LocaleController.getString("EncryptedDescription4", R.string.EncryptedDescription4)); - break; - } - - if (LocaleController.isRTL) { - linearLayout.addView(textView); - linearLayout.addView(imageView); - } else { - linearLayout.addView(imageView); - linearLayout.addView(textView); - } - layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(8); - layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(8) : 0; - layoutParams.topMargin = AndroidUtilities.dp(LocaleController.isRTL ? 3 : 4); - imageView.setLayoutParams(layoutParams); - - layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - textView.setLayoutParams(layoutParams); - } - } - - chatListView = new LayoutListView(getParentActivity()); - chatListView.setAdapter(chatAdapter = new ChatAdapter(getParentActivity())); - chatListView.setCacheColorHint(ApplicationLoader.getSelectedColor()); - chatListView.setClipToPadding(false); - chatListView.setStackFromBottom(true); - chatListView.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(3)); - chatListView.setDivider(null); - chatListView.setSelector(R.drawable.transparent); - chatListView.setOnItemLongClickListener(onItemLongClickListener); - chatListView.setOnItemClickListener(onItemClickListener); - contentView.addView(chatListView); - layoutParams3 = (RelativeLayout.LayoutParams) chatListView.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.bottomMargin = -AndroidUtilities.dp(3); - layoutParams3.addRule(RelativeLayout.ABOVE, id_chat_compose_panel); - chatListView.setLayoutParams(layoutParams3); - chatListView.setOnInterceptTouchEventListener(new LayoutListView.OnInterceptTouchEventListener() { - @Override - public boolean onInterceptTouchEvent(MotionEvent event) { - if (actionBar.isActionModeShowed()) { - return false; - } - if (event.getAction() == MotionEvent.ACTION_DOWN) { - int x = (int)event.getX(); - int y = (int)event.getY(); - int count = chatListView.getChildCount(); - Rect rect = new Rect(); - for (int a = 0; a < count; a++) { - View view = chatListView.getChildAt(a); - int top = view.getTop(); - int bottom = view.getBottom(); - view.getLocalVisibleRect(rect); - if (top > y || bottom < y) { - continue; - } - if (!(view instanceof ChatMediaCell)) { - break; - } - final ChatMediaCell cell = (ChatMediaCell)view; - final MessageObject messageObject = cell.getMessageObject(); - if (messageObject == null || !messageObject.isSecretPhoto() || !cell.getPhotoImage().isInsideImage(x, y - top)) { - break; - } - File file = FileLoader.getPathToMessage(messageObject.messageOwner); - if (!file.exists()) { - break; - } - startX = x; - startY = y; - chatListView.setOnItemClickListener(null); - openSecretPhotoRunnable = new Runnable() { - @Override - public void run() { - if (openSecretPhotoRunnable == null) { - return; - } - chatListView.requestDisallowInterceptTouchEvent(true); - chatListView.setOnItemLongClickListener(null); - chatListView.setLongClickable(false); - openSecretPhotoRunnable = null; - if (sendSecretMessageRead(messageObject)) { - cell.invalidate(); - } - SecretPhotoViewer.getInstance().setParentActivity(getParentActivity()); - SecretPhotoViewer.getInstance().openPhoto(messageObject); - } - }; - AndroidUtilities.runOnUIThread(openSecretPhotoRunnable, 100); - return true; + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", str); + clipboard.setPrimaryClip(clip); } } - return false; - } - }); - chatListView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - if (openSecretPhotoRunnable != null || SecretPhotoViewer.getInstance().isVisible()) { - if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_POINTER_UP) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - chatListView.setOnItemClickListener(onItemClickListener); - } - }, 150); - if (openSecretPhotoRunnable != null) { - AndroidUtilities.cancelRunOnUIThread(openSecretPhotoRunnable); - openSecretPhotoRunnable = null; - try { - Toast.makeText(v.getContext(), LocaleController.getString("PhotoTip", R.string.PhotoTip), Toast.LENGTH_SHORT).show(); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else { - if (SecretPhotoViewer.getInstance().isVisible()) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - chatListView.setOnItemLongClickListener(onItemLongClickListener); - chatListView.setLongClickable(true); - } - }); - SecretPhotoViewer.getInstance().closePhoto(); - } - } - } else if (event.getAction() != MotionEvent.ACTION_DOWN) { - if (SecretPhotoViewer.getInstance().isVisible()) { - return true; - } else if (openSecretPhotoRunnable != null) { - if (event.getAction() == MotionEvent.ACTION_MOVE) { - if (Math.hypot(startX - event.getX(), startY - event.getY()) > AndroidUtilities.dp(5)) { - AndroidUtilities.cancelRunOnUIThread(openSecretPhotoRunnable); - openSecretPhotoRunnable = null; - } - } else { - AndroidUtilities.cancelRunOnUIThread(openSecretPhotoRunnable); - openSecretPhotoRunnable = null; - } - } - } - } - return false; - } - }); - chatListView.setOnScrollListener(new AbsListView.OnScrollListener() { - Rect scrollRect = new Rect(); - - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL || i == AbsListView.OnScrollListener.SCROLL_STATE_FLING && highlightMessageId != Integer.MAX_VALUE) { - highlightMessageId = Integer.MAX_VALUE; - updateVisibleRows(); - } - } - - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (visibleItemCount > 0) { - if (firstVisibleItem <= 10) { - if (!endReached && !loading) { - if (messagesByDays.size() != 0) { - MessagesController.getInstance().loadMessages(dialog_id, 20, maxMessageId, !cacheEndReaced && startLoadFromMessageId == 0, minDate, classGuid, 0, 0, 0, startLoadFromMessageId == 0); - } else { - MessagesController.getInstance().loadMessages(dialog_id, 20, 0, !cacheEndReaced && startLoadFromMessageId == 0, minDate, classGuid, 0, 0, 0, startLoadFromMessageId == 0); - } - loading = true; - } - } - if (firstVisibleItem + visibleItemCount >= totalItemCount - 6) { - if (!forward_end_reached && !loadingForward) { - MessagesController.getInstance().loadMessages(dialog_id, 20, minMessageId, startLoadFromMessageId == 0, maxDate, classGuid, 1, 0, 0, startLoadFromMessageId == 0); - loadingForward = true; - } - } - if (firstVisibleItem + visibleItemCount == totalItemCount && forward_end_reached) { - showPagedownButton(false, true); - } - } - for (int a = 0; a < visibleItemCount; a++) { - View view = absListView.getChildAt(a); - if (view instanceof ChatMessageCell) { - ChatMessageCell messageCell = (ChatMessageCell)view; - messageCell.getLocalVisibleRect(scrollRect); - messageCell.setVisiblePart(scrollRect.top, scrollRect.bottom - scrollRect.top); - } - } - } - }); - - progressView = new FrameLayout(getParentActivity()); - progressView.setVisibility(View.INVISIBLE); - progressView.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_loader2 : R.drawable.system_loader1); - contentView.addView(progressView); - layoutParams3 = (RelativeLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams3.width = AndroidUtilities.dp(36); - layoutParams3.height = AndroidUtilities.dp(36); - layoutParams3.bottomMargin = AndroidUtilities.dp(48); - layoutParams3.addRule(RelativeLayout.CENTER_IN_PARENT); - progressView.setLayoutParams(layoutParams3); - - ProgressBar progressBar = new ProgressBar(getParentActivity()); - try { - progressBar.setIndeterminateDrawable(getParentActivity().getResources().getDrawable(R.drawable.loading_animation)); - } catch (Exception e) { - //don't promt - } - progressBar.setIndeterminate(true); - AndroidUtilities.setProgressBarAnimationDuration(progressBar, 1500); - progressView.addView(progressBar); - layoutParams2 = (FrameLayout.LayoutParams) progressBar.getLayoutParams(); - layoutParams2.width = AndroidUtilities.dp(32); - layoutParams2.height = AndroidUtilities.dp(32); - layoutParams2.gravity = Gravity.CENTER; - progressBar.setLayoutParams(layoutParams2); - - if (currentEncryptedChat == null && !isBroadcast) { - mentionListView = new ListView(getParentActivity()); - mentionListView.setBackgroundResource(R.drawable.compose_panel); - mentionListView.setVisibility(View.GONE); - mentionListView.setPadding(0, AndroidUtilities.dp(2), 0, 0); - mentionListView.setClipToPadding(true); - mentionListView.setDividerHeight(0); - mentionListView.setDivider(null); - if (Build.VERSION.SDK_INT > 8) { - mentionListView.setOverScrollMode(ListView.OVER_SCROLL_NEVER); - } - contentView.addView(mentionListView); - layoutParams3 = (RelativeLayout.LayoutParams) mentionListView.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = AndroidUtilities.dp(110); - layoutParams3.topMargin = -AndroidUtilities.dp(108); - layoutParams3.addRule(RelativeLayout.ALIGN_TOP, id_chat_compose_panel); - mentionListView.setLayoutParams(layoutParams3); - - mentionListView.setAdapter(mentionsAdapter = new MentionsAdapter(getParentActivity(), new MentionsAdapter.MentionsAdapterDelegate() { - @Override - public void needChangePanelVisibility(boolean show) { - if (show) { - RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) mentionListView.getLayoutParams(); - int height = 36 * Math.min(3, mentionsAdapter.getCount()) + (mentionsAdapter.getCount() > 3 ? 18 : 0); - layoutParams3.height = AndroidUtilities.dp(2 + height); - layoutParams3.topMargin = -AndroidUtilities.dp(height); - mentionListView.setLayoutParams(layoutParams3); - - if (mentionListAnimation != null) { - mentionListAnimation.cancel(); - mentionListAnimation = null; - } - - if (mentionListView.getVisibility() == View.VISIBLE) { - ViewProxy.setAlpha(mentionListView, 1.0f); - return; - } - if (allowStickersPanel) { - mentionListView.setVisibility(View.VISIBLE); - mentionListAnimation = new AnimatorSetProxy(); - mentionListAnimation.playTogether( - ObjectAnimatorProxy.ofFloat(mentionListView, "alpha", 0.0f, 1.0f) - ); - mentionListAnimation.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - if (mentionListAnimation != null && mentionListAnimation.equals(animation)) { - mentionListView.clearAnimation(); - mentionListAnimation = null; - } - } - }); - mentionListAnimation.setDuration(200); - mentionListAnimation.start(); - } else { - ViewProxy.setAlpha(mentionListView, 1.0f); - mentionListView.clearAnimation(); - mentionListView.setVisibility(View.INVISIBLE); - } - } else { - if (mentionListAnimation != null) { - mentionListAnimation.cancel(); - mentionListAnimation = null; - } - - if (mentionListView.getVisibility() == View.GONE) { - return; - } - if (allowStickersPanel) { - mentionListAnimation = new AnimatorSetProxy(); - mentionListAnimation.playTogether( - ObjectAnimatorProxy.ofFloat(mentionListView, "alpha", 0.0f) - ); - mentionListAnimation.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - if (mentionListAnimation != null && mentionListAnimation.equals(animation)) { - mentionListView.clearAnimation(); - mentionListView.setVisibility(View.GONE); - mentionListAnimation = null; - } - } - }); - mentionListAnimation.setDuration(200); - mentionListAnimation.start(); - } else { - mentionListView.clearAnimation(); - mentionListView.setVisibility(View.GONE); - } - } - } - })); - mentionsAdapter.setChatInfo(info); - mentionsAdapter.setNeedUsernames(currentChat != null); - - mentionListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Object object = mentionsAdapter.getItem(position); - int start = mentionsAdapter.getResultStartPosition(); - int len = mentionsAdapter.getResultLength(); - if (object instanceof TLRPC.User) { - TLRPC.User user = (TLRPC.User) object; - if (user != null) { - chatActivityEnterView.replaceWithText(start, len, "@" + user.username + " "); - } - } else if (object instanceof String) { - chatActivityEnterView.replaceWithText(start, len, object + " "); - } - } - }); - - mentionListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - Object object = mentionsAdapter.getItem(position); - if (object instanceof String) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); - builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - mentionsAdapter.clearRecentHashtags(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - return true; - } - return false; - } - }); - } - - if (chatActivityEnterView != null) { - chatActivityEnterView.onDestroy(); - } - chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, this, true); - chatActivityEnterView.setDialogId(dialog_id); - chatActivityEnterView.addToAttachLayout(menuItem); - chatActivityEnterView.setId(id_chat_compose_panel); - contentView.addView(chatActivityEnterView); - layoutParams3 = (RelativeLayout.LayoutParams) chatActivityEnterView.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - chatActivityEnterView.setLayoutParams(layoutParams3); - chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { - @Override - public void onMessageSend(String message) { - moveScrollToLastMessage(); - showReplyForMessageObjectOrForward(false, null, null, true); - if (mentionsAdapter != null) { - mentionsAdapter.addHashtagsFromMessage(message); - } - if (message != null) { - NotificationsController.getInstance().playOutChatSound(); - } - } - - @Override - public void onTextChanged(CharSequence text) { - if (stickersAdapter != null) { - stickersAdapter.loadStikersForEmoji(text); - } - if (mentionsAdapter != null) { - mentionsAdapter.searchUsernameOrHashtag(text.toString(), chatActivityEnterView.getCursorPosition(), messages); - } - } - - @Override - public void needSendTyping() { - MessagesController.getInstance().sendTyping(dialog_id, classGuid); - } - - @Override - public void onAttachButtonHidden() { - if (attachItem != null) { - attachItem.setVisibility(View.VISIBLE); - } - if (headerItem != null) { - headerItem.setVisibility(View.INVISIBLE); - } - } - - @Override - public void onAttachButtonShow() { - if (attachItem != null) { - attachItem.setVisibility(View.INVISIBLE); - } - if (headerItem != null) { - headerItem.setVisibility(View.VISIBLE); - } - } - - @Override - public void onWindowSizeChanged(int size) { - if (size < AndroidUtilities.dp(72) + AndroidUtilities.getCurrentActionBarHeight()) { - allowStickersPanel = false; - if (stickersPanel.getVisibility() == View.VISIBLE) { - stickersPanel.clearAnimation(); - stickersPanel.setVisibility(View.INVISIBLE); - } - if (mentionListView != null && mentionListView.getVisibility() == View.VISIBLE) { - mentionListView.clearAnimation(); - mentionListView.setVisibility(View.INVISIBLE); - } - } else { - allowStickersPanel = true; - if (stickersPanel.getVisibility() == View.INVISIBLE) { - stickersPanel.clearAnimation(); - stickersPanel.setVisibility(View.VISIBLE); - } - if (mentionListView != null && mentionListView.getVisibility() == View.INVISIBLE) { - mentionListView.clearAnimation(); - mentionListView.setVisibility(View.VISIBLE); - } - } - } - }); - - FrameLayout replyLayout = new FrameLayout(getParentActivity()); - replyLayout.setClickable(true); - chatActivityEnterView.addTopView(replyLayout, AndroidUtilities.dp(48)); - - View lineView = new View(getParentActivity()); - lineView.setBackgroundColor(0xffe8e8e8); - replyLayout.addView(lineView); - layoutParams2 = (FrameLayout.LayoutParams) lineView.getLayoutParams(); - layoutParams2.gravity = Gravity.BOTTOM; - layoutParams2.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams2.height = AndroidUtilities.dp(1); - lineView.setLayoutParams(layoutParams2); - - replyIconImageView = new ImageView(getParentActivity()); - replyIconImageView.setScaleType(ImageView.ScaleType.CENTER); - replyLayout.addView(replyIconImageView); - layoutParams2 = (FrameLayout.LayoutParams) replyIconImageView.getLayoutParams(); - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - layoutParams2.width = AndroidUtilities.dp(52); - layoutParams2.height = AndroidUtilities.dp(46); - replyIconImageView.setLayoutParams(layoutParams2); - - ImageView imageView = new ImageView(getParentActivity()); - imageView.setImageResource(R.drawable.delete_reply); - imageView.setScaleType(ImageView.ScaleType.CENTER); - replyLayout.addView(imageView); - layoutParams2 = (FrameLayout.LayoutParams) imageView.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(0.5f); - layoutParams2.width = AndroidUtilities.dp(52); - layoutParams2.height = AndroidUtilities.dp(46); - layoutParams2.gravity = Gravity.RIGHT | Gravity.TOP; - imageView.setLayoutParams(layoutParams2); - imageView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (forwardingMessages != null) { - forwardingMessages.clear(); - } - showReplyForMessageObjectOrForward(false, null, null, true); - } - }); - - replyNameTextView = new TextView(getParentActivity()); - replyNameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - replyNameTextView.setTextColor(0xff377aae); - replyNameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - replyNameTextView.setSingleLine(true); - replyNameTextView.setEllipsize(TextUtils.TruncateAt.END); - replyNameTextView.setMaxLines(1); - replyLayout.addView(replyNameTextView); - layoutParams2 = (FrameLayout.LayoutParams) replyNameTextView.getLayoutParams(); - layoutParams2.leftMargin = AndroidUtilities.dp(52); - layoutParams2.rightMargin = AndroidUtilities.dp(52); - layoutParams2.topMargin = AndroidUtilities.dp(4); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - replyNameTextView.setLayoutParams(layoutParams2); - - replyObjectTextView = new TextView(getParentActivity()); - replyObjectTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - replyObjectTextView.setTextColor(0xff999999); - replyObjectTextView.setSingleLine(true); - replyObjectTextView.setEllipsize(TextUtils.TruncateAt.END); - replyObjectTextView.setMaxLines(1); - replyLayout.addView(replyObjectTextView); - layoutParams2 = (FrameLayout.LayoutParams) replyObjectTextView.getLayoutParams(); - layoutParams2.leftMargin = AndroidUtilities.dp(52); - layoutParams2.rightMargin = AndroidUtilities.dp(52); - layoutParams2.topMargin = AndroidUtilities.dp(22); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - replyObjectTextView.setLayoutParams(layoutParams2); - - replyImageView = new BackupImageView(getParentActivity()); - replyImageView.processDetach = false; - replyLayout.addView(replyImageView); - layoutParams2 = (FrameLayout.LayoutParams) replyImageView.getLayoutParams(); - layoutParams2.leftMargin = AndroidUtilities.dp(52); - layoutParams2.topMargin = AndroidUtilities.dp(6); - layoutParams2.width = AndroidUtilities.dp(34); - layoutParams2.height = AndroidUtilities.dp(34); - layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; - replyImageView.setLayoutParams(layoutParams2); - - stickersPanel = new FrameLayout(getParentActivity()); - stickersPanel.setVisibility(View.GONE); - contentView.addView(stickersPanel); - layoutParams3 = (RelativeLayout.LayoutParams) stickersPanel.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.height = AndroidUtilities.dp(81.5f); - layoutParams3.bottomMargin = AndroidUtilities.dp(38); - layoutParams3.addRule(RelativeLayout.ALIGN_BOTTOM, id_chat_compose_panel); - stickersPanel.setLayoutParams(layoutParams3); - - stickersListView = new RecyclerListView(getParentActivity()); - LinearLayoutManager layoutManager = new LinearLayoutManager(getParentActivity()); - layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); - stickersListView.setLayoutManager(layoutManager); - stickersListView.setClipToPadding(false); - if (Build.VERSION.SDK_INT >= 9) { - stickersListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); - } - stickersPanel.addView(stickersListView); - layoutParams2 = (FrameLayout.LayoutParams) stickersListView.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams2.height = AndroidUtilities.dp(78); - stickersListView.setLayoutParams(layoutParams2); - if (currentEncryptedChat == null || currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 23) { - if (stickersAdapter != null) { - stickersAdapter.destroy(); - } - stickersListView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); - stickersListView.setAdapter(stickersAdapter = new StickersAdapter(getParentActivity(), new StickersAdapter.StickersAdapterDelegate() { - @Override - public void needChangePanelVisibility(final boolean show) { - if (show && stickersPanel.getVisibility() == View.VISIBLE || !show && stickersPanel.getVisibility() == View.GONE) { - return; - } - if (show) { - stickersListView.scrollToPosition(0); - stickersPanel.clearAnimation(); - stickersPanel.setVisibility(allowStickersPanel ? View.VISIBLE : View.INVISIBLE); - } - if (runningAnimation != null) { - runningAnimation.cancel(); - runningAnimation = null; - } - if (stickersPanel.getVisibility() != View.INVISIBLE) { - runningAnimation = new AnimatorSetProxy(); - runningAnimation.playTogether( - ObjectAnimatorProxy.ofFloat(stickersPanel, "alpha", show ? 0.0f : 1.0f, show ? 1.0f : 0.0f) - ); - runningAnimation.setDuration(150); - runningAnimation.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - if (runningAnimation != null && runningAnimation.equals(animation)) { - if (!show) { - stickersAdapter.clearStickers(); - stickersPanel.clearAnimation(); - stickersPanel.setVisibility(View.GONE); - } - runningAnimation = null; - } - } - }); - runningAnimation.start(); - } else if (!show) { - stickersPanel.setVisibility(View.GONE); - } - } - })); - stickersListView.addOnItemTouchListener(new RecyclerListView.RecyclerListViewItemClickListener(getParentActivity(), new RecyclerListView.OnItemClickListener() { - @Override - public void onItemClick(View view, int position) { - TLRPC.Document document = stickersAdapter.getItem(position); - if (document instanceof TLRPC.TL_document) { - if (currentEncryptedChat != null && document.thumb instanceof TLRPC.TL_photoSize) { - File file = FileLoader.getPathToAttach(document.thumb, true); - if (file.exists()) { - try { - int len = (int)file.length(); - byte[] arr = new byte[(int)file.length()]; - RandomAccessFile reader = new RandomAccessFile(file, "r"); - reader.readFully(arr); - TLRPC.TL_document newDocument = new TLRPC.TL_document(); - newDocument.thumb = new TLRPC.TL_photoCachedSize(); - newDocument.thumb.location = document.thumb.location; - newDocument.thumb.size = document.thumb.size; - newDocument.thumb.w = document.thumb.w; - newDocument.thumb.h = document.thumb.h; - newDocument.thumb.type = document.thumb.type; - newDocument.thumb.bytes = arr; - - newDocument.id = document.id; - newDocument.access_hash = document.access_hash; - newDocument.date = document.date; - newDocument.mime_type = document.mime_type; - newDocument.size = document.size; - newDocument.dc_id = document.dc_id; - newDocument.attributes = document.attributes; - document = newDocument; - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } - } - for (int a = 0; a < document.attributes.size(); a++) { - TLRPC.DocumentAttribute attribute = document.attributes.get(a); - if (attribute instanceof TLRPC.TL_documentAttributeSticker) { - document.attributes.remove(a); - document.attributes.add(new TLRPC.TL_documentAttributeSticker_old()); - break; - } - } - SendMessagesHelper.getInstance().sendMessage((TLRPC.TL_document) document, null, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); - } - chatActivityEnterView.setFieldText(""); - } - })); - } - - imageView = new ImageView(getParentActivity()); - imageView.setImageResource(R.drawable.stickers_back_arrow); - stickersPanel.addView(imageView); - layoutParams2 = (FrameLayout.LayoutParams) imageView.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.BOTTOM; - layoutParams2.leftMargin = AndroidUtilities.dp(53); - imageView.setLayoutParams(layoutParams2); - - bottomOverlay = new FrameLayout(getParentActivity()); - bottomOverlay.setBackgroundColor(0xffffffff); - bottomOverlay.setVisibility(View.INVISIBLE); - bottomOverlay.setFocusable(true); - bottomOverlay.setFocusableInTouchMode(true); - bottomOverlay.setClickable(true); - contentView.addView(bottomOverlay); - layoutParams3 = (RelativeLayout.LayoutParams) bottomOverlay.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = AndroidUtilities.dp(48); - layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - bottomOverlay.setLayoutParams(layoutParams3); - - bottomOverlayText = new TextView(getParentActivity()); - bottomOverlayText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - bottomOverlayText.setTextColor(0xff7f7f7f); - bottomOverlay.addView(bottomOverlayText); - layoutParams2 = (FrameLayout.LayoutParams) bottomOverlayText.getLayoutParams(); - layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams2.gravity = Gravity.CENTER; - bottomOverlayText.setLayoutParams(layoutParams2); - - bottomOverlayChat = new FrameLayout(getParentActivity()); - bottomOverlayChat.setBackgroundColor(0xfffbfcfd); - bottomOverlayChat.setVisibility(View.INVISIBLE); - contentView.addView(bottomOverlayChat); - layoutParams3 = (RelativeLayout.LayoutParams) bottomOverlayChat.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; - layoutParams3.height = AndroidUtilities.dp(48); - layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - bottomOverlayChat.setLayoutParams(layoutParams3); - bottomOverlayChat.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { + selectedMessagesIds.clear(); + selectedMessagesCanCopyIds.clear(); + actionBar.hideActionMode(); + updateVisibleRows(); + } else if (id == delete) { if (getParentActivity() == null) { return; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("messages", selectedMessagesIds.size()))); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - if (currentUser != null && userBlocked) { - builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - MessagesController.getInstance().unblockUser(currentUser.id); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ArrayList ids = new ArrayList<>(selectedMessagesIds.keySet()); + ArrayList random_ids = null; + if (currentEncryptedChat != null) { + random_ids = new ArrayList<>(); + for (HashMap.Entry entry : selectedMessagesIds.entrySet()) { + MessageObject msg = entry.getValue(); + if (msg.messageOwner.random_id != 0 && msg.type != 10) { + random_ids.add(msg.messageOwner.random_id); + } + } } - }); - } else { - builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - MessagesController.getInstance().deleteDialog(dialog_id, 0, false); - finishFragment(); - } - }); - } + MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat); + actionBar.hideActionMode(); + } + }); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); showAlertDialog(builder); + } else if (id == forward) { + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putBoolean("serverOnly", true); + MessagesActivity fragment = new MessagesActivity(args); + fragment.setDelegate(ChatActivity.this); + presentFragment(fragment); + } else if (id == chat_enc_timer) { + if (getParentActivity() == null) { + return; + } + showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat)); + } else if (id == clear_history || id == delete_chat) { + if (getParentActivity() == null) { + return; + } + final boolean isChat = (int) dialog_id < 0 && (int) (dialog_id >> 32) != 1; + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + if (id == clear_history) { + builder.setMessage(LocaleController.getString("AreYouSureClearHistory", R.string.AreYouSureClearHistory)); + } else { + if (isChat) { + builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); + } else { + builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); + } + } + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (id != clear_history) { + if (isChat) { + MessagesController.getInstance().deleteUserFromChat((int) -dialog_id, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null); + } else { + MessagesController.getInstance().deleteDialog(dialog_id, 0, false); + } + finishFragment(); + } else { + MessagesController.getInstance().deleteDialog(dialog_id, 0, true); + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (id == share_contact) { + if (currentUser == null || getParentActivity() == null) { + return; + } + if (currentUser.phone != null && currentUser.phone.length() != 0) { + Bundle args = new Bundle(); + args.putInt("user_id", currentUser.id); + args.putBoolean("addContact", true); + presentFragment(new ContactAddActivity(args)); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSureShareMyContactInfo", R.string.AreYouSureShareMyContactInfo)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + SendMessagesHelper.getInstance().sendMessage(UserConfig.getCurrentUser(), dialog_id, replyingMessageObject); + moveScrollToLastMessage(); + showReplyPanel(false, null, null, null, false, true); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + } else if (id == mute) { + boolean muted = MessagesController.getInstance().isDialogMuted(dialog_id); + if (!muted) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("Notifications", R.string.Notifications)); + CharSequence[] items = new CharSequence[]{ + LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 1)), + LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 8)), + LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Days", 2)), + LocaleController.getString("MuteDisable", R.string.MuteDisable) + }; + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + int untilTime = ConnectionsManager.getInstance().getCurrentTime(); + if (i == 0) { + untilTime += 60 * 60; + } else if (i == 1) { + untilTime += 60 * 60 * 8; + } else if (i == 2) { + untilTime += 60 * 60 * 48; + } else if (i == 3) { + untilTime = Integer.MAX_VALUE; + } + + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + long flags = 0; + if (i == 3) { + editor.putInt("notify2_" + dialog_id, 2); + flags = 1; + } else { + editor.putInt("notify2_" + dialog_id, 3); + editor.putInt("notifyuntil_" + dialog_id, untilTime); + flags = ((long) untilTime << 32) | 1; + } + MessagesStorage.getInstance().setDialogFlags(dialog_id, flags); + editor.commit(); + TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); + if (dialog != null) { + dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); + dialog.notify_settings.mute_until = untilTime; + } + NotificationsController.updateServerNotificationsSettings(dialog_id); + } + } + ); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("notify2_" + dialog_id, 0); + MessagesStorage.getInstance().setDialogFlags(dialog_id, 0); + editor.commit(); + TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); + if (dialog != null) { + dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); + } + NotificationsController.updateServerNotificationsSettings(dialog_id); + } + } else if (id == reply) { + if (selectedMessagesIds.size() == 1) { + ArrayList ids = new ArrayList<>(selectedMessagesIds.keySet()); + MessageObject messageObject = messagesDict.get(ids.get(0)); + if (messageObject != null && messageObject.messageOwner.id > 0) { + showReplyPanel(true, messageObject, null, null, false, true); + } + } + selectedMessagesIds.clear(); + selectedMessagesCanCopyIds.clear(); + actionBar.hideActionMode(); + updateVisibleRows(); + } + } + }); + + avatarContainer = new FrameLayoutFixed(context); + avatarContainer.setBackgroundResource(R.drawable.bar_selector); + avatarContainer.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); + actionBar.addView(avatarContainer); + FrameLayout.LayoutParams layoutParams2 = (FrameLayout.LayoutParams) avatarContainer.getLayoutParams(); + layoutParams2.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.rightMargin = AndroidUtilities.dp(40); + layoutParams2.leftMargin = AndroidUtilities.dp(56); + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + avatarContainer.setLayoutParams(layoutParams2); + avatarContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (currentUser != null) { + Bundle args = new Bundle(); + args.putInt("user_id", currentUser.id); + if (currentEncryptedChat != null) { + args.putLong("dialog_id", dialog_id); + } + presentFragment(new ProfileActivity(args)); + } else if (currentChat != null) { + Bundle args = new Bundle(); + args.putInt("chat_id", currentChat.id); + ProfileActivity fragment = new ProfileActivity(args); + fragment.setChatInfo(info); + presentFragment(fragment); + } + } + }); + + if (currentChat != null) { + int count = currentChat.participants_count; + if (info != null) { + count = info.participants.size(); + } + if (count == 0 || currentChat.left || currentChat instanceof TLRPC.TL_chatForbidden || info != null && info instanceof TLRPC.TL_chatParticipantsForbidden) { + avatarContainer.setEnabled(false); + } + } + + avatarImageView = new BackupImageView(context); + avatarImageView.setRoundRadius(AndroidUtilities.dp(21)); + avatarContainer.addView(avatarImageView); + layoutParams2 = (FrameLayout.LayoutParams) avatarImageView.getLayoutParams(); + layoutParams2.width = AndroidUtilities.dp(42); + layoutParams2.height = AndroidUtilities.dp(42); + layoutParams2.topMargin = AndroidUtilities.dp(3); + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + avatarImageView.setLayoutParams(layoutParams2); + + if (currentEncryptedChat != null) { + timeItem = new ImageView(context); + timeItem.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(5), AndroidUtilities.dp(5)); + timeItem.setScaleType(ImageView.ScaleType.CENTER); + avatarContainer.addView(timeItem); + timerDrawable = new TimerDrawable(context); + + layoutParams2 = (FrameLayout.LayoutParams) timeItem.getLayoutParams(); + layoutParams2.width = AndroidUtilities.dp(34); + layoutParams2.height = AndroidUtilities.dp(34); + layoutParams2.topMargin = AndroidUtilities.dp(18); + layoutParams2.leftMargin = AndroidUtilities.dp(16); + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + timeItem.setLayoutParams(layoutParams2); + timeItem.setImageDrawable(timerDrawable); + + timeItem.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentActivity() == null) { + return; + } + showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat)); } }); + } - bottomOverlayChatText = new TextView(getParentActivity()); - bottomOverlayChatText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - bottomOverlayChatText.setTextColor(0xff3e6fa1); - bottomOverlayChat.addView(bottomOverlayChatText); - layoutParams2 = (FrameLayout.LayoutParams) bottomOverlayChatText.getLayoutParams(); + nameTextView = new TextView(context); + nameTextView.setTextColor(0xffffffff); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + nameTextView.setLines(1); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setEllipsize(TextUtils.TruncateAt.END); + nameTextView.setGravity(Gravity.LEFT); + nameTextView.setCompoundDrawablePadding(AndroidUtilities.dp(4)); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + avatarContainer.addView(nameTextView); + layoutParams2 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.leftMargin = AndroidUtilities.dp(54); + layoutParams2.bottomMargin = AndroidUtilities.dp(22); + layoutParams2.gravity = Gravity.BOTTOM; + nameTextView.setLayoutParams(layoutParams2); + + onlineTextView = new TextView(context); + onlineTextView.setTextColor(0xffd7e8f7); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + onlineTextView.setLines(1); + onlineTextView.setMaxLines(1); + onlineTextView.setSingleLine(true); + onlineTextView.setEllipsize(TextUtils.TruncateAt.END); + onlineTextView.setGravity(Gravity.LEFT); + avatarContainer.addView(onlineTextView); + layoutParams2 = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.leftMargin = AndroidUtilities.dp(54); + layoutParams2.bottomMargin = AndroidUtilities.dp(4); + layoutParams2.gravity = Gravity.BOTTOM; + onlineTextView.setLayoutParams(layoutParams2); + + ActionBarMenu menu = actionBar.createMenu(); + + headerItem = menu.addItem(0, R.drawable.ic_ab_other); + if (currentUser != null) { + addContactItem = headerItem.addSubItem(share_contact, "", 0); + } + if (currentEncryptedChat != null) { + timeItem2 = headerItem.addSubItem(chat_enc_timer, LocaleController.getString("SetTimer", R.string.SetTimer), 0); + } + headerItem.addSubItem(clear_history, LocaleController.getString("ClearHistory", R.string.ClearHistory), 0); + if (currentChat != null && !isBroadcast) { + headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteAndExit", R.string.DeleteAndExit), 0); + } else { + headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteChatUser", R.string.DeleteChatUser), 0); + } + muteItem = headerItem.addSubItem(mute, null, 0); + + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) headerItem.getLayoutParams(); + layoutParams.rightMargin = AndroidUtilities.dp(-48); + headerItem.setLayoutParams(layoutParams); + + updateTitle(); + updateSubtitle(); + updateTitleIcons(); + + attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other); + attachItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo); + attachItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery); + attachItem.addSubItem(attach_video, LocaleController.getString("ChatVideo", R.string.ChatVideo), R.drawable.ic_attach_video); + attachItem.addSubItem(attach_document, LocaleController.getString("ChatDocument", R.string.ChatDocument), R.drawable.ic_ab_doc); + attachItem.addSubItem(attach_location, LocaleController.getString("ChatLocation", R.string.ChatLocation), R.drawable.ic_attach_location); + attachItem.setVisibility(View.INVISIBLE); + + menuItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_attach); + menuItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo); + menuItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery); + menuItem.addSubItem(attach_video, LocaleController.getString("ChatVideo", R.string.ChatVideo), R.drawable.ic_attach_video); + menuItem.addSubItem(attach_document, LocaleController.getString("ChatDocument", R.string.ChatDocument), R.drawable.ic_ab_doc); + menuItem.addSubItem(attach_location, LocaleController.getString("ChatLocation", R.string.ChatLocation), R.drawable.ic_attach_location); + menuItem.setShowFromBottom(true); + menuItem.setBackgroundDrawable(null); + + actionModeViews.clear(); + + final ActionBarMenu actionMode = actionBar.createActionMode(); + actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + + selectedMessagesCountTextView = new TextView(actionMode.getContext()); + selectedMessagesCountTextView.setTextSize(18); + selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + selectedMessagesCountTextView.setTextColor(0xff737373); + selectedMessagesCountTextView.setSingleLine(true); + selectedMessagesCountTextView.setLines(1); + selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); + selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); + selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); + selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + actionMode.addView(selectedMessagesCountTextView); + layoutParams = (LinearLayout.LayoutParams) selectedMessagesCountTextView.getLayoutParams(); + layoutParams.weight = 1; + layoutParams.width = 0; + layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; + selectedMessagesCountTextView.setLayoutParams(layoutParams); + + if (currentEncryptedChat == null) { + actionModeViews.add(actionMode.addItem(copy, R.drawable.ic_ab_fwd_copy, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + if (!isBroadcast) { + actionModeViews.add(actionMode.addItem(reply, R.drawable.ic_ab_reply, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + } + actionModeViews.add(actionMode.addItem(forward, R.drawable.ic_ab_fwd_forward, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + } else { + actionModeViews.add(actionMode.addItem(copy, R.drawable.ic_ab_fwd_copy, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + } + actionMode.getItem(copy).setVisibility(selectedMessagesCanCopyIds.size() != 0 ? View.VISIBLE : View.GONE); + if (actionMode.getItem(reply) != null) { + actionMode.getItem(reply).setVisibility(selectedMessagesIds.size() == 1 ? View.VISIBLE : View.GONE); + } + checkActionBarMenu(); + + fragmentView = new SizeNotifierRelativeLayout(context); + SizeNotifierRelativeLayout contentView = (SizeNotifierRelativeLayout) fragmentView; + + contentView.setBackgroundImage(ApplicationLoader.getCachedWallpaper()); + + emptyViewContainer = new FrameLayout(context); + emptyViewContainer.setPadding(0, 0, 0, AndroidUtilities.dp(48)); + emptyViewContainer.setVisibility(View.INVISIBLE); + contentView.addView(emptyViewContainer); + RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) emptyViewContainer.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; + emptyViewContainer.setLayoutParams(layoutParams3); + emptyViewContainer.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + if (currentEncryptedChat == null) { + TextView emptyView = new TextView(context); + if (currentUser != null && currentUser.id != 777000 && (currentUser.id / 1000 == 333 || currentUser.id % 1000 == 0)) { + emptyView.setText(LocaleController.getString("GotAQuestion", R.string.GotAQuestion)); + } else { + emptyView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); + } + emptyView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + emptyView.setGravity(Gravity.CENTER); + emptyView.setTextColor(0xffffffff); + emptyView.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_black : R.drawable.system_blue); + emptyView.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(1), AndroidUtilities.dp(7), AndroidUtilities.dp(1)); + emptyViewContainer.addView(emptyView); + layoutParams2 = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; layoutParams2.gravity = Gravity.CENTER; - bottomOverlayChatText.setLayoutParams(layoutParams2); + emptyView.setLayoutParams(layoutParams2); + } else { + LinearLayout secretChatPlaceholder = new LinearLayout(context); + secretChatPlaceholder.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_black : R.drawable.system_blue); + secretChatPlaceholder.setPadding(AndroidUtilities.dp(16), AndroidUtilities.dp(12), AndroidUtilities.dp(16), AndroidUtilities.dp(12)); + secretChatPlaceholder.setOrientation(LinearLayout.VERTICAL); + emptyViewContainer.addView(secretChatPlaceholder); + layoutParams2 = (FrameLayout.LayoutParams) secretChatPlaceholder.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + secretChatPlaceholder.setLayoutParams(layoutParams2); - pagedownButton = new ImageView(getParentActivity()); - pagedownButton.setVisibility(View.INVISIBLE); - pagedownButton.setImageResource(R.drawable.pagedown); - contentView.addView(pagedownButton); - layoutParams3 = (RelativeLayout.LayoutParams) pagedownButton.getLayoutParams(); - layoutParams3.width = RelativeLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.rightMargin = AndroidUtilities.dp(6); - layoutParams3.bottomMargin = AndroidUtilities.dp(4); - layoutParams3.addRule(RelativeLayout.ABOVE, id_chat_compose_panel); - layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - pagedownButton.setLayoutParams(layoutParams3); - pagedownButton.setOnClickListener(new View.OnClickListener() { + secretViewStatusTextView = new TextView(context); + secretViewStatusTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + secretViewStatusTextView.setTextColor(0xffffffff); + secretViewStatusTextView.setGravity(Gravity.CENTER_HORIZONTAL); + secretViewStatusTextView.setMaxWidth(AndroidUtilities.dp(210)); + if (currentEncryptedChat.admin_id == UserConfig.getClientUserId()) { + if (currentUser.first_name.length() > 0) { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.first_name)); + } else { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.last_name)); + } + } else { + if (currentUser.first_name.length() > 0) { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.first_name)); + } else { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.last_name)); + } + } + secretChatPlaceholder.addView(secretViewStatusTextView); + layoutParams = (LinearLayout.LayoutParams) secretViewStatusTextView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + secretViewStatusTextView.setLayoutParams(layoutParams); + + TextView textView = new TextView(context); + textView.setText(LocaleController.getString("EncryptedDescriptionTitle", R.string.EncryptedDescriptionTitle)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textView.setTextColor(0xffffffff); + textView.setGravity(Gravity.CENTER_HORIZONTAL); + textView.setMaxWidth(AndroidUtilities.dp(260)); + secretChatPlaceholder.addView(textView); + layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.topMargin = AndroidUtilities.dp(8); + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + textView.setLayoutParams(layoutParams); + + for (int a = 0; a < 4; a++) { + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.HORIZONTAL); + secretChatPlaceholder.addView(linearLayout); + layoutParams = (LinearLayout.LayoutParams) linearLayout.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.topMargin = AndroidUtilities.dp(8); + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + linearLayout.setLayoutParams(layoutParams); + + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.ic_lock_white); + + textView = new TextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textView.setTextColor(0xffffffff); + textView.setGravity(Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + textView.setMaxWidth(AndroidUtilities.dp(260)); + + switch (a) { + case 0: + textView.setText(LocaleController.getString("EncryptedDescription1", R.string.EncryptedDescription1)); + break; + case 1: + textView.setText(LocaleController.getString("EncryptedDescription2", R.string.EncryptedDescription2)); + break; + case 2: + textView.setText(LocaleController.getString("EncryptedDescription3", R.string.EncryptedDescription3)); + break; + case 3: + textView.setText(LocaleController.getString("EncryptedDescription4", R.string.EncryptedDescription4)); + break; + } + + if (LocaleController.isRTL) { + linearLayout.addView(textView); + linearLayout.addView(imageView); + } else { + linearLayout.addView(imageView); + linearLayout.addView(textView); + } + layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(8); + layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(8) : 0; + layoutParams.topMargin = AndroidUtilities.dp(LocaleController.isRTL ? 3 : 4); + imageView.setLayoutParams(layoutParams); + + layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + textView.setLayoutParams(layoutParams); + } + } + + chatListView = new LayoutListView(context); + chatListView.setAdapter(chatAdapter = new ChatAdapter(context)); + chatListView.setCacheColorHint(ApplicationLoader.getSelectedColor()); + chatListView.setClipToPadding(false); + chatListView.setStackFromBottom(true); + chatListView.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(3)); + chatListView.setDivider(null); + chatListView.setSelector(R.drawable.transparent); + chatListView.setOnItemLongClickListener(onItemLongClickListener); + chatListView.setOnItemClickListener(onItemClickListener); + contentView.addView(chatListView); + layoutParams3 = (RelativeLayout.LayoutParams) chatListView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.bottomMargin = -AndroidUtilities.dp(3); + layoutParams3.addRule(RelativeLayout.ABOVE, id_chat_compose_panel); + chatListView.setLayoutParams(layoutParams3); + chatListView.setOnInterceptTouchEventListener(new LayoutListView.OnInterceptTouchEventListener() { + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + if (actionBar.isActionModeShowed()) { + return false; + } + if (event.getAction() == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + int count = chatListView.getChildCount(); + Rect rect = new Rect(); + for (int a = 0; a < count; a++) { + View view = chatListView.getChildAt(a); + int top = view.getTop(); + int bottom = view.getBottom(); + view.getLocalVisibleRect(rect); + if (top > y || bottom < y) { + continue; + } + if (!(view instanceof ChatMediaCell)) { + break; + } + final ChatMediaCell cell = (ChatMediaCell) view; + final MessageObject messageObject = cell.getMessageObject(); + if (messageObject == null || !messageObject.isSecretPhoto() || !cell.getPhotoImage().isInsideImage(x, y - top)) { + break; + } + File file = FileLoader.getPathToMessage(messageObject.messageOwner); + if (!file.exists()) { + break; + } + startX = x; + startY = y; + chatListView.setOnItemClickListener(null); + openSecretPhotoRunnable = new Runnable() { + @Override + public void run() { + if (openSecretPhotoRunnable == null) { + return; + } + chatListView.requestDisallowInterceptTouchEvent(true); + chatListView.setOnItemLongClickListener(null); + chatListView.setLongClickable(false); + openSecretPhotoRunnable = null; + if (sendSecretMessageRead(messageObject)) { + cell.invalidate(); + } + SecretPhotoViewer.getInstance().setParentActivity(getParentActivity()); + SecretPhotoViewer.getInstance().openPhoto(messageObject); + } + }; + AndroidUtilities.runOnUIThread(openSecretPhotoRunnable, 100); + return true; + } + } + return false; + } + }); + chatListView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (openSecretPhotoRunnable != null || SecretPhotoViewer.getInstance().isVisible()) { + if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_POINTER_UP) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + chatListView.setOnItemClickListener(onItemClickListener); + } + }, 150); + if (openSecretPhotoRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(openSecretPhotoRunnable); + openSecretPhotoRunnable = null; + try { + Toast.makeText(v.getContext(), LocaleController.getString("PhotoTip", R.string.PhotoTip), Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else { + if (SecretPhotoViewer.getInstance().isVisible()) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + chatListView.setOnItemLongClickListener(onItemLongClickListener); + chatListView.setLongClickable(true); + } + }); + SecretPhotoViewer.getInstance().closePhoto(); + } + } + } else if (event.getAction() != MotionEvent.ACTION_DOWN) { + if (SecretPhotoViewer.getInstance().isVisible()) { + return true; + } else if (openSecretPhotoRunnable != null) { + if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (Math.hypot(startX - event.getX(), startY - event.getY()) > AndroidUtilities.dp(5)) { + AndroidUtilities.cancelRunOnUIThread(openSecretPhotoRunnable); + openSecretPhotoRunnable = null; + } + } else { + AndroidUtilities.cancelRunOnUIThread(openSecretPhotoRunnable); + openSecretPhotoRunnable = null; + } + } + } + } + return false; + } + }); + chatListView.setOnScrollListener(new AbsListView.OnScrollListener() { + Rect scrollRect = new Rect(); + + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL || i == AbsListView.OnScrollListener.SCROLL_STATE_FLING && highlightMessageId != Integer.MAX_VALUE) { + highlightMessageId = Integer.MAX_VALUE; + updateVisibleRows(); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (visibleItemCount > 0) { + if (firstVisibleItem <= 10) { + if (!endReached && !loading) { + if (messagesByDays.size() != 0) { + MessagesController.getInstance().loadMessages(dialog_id, 20, maxMessageId, !cacheEndReaced && startLoadFromMessageId == 0, minDate, classGuid, 0, 0, 0, startLoadFromMessageId == 0); + } else { + MessagesController.getInstance().loadMessages(dialog_id, 20, 0, !cacheEndReaced && startLoadFromMessageId == 0, minDate, classGuid, 0, 0, 0, startLoadFromMessageId == 0); + } + loading = true; + } + } + if (firstVisibleItem + visibleItemCount >= totalItemCount - 6) { + if (!forward_end_reached && !loadingForward) { + MessagesController.getInstance().loadMessages(dialog_id, 20, minMessageId, startLoadFromMessageId == 0, maxDate, classGuid, 1, 0, 0, startLoadFromMessageId == 0); + loadingForward = true; + } + } + if (firstVisibleItem + visibleItemCount == totalItemCount && forward_end_reached) { + showPagedownButton(false, true); + } + } + for (int a = 0; a < visibleItemCount; a++) { + View view = absListView.getChildAt(a); + if (view instanceof ChatMessageCell) { + ChatMessageCell messageCell = (ChatMessageCell) view; + messageCell.getLocalVisibleRect(scrollRect); + messageCell.setVisiblePart(scrollRect.top, scrollRect.bottom - scrollRect.top); + } + } + } + }); + + progressView = new FrameLayout(context); + progressView.setVisibility(View.INVISIBLE); + progressView.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_loader2 : R.drawable.system_loader1); + contentView.addView(progressView); + layoutParams3 = (RelativeLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams3.width = AndroidUtilities.dp(36); + layoutParams3.height = AndroidUtilities.dp(36); + layoutParams3.bottomMargin = AndroidUtilities.dp(48); + layoutParams3.addRule(RelativeLayout.CENTER_IN_PARENT); + progressView.setLayoutParams(layoutParams3); + + ProgressBar progressBar = new ProgressBar(context); + try { + progressBar.setIndeterminateDrawable(context.getResources().getDrawable(R.drawable.loading_animation)); + } catch (Exception e) { + //don't promt + } + progressBar.setIndeterminate(true); + AndroidUtilities.setProgressBarAnimationDuration(progressBar, 1500); + progressView.addView(progressBar); + layoutParams2 = (FrameLayout.LayoutParams) progressBar.getLayoutParams(); + layoutParams2.width = AndroidUtilities.dp(32); + layoutParams2.height = AndroidUtilities.dp(32); + layoutParams2.gravity = Gravity.CENTER; + progressBar.setLayoutParams(layoutParams2); + + if (currentEncryptedChat == null && !isBroadcast) { + mentionListView = new ListView(context); + mentionListView.setBackgroundResource(R.drawable.compose_panel); + mentionListView.setVisibility(View.GONE); + mentionListView.setPadding(0, AndroidUtilities.dp(2), 0, 0); + mentionListView.setClipToPadding(true); + mentionListView.setDividerHeight(0); + mentionListView.setDivider(null); + if (Build.VERSION.SDK_INT > 8) { + mentionListView.setOverScrollMode(ListView.OVER_SCROLL_NEVER); + } + contentView.addView(mentionListView); + layoutParams3 = (RelativeLayout.LayoutParams) mentionListView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = AndroidUtilities.dp(110); + layoutParams3.topMargin = -AndroidUtilities.dp(108); + layoutParams3.addRule(RelativeLayout.ALIGN_TOP, id_chat_compose_panel); + mentionListView.setLayoutParams(layoutParams3); + + mentionListView.setAdapter(mentionsAdapter = new MentionsAdapter(context, new MentionsAdapter.MentionsAdapterDelegate() { @Override - public void onClick(View view) { - if (returnToMessageId > 0) { - scrollToMessageId(returnToMessageId, 0, true); + public void needChangePanelVisibility(boolean show) { + if (show) { + RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) mentionListView.getLayoutParams(); + int height = 36 * Math.min(3, mentionsAdapter.getCount()) + (mentionsAdapter.getCount() > 3 ? 18 : 0); + layoutParams3.height = AndroidUtilities.dp(2 + height); + layoutParams3.topMargin = -AndroidUtilities.dp(height); + mentionListView.setLayoutParams(layoutParams3); + + if (mentionListAnimation != null) { + mentionListAnimation.cancel(); + mentionListAnimation = null; + } + + if (mentionListView.getVisibility() == View.VISIBLE) { + ViewProxy.setAlpha(mentionListView, 1.0f); + return; + } + if (allowStickersPanel) { + mentionListView.setVisibility(View.VISIBLE); + mentionListAnimation = new AnimatorSetProxy(); + mentionListAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(mentionListView, "alpha", 0.0f, 1.0f) + ); + mentionListAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (mentionListAnimation != null && mentionListAnimation.equals(animation)) { + mentionListView.clearAnimation(); + mentionListAnimation = null; + } + } + }); + mentionListAnimation.setDuration(200); + mentionListAnimation.start(); + } else { + ViewProxy.setAlpha(mentionListView, 1.0f); + mentionListView.clearAnimation(); + mentionListView.setVisibility(View.INVISIBLE); + } } else { - scrollToLastMessage(); + if (mentionListAnimation != null) { + mentionListAnimation.cancel(); + mentionListAnimation = null; + } + + if (mentionListView.getVisibility() == View.GONE) { + return; + } + if (allowStickersPanel) { + mentionListAnimation = new AnimatorSetProxy(); + mentionListAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(mentionListView, "alpha", 0.0f) + ); + mentionListAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (mentionListAnimation != null && mentionListAnimation.equals(animation)) { + mentionListView.clearAnimation(); + mentionListView.setVisibility(View.GONE); + mentionListAnimation = null; + } + } + }); + mentionListAnimation.setDuration(200); + mentionListAnimation.start(); + } else { + mentionListView.clearAnimation(); + mentionListView.setVisibility(View.GONE); + } + } + } + })); + mentionsAdapter.setChatInfo(info); + mentionsAdapter.setNeedUsernames(currentChat != null); + + mentionListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Object object = mentionsAdapter.getItem(position); + int start = mentionsAdapter.getResultStartPosition(); + int len = mentionsAdapter.getResultLength(); + if (object instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) object; + if (user != null) { + chatActivityEnterView.replaceWithText(start, len, "@" + user.username + " "); + } + } else if (object instanceof String) { + chatActivityEnterView.replaceWithText(start, len, object + " "); } } }); - if (loading && messages.isEmpty()) { - progressView.setVisibility(View.VISIBLE); - chatListView.setEmptyView(null); - } else { - progressView.setVisibility(View.INVISIBLE); - chatListView.setEmptyView(emptyViewContainer); + mentionListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + Object object = mentionsAdapter.getItem(position); + if (object instanceof String) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + mentionsAdapter.clearRecentHashtags(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + return false; + } + }); + } + + if (chatActivityEnterView != null) { + chatActivityEnterView.onDestroy(); + } + chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, this, true); + chatActivityEnterView.setDialogId(dialog_id); + chatActivityEnterView.addToAttachLayout(menuItem); + chatActivityEnterView.setId(id_chat_compose_panel); + contentView.addView(chatActivityEnterView); + layoutParams3 = (RelativeLayout.LayoutParams) chatActivityEnterView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + chatActivityEnterView.setLayoutParams(layoutParams3); + chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { + @Override + public void onMessageSend(String message) { + moveScrollToLastMessage(); + showReplyPanel(false, null, null, null, false, true); + if (mentionsAdapter != null) { + mentionsAdapter.addHashtagsFromMessage(message); + } + if (message != null) { + NotificationsController.getInstance().playOutChatSound(); + } } - updateContactStatus(); - updateBottomOverlay(); - updateSecretStatus(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + @Override + public void onTextChanged(final CharSequence text, boolean bigChange) { + if (stickersAdapter != null) { + stickersAdapter.loadStikersForEmoji(text); + } + if (mentionsAdapter != null) { + mentionsAdapter.searchUsernameOrHashtag(text.toString(), chatActivityEnterView.getCursorPosition(), messages); + } + if (waitingForCharaterEnterRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(waitingForCharaterEnterRunnable); + waitingForCharaterEnterRunnable = null; + } + if (bigChange) { + searchLinks(text, true); + } else { + waitingForCharaterEnterRunnable = new Runnable() { + @Override + public void run() { + if (this == waitingForCharaterEnterRunnable) { + searchLinks(text, false); + waitingForCharaterEnterRunnable = null; + } + } + }; + AndroidUtilities.runOnUIThread(waitingForCharaterEnterRunnable, 1000); + } } + + @Override + public void needSendTyping() { + MessagesController.getInstance().sendTyping(dialog_id, classGuid); + } + + @Override + public void onAttachButtonHidden() { + if (attachItem != null) { + attachItem.setVisibility(View.VISIBLE); + } + if (headerItem != null) { + headerItem.setVisibility(View.INVISIBLE); + } + } + + @Override + public void onAttachButtonShow() { + if (attachItem != null) { + attachItem.setVisibility(View.INVISIBLE); + } + if (headerItem != null) { + headerItem.setVisibility(View.VISIBLE); + } + } + + @Override + public void onWindowSizeChanged(int size) { + if (size < AndroidUtilities.dp(72) + AndroidUtilities.getCurrentActionBarHeight()) { + allowStickersPanel = false; + if (stickersPanel.getVisibility() == View.VISIBLE) { + stickersPanel.clearAnimation(); + stickersPanel.setVisibility(View.INVISIBLE); + } + if (mentionListView != null && mentionListView.getVisibility() == View.VISIBLE) { + mentionListView.clearAnimation(); + mentionListView.setVisibility(View.INVISIBLE); + } + } else { + allowStickersPanel = true; + if (stickersPanel.getVisibility() == View.INVISIBLE) { + stickersPanel.clearAnimation(); + stickersPanel.setVisibility(View.VISIBLE); + } + if (mentionListView != null && mentionListView.getVisibility() == View.INVISIBLE) { + mentionListView.clearAnimation(); + mentionListView.setVisibility(View.VISIBLE); + } + } + } + }); + + FrameLayout replyLayout = new FrameLayout(context); + replyLayout.setClickable(true); + chatActivityEnterView.addTopView(replyLayout, AndroidUtilities.dp(48)); + + View lineView = new View(context); + lineView.setBackgroundColor(0xffe8e8e8); + replyLayout.addView(lineView); + layoutParams2 = (FrameLayout.LayoutParams) lineView.getLayoutParams(); + layoutParams2.gravity = Gravity.BOTTOM; + layoutParams2.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams2.height = AndroidUtilities.dp(1); + lineView.setLayoutParams(layoutParams2); + + replyIconImageView = new ImageView(context); + replyIconImageView.setScaleType(ImageView.ScaleType.CENTER); + replyLayout.addView(replyIconImageView); + layoutParams2 = (FrameLayout.LayoutParams) replyIconImageView.getLayoutParams(); + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams2.width = AndroidUtilities.dp(52); + layoutParams2.height = AndroidUtilities.dp(46); + replyIconImageView.setLayoutParams(layoutParams2); + + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.delete_reply); + imageView.setScaleType(ImageView.ScaleType.CENTER); + replyLayout.addView(imageView); + layoutParams2 = (FrameLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams2.topMargin = AndroidUtilities.dp(0.5f); + layoutParams2.width = AndroidUtilities.dp(52); + layoutParams2.height = AndroidUtilities.dp(46); + layoutParams2.gravity = Gravity.RIGHT | Gravity.TOP; + imageView.setLayoutParams(layoutParams2); + imageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (forwardingMessages != null) { + forwardingMessages.clear(); + } + showReplyPanel(false, null, null, foundWebPage, true, true); + } + }); + + replyNameTextView = new TextView(context); + replyNameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + replyNameTextView.setTextColor(0xff377aae); + replyNameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + replyNameTextView.setSingleLine(true); + replyNameTextView.setEllipsize(TextUtils.TruncateAt.END); + replyNameTextView.setMaxLines(1); + replyLayout.addView(replyNameTextView); + layoutParams2 = (FrameLayout.LayoutParams) replyNameTextView.getLayoutParams(); + layoutParams2.leftMargin = AndroidUtilities.dp(52); + layoutParams2.rightMargin = AndroidUtilities.dp(52); + layoutParams2.topMargin = AndroidUtilities.dp(4); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + replyNameTextView.setLayoutParams(layoutParams2); + + replyObjectTextView = new TextView(context); + replyObjectTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + replyObjectTextView.setTextColor(0xff999999); + replyObjectTextView.setSingleLine(true); + replyObjectTextView.setEllipsize(TextUtils.TruncateAt.END); + replyObjectTextView.setMaxLines(1); + replyLayout.addView(replyObjectTextView); + layoutParams2 = (FrameLayout.LayoutParams) replyObjectTextView.getLayoutParams(); + layoutParams2.leftMargin = AndroidUtilities.dp(52); + layoutParams2.rightMargin = AndroidUtilities.dp(52); + layoutParams2.topMargin = AndroidUtilities.dp(22); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + replyObjectTextView.setLayoutParams(layoutParams2); + + replyImageView = new BackupImageView(context); + replyLayout.addView(replyImageView); + layoutParams2 = (FrameLayout.LayoutParams) replyImageView.getLayoutParams(); + layoutParams2.leftMargin = AndroidUtilities.dp(52); + layoutParams2.topMargin = AndroidUtilities.dp(6); + layoutParams2.width = AndroidUtilities.dp(34); + layoutParams2.height = AndroidUtilities.dp(34); + layoutParams2.gravity = Gravity.TOP | Gravity.LEFT; + replyImageView.setLayoutParams(layoutParams2); + + stickersPanel = new FrameLayout(context); + stickersPanel.setVisibility(View.GONE); + contentView.addView(stickersPanel); + layoutParams3 = (RelativeLayout.LayoutParams) stickersPanel.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = AndroidUtilities.dp(81.5f); + layoutParams3.bottomMargin = AndroidUtilities.dp(38); + layoutParams3.addRule(RelativeLayout.ALIGN_BOTTOM, id_chat_compose_panel); + stickersPanel.setLayoutParams(layoutParams3); + + stickersListView = new RecyclerListView(context); + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + stickersListView.setLayoutManager(layoutManager); + stickersListView.setClipToPadding(false); + if (Build.VERSION.SDK_INT >= 9) { + stickersListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); } + stickersPanel.addView(stickersListView); + layoutParams2 = (FrameLayout.LayoutParams) stickersListView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams2.height = AndroidUtilities.dp(78); + stickersListView.setLayoutParams(layoutParams2); + if (currentEncryptedChat == null || currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 23) { + if (stickersAdapter != null) { + stickersAdapter.destroy(); + } + stickersListView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); + stickersListView.setAdapter(stickersAdapter = new StickersAdapter(context, new StickersAdapter.StickersAdapterDelegate() { + @Override + public void needChangePanelVisibility(final boolean show) { + if (show && stickersPanel.getVisibility() == View.VISIBLE || !show && stickersPanel.getVisibility() == View.GONE) { + return; + } + if (show) { + stickersListView.scrollToPosition(0); + stickersPanel.clearAnimation(); + stickersPanel.setVisibility(allowStickersPanel ? View.VISIBLE : View.INVISIBLE); + } + if (runningAnimation != null) { + runningAnimation.cancel(); + runningAnimation = null; + } + if (stickersPanel.getVisibility() != View.INVISIBLE) { + runningAnimation = new AnimatorSetProxy(); + runningAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(stickersPanel, "alpha", show ? 0.0f : 1.0f, show ? 1.0f : 0.0f) + ); + runningAnimation.setDuration(150); + runningAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (runningAnimation != null && runningAnimation.equals(animation)) { + if (!show) { + stickersAdapter.clearStickers(); + stickersPanel.clearAnimation(); + stickersPanel.setVisibility(View.GONE); + } + runningAnimation = null; + } + } + }); + runningAnimation.start(); + } else if (!show) { + stickersPanel.setVisibility(View.GONE); + } + } + })); + stickersListView.addOnItemTouchListener(new RecyclerListView.RecyclerListViewItemClickListener(context, new RecyclerListView.OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + TLRPC.Document document = stickersAdapter.getItem(position); + if (document instanceof TLRPC.TL_document) { + if (currentEncryptedChat != null && document.thumb instanceof TLRPC.TL_photoSize) { + File file = FileLoader.getPathToAttach(document.thumb, true); + if (file.exists()) { + try { + int len = (int) file.length(); + byte[] arr = new byte[(int) file.length()]; + RandomAccessFile reader = new RandomAccessFile(file, "r"); + reader.readFully(arr); + TLRPC.TL_document newDocument = new TLRPC.TL_document(); + newDocument.thumb = new TLRPC.TL_photoCachedSize(); + newDocument.thumb.location = document.thumb.location; + newDocument.thumb.size = document.thumb.size; + newDocument.thumb.w = document.thumb.w; + newDocument.thumb.h = document.thumb.h; + newDocument.thumb.type = document.thumb.type; + newDocument.thumb.bytes = arr; + + newDocument.id = document.id; + newDocument.access_hash = document.access_hash; + newDocument.date = document.date; + newDocument.mime_type = document.mime_type; + newDocument.size = document.size; + newDocument.dc_id = document.dc_id; + newDocument.attributes = document.attributes; + document = newDocument; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + for (int a = 0; a < document.attributes.size(); a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeSticker) { + document.attributes.remove(a); + document.attributes.add(new TLRPC.TL_documentAttributeSticker_old()); + break; + } + } + SendMessagesHelper.getInstance().sendMessage((TLRPC.TL_document) document, null, null, dialog_id, replyingMessageObject); + showReplyPanel(false, null, null, null, false, true); + } + chatActivityEnterView.setFieldText(""); + } + })); + } + + imageView = new ImageView(context); + imageView.setImageResource(R.drawable.stickers_back_arrow); + stickersPanel.addView(imageView); + layoutParams2 = (FrameLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.BOTTOM; + layoutParams2.leftMargin = AndroidUtilities.dp(53); + imageView.setLayoutParams(layoutParams2); + + bottomOverlay = new FrameLayout(context); + bottomOverlay.setBackgroundColor(0xffffffff); + bottomOverlay.setVisibility(View.INVISIBLE); + bottomOverlay.setFocusable(true); + bottomOverlay.setFocusableInTouchMode(true); + bottomOverlay.setClickable(true); + contentView.addView(bottomOverlay); + layoutParams3 = (RelativeLayout.LayoutParams) bottomOverlay.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = AndroidUtilities.dp(48); + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + bottomOverlay.setLayoutParams(layoutParams3); + + bottomOverlayText = new TextView(context); + bottomOverlayText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + bottomOverlayText.setTextColor(0xff7f7f7f); + bottomOverlay.addView(bottomOverlayText); + layoutParams2 = (FrameLayout.LayoutParams) bottomOverlayText.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + bottomOverlayText.setLayoutParams(layoutParams2); + + bottomOverlayChat = new FrameLayout(context); + bottomOverlayChat.setBackgroundColor(0xfffbfcfd); + bottomOverlayChat.setVisibility(View.INVISIBLE); + contentView.addView(bottomOverlayChat); + layoutParams3 = (RelativeLayout.LayoutParams) bottomOverlayChat.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = AndroidUtilities.dp(48); + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + bottomOverlayChat.setLayoutParams(layoutParams3); + bottomOverlayChat.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + if (currentUser != null && userBlocked) { + builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + MessagesController.getInstance().unblockUser(currentUser.id); + } + }); + } else { + builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + MessagesController.getInstance().deleteDialog(dialog_id, 0, false); + finishFragment(); + } + }); + } + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + }); + + bottomOverlayChatText = new TextView(context); + bottomOverlayChatText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + bottomOverlayChatText.setTextColor(0xff3e6fa1); + bottomOverlayChat.addView(bottomOverlayChatText); + layoutParams2 = (FrameLayout.LayoutParams) bottomOverlayChatText.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + bottomOverlayChatText.setLayoutParams(layoutParams2); + + pagedownButton = new ImageView(context); + pagedownButton.setVisibility(View.INVISIBLE); + pagedownButton.setImageResource(R.drawable.pagedown); + contentView.addView(pagedownButton); + layoutParams3 = (RelativeLayout.LayoutParams) pagedownButton.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.rightMargin = AndroidUtilities.dp(6); + layoutParams3.bottomMargin = AndroidUtilities.dp(4); + layoutParams3.addRule(RelativeLayout.ABOVE, id_chat_compose_panel); + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + pagedownButton.setLayoutParams(layoutParams3); + pagedownButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (returnToMessageId > 0) { + scrollToMessageId(returnToMessageId, 0, true); + } else { + scrollToLastMessage(); + } + } + }); + + if (loading && messages.isEmpty()) { + progressView.setVisibility(View.VISIBLE); + chatListView.setEmptyView(null); + } else { + progressView.setVisibility(View.INVISIBLE); + chatListView.setEmptyView(emptyViewContainer); + } + + updateContactStatus(); + updateBottomOverlay(); + updateSecretStatus(); + return fragmentView; } + private void searchLinks(CharSequence charSequence, boolean force) { + if (currentEncryptedChat != null) { + return; + } + if (linkSearchRequestId != 0) { + ConnectionsManager.getInstance().cancelRpc(linkSearchRequestId, true); + linkSearchRequestId = 0; + } + if (force && foundWebPage != null) { + if (foundWebPage.url != null) { + int index = TextUtils.indexOf(charSequence, foundWebPage.url); + char lastChar; + boolean lenEqual; + if (index == -1) { + index = TextUtils.indexOf(charSequence, foundWebPage.display_url); + lenEqual = index != -1 && index + foundWebPage.display_url.length() == charSequence.length(); + lastChar = index != -1 && !lenEqual ? charSequence.charAt(index + foundWebPage.display_url.length()) : 0; + } else { + lenEqual = index != -1 && index + foundWebPage.url.length() == charSequence.length(); + lastChar = index != -1 && !lenEqual ? charSequence.charAt(index + foundWebPage.url.length()) : 0; + } + if (index != -1 && (lenEqual || lastChar == ' ' || lastChar == ',' || lastChar == '.' || lastChar == '!' || lastChar == '/')) { + return; + } + } + pendingLinkSearchString = null; + showReplyPanel(false, null, null, foundWebPage, false, true); + } + if (charSequence.length() == 0 || TextUtils.indexOf(charSequence, "http") == -1 && TextUtils.indexOf(charSequence, ".com/") == -1) { + return; + } + final TLRPC.TL_messages_getWebPagePreview req = new TLRPC.TL_messages_getWebPagePreview(); + if (charSequence instanceof String) { + req.message = (String) charSequence; + } else { + req.message = charSequence.toString(); + } + linkSearchRequestId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + linkSearchRequestId = 0; + if (error == null) { + if (response instanceof TLRPC.TL_messageMediaWebPage) { + foundWebPage = ((TLRPC.TL_messageMediaWebPage) response).webpage; + if (foundWebPage instanceof TLRPC.TL_webPage || foundWebPage instanceof TLRPC.TL_webPagePending) { + if (foundWebPage instanceof TLRPC.TL_webPagePending) { + pendingLinkSearchString = req.message; + } + showReplyPanel(true, null, null, foundWebPage, false, true); + } else { + if (foundWebPage != null) { + showReplyPanel(false, null, null, foundWebPage, false, true); + foundWebPage = null; + } + } + } else { + if (foundWebPage != null) { + showReplyPanel(false, null, null, foundWebPage, false, true); + foundWebPage = null; + } + } + } + } + }); + } + }); + ConnectionsManager.getInstance().bindRequestToGuid(linkSearchRequestId, classGuid); + } + private void forwardMessages(ArrayList arrayList, boolean fromMyName) { if (arrayList == null || arrayList.isEmpty()) { return; @@ -1954,9 +2045,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } - public void showReplyForMessageObjectOrForward(boolean show, MessageObject messageObject, ArrayList messageObjects, boolean animated) { + public void showReplyPanel(boolean show, MessageObject messageObject, ArrayList messageObjects, TLRPC.WebPage webPage, boolean cancel, boolean animated) { if (show) { - if (messageObject == null && messageObjects == null) { + if (messageObject == null && messageObjects == null && webPage == null) { return; } if (messageObject != null) { @@ -1965,9 +2056,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } forwardingMessages = null; - replyIconImageView.setImageResource(R.drawable.reply); replyingMessageObject = messageObject; chatActivityEnterView.setReplyingMessageObject(messageObject); + + if (foundWebPage != null) { + return; + } + replyIconImageView.setImageResource(R.drawable.reply); replyNameTextView.setText(ContactsController.formatName(user.first_name, user.last_name)); if (messageObject.messageText != null) { String mess = messageObject.messageText.toString(); @@ -1981,12 +2076,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (messageObjects.isEmpty()) { return; } - chatActivityEnterView.setForceShowSendButton(true, animated); - chatActivityEnterView.setReplyingMessageObject(null); replyingMessageObject = null; + chatActivityEnterView.setReplyingMessageObject(null); + forwardingMessages = messageObjects; + + if (foundWebPage != null) { + return; + } + chatActivityEnterView.setForceShowSendButton(true, animated); ArrayList uids = new ArrayList<>(); replyIconImageView.setImageResource(R.drawable.forward_blue); - forwardingMessages = messageObjects; uids.add(messageObjects.get(0).messageOwner.from_id); int type = messageObjects.get(0).type; for (int a = 1; a < messageObjects.size(); a++) { @@ -2067,16 +2166,40 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } + } else if (webPage != null) { + replyIconImageView.setImageResource(R.drawable.link); + if (webPage instanceof TLRPC.TL_webPagePending) { + replyNameTextView.setText(LocaleController.getString("GettingLinkInfo", R.string.GettingLinkInfo)); + replyObjectTextView.setText(pendingLinkSearchString); + } else { + if (webPage.site_name != null) { + replyNameTextView.setText(webPage.site_name); + } else if (webPage.title != null) { + replyNameTextView.setText(webPage.title); + } + if (webPage.description != null) { + replyObjectTextView.setText(webPage.description); + } else if (webPage.title != null && webPage.site_name != null) { + replyObjectTextView.setText(webPage.title); + } else if (webPage.author != null) { + replyObjectTextView.setText(webPage.author); + } else { + replyObjectTextView.setText(webPage.display_url); + } + chatActivityEnterView.setWebPage(webPage, true); + } } FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) replyNameTextView.getLayoutParams(); FrameLayout.LayoutParams layoutParams2 = (FrameLayout.LayoutParams) replyObjectTextView.getLayoutParams(); TLRPC.PhotoSize photoSize = messageObject != null ? FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80) : null; - if (photoSize == null || messageObject.type == 13) { + if (photoSize == null || messageObject != null && messageObject.type == 13) { replyImageView.setImageBitmap(null); + replyImageLocation = null; replyImageView.setVisibility(View.INVISIBLE); layoutParams1.leftMargin = layoutParams2.leftMargin = AndroidUtilities.dp(52); } else { - replyImageView.setImage(photoSize.location, "50_50", (Drawable) null); + replyImageLocation = photoSize.location; + replyImageView.setImage(replyImageLocation, "50_50", (Drawable) null); replyImageView.setVisibility(View.VISIBLE); layoutParams1.leftMargin = layoutParams2.leftMargin = AndroidUtilities.dp(96); } @@ -2084,9 +2207,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not replyObjectTextView.setLayoutParams(layoutParams2); chatActivityEnterView.showTopView(animated); } else { - if (replyingMessageObject == null && forwardingMessages == null) { + if (replyingMessageObject == null && forwardingMessages == null && foundWebPage == null) { return; } + if (foundWebPage != null) { + foundWebPage = null; + chatActivityEnterView.setWebPage(null, !cancel); + if (webPage != null && (replyingMessageObject != null || forwardingMessages != null)) { + showReplyPanel(true, replyingMessageObject, forwardingMessages, null, false, true); + return; + } + } if (forwardingMessages != null) { forwardMessages(forwardingMessages, false); } @@ -2095,6 +2226,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatActivityEnterView.setReplyingMessageObject(null); replyingMessageObject = null; forwardingMessages = null; + replyImageLocation = null; SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); preferences.edit().remove("reply_" + dialog_id).commit(); } @@ -2263,7 +2395,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not bottomOverlay.setVisibility(View.VISIBLE); hideKeyboard = true; } else if (currentEncryptedChat instanceof TLRPC.TL_encryptedChatWaiting) { - bottomOverlayText.setText(Html.fromHtml(LocaleController.formatString("AwaitingEncryption", R.string.AwaitingEncryption, "" + currentUser.first_name + ""))); + bottomOverlayText.setText(AndroidUtilities.replaceTags(LocaleController.formatString("AwaitingEncryption", R.string.AwaitingEncryption, "" + currentUser.first_name + ""))); bottomOverlay.setVisibility(View.VISIBLE); hideKeyboard = true; } else if (currentEncryptedChat instanceof TLRPC.TL_encryptedChatDiscarded) { @@ -2341,7 +2473,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not boolean isBroadcastError = isBroadcast && messageObject.getId() <= 0 && messageObject.isSendError(); if (!isBroadcast && messageObject.getId() <= 0 && messageObject.isOut() || isBroadcastError) { if (messageObject.isSendError()) { - if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (!messageObject.isMediaEmpty()) { return 0; } else { return 7; @@ -2358,7 +2490,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } return 1; } else { - if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (!messageObject.isMediaEmpty()) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { @@ -2402,7 +2534,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (messageObject.type == 6) { return -1; } else if (messageObject.isSendError()) { - if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (!messageObject.isMediaEmpty()) { return 0; } else { return 7; @@ -2414,7 +2546,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return 1; } } else { - if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (!messageObject.isMediaEmpty()) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { @@ -2477,9 +2609,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private void processRowSelect(View view) { MessageObject message = null; if (view instanceof ChatBaseCell) { - message = ((ChatBaseCell)view).getMessageObject(); + message = ((ChatBaseCell) view).getMessageObject(); } else if (view instanceof ChatActionCell) { - message = ((ChatActionCell)view).getMessageObject(); + message = ((ChatActionCell) view).getMessageObject(); } int type = getMessageType(message); @@ -2658,13 +2790,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not videoEditedInfo.resultHeight = resultHeight; videoEditedInfo.originalPath = videoPath; SendMessagesHelper.prepareSendingVideo(videoPath, estimatedSize, estimatedDuration, resultWidth, resultHeight, videoEditedInfo, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); } }); if (parentLayout == null || !fragment.onFragmentCreate()) { SendMessagesHelper.prepareSendingVideo(videoPath, 0, 0, 0, 0, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); return false; } parentLayout.presentFragment(fragment, removeLast, true, true); @@ -2689,7 +2821,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not try { ExifInterface ei = new ExifInterface(currentPicturePath); int exif = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - switch(exif) { + switch (exif) { case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; @@ -2711,10 +2843,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) arrayList.get(0); if (photoEntry.imagePath != null) { SendMessagesHelper.prepareSendingPhoto(photoEntry.imagePath, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); } else if (photoEntry.path != null) { SendMessagesHelper.prepareSendingPhoto(photoEntry.path, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); } } }); @@ -2726,7 +2858,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } SendMessagesHelper.prepareSendingPhoto(null, data.getData(), dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); } else if (requestCode == 2) { String videoPath = null; if (data != null) { @@ -2760,7 +2892,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } currentPicturePath = null; } - if(Build.VERSION.SDK_INT >= 16) { + if (Build.VERSION.SDK_INT >= 16) { if (paused) { startVideoEdit = videoPath; } else { @@ -2768,7 +2900,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } else { SendMessagesHelper.prepareSendingVideo(videoPath, 0, 0, 0, 0, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); } } else if (requestCode == 21) { if (data == null || data.getData() == null) { @@ -2786,7 +2918,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } SendMessagesHelper.prepareSendingDocument(tempPath, originalPath, null, null, dialog_id, replyingMessageObject); - showReplyForMessageObjectOrForward(false, null, null, true); + showReplyPanel(false, null, null, null, false, true); } } } @@ -2826,24 +2958,24 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public void didReceivedNotification(int id, final Object... args) { if (id == NotificationCenter.messagesDidLoaded) { - long did = (Long)args[0]; + long did = (Long) args[0]; if (did == dialog_id) { loadsCount++; - int count = (Integer)args[1]; - boolean isCache = (Boolean)args[3]; - int fnid = (Integer)args[4]; - int last_unread_date = (Integer)args[8]; - int load_type = (Integer)args[9]; + int count = (Integer) args[1]; + boolean isCache = (Boolean) args[3]; + int fnid = (Integer) args[4]; + int last_unread_date = (Integer) args[8]; + int load_type = (Integer) args[9]; boolean wasUnread = false; if (fnid != 0) { first_unread_id = fnid; - last_message_id = (Integer)args[5]; - unread_to_load = (Integer)args[7]; + last_message_id = (Integer) args[5]; + unread_to_load = (Integer) args[7]; } else if (startLoadFromMessageId != 0 && load_type == 3) { - last_message_id = (Integer)args[5]; - first_message_id = (Integer)args[6]; + last_message_id = (Integer) args[5]; + first_message_id = (Integer) args[6]; } - ArrayList messArr = (ArrayList)args[2]; + ArrayList messArr = (ArrayList) args[2]; int newRowsCount = 0; @@ -3086,7 +3218,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not replyObjectTextView.invalidate(); } } else if (id == NotificationCenter.updateInterfaces) { - int updateMask = (Integer)args[0]; + int updateMask = (Integer) args[0]; if ((updateMask & MessagesController.UPDATE_MASK_NAME) != 0 || (updateMask & MessagesController.UPDATE_MASK_CHAT_NAME) != 0) { updateTitle(); } @@ -3118,19 +3250,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not updateContactStatus(); } } else if (id == NotificationCenter.didReceivedNewMessages) { - long did = (Long)args[0]; + long did = (Long) args[0]; if (did == dialog_id) { boolean updateChat = false; boolean hasFromMe = false; - ArrayList arr = (ArrayList)args[1]; + ArrayList arr = (ArrayList) args[1]; if (currentEncryptedChat != null && arr.size() == 1) { MessageObject obj = arr.get(0); if (currentEncryptedChat != null && obj.isOut() && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction && obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL && getParentActivity() != null) { - TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL)obj.messageOwner.action.encryptedAction; + TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL) obj.messageOwner.action.encryptedAction; if (AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 17 && currentEncryptedChat.ttl > 0 && currentEncryptedChat.ttl <= 60) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); @@ -3152,7 +3284,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not for (MessageObject obj : arr) { if (currentEncryptedChat != null && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction && obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL && timerDrawable != null) { - TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL)obj.messageOwner.action.encryptedAction; + TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL) obj.messageOwner.action.encryptedAction; timerDrawable.setTime(action.ttl_seconds); } if (obj.isOut() && obj.isSending()) { @@ -3199,7 +3331,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not for (MessageObject obj : arr) { if (currentEncryptedChat != null && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction && obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL && timerDrawable != null) { - TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL)obj.messageOwner.action.encryptedAction; + TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL) obj.messageOwner.action.encryptedAction; timerDrawable.setTime(action.ttl_seconds); } if (messagesDict.containsKey(obj.getId())) { @@ -3298,7 +3430,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } else if (id == NotificationCenter.closeChats) { if (args != null && args.length > 0) { - long did = (Long)args[0]; + long did = (Long) args[0]; if (did == dialog_id) { finishFragment(); } @@ -3345,7 +3477,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not updateVisibleRows(); } } else if (id == NotificationCenter.messagesDeleted) { - ArrayList markAsDeletedMessages = (ArrayList)args[0]; + ArrayList markAsDeletedMessages = (ArrayList) args[0]; boolean updated = false; for (Integer ids : markAsDeletedMessages) { MessageObject obj = messagesDict.get(ids); @@ -3388,11 +3520,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatAdapter.notifyDataSetChanged(); } } else if (id == NotificationCenter.messageReceivedByServer) { - Integer msgId = (Integer)args[0]; + Integer msgId = (Integer) args[0]; MessageObject obj = messagesDict.get(msgId); if (obj != null) { - Integer newMsgId = (Integer)args[1]; - TLRPC.Message newMsgObj = (TLRPC.Message)args[2]; + Integer newMsgId = (Integer) args[1]; + TLRPC.Message newMsgObj = (TLRPC.Message) args[2]; + boolean mediaUpdated = (Boolean) args[3]; if (newMsgObj != null) { obj.messageOwner.media = newMsgObj.media; obj.generateThumbs(true); @@ -3402,25 +3535,28 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not obj.messageOwner.id = newMsgId; obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; updateVisibleRows(); + if (mediaUpdated && chatListView.getLastVisiblePosition() >= messages.size() - 1) { + moveScrollToLastMessage(); + } } } else if (id == NotificationCenter.messageReceivedByAck) { - Integer msgId = (Integer)args[0]; + Integer msgId = (Integer) args[0]; MessageObject obj = messagesDict.get(msgId); if (obj != null) { obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENT; updateVisibleRows(); } } else if (id == NotificationCenter.messageSendError) { - Integer msgId = (Integer)args[0]; + Integer msgId = (Integer) args[0]; MessageObject obj = messagesDict.get(msgId); if (obj != null) { obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR; updateVisibleRows(); } } else if (id == NotificationCenter.chatInfoDidLoaded) { - int chatId = (Integer)args[0]; + int chatId = (Integer) args[0]; if (currentChat != null && chatId == currentChat.id) { - info = (TLRPC.ChatParticipants)args[1]; + info = (TLRPC.ChatParticipants) args[1]; if (mentionsAdapter != null) { mentionsAdapter.setChatInfo(info); } @@ -3434,16 +3570,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not updateContactStatus(); updateSubtitle(); } else if (id == NotificationCenter.encryptedChatUpdated) { - TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat)args[0]; + TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat) args[0]; if (currentEncryptedChat != null && chat.id == currentEncryptedChat.id) { currentEncryptedChat = chat; updateContactStatus(); updateSecretStatus(); } } else if (id == NotificationCenter.messagesReadedEncrypted) { - int encId = (Integer)args[0]; + int encId = (Integer) args[0]; if (currentEncryptedChat != null && currentEncryptedChat.id == encId) { - int date = (Integer)args[1]; + int date = (Integer) args[1]; boolean started = false; for (MessageObject obj : messages) { if (!obj.isOut()) { @@ -3458,13 +3594,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not updateVisibleRows(); } } else if (id == NotificationCenter.audioDidReset) { - Integer mid = (Integer)args[0]; + Integer mid = (Integer) args[0]; if (chatListView != null) { int count = chatListView.getChildCount(); for (int a = 0; a < count; a++) { View view = chatListView.getChildAt(a); if (view instanceof ChatAudioCell) { - ChatAudioCell cell = (ChatAudioCell)view; + ChatAudioCell cell = (ChatAudioCell) view; if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { cell.updateButtonState(); break; @@ -3473,13 +3609,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } else if (id == NotificationCenter.audioProgressDidChanged) { - Integer mid = (Integer)args[0]; + Integer mid = (Integer) args[0]; if (chatListView != null) { int count = chatListView.getChildCount(); for (int a = 0; a < count; a++) { View view = chatListView.getChildAt(a); if (view instanceof ChatAudioCell) { - ChatAudioCell cell = (ChatAudioCell)view; + ChatAudioCell cell = (ChatAudioCell) view; if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { cell.updateProgress(); break; @@ -3488,7 +3624,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } else if (id == NotificationCenter.removeAllMessagesFromDialog) { - long did = (Long)args[0]; + long did = (Long) args[0]; if (dialog_id == did) { messages.clear(); messagesByDays.clear(); @@ -3520,19 +3656,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } else if (id == NotificationCenter.FileNewChunkAvailable) { - MessageObject messageObject = (MessageObject)args[0]; - long finalSize = (Long)args[2]; + MessageObject messageObject = (MessageObject) args[0]; + long finalSize = (Long) args[2]; if (finalSize != 0 && dialog_id == messageObject.getDialogId()) { MessageObject currentObject = messagesDict.get(messageObject.getId()); if (currentObject != null) { - currentObject.messageOwner.media.video.size = (int)finalSize; + currentObject.messageOwner.media.video.size = (int) finalSize; updateVisibleRows(); } } } else if (id == NotificationCenter.didCreatedNewDeleteTask) { - SparseArray> mids = (SparseArray>)args[0]; + SparseArray> mids = (SparseArray>) args[0]; boolean changed = false; - for(int i = 0; i < mids.size(); i++) { + for (int i = 0; i < mids.size(); i++) { int key = mids.keyAt(i); ArrayList arr = mids.get(key); for (Integer mid : arr) { @@ -3547,10 +3683,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not updateVisibleRows(); } } else if (id == NotificationCenter.audioDidStarted) { - MessageObject messageObject = (MessageObject)args[0]; + MessageObject messageObject = (MessageObject) args[0]; sendSecretMessageRead(messageObject); } else if (id == NotificationCenter.updateMessageMedia) { - MessageObject messageObject = (MessageObject)args[0]; + MessageObject messageObject = (MessageObject) args[0]; MessageObject existMessageObject = messagesDict.get(messageObject.getId()); if (existMessageObject != null) { existMessageObject.messageOwner.media = messageObject.messageOwner.media; @@ -3561,10 +3697,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else if (id == NotificationCenter.replaceMessagesObjects) { if (dialog_id == (long) args[0]) { boolean changed = false; + boolean mediaUpdated = false; ArrayList messageObjects = (ArrayList) args[1]; for (MessageObject messageObject : messageObjects) { MessageObject old = messagesDict.get(messageObject.getId()); if (old != null) { + if (!mediaUpdated && messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) { + mediaUpdated = true; + } messagesDict.put(old.getId(), messageObject); int idx = messages.indexOf(old); if (idx >= 0) { @@ -3575,6 +3715,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (changed) { chatAdapter.notifyDataSetChanged(); + if (mediaUpdated && chatListView.getLastVisiblePosition() >= messages.size() - 1) { + moveScrollToLastMessage(); + } } } } else if (id == NotificationCenter.notificationsSettingsUpdated) { @@ -3584,6 +3727,33 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (did == dialog_id) { updateVisibleRows(); } + } else if (id == NotificationCenter.didReceivedWebpages) { + ArrayList arrayList = (ArrayList) args[0]; + boolean updated = false; + for (TLRPC.Message message : arrayList) { + MessageObject currentMessage = messagesDict.get(message.id); + if (currentMessage != null) { + currentMessage.messageOwner.media.webpage = message.media.webpage; + currentMessage.generateThumbs(true); + updated = true; + } + } + if (updated) { + updateVisibleRows(); + if (chatListView.getLastVisiblePosition() >= messages.size() - 1) { + moveScrollToLastMessage(); + } + } + } else if (id == NotificationCenter.didReceivedWebpagesInUpdates) { + if (foundWebPage != null) { + HashMap hashMap = (HashMap) args[0]; + for (TLRPC.WebPage webPage : hashMap.values()) { + if (webPage.id == foundWebPage.id) { + showReplyPanel(!(webPage instanceof TLRPC.TL_webPageEmpty), null, null, webPage, false, true); + break; + } + } + } } } @@ -3594,7 +3764,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not for (int a = 0; a < count; a++) { View view = chatListView.getChildAt(a); if (view instanceof ChatMediaCell) { - ChatMediaCell cell = (ChatMediaCell)view; + ChatMediaCell cell = (ChatMediaCell) view; cell.setAllowedToSetPhoto(true); } } @@ -3666,6 +3836,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } checkActionBarMenu(); + if (replyImageLocation != null && replyImageView != null) { + replyImageView.setImage(replyImageLocation, "50_50", (Drawable) null); + } NotificationsController.getInstance().setOpennedDialogId(dialog_id); if (scrollToTopOnResume) { @@ -3712,7 +3885,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not TLRPC.Message message = (TLRPC.Message) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); if (message != null) { replyingMessageObject = new MessageObject(message, MessagesController.getInstance().getUsers(), false); - showReplyForMessageObjectOrForward(true, replyingMessageObject, null, false); + showReplyPanel(true, replyingMessageObject, null, null, false, false); } } } catch (Exception e) { @@ -4062,11 +4235,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not fragment.setDelegate(this); presentFragment(fragment); } else if (option == 3) { - if(Build.VERSION.SDK_INT < 11) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager)ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + if (Build.VERSION.SDK_INT < 11) { + android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(selectedObject.messageText); } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager)ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("label", selectedObject.messageText); clipboard.setPrimaryClip(clip); } @@ -4143,7 +4316,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } else if (option == 8) { - showReplyForMessageObjectOrForward(true, selectedObject, null, true); + showReplyPanel(true, selectedObject, null, null, false, true); } selectedObject = null; } @@ -4234,7 +4407,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (did != dialog_id) { - int lower_part = (int)did; + int lower_part = (int) did; if (lower_part != 0) { Bundle args = new Bundle(); args.putBoolean("scrollToTopOnResume", scrollToTopOnResume); @@ -4245,7 +4418,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } ChatActivity chatActivity = new ChatActivity(args); if (presentFragment(chatActivity, true)) { - chatActivity.showReplyForMessageObjectOrForward(true, null, fmessages, false); + chatActivity.showReplyPanel(true, null, fmessages, null, false, false); if (!AndroidUtilities.isTablet()) { removeSelfFromStack(); Activity parentActivity = getParentActivity(); @@ -4265,7 +4438,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else { activity.finishFragment(); moveScrollToLastMessage(); - showReplyForMessageObjectOrForward(true, null, fmessages, AndroidUtilities.isTablet()); + showReplyPanel(true, null, fmessages, null, false, AndroidUtilities.isTablet()); if (AndroidUtilities.isTablet()) { actionBar.hideActionMode(); } @@ -4292,7 +4465,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not try { ApplicationInfo info = ApplicationLoader.applicationContext.getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0); return true; - } catch(PackageManager.NameNotFoundException e) { + } catch (PackageManager.NameNotFoundException e) { if (getParentActivity() == null) { return false; } @@ -4324,7 +4497,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not for (int a = 0; a < count; a++) { View view = chatListView.getChildAt(a); if (view instanceof ChatBaseCell) { - ChatBaseCell cell = (ChatBaseCell)view; + ChatBaseCell cell = (ChatBaseCell) view; boolean disableSelection = false; boolean selected = false; @@ -4379,14 +4552,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not ImageReceiver imageReceiver = null; View view = chatListView.getChildAt(a); if (view instanceof ChatMediaCell) { - ChatMediaCell cell = (ChatMediaCell)view; + ChatMediaCell cell = (ChatMediaCell) view; MessageObject message = cell.getMessageObject(); if (message != null && message.getId() == messageObject.getId()) { messageToOpen = message; imageReceiver = cell.getPhotoImage(); } } else if (view instanceof ChatActionCell) { - ChatActionCell cell = (ChatActionCell)view; + ChatActionCell cell = (ChatActionCell) view; MessageObject message = cell.getMessageObject(); if (message != null && message.getId() == messageObject.getId()) { messageToOpen = message; @@ -4416,25 +4589,34 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } @Override - public void willSwitchFromPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { } + public void willSwitchFromPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { + } @Override - public void willHidePhotoViewer() { } + public void willHidePhotoViewer() { + } @Override - public boolean isPhotoChecked(int index) { return false; } + public boolean isPhotoChecked(int index) { + return false; + } @Override - public void setPhotoChecked(int index) { } + public void setPhotoChecked(int index) { + } @Override - public void cancelButtonPressed() { } + public void cancelButtonPressed() { + } @Override - public void sendButtonPressed(int index) { } + public void sendButtonPressed(int index) { + } @Override - public int getSelectedCount() { return 0; } + public int getSelectedCount() { + return 0; + } private class ChatAdapter extends BaseFragmentAdapter { @@ -4493,7 +4675,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (i == 0 && !endReached || !forward_end_reached && i == (messages.size() + 1 - offset)) { View progressBar = null; if (view == null) { - LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.chat_loading_layout, viewGroup, false); progressBar = view.findViewById(R.id.progressLayout); if (ApplicationLoader.isCustomTheme()) { @@ -4514,21 +4696,22 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (view == null) { if (type == 0) { view = new ChatMessageCell(mContext); - } if (type == 1) { + } + if (type == 1) { view = new ChatMediaCell(mContext); } else if (type == 2) { view = new ChatAudioCell(mContext); } else if (type == 3) { view = new ChatContactCell(mContext); } else if (type == 6) { - LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.chat_unread_layout, viewGroup, false); } else if (type == 4) { view = new ChatActionCell(mContext); } if (view instanceof ChatBaseCell) { - ((ChatBaseCell)view).setDelegate(new ChatBaseCell.ChatBaseCellDelegate() { + ((ChatBaseCell) view).setDelegate(new ChatBaseCell.ChatBaseCellDelegate() { @Override public void didPressedUserAvatar(ChatBaseCell cell, TLRPC.User user) { if (actionBar.isActionModeShowed()) { @@ -4671,7 +4854,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } }); } else if (view instanceof ChatContactCell) { - ((ChatContactCell)view).setContactDelegate(new ChatContactCell.ChatContactCellDelegate() { + ((ChatContactCell) view).setContactDelegate(new ChatContactCell.ChatContactCellDelegate() { @Override public void didClickAddButton(ChatContactCell cell, TLRPC.User user) { if (actionBar.isActionModeShowed()) { @@ -4726,7 +4909,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not }); } } else if (view instanceof ChatActionCell) { - ((ChatActionCell)view).setDelegate(new ChatActionCell.ChatActionCellDelegate() { + ((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() { @Override public void didClickedImage(ChatActionCell cell) { MessageObject message = cell.getMessageObject(); @@ -4766,20 +4949,20 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (view instanceof ChatBaseCell) { - ChatBaseCell baseCell = (ChatBaseCell)view; + ChatBaseCell baseCell = (ChatBaseCell) view; baseCell.isChat = currentChat != null; baseCell.setMessageObject(message); baseCell.setCheckPressed(!disableSelection, disableSelection && selected); if (view instanceof ChatAudioCell && MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_AUDIO)) { - ((ChatAudioCell)view).downloadAudioIfNeed(); + ((ChatAudioCell) view).downloadAudioIfNeed(); } baseCell.setHighlighted(highlightMessageId != Integer.MAX_VALUE && message.getId() == highlightMessageId); } else if (view instanceof ChatActionCell) { - ChatActionCell actionCell = (ChatActionCell)view; + ChatActionCell actionCell = (ChatActionCell) view; actionCell.setMessageObject(message); } if (type == 6) { - TextView messageTextView = (TextView)view.findViewById(R.id.chat_message_text); + TextView messageTextView = (TextView) view.findViewById(R.id.chat_message_text); messageTextView.setText(LocaleController.formatPluralString("NewMessages", unread_to_load)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java index a7472c6fa..1fa82ddd5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java @@ -35,6 +35,7 @@ import java.io.File; import java.util.ArrayList; public class AvatarUpdater implements NotificationCenter.NotificationCenterDelegate, PhotoCropActivity.PhotoEditActivityDelegate { + public String currentPicturePath; private TLRPC.PhotoSize smallPhoto; private TLRPC.PhotoSize bigPhoto; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java index ad0478dec..e625402ef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java @@ -20,10 +20,9 @@ import org.telegram.android.ImageReceiver; import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; - public class BackupImageView extends View { - public ImageReceiver imageReceiver; - public boolean processDetach = true; + + private ImageReceiver imageReceiver; public BackupImageView(Context context) { super(context); @@ -91,12 +90,22 @@ public class BackupImageView extends View { imageReceiver.setImageBitmap(drawable); } + public void setRoundRadius(int value) { + imageReceiver.setRoundRadius(value); + } + + public void setAspectFit(boolean value) { + imageReceiver.setAspectFit(value); + } + + public ImageReceiver getImageReceiver() { + return imageReceiver; + } + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (processDetach) { - imageReceiver.clearImage(); - } + imageReceiver.clearImage(); } @Override 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 f4e5a15f1..de1b773b6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -61,7 +61,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat public interface ChatActivityEnterViewDelegate { void onMessageSend(String message); void needSendTyping(); - void onTextChanged(CharSequence text); + void onTextChanged(CharSequence text, boolean bigChange); void onAttachButtonHidden(); void onAttachButtonShow(); void onWindowSizeChanged(int size); @@ -104,11 +104,15 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat private long dialog_id; private boolean ignoreTextChange; private MessageObject replyingMessageObject; + private TLRPC.WebPage messageWebPage; + private boolean messageWebPageSearch; private ChatActivityEnterViewDelegate delegate; private float topViewAnimation; + private boolean topViewShowed; private boolean needShowTopView; private boolean allowShowTopView; + private AnimatorSetProxy currentTopViewAnimation; public ChatActivityEnterView(Activity context, SizeNotifierRelativeLayout parent, BaseFragment fragment, boolean isChat) { super(context); @@ -234,12 +238,15 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + public void onTextChanged(CharSequence charSequence, int start, int before, int count) { String message = getTrimmedString(charSequence.toString()); checkSendButton(true); if (delegate != null) { - delegate.onTextChanged(charSequence); + if (before > count || count > 1) { + messageWebPageSearch = true; + } + delegate.onTextChanged(charSequence, before > count || count > 1); } if (message.length() != 0 && lastTypingTimeSend < System.currentTimeMillis() - 5000 && !ignoreTextChange) { @@ -499,6 +506,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } public void setTopViewAnimation(float progress) { + topViewAnimation = progress; LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); layoutParams2.topMargin = AndroidUtilities.dp(2) + (int) (topView.getLayoutParams().height * progress); textFieldContainer.setLayoutParams(layoutParams2); @@ -514,75 +522,85 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } public void showTopView(boolean animated) { - if (topView == null) { + if (topView == null || topViewShowed) { return; } needShowTopView = true; + topViewShowed = true; if (allowShowTopView) { topView.setVisibility(VISIBLE); + float resumeValue = 0.0f; + if (currentTopViewAnimation != null) { + resumeValue = topViewAnimation; + currentTopViewAnimation.cancel(); + currentTopViewAnimation = null; + } if (animated) { if (keyboardVisible || emojiPopup != null && emojiPopup.isShowing()) { - AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); - animatorSetProxy.playTogether( - ObjectAnimatorProxy.ofFloat(ChatActivityEnterView.this, "topViewAnimation", 0.0f, 1.0f) + currentTopViewAnimation = new AnimatorSetProxy(); + currentTopViewAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(ChatActivityEnterView.this, "topViewAnimation", 1.0f) ); - animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + currentTopViewAnimation.addListener(new AnimatorListenerAdapterProxy() { @Override public void onAnimationEnd(Object animation) { - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; - textFieldContainer.setLayoutParams(layoutParams2); - if (!forceShowSendButton) { - openKeyboard(); + if (animation == currentTopViewAnimation) { + setTopViewAnimation(1.0f); + if (!forceShowSendButton) { + openKeyboard(); + } + currentTopViewAnimation = null; } } }); - animatorSetProxy.setDuration(200); - animatorSetProxy.start(); + currentTopViewAnimation.setDuration(200); + currentTopViewAnimation.start(); } else { - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; - textFieldContainer.setLayoutParams(layoutParams2); + setTopViewAnimation(1.0f); if (!forceShowSendButton) { openKeyboard(); } } } else { - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; - textFieldContainer.setLayoutParams(layoutParams2); + setTopViewAnimation(1.0f); } } } - public void hideTopView(boolean animated) { - if (topView == null) { + public void hideTopView(final boolean animated) { + if (topView == null || !topViewShowed) { return; } + topViewShowed = false; needShowTopView = false; if (allowShowTopView) { + float resumeValue = 1.0f; + if (currentTopViewAnimation != null) { + resumeValue = topViewAnimation; + currentTopViewAnimation.cancel(); + currentTopViewAnimation = null; + } if (animated) { - AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); - animatorSetProxy.playTogether( - ObjectAnimatorProxy.ofFloat(ChatActivityEnterView.this, "topViewAnimation", 1.0f, 0.0f) + currentTopViewAnimation = new AnimatorSetProxy(); + currentTopViewAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(ChatActivityEnterView.this, "topViewAnimation", resumeValue, 0.0f) ); - animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + currentTopViewAnimation.addListener(new AnimatorListenerAdapterProxy() { @Override public void onAnimationEnd(Object animation) { - topView.setVisibility(GONE); - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2); - textFieldContainer.setLayoutParams(layoutParams2); + if (animation == currentTopViewAnimation) { + topView.setVisibility(GONE); + setTopViewAnimation(0.0f); + currentTopViewAnimation = null; + } } }); - animatorSetProxy.setDuration(200); - animatorSetProxy.start(); + currentTopViewAnimation.setDuration(200); + currentTopViewAnimation.start(); } else { topView.setVisibility(GONE); - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2); - textFieldContainer.setLayoutParams(layoutParams2); + setTopViewAnimation(0.0f); } } } @@ -601,9 +619,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat allowShowTopView = false; if (needShowTopView) { topView.setVisibility(View.GONE); - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2); - textFieldContainer.setLayoutParams(layoutParams2); + setTopViewAnimation(0.0f); } } } else { @@ -611,9 +627,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat allowShowTopView = true; if (needShowTopView) { topView.setVisibility(View.VISIBLE); - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; - textFieldContainer.setLayoutParams(layoutParams2); + setTopViewAnimation(1.0f); } } } @@ -651,6 +665,11 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat replyingMessageObject = messageObject; } + public void setWebPage(TLRPC.WebPage webPage, boolean searchWebPages) { + messageWebPage = webPage; + messageWebPageSearch = searchWebPages; + } + private void sendMessage() { if (parentFragment != null) { String action = null; @@ -689,7 +708,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat int count = (int) Math.ceil(text.length() / 4096.0f); for (int a = 0; a < count; a++) { String mess = text.substring(a * 4096, Math.min((a + 1) * 4096, text.length())); - SendMessagesHelper.getInstance().sendMessage(mess, dialog_id, replyingMessageObject); + SendMessagesHelper.getInstance().sendMessage(mess, dialog_id, replyingMessageObject, messageWebPage, messageWebPageSearch); } return true; } @@ -1107,7 +1126,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat messageEditText.setSelection(messageEditText.getText().length()); ignoreTextChange = false; if (delegate != null) { - delegate.onTextChanged(messageEditText.getText()); + delegate.onTextChanged(messageEditText.getText(), true); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java index 6d6709781..3c17e47ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java @@ -22,6 +22,7 @@ import org.telegram.messenger.FileLog; import org.telegram.ui.AnimationCompat.ViewProxy; public class ClippingImageView extends View { + private int clipBottom; private int clipLeft; private int clipRight; @@ -79,7 +80,7 @@ public class ClippingImageView extends View { } public void onDraw(Canvas canvas) { - if (getVisibility() == GONE || getVisibility() == INVISIBLE) { + if (getVisibility() != VISIBLE) { return; } if (bmp != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java index 28bdc149a..2f2706d4d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -31,7 +31,8 @@ import org.telegram.messenger.R; import java.util.ArrayList; public class EmojiView extends LinearLayout { - private ArrayList adapters = new ArrayList(); + + private ArrayList adapters = new ArrayList<>(); private int[] icons = { R.drawable.ic_emoji_recent, R.drawable.ic_emoji_smile, @@ -42,7 +43,7 @@ public class EmojiView extends LinearLayout { private Listener listener; private ViewPager pager; private FrameLayout recentsWrap; - private ArrayList views = new ArrayList(); + private ArrayList views = new ArrayList<>(); public EmojiView(Context paramContext) { super(paramContext); @@ -63,7 +64,7 @@ public class EmojiView extends LinearLayout { if (this.pager.getCurrentItem() == 0) { return; } - ArrayList localArrayList = new ArrayList(); + ArrayList localArrayList = new ArrayList<>(); long[] currentRecent = Emoji.data[0]; boolean was = false; for (long aCurrentRecent : currentRecent) { @@ -161,7 +162,7 @@ public class EmojiView extends LinearLayout { } private void saveRecents() { - ArrayList localArrayList = new ArrayList(); + ArrayList localArrayList = new ArrayList<>(); long[] arrayOfLong = Emoji.data[0]; int i = arrayOfLong.length; for (int j = 0; ; j++) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FrameLayoutFixed.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FrameLayoutFixed.java index 1d30c5682..542623e9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FrameLayoutFixed.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FrameLayoutFixed.java @@ -19,7 +19,8 @@ import org.telegram.messenger.FileLog; import java.util.ArrayList; public class FrameLayoutFixed extends FrameLayout { - private final ArrayList mMatchParentChildren = new ArrayList(1); + + private final ArrayList mMatchParentChildren = new ArrayList<>(1); public FrameLayoutFixed(Context context) { super(context); @@ -110,7 +111,7 @@ public class FrameLayoutFixed extends FrameLayout { } setMeasuredDimension(resolveSizeAndStateFixed(maxWidth, widthMeasureSpec, childState), - resolveSizeAndStateFixed(maxHeight, heightMeasureSpec, childState << MEASURED_HEIGHT_STATE_SHIFT)); + resolveSizeAndStateFixed(maxHeight, heightMeasureSpec, childState << 16)); count = mMatchParentChildren.size(); if (count > 1) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ProgressView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ProgressView.java index adaa786e2..b6f2561b6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ProgressView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ProgressView.java @@ -14,6 +14,7 @@ import android.graphics.Paint; import org.telegram.android.AndroidUtilities; public class ProgressView { + private Paint innerPaint; private Paint outerPaint; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java index d0d4187e2..54ec83b9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java @@ -33,14 +33,17 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { public SizeNotifierRelativeLayout(Context context) { super(context); + setWillNotDraw(false); } public SizeNotifierRelativeLayout(android.content.Context context, android.util.AttributeSet attrs) { super(context, attrs); + setWillNotDraw(false); } public SizeNotifierRelativeLayout(android.content.Context context, android.util.AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + setWillNotDraw(false); } public void setBackgroundImage(int resourceId) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideView.java index 6464ce5f9..a1ae84c65 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideView.java @@ -49,4 +49,8 @@ public class SlideView extends LinearLayout { public void restoreStateParams(Bundle bundle) { } + + public boolean needBackButton() { + return false; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StaticLayoutEx.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StaticLayoutEx.java new file mode 100644 index 000000000..4700a15e6 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StaticLayoutEx.java @@ -0,0 +1,119 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui.Components; + +import android.os.Build; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextDirectionHeuristic; +import android.text.TextDirectionHeuristics; +import android.text.TextPaint; +import android.text.TextUtils; + +import org.telegram.messenger.FileLog; + +import java.lang.reflect.Constructor; + +public class StaticLayoutEx { + + private static final String TEXT_DIR_CLASS = "android.text.TextDirectionHeuristic"; + private static final String TEXT_DIRS_CLASS = "android.text.TextDirectionHeuristics"; + private static final String TEXT_DIR_FIRSTSTRONG_LTR = "FIRSTSTRONG_LTR"; + private static boolean initialized; + + private static Constructor sConstructor; + private static Object[] sConstructorArgs; + private static Object sTextDirection; + + public static void init() { + if (initialized) { + return; + } + + try { + final Class textDirClass; + if (Build.VERSION.SDK_INT >= 18) { + textDirClass = TextDirectionHeuristic.class; + sTextDirection = TextDirectionHeuristics.FIRSTSTRONG_LTR; + } else { + ClassLoader loader = StaticLayoutEx.class.getClassLoader(); + textDirClass = loader.loadClass(TEXT_DIR_CLASS); + Class textDirsClass = loader.loadClass(TEXT_DIRS_CLASS); + sTextDirection = textDirsClass.getField(TEXT_DIR_FIRSTSTRONG_LTR).get(textDirsClass); + } + + final Class[] signature = new Class[]{ + CharSequence.class, + int.class, + int.class, + TextPaint.class, + int.class, + Layout.Alignment.class, + textDirClass, + float.class, + float.class, + boolean.class, + TextUtils.TruncateAt.class, + int.class, + int.class + }; + + sConstructor = StaticLayout.class.getDeclaredConstructor(signature); + sConstructor.setAccessible(true); + sConstructorArgs = new Object[signature.length]; + initialized = true; + } catch (Throwable e) { + FileLog.e("tmessages", e); + } + } + + public static StaticLayout createStaticLayout(CharSequence source, TextPaint paint, int width, Layout.Alignment align, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsisWidth, int maxLines) { + return createStaticLayout(source, 0, source.length(), paint, width, align, spacingmult, spacingadd, includepad, ellipsize, ellipsisWidth, maxLines); + } + + public static StaticLayout createStaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerWidth, Layout.Alignment align, float spacingMult, float spacingAdd, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsisWidth, int maxLines) { + if (Build.VERSION.SDK_INT >= 14) { + init(); + try { + sConstructorArgs[0] = source; + sConstructorArgs[1] = bufstart; + sConstructorArgs[2] = bufend; + sConstructorArgs[3] = paint; + sConstructorArgs[4] = outerWidth; + sConstructorArgs[5] = align; + sConstructorArgs[6] = sTextDirection; + sConstructorArgs[7] = spacingMult; + sConstructorArgs[8] = spacingAdd; + sConstructorArgs[9] = includePad; + sConstructorArgs[10] = ellipsize; + sConstructorArgs[11] = ellipsisWidth; + sConstructorArgs[12] = maxLines; + return sConstructor.newInstance(sConstructorArgs); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + try { + if (maxLines == 1) { + return new StaticLayout(source, bufstart, bufend, paint, outerWidth, align, spacingMult, spacingAdd, includePad, ellipsize, ellipsisWidth); + } else { + StaticLayout layout = new StaticLayout(source, paint, outerWidth, align, spacingMult, spacingAdd, includePad); + if (layout.getLineCount() <= maxLines) { + return layout; + } else { + int off = layout.getOffsetForHorizontal(maxLines - 1, layout.getLineWidth(maxLines - 1)); + return new StaticLayout(source.subSequence(0, off), paint, outerWidth, align, spacingMult, spacingAdd, includePad); + } + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return null; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java index 74da7e49f..d562cc6bb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java @@ -29,6 +29,7 @@ import java.util.ArrayList; @TargetApi(10) public class VideoTimelineView extends View { + private long videoLength = 0; private float progressLeft = 0; private float progressRight = 1; @@ -39,7 +40,7 @@ public class VideoTimelineView extends View { private float pressDx = 0; private MediaMetadataRetriever mediaMetadataRetriever = null; private VideoTimelineViewDelegate delegate = null; - private ArrayList frames = new ArrayList(); + private ArrayList frames = new ArrayList<>(); private AsyncTask currentTask = null; private static final Object sync = new Object(); private long frameTimeOffset = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java index 288690a30..cf56dd75b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import android.app.Activity; +import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.InputType; @@ -19,7 +20,6 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.FrameLayout; @@ -74,198 +74,186 @@ public class ContactAddActivity extends BaseFragment implements NotificationCent @Override public void onFragmentDestroy() { super.onFragmentDestroy(); - if (avatarImage != null) { - avatarImage.setImageDrawable(null); - } NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces); } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - if (addContact) { - actionBar.setTitle(LocaleController.getString("AddContactTitle", R.string.AddContactTitle)); - } else { - actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); - } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (addContact) { + actionBar.setTitle(LocaleController.getString("AddContactTitle", R.string.AddContactTitle)); + } else { + actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); + } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (firstNameField.getText().length() != 0) { + TLRPC.User user = MessagesController.getInstance().getUser(user_id); + user.first_name = firstNameField.getText().toString(); + user.last_name = lastNameField.getText().toString(); + ContactsController.getInstance().addContact(user); finishFragment(); - } else if (id == done_button) { - if (firstNameField.getText().length() != 0) { - TLRPC.User user = MessagesController.getInstance().getUser(user_id); - user.first_name = firstNameField.getText().toString(); - user.last_name = lastNameField.getText().toString(); - ContactsController.getInstance().addContact(user); - finishFragment(); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, MessagesController.UPDATE_MASK_NAME); - } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, MessagesController.UPDATE_MASK_NAME); } } - }); + } + }); - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + ActionBarMenu menu = actionBar.createMenu(); + doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - fragmentView = new ScrollView(getParentActivity()); + fragmentView = new ScrollView(context); - LinearLayout linearLayout = new LinearLayout(getParentActivity()); - linearLayout.setOrientation(LinearLayout.VERTICAL); - ((ScrollView) fragmentView).addView(linearLayout); - ScrollView.LayoutParams layoutParams2 = (ScrollView.LayoutParams) linearLayout.getLayoutParams(); - layoutParams2.width = ScrollView.LayoutParams.MATCH_PARENT; - layoutParams2.height = ScrollView.LayoutParams.WRAP_CONTENT; - linearLayout.setLayoutParams(layoutParams2); - linearLayout.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + ((ScrollView) fragmentView).addView(linearLayout); + ScrollView.LayoutParams layoutParams2 = (ScrollView.LayoutParams) linearLayout.getLayoutParams(); + layoutParams2.width = ScrollView.LayoutParams.MATCH_PARENT; + layoutParams2.height = ScrollView.LayoutParams.WRAP_CONTENT; + linearLayout.setLayoutParams(layoutParams2); + linearLayout.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + FrameLayout frameLayout = new FrameLayout(context); + linearLayout.addView(frameLayout); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(24); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + frameLayout.setLayoutParams(layoutParams); + + avatarImage = new BackupImageView(context); + avatarImage.setRoundRadius(AndroidUtilities.dp(30)); + frameLayout.addView(avatarImage); + FrameLayout.LayoutParams layoutParams3 = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); + layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + layoutParams3.width = AndroidUtilities.dp(60); + layoutParams3.height = AndroidUtilities.dp(60); + avatarImage.setLayoutParams(layoutParams3); + + nameTextView = new TextView(context); + nameTextView.setTextColor(0xff212121); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + nameTextView.setLines(1); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setEllipsize(TextUtils.TruncateAt.END); + nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + frameLayout.addView(nameTextView); + layoutParams3 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 80); + layoutParams3.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 80 : 0); + layoutParams3.topMargin = AndroidUtilities.dp(3); + layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + nameTextView.setLayoutParams(layoutParams3); + + onlineTextView = new TextView(context); + onlineTextView.setTextColor(0xff999999); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + onlineTextView.setLines(1); + onlineTextView.setMaxLines(1); + onlineTextView.setSingleLine(true); + onlineTextView.setEllipsize(TextUtils.TruncateAt.END); + onlineTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + frameLayout.addView(onlineTextView); + layoutParams3 = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); + layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 80); + layoutParams3.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 80 : 0); + layoutParams3.topMargin = AndroidUtilities.dp(32); + layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + onlineTextView.setLayoutParams(layoutParams3); + + firstNameField = new EditText(context); + firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + firstNameField.setHintTextColor(0xff979797); + firstNameField.setTextColor(0xff212121); + firstNameField.setMaxLines(1); + firstNameField.setLines(1); + firstNameField.setSingleLine(true); + firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + firstNameField.setImeOptions(EditorInfo.IME_ACTION_NEXT); + firstNameField.setHint(LocaleController.getString("FirstName", R.string.FirstName)); + AndroidUtilities.clearCursorDrawable(firstNameField); + linearLayout.addView(firstNameField); + layoutParams = (LinearLayout.LayoutParams) firstNameField.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(24); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + firstNameField.setLayoutParams(layoutParams); + firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT) { + lastNameField.requestFocus(); + lastNameField.setSelection(lastNameField.length()); return true; } - }); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - linearLayout.addView(frameLayout); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(24); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - frameLayout.setLayoutParams(layoutParams); - - avatarImage = new BackupImageView(getParentActivity()); - avatarImage.imageReceiver.setRoundRadius(AndroidUtilities.dp(30)); - avatarImage.processDetach = false; - frameLayout.addView(avatarImage); - FrameLayout.LayoutParams layoutParams3 = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); - layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; - layoutParams3.width = AndroidUtilities.dp(60); - layoutParams3.height = AndroidUtilities.dp(60); - avatarImage.setLayoutParams(layoutParams3); - - nameTextView = new TextView(getParentActivity()); - nameTextView.setTextColor(0xff212121); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - nameTextView.setLines(1); - nameTextView.setMaxLines(1); - nameTextView.setSingleLine(true); - nameTextView.setEllipsize(TextUtils.TruncateAt.END); - nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - frameLayout.addView(nameTextView); - layoutParams3 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); - layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 80); - layoutParams3.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 80 : 0); - layoutParams3.topMargin = AndroidUtilities.dp(3); - layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; - nameTextView.setLayoutParams(layoutParams3); - - onlineTextView = new TextView(getParentActivity()); - onlineTextView.setTextColor(0xff999999); - onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - onlineTextView.setLines(1); - onlineTextView.setMaxLines(1); - onlineTextView.setSingleLine(true); - onlineTextView.setEllipsize(TextUtils.TruncateAt.END); - onlineTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - frameLayout.addView(onlineTextView); - layoutParams3 = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); - layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams3.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 80); - layoutParams3.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 80 : 0); - layoutParams3.topMargin = AndroidUtilities.dp(32); - layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; - onlineTextView.setLayoutParams(layoutParams3); - - firstNameField = new EditText(getParentActivity()); - firstNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - firstNameField.setHintTextColor(0xff979797); - firstNameField.setTextColor(0xff212121); - firstNameField.setMaxLines(1); - firstNameField.setLines(1); - firstNameField.setSingleLine(true); - firstNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - firstNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - firstNameField.setImeOptions(EditorInfo.IME_ACTION_NEXT); - firstNameField.setHint(LocaleController.getString("FirstName", R.string.FirstName)); - AndroidUtilities.clearCursorDrawable(firstNameField); - linearLayout.addView(firstNameField); - layoutParams = (LinearLayout.LayoutParams) firstNameField.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(24); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - firstNameField.setLayoutParams(layoutParams); - firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_NEXT) { - lastNameField.requestFocus(); - lastNameField.setSelection(lastNameField.length()); - return true; - } - return false; - } - }); - - lastNameField = new EditText(getParentActivity()); - lastNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - lastNameField.setHintTextColor(0xff979797); - lastNameField.setTextColor(0xff212121); - lastNameField.setMaxLines(1); - lastNameField.setLines(1); - lastNameField.setSingleLine(true); - lastNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - lastNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - lastNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); - lastNameField.setHint(LocaleController.getString("LastName", R.string.LastName)); - AndroidUtilities.clearCursorDrawable(lastNameField); - linearLayout.addView(lastNameField); - layoutParams = (LinearLayout.LayoutParams) lastNameField.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(16); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - lastNameField.setLayoutParams(layoutParams); - lastNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_DONE) { - doneButton.performClick(); - return true; - } - return false; - } - }); - - TLRPC.User user = MessagesController.getInstance().getUser(user_id); - if (user != null) { - if (user.phone == null) { - if (phone != null) { - user.phone = PhoneFormat.stripExceptNumbers(phone); - } - } - firstNameField.setText(user.first_name); - firstNameField.setSelection(firstNameField.length()); - lastNameField.setText(user.last_name); + return false; } + }); - updateAvatarLayout(); - } else { - ViewGroup parent = (ViewGroup) fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + lastNameField = new EditText(context); + lastNameField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + lastNameField.setHintTextColor(0xff979797); + lastNameField.setTextColor(0xff212121); + lastNameField.setMaxLines(1); + lastNameField.setLines(1); + lastNameField.setSingleLine(true); + lastNameField.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + lastNameField.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + lastNameField.setImeOptions(EditorInfo.IME_ACTION_DONE); + lastNameField.setHint(LocaleController.getString("LastName", R.string.LastName)); + AndroidUtilities.clearCursorDrawable(lastNameField); + linearLayout.addView(lastNameField); + layoutParams = (LinearLayout.LayoutParams) lastNameField.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(16); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(24); + layoutParams.rightMargin = AndroidUtilities.dp(24); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + lastNameField.setLayoutParams(layoutParams); + lastNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_DONE) { + doneButton.performClick(); + return true; + } + return false; } + }); + + TLRPC.User user = MessagesController.getInstance().getUser(user_id); + if (user != null) { + if (user.phone == null) { + if (phone != null) { + user.phone = PhoneFormat.stripExceptNumbers(phone); + } + } + firstNameField.setText(user.first_name); + firstNameField.setSelection(firstNameField.length()); + lastNameField.setText(user.last_name); } + return fragmentView; } @@ -299,6 +287,7 @@ public class ContactAddActivity extends BaseFragment implements NotificationCent @Override public void onResume() { super.onResume(); + updateAvatarLayout(); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); boolean animations = preferences.getBoolean("view_animations", true); if (!animations) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index 559766f5b..39b4310bc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; @@ -116,286 +117,281 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - searching = false; - searchWas = false; + public View createView(Context context, LayoutInflater inflater) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - if (destroyAfterSelect) { - if (returnAsResult) { - actionBar.setTitle(LocaleController.getString("SelectContact", R.string.SelectContact)); - } else { - if (createSecretChat) { - actionBar.setTitle(LocaleController.getString("NewSecretChat", R.string.NewSecretChat)); - } else { - actionBar.setTitle(LocaleController.getString("NewMessageTitle", R.string.NewMessageTitle)); - } - } + searching = false; + searchWas = false; + + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (destroyAfterSelect) { + if (returnAsResult) { + actionBar.setTitle(LocaleController.getString("SelectContact", R.string.SelectContact)); } else { - actionBar.setTitle(LocaleController.getString("Contacts", R.string.Contacts)); + if (createSecretChat) { + actionBar.setTitle(LocaleController.getString("NewSecretChat", R.string.NewSecretChat)); + } else { + actionBar.setTitle(LocaleController.getString("NewMessageTitle", R.string.NewMessageTitle)); + } + } + } else { + actionBar.setTitle(LocaleController.getString("Contacts", R.string.Contacts)); + } + + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + ActionBarMenu menu = actionBar.createMenu(); + ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { + searching = true; } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); + @Override + public boolean onSearchCollapse() { + searchListViewAdapter.searchDialogs(null); + searching = false; + searchWas = false; + listView.setAdapter(listViewAdapter); + listViewAdapter.notifyDataSetChanged(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + } + listView.setFastScrollEnabled(true); + listView.setVerticalScrollBarEnabled(false); + emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); + return true; + } + + @Override + public void onTextChanged(EditText editText) { + if (searchListViewAdapter == null) { + return; + } + String text = editText.getText().toString(); + if (text.length() != 0) { + searchWas = true; + if (listView != null) { + listView.setAdapter(searchListViewAdapter); + searchListViewAdapter.notifyDataSetChanged(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(false); + } + listView.setFastScrollEnabled(false); + listView.setVerticalScrollBarEnabled(true); + } + if (emptyTextView != null) { + emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); } } - }); + searchListViewAdapter.searchDialogs(text); + } + }); + item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - ActionBarMenu menu = actionBar.createMenu(); - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - searching = true; - } + searchListViewAdapter = new SearchAdapter(context, ignoreUsers, allowUsernameSearch); + listViewAdapter = new ContactsAdapter(context, onlyUsers, needPhonebook, ignoreUsers); - @Override - public boolean onSearchCollapse() { - searchListViewAdapter.searchDialogs(null); - searching = false; - searchWas = false; - listView.setAdapter(listViewAdapter); - listViewAdapter.notifyDataSetChanged(); - if (android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - } - listView.setFastScrollEnabled(true); - listView.setVerticalScrollBarEnabled(false); - emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); - return true; - } + fragmentView = new FrameLayout(context); - @Override - public void onTextChanged(EditText editText) { - if (searchListViewAdapter == null) { + LinearLayout emptyTextLayout = new LinearLayout(context); + emptyTextLayout.setVisibility(View.INVISIBLE); + emptyTextLayout.setOrientation(LinearLayout.VERTICAL); + ((FrameLayout) fragmentView).addView(emptyTextLayout); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextLayout.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + emptyTextLayout.setLayoutParams(layoutParams); + emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff808080); + emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); + emptyTextLayout.addView(emptyTextView); + LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.weight = 0.5f; + emptyTextView.setLayoutParams(layoutParams1); + + FrameLayout frameLayout = new FrameLayout(context); + emptyTextLayout.addView(frameLayout); + layoutParams1 = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.weight = 0.5f; + frameLayout.setLayoutParams(layoutParams1); + + listView = new LetterSectionsListView(context); + listView.setEmptyView(emptyTextLayout); + listView.setVerticalScrollBarEnabled(false); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setFastScrollEnabled(true); + listView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); + listView.setAdapter(listViewAdapter); + if (Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); + } + ((FrameLayout) fragmentView).addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (searching && searchWas) { + TLRPC.User user = searchListViewAdapter.getItem(i); + if (user == null) { return; } - String text = editText.getText().toString(); - if (text.length() != 0) { - searchWas = true; - if (listView != null) { - listView.setAdapter(searchListViewAdapter); - searchListViewAdapter.notifyDataSetChanged(); - if(android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(false); - } - listView.setFastScrollEnabled(false); - listView.setVerticalScrollBarEnabled(true); - } - if (emptyTextView != null) { - emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); - } + if (searchListViewAdapter.isGlobalSearch(i)) { + ArrayList users = new ArrayList<>(); + users.add(user); + MessagesController.getInstance().putUsers(users, false); + MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); } - searchListViewAdapter.searchDialogs(text); - } - }); - item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - - searchListViewAdapter = new SearchAdapter(getParentActivity(), ignoreUsers, allowUsernameSearch); - listViewAdapter = new ContactsAdapter(getParentActivity(), onlyUsers, needPhonebook, ignoreUsers); - - fragmentView = new FrameLayout(getParentActivity()); - - LinearLayout emptyTextLayout = new LinearLayout(getParentActivity()); - emptyTextLayout.setVisibility(View.INVISIBLE); - emptyTextLayout.setOrientation(LinearLayout.VERTICAL); - ((FrameLayout) fragmentView).addView(emptyTextLayout); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextLayout.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - emptyTextLayout.setLayoutParams(layoutParams); - emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); - emptyTextLayout.addView(emptyTextView); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.weight = 0.5f; - emptyTextView.setLayoutParams(layoutParams1); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - emptyTextLayout.addView(frameLayout); - layoutParams1 = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.weight = 0.5f; - frameLayout.setLayoutParams(layoutParams1); - - listView = new LetterSectionsListView(getParentActivity()); - listView.setEmptyView(emptyTextLayout); - listView.setVerticalScrollBarEnabled(false); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setFastScrollEnabled(true); - listView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); - listView.setAdapter(listViewAdapter); - if (Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - ((FrameLayout) fragmentView).addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (searching && searchWas) { - TLRPC.User user = searchListViewAdapter.getItem(i); - if (user == null) { + if (returnAsResult) { + if (ignoreUsers != null && ignoreUsers.containsKey(user.id)) { return; } - if (searchListViewAdapter.isGlobalSearch(i)) { - ArrayList users = new ArrayList<>(); - users.add(user); - MessagesController.getInstance().putUsers(users, false); - MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); - } - if (returnAsResult) { - if (ignoreUsers != null && ignoreUsers.containsKey(user.id)) { - return; - } - didSelectResult(user, true, null); + didSelectResult(user, true, null); + } else { + if (createSecretChat) { + creatingChat = true; + SecretChatHelper.getInstance().startSecretChat(getParentActivity(), user); } else { - if (createSecretChat) { - creatingChat = true; - SecretChatHelper.getInstance().startSecretChat(getParentActivity(), user); - } else { + Bundle args = new Bundle(); + args.putInt("user_id", user.id); + presentFragment(new ChatActivity(args), true); + } + } + } else { + int section = listViewAdapter.getSectionForPosition(i); + int row = listViewAdapter.getPositionInSectionForPosition(i); + if (row < 0 || section < 0) { + return; + } + if (!onlyUsers && section == 0) { + if (needPhonebook) { + if (row == 0) { + try { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText()); + getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteFriends", R.string.InviteFriends)), 500); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } else { + if (row == 0) { + if (!MessagesController.isFeatureEnabled("chat_create", ContactsActivity.this)) { + return; + } + presentFragment(new GroupCreateActivity(), false); + } else if (row == 1) { Bundle args = new Bundle(); - args.putInt("user_id", user.id); - presentFragment(new ChatActivity(args), true); + args.putBoolean("onlyUsers", true); + args.putBoolean("destroyAfterSelect", true); + args.putBoolean("createSecretChat", true); + presentFragment(new ContactsActivity(args), false); + } else if (row == 2) { + if (!MessagesController.isFeatureEnabled("broadcast_create", ContactsActivity.this)) { + return; + } + Bundle args = new Bundle(); + args.putBoolean("broadcast", true); + presentFragment(new GroupCreateActivity(args), false); } } } else { - int section = listViewAdapter.getSectionForPosition(i); - int row = listViewAdapter.getPositionInSectionForPosition(i); - if (row < 0 || section < 0) { - return; - } - if (!onlyUsers && section == 0) { - if (needPhonebook) { - if (row == 0) { + Object item = listViewAdapter.getItem(section, row); + + if (item instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) item; + if (returnAsResult) { + if (ignoreUsers != null && ignoreUsers.containsKey(user.id)) { + return; + } + didSelectResult(user, true, null); + } else { + if (createSecretChat) { + creatingChat = true; + SecretChatHelper.getInstance().startSecretChat(getParentActivity(), user); + } else { + Bundle args = new Bundle(); + args.putInt("user_id", user.id); + presentFragment(new ChatActivity(args), true); + } + } + } else if (item instanceof ContactsController.Contact) { + ContactsController.Contact contact = (ContactsController.Contact) item; + String usePhone = null; + if (!contact.phones.isEmpty()) { + usePhone = contact.phones.get(0); + } + if (usePhone == null || getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("InviteUser", R.string.InviteUser)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + final String arg1 = usePhone; + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { try { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText()); - getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteFriends", R.string.InviteFriends)), 500); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", arg1, null)); + intent.putExtra("sms_body", LocaleController.getString("InviteText", R.string.InviteText)); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } } - } else { - if (row == 0) { - if (!MessagesController.isFeatureEnabled("chat_create", ContactsActivity.this)) { - return; - } - presentFragment(new GroupCreateActivity(), false); - } else if (row == 1) { - Bundle args = new Bundle(); - args.putBoolean("onlyUsers", true); - args.putBoolean("destroyAfterSelect", true); - args.putBoolean("createSecretChat", true); - presentFragment(new ContactsActivity(args), false); - } else if (row == 2) { - if (!MessagesController.isFeatureEnabled("broadcast_create", ContactsActivity.this)) { - return; - } - Bundle args = new Bundle(); - args.putBoolean("broadcast", true); - presentFragment(new GroupCreateActivity(args), false); - } - } - } else { - Object item = listViewAdapter.getItem(section, row); - - if (item instanceof TLRPC.User) { - TLRPC.User user = (TLRPC.User) item; - if (returnAsResult) { - if (ignoreUsers != null && ignoreUsers.containsKey(user.id)) { - return; - } - didSelectResult(user, true, null); - } else { - if (createSecretChat) { - creatingChat = true; - SecretChatHelper.getInstance().startSecretChat(getParentActivity(), user); - } else { - Bundle args = new Bundle(); - args.putInt("user_id", user.id); - presentFragment(new ChatActivity(args), true); - } - } - } else if (item instanceof ContactsController.Contact) { - ContactsController.Contact contact = (ContactsController.Contact) item; - String usePhone = null; - if (!contact.phones.isEmpty()) { - usePhone = contact.phones.get(0); - } - if (usePhone == null || getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("InviteUser", R.string.InviteUser)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - final String arg1 = usePhone; - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - try { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", arg1, null)); - intent.putExtra("sms_body", LocaleController.getString("InviteText", R.string.InviteText)); - getParentActivity().startActivityForResult(intent, 500); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); } } } - }); - - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); - } - } - - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (absListView.isFastScrollEnabled()) { - AndroidUtilities.clearDrawableAnimation(absListView); - } - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (absListView.isFastScrollEnabled()) { + AndroidUtilities.clearDrawableAnimation(absListView); + } + } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java index 414f93456..2eb56da69 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java @@ -8,12 +8,12 @@ package org.telegram.ui; +import android.content.Context; import android.os.Build; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.EditText; @@ -61,174 +61,168 @@ public class CountrySelectActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } - } - }); - - ActionBarMenu menu = actionBar.createMenu(); - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - searching = true; - } - - @Override - public boolean onSearchCollapse() { - searchListViewAdapter.search(null); - searching = false; - searchWas = false; - listView.setAdapter(listViewAdapter); - if (android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - } - listView.setFastScrollEnabled(true); - listView.setVerticalScrollBarEnabled(false); - - emptyTextView.setText(LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); - - return true; - } - - @Override - public void onTextChanged(EditText editText) { - String text = editText.getText().toString(); - searchListViewAdapter.search(text); - if (text.length() != 0) { - searchWas = true; - if (listView != null) { - listView.setAdapter(searchListViewAdapter); - if(android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(false); - } - listView.setFastScrollEnabled(false); - listView.setVerticalScrollBarEnabled(true); - } - if (emptyTextView != null) { - - } - } - } - }); - item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - - searching = false; - searchWas = false; - - listViewAdapter = new CountryAdapter(getParentActivity()); - searchListViewAdapter = new CountrySearchAdapter(getParentActivity(), listViewAdapter.getCountries()); - - fragmentView = new FrameLayout(getParentActivity()); - - LinearLayout emptyTextLayout = new LinearLayout(getParentActivity()); - emptyTextLayout.setVisibility(View.INVISIBLE); - emptyTextLayout.setOrientation(LinearLayout.VERTICAL); - ((FrameLayout) fragmentView).addView(emptyTextLayout); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextLayout.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - emptyTextLayout.setLayoutParams(layoutParams); - emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(20); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); - emptyTextLayout.addView(emptyTextView); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.weight = 0.5f; - emptyTextView.setLayoutParams(layoutParams1); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - emptyTextLayout.addView(frameLayout); - layoutParams1 = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.weight = 0.5f; - frameLayout.setLayoutParams(layoutParams1); - - listView = new LetterSectionsListView(getParentActivity()); - listView.setEmptyView(emptyTextLayout); - listView.setVerticalScrollBarEnabled(false); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setFastScrollEnabled(true); - listView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); - listView.setAdapter(listViewAdapter); - if (Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - ((FrameLayout) fragmentView).addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - Country country = null; - if (searching && searchWas) { - country = searchListViewAdapter.getItem(i); - } else { - int section = listViewAdapter.getSectionForPosition(i); - int row = listViewAdapter.getPositionInSectionForPosition(i); - if (row < 0 || section < 0) { - return; - } - country = listViewAdapter.getItem(section, row); - } - if (i < 0) { - return; - } - if (country != null && delegate != null) { - delegate.didSelectCountry(country.name); - } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { finishFragment(); } - }); - - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); - } - } - - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (absListView.isFastScrollEnabled()) { - AndroidUtilities.clearDrawableAnimation(absListView); - } - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } + }); + + ActionBarMenu menu = actionBar.createMenu(); + ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { + searching = true; + } + + @Override + public boolean onSearchCollapse() { + searchListViewAdapter.search(null); + searching = false; + searchWas = false; + listView.setAdapter(listViewAdapter); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + } + listView.setFastScrollEnabled(true); + listView.setVerticalScrollBarEnabled(false); + + emptyTextView.setText(LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); + + return true; + } + + @Override + public void onTextChanged(EditText editText) { + String text = editText.getText().toString(); + searchListViewAdapter.search(text); + if (text.length() != 0) { + searchWas = true; + if (listView != null) { + listView.setAdapter(searchListViewAdapter); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(false); + } + listView.setFastScrollEnabled(false); + listView.setVerticalScrollBarEnabled(true); + } + if (emptyTextView != null) { + + } + } + } + }); + item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); + + searching = false; + searchWas = false; + + listViewAdapter = new CountryAdapter(context); + searchListViewAdapter = new CountrySearchAdapter(context, listViewAdapter.getCountries()); + + fragmentView = new FrameLayout(context); + + LinearLayout emptyTextLayout = new LinearLayout(context); + emptyTextLayout.setVisibility(View.INVISIBLE); + emptyTextLayout.setOrientation(LinearLayout.VERTICAL); + ((FrameLayout) fragmentView).addView(emptyTextLayout); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextLayout.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + emptyTextLayout.setLayoutParams(layoutParams); + emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff808080); + emptyTextView.setTextSize(20); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + emptyTextLayout.addView(emptyTextView); + LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.weight = 0.5f; + emptyTextView.setLayoutParams(layoutParams1); + + FrameLayout frameLayout = new FrameLayout(context); + emptyTextLayout.addView(frameLayout); + layoutParams1 = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.weight = 0.5f; + frameLayout.setLayoutParams(layoutParams1); + + listView = new LetterSectionsListView(context); + listView.setEmptyView(emptyTextLayout); + listView.setVerticalScrollBarEnabled(false); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setFastScrollEnabled(true); + listView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); + listView.setAdapter(listViewAdapter); + if (Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); } + ((FrameLayout) fragmentView).addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + Country country = null; + if (searching && searchWas) { + country = searchListViewAdapter.getItem(i); + } else { + int section = listViewAdapter.getSectionForPosition(i); + int row = listViewAdapter.getPositionInSectionForPosition(i); + if (row < 0 || section < 0) { + return; + } + country = listViewAdapter.getItem(section, row); + } + if (i < 0) { + return; + } + if (country != null && delegate != null) { + delegate.didSelectCountry(country.name); + } + finishFragment(); + } + }); + + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (absListView.isFastScrollEnabled()) { + AndroidUtilities.clearDrawableAnimation(absListView); + } + } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java index 1d7cc0920..1daa1499b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java @@ -125,7 +125,7 @@ public class DocumentSelectActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { + public View createView(Context context, LayoutInflater inflater) { if (!receiverRegistered) { receiverRegistered = true; IntentFilter filter = new IntentFilter(); @@ -142,217 +142,211 @@ public class DocumentSelectActivity extends BaseFragment { getParentActivity().registerReceiver(receiver, filter); } - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("SelectFile", R.string.SelectFile)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == -2) { - selectedFiles.clear(); - actionBar.hideActionMode(); - listView.invalidateViews(); - } else if (id == done) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("SelectFile", R.string.SelectFile)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == -2) { + selectedFiles.clear(); + actionBar.hideActionMode(); + listView.invalidateViews(); + } else if (id == done) { + if (delegate != null) { + ArrayList files = new ArrayList<>(); + files.addAll(selectedFiles.keySet()); + delegate.didSelectFiles(DocumentSelectActivity.this, files); + } + } + } + }); + selectedFiles.clear(); + actionModeViews.clear(); + + final ActionBarMenu actionMode = actionBar.createActionMode(); + actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + + selectedMessagesCountTextView = new TextView(actionMode.getContext()); + selectedMessagesCountTextView.setTextSize(18); + selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + selectedMessagesCountTextView.setTextColor(0xff737373); + selectedMessagesCountTextView.setSingleLine(true); + selectedMessagesCountTextView.setLines(1); + selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); + selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); + selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); + selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + actionMode.addView(selectedMessagesCountTextView); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) selectedMessagesCountTextView.getLayoutParams(); + layoutParams.weight = 1; + layoutParams.width = 0; + layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; + selectedMessagesCountTextView.setLayoutParams(layoutParams); + + actionModeViews.add(actionMode.addItem(done, R.drawable.ic_ab_done_gray, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + + fragmentView = inflater.inflate(R.layout.document_select_layout, null, false); + listAdapter = new ListAdapter(context); + emptyView = (TextView) fragmentView.findViewById(R.id.searchEmptyView); + emptyView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + listView = (ListView) fragmentView.findViewById(R.id.listView); + listView.setEmptyView(emptyView); + listView.setAdapter(listAdapter); + + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + scrolling = scrollState != SCROLL_STATE_IDLE; + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + + } + }); + + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int i, long id) { + if (actionBar.isActionModeShowed() || i < 0 || i >= items.size()) { + return false; + } + ListItem item = items.get(i); + File file = item.file; + if (file != null && !file.isDirectory()) { + if (!file.canRead()) { + showErrorBox(LocaleController.getString("AccessError", R.string.AccessError)); + return false; + } + if (sizeLimit != 0) { + if (file.length() > sizeLimit) { + showErrorBox(LocaleController.formatString("FileUploadLimit", R.string.FileUploadLimit, Utilities.formatFileSize(sizeLimit))); + return false; + } + } + if (file.length() == 0) { + return false; + } + selectedFiles.put(file.toString(), item); + selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); + if (Build.VERSION.SDK_INT >= 11) { + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + ArrayList animators = new ArrayList<>(); + for (int a = 0; a < actionModeViews.size(); a++) { + View view2 = actionModeViews.get(a); + AndroidUtilities.clearDrawableAnimation(view2); + if (a < 1) { + animators.add(ObjectAnimatorProxy.ofFloat(view2, "translationX", -AndroidUtilities.dp(56), 0)); + } else { + animators.add(ObjectAnimatorProxy.ofFloat(view2, "scaleY", 0.1f, 1.0f)); + } + } + animatorSet.playTogether(animators); + animatorSet.setDuration(250); + animatorSet.start(); + } + scrolling = false; + if (view instanceof SharedDocumentCell) { + ((SharedDocumentCell) view).setChecked(true, true); + } + actionBar.showActionMode(); + } + return true; + } + }); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (i < 0 || i >= items.size()) { + return; + } + ListItem item = items.get(i); + File file = item.file; + if (file == null) { + if (item.icon == R.drawable.ic_storage_gallery) { + if (delegate != null) { + delegate.startDocumentSelectActivity(); + } + finishFragment(false); + } else { + HistoryEntry he = history.remove(history.size() - 1); + actionBar.setTitle(he.title); + if (he.dir != null) { + listFiles(he.dir); + } else { + listRoots(); + } + listView.setSelectionFromTop(he.scrollItem, he.scrollOffset); + } + } else if (file.isDirectory()) { + HistoryEntry he = new HistoryEntry(); + he.scrollItem = listView.getFirstVisiblePosition(); + he.scrollOffset = listView.getChildAt(0).getTop(); + he.dir = currentDir; + he.title = actionBar.getTitle().toString(); + history.add(he); + if (!listFiles(file)) { + history.remove(he); + return; + } + actionBar.setTitle(item.title); + listView.setSelection(0); + } else { + if (!file.canRead()) { + showErrorBox(LocaleController.getString("AccessError", R.string.AccessError)); + return; + } + if (sizeLimit != 0) { + if (file.length() > sizeLimit) { + showErrorBox(LocaleController.formatString("FileUploadLimit", R.string.FileUploadLimit, Utilities.formatFileSize(sizeLimit))); + return; + } + } + if (file.length() == 0) { + return; + } + if (actionBar.isActionModeShowed()) { + if (selectedFiles.containsKey(file.toString())) { + selectedFiles.remove(file.toString()); + } else { + selectedFiles.put(file.toString(), item); + } + if (selectedFiles.isEmpty()) { + actionBar.hideActionMode(); + } else { + selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); + } + scrolling = false; + if (view instanceof SharedDocumentCell) { + ((SharedDocumentCell) view).setChecked(selectedFiles.containsKey(item.file.toString()), true); + } + } else { if (delegate != null) { ArrayList files = new ArrayList<>(); - files.addAll(selectedFiles.keySet()); + files.add(file.getAbsolutePath()); delegate.didSelectFiles(DocumentSelectActivity.this, files); } } } - }); - selectedFiles.clear(); - actionModeViews.clear(); - - final ActionBarMenu actionMode = actionBar.createActionMode(); - actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - - selectedMessagesCountTextView = new TextView(actionMode.getContext()); - selectedMessagesCountTextView.setTextSize(18); - selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - selectedMessagesCountTextView.setTextColor(0xff737373); - selectedMessagesCountTextView.setSingleLine(true); - selectedMessagesCountTextView.setLines(1); - selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); - selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); - selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); - selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - actionMode.addView(selectedMessagesCountTextView); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)selectedMessagesCountTextView.getLayoutParams(); - layoutParams.weight = 1; - layoutParams.width = 0; - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - selectedMessagesCountTextView.setLayoutParams(layoutParams); - - actionModeViews.add(actionMode.addItem(done, R.drawable.ic_ab_done_gray, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - - fragmentView = inflater.inflate(R.layout.document_select_layout, null, false); - listAdapter = new ListAdapter(getParentActivity()); - emptyView = (TextView)fragmentView.findViewById(R.id.searchEmptyView); - emptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - listView = (ListView)fragmentView.findViewById(R.id.listView); - listView.setEmptyView(emptyView); - listView.setAdapter(listAdapter); - - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - scrolling = scrollState != SCROLL_STATE_IDLE; - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - - } - }); - - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int i, long id) { - if (actionBar.isActionModeShowed() || i < 0 || i >= items.size()) { - return false; - } - ListItem item = items.get(i); - File file = item.file; - if (file != null && !file.isDirectory()) { - if (!file.canRead()) { - showErrorBox(LocaleController.getString("AccessError", R.string.AccessError)); - return false; - } - if (sizeLimit != 0) { - if (file.length() > sizeLimit) { - showErrorBox(LocaleController.formatString("FileUploadLimit", R.string.FileUploadLimit, Utilities.formatFileSize(sizeLimit))); - return false; - } - } - if (file.length() == 0) { - return false; - } - selectedFiles.put(file.toString(), item); - selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); - if (Build.VERSION.SDK_INT >= 11) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - ArrayList animators = new ArrayList<>(); - for (int a = 0; a < actionModeViews.size(); a++) { - View view2 = actionModeViews.get(a); - AndroidUtilities.clearDrawableAnimation(view2); - if (a < 1) { - animators.add(ObjectAnimatorProxy.ofFloat(view2, "translationX", -AndroidUtilities.dp(56), 0)); - } else { - animators.add(ObjectAnimatorProxy.ofFloat(view2, "scaleY", 0.1f, 1.0f)); - } - } - animatorSet.playTogether(animators); - animatorSet.setDuration(250); - animatorSet.start(); - } - scrolling = false; - if (view instanceof SharedDocumentCell) { - ((SharedDocumentCell) view).setChecked(true, true); - } - actionBar.showActionMode(); - } - return true; - } - }); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (i < 0 || i >= items.size()) { - return; - } - ListItem item = items.get(i); - File file = item.file; - if (file == null) { - if (item.icon == R.drawable.ic_storage_gallery) { - if (delegate != null) { - delegate.startDocumentSelectActivity(); - } - finishFragment(false); - } else { - HistoryEntry he = history.remove(history.size() - 1); - actionBar.setTitle(he.title); - if (he.dir != null) { - listFiles(he.dir); - } else { - listRoots(); - } - listView.setSelectionFromTop(he.scrollItem, he.scrollOffset); - } - } else if (file.isDirectory()) { - HistoryEntry he = new HistoryEntry(); - he.scrollItem = listView.getFirstVisiblePosition(); - he.scrollOffset = listView.getChildAt(0).getTop(); - he.dir = currentDir; - he.title = actionBar.getTitle().toString(); - history.add(he); - if (!listFiles(file)) { - history.remove(he); - return; - } - actionBar.setTitle(item.title); - listView.setSelection(0); - } else { - if (!file.canRead()) { - showErrorBox(LocaleController.getString("AccessError", R.string.AccessError)); - return; - } - if (sizeLimit != 0) { - if (file.length() > sizeLimit) { - showErrorBox(LocaleController.formatString("FileUploadLimit", R.string.FileUploadLimit, Utilities.formatFileSize(sizeLimit))); - return; - } - } - if (file.length() == 0) { - return; - } - if (actionBar.isActionModeShowed()) { - if (selectedFiles.containsKey(file.toString())) { - selectedFiles.remove(file.toString()); - } else { - selectedFiles.put(file.toString(), item); - } - if (selectedFiles.isEmpty()) { - actionBar.hideActionMode(); - } else { - selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); - } - scrolling = false; - if (view instanceof SharedDocumentCell) { - ((SharedDocumentCell) view).setChecked(selectedFiles.containsKey(item.file.toString()), true); - } - } else { - if (delegate != null) { - ArrayList files = new ArrayList<>(); - files.add(file.getAbsolutePath()); - delegate.didSelectFiles(DocumentSelectActivity.this, files); - } - } - } - } - }); - - listRoots(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + + listRoots(); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index f675fd7d8..5f18cf414 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import android.app.Activity; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; @@ -28,7 +29,6 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.AbsListView; import android.widget.AdapterView; @@ -141,337 +141,331 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - searching = false; - searchWas = false; + public View createView(Context context, LayoutInflater inflater) { + searching = false; + searchWas = false; - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - if (isAlwaysShare) { - actionBar.setTitle(LocaleController.getString("AlwaysShareWithTitle", R.string.AlwaysShareWithTitle)); - } else if (isNeverShare) { - actionBar.setTitle(LocaleController.getString("NeverShareWithTitle", R.string.NeverShareWithTitle)); - } else { - actionBar.setTitle(isBroadcast ? LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList) : LocaleController.getString("NewGroup", R.string.NewGroup)); - actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); - } + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (isAlwaysShare) { + actionBar.setTitle(LocaleController.getString("AlwaysShareWithTitle", R.string.AlwaysShareWithTitle)); + } else if (isNeverShare) { + actionBar.setTitle(LocaleController.getString("NeverShareWithTitle", R.string.NeverShareWithTitle)); + } else { + actionBar.setTitle(isBroadcast ? LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList) : LocaleController.getString("NewGroup", R.string.NewGroup)); + actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); + } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - if (selectedContacts.isEmpty()) { - return; - } - ArrayList result = new ArrayList<>(); - result.addAll(selectedContacts.keySet()); - if (isAlwaysShare || isNeverShare) { - if (delegate != null) { - delegate.didSelectUsers(result); - } - finishFragment(); - } else { - Bundle args = new Bundle(); - args.putIntegerArrayList("result", result); - args.putBoolean("broadcast", isBroadcast); - presentFragment(new GroupCreateFinalActivity(args)); - } - } - } - }); - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - searchListViewAdapter = new SearchAdapter(getParentActivity(), null, false); - searchListViewAdapter.setCheckedMap(selectedContacts); - searchListViewAdapter.setUseUserCell(true); - listViewAdapter = new ContactsAdapter(getParentActivity(), true, false, null); - listViewAdapter.setCheckedMap(selectedContacts); - - fragmentView = new LinearLayout(getParentActivity()); - LinearLayout linearLayout = (LinearLayout) fragmentView; - linearLayout.setOrientation(LinearLayout.VERTICAL); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - linearLayout.addView(frameLayout); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP; - frameLayout.setLayoutParams(layoutParams); - - userSelectEditText = new EditText(getParentActivity()); - userSelectEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - userSelectEditText.setHintTextColor(0xff979797); - userSelectEditText.setTextColor(0xff212121); - userSelectEditText.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_MULTI_LINE); - userSelectEditText.setMinimumHeight(AndroidUtilities.dp(54)); - userSelectEditText.setSingleLine(false); - userSelectEditText.setLines(2); - userSelectEditText.setMaxLines(2); - userSelectEditText.setVerticalScrollBarEnabled(true); - userSelectEditText.setHorizontalScrollBarEnabled(false); - userSelectEditText.setPadding(0, 0, 0, 0); - userSelectEditText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI); - userSelectEditText.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); - AndroidUtilities.clearCursorDrawable(userSelectEditText); - frameLayout.addView(userSelectEditText); - FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) userSelectEditText.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.leftMargin = AndroidUtilities.dp(10); - layoutParams1.rightMargin = AndroidUtilities.dp(10); - layoutParams1.gravity = Gravity.TOP; - userSelectEditText.setLayoutParams(layoutParams1); - - if (isAlwaysShare) { - userSelectEditText.setHint(LocaleController.getString("AlwaysShareWithPlaceholder", R.string.AlwaysShareWithPlaceholder)); - } else if (isNeverShare) { - userSelectEditText.setHint(LocaleController.getString("NeverShareWithPlaceholder", R.string.NeverShareWithPlaceholder)); - } else { - userSelectEditText.setHint(LocaleController.getString("SendMessageTo", R.string.SendMessageTo)); - } - if (Build.VERSION.SDK_INT >= 11) { - userSelectEditText.setTextIsSelectable(false); - } - userSelectEditText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { - if (!ignoreChange) { - beforeChangeIndex = userSelectEditText.getSelectionStart(); - changeString = new SpannableString(charSequence); - } - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { - - } - - @Override - public void afterTextChanged(Editable editable) { - if (!ignoreChange) { - boolean search = false; - int afterChangeIndex = userSelectEditText.getSelectionEnd(); - if (editable.toString().length() < changeString.toString().length()) { - String deletedString = ""; - try { - deletedString = changeString.toString().substring(afterChangeIndex, beforeChangeIndex); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - if (deletedString.length() > 0) { - if (searching && searchWas) { - search = true; - } - Spannable span = userSelectEditText.getText(); - for (int a = 0; a < allSpans.size(); a++) { - XImageSpan sp = allSpans.get(a); - if (span.getSpanStart(sp) == -1) { - allSpans.remove(sp); - selectedContacts.remove(sp.uid); - } - } - if (!isAlwaysShare && !isNeverShare) { - actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); - } - listView.invalidateViews(); - } else { - search = true; - } - } else { - search = true; - } - if (search) { - String text = userSelectEditText.getText().toString().replace("<", ""); - if (text.length() != 0) { - searching = true; - searchWas = true; - if (listView != null) { - listView.setAdapter(searchListViewAdapter); - searchListViewAdapter.notifyDataSetChanged(); - if(android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(false); - } - listView.setFastScrollEnabled(false); - listView.setVerticalScrollBarEnabled(true); - } - if (emptyTextView != null) { - emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); - } - searchListViewAdapter.searchDialogs(text); - } else { - searchListViewAdapter.searchDialogs(null); - searching = false; - searchWas = false; - listView.setAdapter(listViewAdapter); - listViewAdapter.notifyDataSetChanged(); - if (android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - } - listView.setFastScrollEnabled(true); - listView.setVerticalScrollBarEnabled(false); - emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); - } - } - } - } - }); - - LinearLayout emptyTextLayout = new LinearLayout(getParentActivity()); - emptyTextLayout.setVisibility(View.INVISIBLE); - emptyTextLayout.setOrientation(LinearLayout.VERTICAL); - linearLayout.addView(emptyTextLayout); - layoutParams = (LinearLayout.LayoutParams) emptyTextLayout.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - emptyTextLayout.setLayoutParams(layoutParams); - emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(20); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); - emptyTextLayout.addView(emptyTextView); - layoutParams = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.weight = 0.5f; - emptyTextView.setLayoutParams(layoutParams); - - FrameLayout frameLayout2 = new FrameLayout(getParentActivity()); - emptyTextLayout.addView(frameLayout2); - layoutParams = (LinearLayout.LayoutParams) frameLayout2.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.weight = 0.5f; - frameLayout2.setLayoutParams(layoutParams); - - listView = new LetterSectionsListView(getParentActivity()); - listView.setEmptyView(emptyTextLayout); - listView.setVerticalScrollBarEnabled(false); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setFastScrollEnabled(true); - listView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); - listView.setAdapter(listViewAdapter); - if (Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - linearLayout.addView(listView); - layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - TLRPC.User user = null; - if (searching && searchWas) { - user = searchListViewAdapter.getItem(i); - } else { - int section = listViewAdapter.getSectionForPosition(i); - int row = listViewAdapter.getPositionInSectionForPosition(i); - if (row < 0 || section < 0) { - return; - } - user = (TLRPC.User) listViewAdapter.getItem(section, row); - } - if (user == null) { + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (selectedContacts.isEmpty()) { return; } + ArrayList result = new ArrayList<>(); + result.addAll(selectedContacts.keySet()); + if (isAlwaysShare || isNeverShare) { + if (delegate != null) { + delegate.didSelectUsers(result); + } + finishFragment(); + } else { + Bundle args = new Bundle(); + args.putIntegerArrayList("result", result); + args.putBoolean("broadcast", isBroadcast); + presentFragment(new GroupCreateFinalActivity(args)); + } + } + } + }); + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - boolean check = true; - if (selectedContacts.containsKey(user.id)) { - check = false; + searchListViewAdapter = new SearchAdapter(context, null, false); + searchListViewAdapter.setCheckedMap(selectedContacts); + searchListViewAdapter.setUseUserCell(true); + listViewAdapter = new ContactsAdapter(context, true, false, null); + listViewAdapter.setCheckedMap(selectedContacts); + + fragmentView = new LinearLayout(context); + LinearLayout linearLayout = (LinearLayout) fragmentView; + linearLayout.setOrientation(LinearLayout.VERTICAL); + + FrameLayout frameLayout = new FrameLayout(context); + linearLayout.addView(frameLayout); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP; + frameLayout.setLayoutParams(layoutParams); + + userSelectEditText = new EditText(context); + userSelectEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + userSelectEditText.setHintTextColor(0xff979797); + userSelectEditText.setTextColor(0xff212121); + userSelectEditText.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_MULTI_LINE); + userSelectEditText.setMinimumHeight(AndroidUtilities.dp(54)); + userSelectEditText.setSingleLine(false); + userSelectEditText.setLines(2); + userSelectEditText.setMaxLines(2); + userSelectEditText.setVerticalScrollBarEnabled(true); + userSelectEditText.setHorizontalScrollBarEnabled(false); + userSelectEditText.setPadding(0, 0, 0, 0); + userSelectEditText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI); + userSelectEditText.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); + AndroidUtilities.clearCursorDrawable(userSelectEditText); + frameLayout.addView(userSelectEditText); + FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) userSelectEditText.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.leftMargin = AndroidUtilities.dp(10); + layoutParams1.rightMargin = AndroidUtilities.dp(10); + layoutParams1.gravity = Gravity.TOP; + userSelectEditText.setLayoutParams(layoutParams1); + + if (isAlwaysShare) { + userSelectEditText.setHint(LocaleController.getString("AlwaysShareWithPlaceholder", R.string.AlwaysShareWithPlaceholder)); + } else if (isNeverShare) { + userSelectEditText.setHint(LocaleController.getString("NeverShareWithPlaceholder", R.string.NeverShareWithPlaceholder)); + } else { + userSelectEditText.setHint(LocaleController.getString("SendMessageTo", R.string.SendMessageTo)); + } + if (Build.VERSION.SDK_INT >= 11) { + userSelectEditText.setTextIsSelectable(false); + } + userSelectEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { + if (!ignoreChange) { + beforeChangeIndex = userSelectEditText.getSelectionStart(); + changeString = new SpannableString(charSequence); + } + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (!ignoreChange) { + boolean search = false; + int afterChangeIndex = userSelectEditText.getSelectionEnd(); + if (editable.toString().length() < changeString.toString().length()) { + String deletedString = ""; try { - XImageSpan span = selectedContacts.get(user.id); - selectedContacts.remove(user.id); - SpannableStringBuilder text = new SpannableStringBuilder(userSelectEditText.getText()); - text.delete(text.getSpanStart(span), text.getSpanEnd(span)); - allSpans.remove(span); - ignoreChange = true; - userSelectEditText.setText(text); - userSelectEditText.setSelection(text.length()); - ignoreChange = false; + deletedString = changeString.toString().substring(afterChangeIndex, beforeChangeIndex); } catch (Exception e) { FileLog.e("tmessages", e); } + if (deletedString.length() > 0) { + if (searching && searchWas) { + search = true; + } + Spannable span = userSelectEditText.getText(); + for (int a = 0; a < allSpans.size(); a++) { + XImageSpan sp = allSpans.get(a); + if (span.getSpanStart(sp) == -1) { + allSpans.remove(sp); + selectedContacts.remove(sp.uid); + } + } + if (!isAlwaysShare && !isNeverShare) { + actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); + } + listView.invalidateViews(); + } else { + search = true; + } } else { - if (selectedContacts.size() == maxCount) { - return; - } - ignoreChange = true; - XImageSpan span = createAndPutChipForUser(user); - span.uid = user.id; - ignoreChange = false; + search = true; } - if (!isAlwaysShare && !isNeverShare) { - actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); - } - if (searching || searchWas) { - ignoreChange = true; - SpannableStringBuilder ssb = new SpannableStringBuilder(""); - for (ImageSpan sp : allSpans) { - ssb.append("<<"); - ssb.setSpan(sp, ssb.length() - 2, ssb.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); - } - userSelectEditText.setText(ssb); - userSelectEditText.setSelection(ssb.length()); - ignoreChange = false; - - searchListViewAdapter.searchDialogs(null); - searching = false; - searchWas = false; - listView.setAdapter(listViewAdapter); - listViewAdapter.notifyDataSetChanged(); - if (android.os.Build.VERSION.SDK_INT >= 11) { - listView.setFastScrollAlwaysVisible(true); - } - listView.setFastScrollEnabled(true); - listView.setVerticalScrollBarEnabled(false); - emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); - } else { - if (view instanceof UserCell) { - ((UserCell) view).setChecked(check, true); + if (search) { + String text = userSelectEditText.getText().toString().replace("<", ""); + if (text.length() != 0) { + searching = true; + searchWas = true; + if (listView != null) { + listView.setAdapter(searchListViewAdapter); + searchListViewAdapter.notifyDataSetChanged(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(false); + } + listView.setFastScrollEnabled(false); + listView.setVerticalScrollBarEnabled(true); + } + if (emptyTextView != null) { + emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + } + searchListViewAdapter.searchDialogs(text); + } else { + searchListViewAdapter.searchDialogs(null); + searching = false; + searchWas = false; + listView.setAdapter(listViewAdapter); + listViewAdapter.notifyDataSetChanged(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + } + listView.setFastScrollEnabled(true); + listView.setVerticalScrollBarEnabled(false); + emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); } } } - }); - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == SCROLL_STATE_TOUCH_SCROLL) { - AndroidUtilities.hideKeyboard(userSelectEditText); - } - if (listViewAdapter != null) { - listViewAdapter.setIsScrolling(i != SCROLL_STATE_IDLE); - } - } - - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (absListView.isFastScrollEnabled()) { - AndroidUtilities.clearDrawableAnimation(absListView); - } - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } + }); + + LinearLayout emptyTextLayout = new LinearLayout(context); + emptyTextLayout.setVisibility(View.INVISIBLE); + emptyTextLayout.setOrientation(LinearLayout.VERTICAL); + linearLayout.addView(emptyTextLayout); + layoutParams = (LinearLayout.LayoutParams) emptyTextLayout.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + emptyTextLayout.setLayoutParams(layoutParams); + emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff808080); + emptyTextView.setTextSize(20); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); + emptyTextLayout.addView(emptyTextView); + layoutParams = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.weight = 0.5f; + emptyTextView.setLayoutParams(layoutParams); + + FrameLayout frameLayout2 = new FrameLayout(context); + emptyTextLayout.addView(frameLayout2); + layoutParams = (LinearLayout.LayoutParams) frameLayout2.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.weight = 0.5f; + frameLayout2.setLayoutParams(layoutParams); + + listView = new LetterSectionsListView(context); + listView.setEmptyView(emptyTextLayout); + listView.setVerticalScrollBarEnabled(false); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setFastScrollEnabled(true); + listView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); + listView.setAdapter(listViewAdapter); + if (Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); } + linearLayout.addView(listView); + layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + TLRPC.User user = null; + if (searching && searchWas) { + user = searchListViewAdapter.getItem(i); + } else { + int section = listViewAdapter.getSectionForPosition(i); + int row = listViewAdapter.getPositionInSectionForPosition(i); + if (row < 0 || section < 0) { + return; + } + user = (TLRPC.User) listViewAdapter.getItem(section, row); + } + if (user == null) { + return; + } + + boolean check = true; + if (selectedContacts.containsKey(user.id)) { + check = false; + try { + XImageSpan span = selectedContacts.get(user.id); + selectedContacts.remove(user.id); + SpannableStringBuilder text = new SpannableStringBuilder(userSelectEditText.getText()); + text.delete(text.getSpanStart(span), text.getSpanEnd(span)); + allSpans.remove(span); + ignoreChange = true; + userSelectEditText.setText(text); + userSelectEditText.setSelection(text.length()); + ignoreChange = false; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else { + if (selectedContacts.size() == maxCount) { + return; + } + ignoreChange = true; + XImageSpan span = createAndPutChipForUser(user); + span.uid = user.id; + ignoreChange = false; + } + if (!isAlwaysShare && !isNeverShare) { + actionBar.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); + } + if (searching || searchWas) { + ignoreChange = true; + SpannableStringBuilder ssb = new SpannableStringBuilder(""); + for (ImageSpan sp : allSpans) { + ssb.append("<<"); + ssb.setSpan(sp, ssb.length() - 2, ssb.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + } + userSelectEditText.setText(ssb); + userSelectEditText.setSelection(ssb.length()); + ignoreChange = false; + + searchListViewAdapter.searchDialogs(null); + searching = false; + searchWas = false; + listView.setAdapter(listViewAdapter); + listViewAdapter.notifyDataSetChanged(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + listView.setFastScrollAlwaysVisible(true); + } + listView.setFastScrollEnabled(true); + listView.setVerticalScrollBarEnabled(false); + emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); + } else { + if (view instanceof UserCell) { + ((UserCell) view).setChecked(check, true); + } + } + } + }); + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == SCROLL_STATE_TOUCH_SCROLL) { + AndroidUtilities.hideKeyboard(userSelectEditText); + } + if (listViewAdapter != null) { + listViewAdapter.setIsScrolling(i != SCROLL_STATE_IDLE); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (absListView.isFastScrollEnabled()) { + AndroidUtilities.clearDrawableAnimation(absListView); + } + } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index c5974180b..6436ef0ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -138,191 +138,185 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - if (isBroadcast) { - actionBar.setTitle(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList)); - } else { - actionBar.setTitle(LocaleController.getString("NewGroup", R.string.NewGroup)); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (isBroadcast) { + actionBar.setTitle(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList)); + } else { + actionBar.setTitle(LocaleController.getString("NewGroup", R.string.NewGroup)); + } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - if (donePressed) { - return; - } - if (nameTextView.getText().length() == 0) { - return; - } - donePressed = true; + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (donePressed) { + return; + } + if (nameTextView.getText().length() == 0) { + return; + } + donePressed = true; - if (isBroadcast) { - MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar, isBroadcast); + if (isBroadcast) { + MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, isBroadcast); + } else { + if (avatarUpdater.uploadingAvatar != null) { + createAfterUpload = true; } else { - if (avatarUpdater.uploadingAvatar != null) { - createAfterUpload = true; - } else { - progressDialog = new ProgressDialog(getParentActivity()); - progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.setCancelable(false); + progressDialog = new ProgressDialog(getParentActivity()); + progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); - final long reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar, isBroadcast); + final long reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, isBroadcast); - progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ConnectionsManager.getInstance().cancelRpc(reqId, true); - donePressed = false; - try { - dialog.dismiss(); - } catch (Exception e) { - FileLog.e("tmessages", e); - } + progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ConnectionsManager.getInstance().cancelRpc(reqId, true); + donePressed = false; + try { + dialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); } - }); - progressDialog.show(); - } + } + }); + progressDialog.show(); } } } - }); + } + }); - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - fragmentView = new LinearLayout(getParentActivity()); - LinearLayout linearLayout = (LinearLayout) fragmentView; - linearLayout.setOrientation(LinearLayout.VERTICAL); + fragmentView = new LinearLayout(context); + LinearLayout linearLayout = (LinearLayout) fragmentView; + linearLayout.setOrientation(LinearLayout.VERTICAL); - FrameLayout frameLayout = new FrameLayoutFixed(getParentActivity()); - linearLayout.addView(frameLayout); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - frameLayout.setLayoutParams(layoutParams); + FrameLayout frameLayout = new FrameLayoutFixed(context); + linearLayout.addView(frameLayout); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + frameLayout.setLayoutParams(layoutParams); - avatarImage = new BackupImageView(getParentActivity()); - avatarImage.imageReceiver.setRoundRadius(AndroidUtilities.dp(32)); - avatarDrawable.setInfo(5, null, null, isBroadcast); - avatarImage.setImageDrawable(avatarDrawable); - frameLayout.addView(avatarImage); - FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); - layoutParams1.width = AndroidUtilities.dp(64); - layoutParams1.height = AndroidUtilities.dp(64); - layoutParams1.topMargin = AndroidUtilities.dp(12); - layoutParams1.bottomMargin = AndroidUtilities.dp(12); - layoutParams1.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(16); - layoutParams1.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(16) : 0; - layoutParams1.gravity = Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - avatarImage.setLayoutParams(layoutParams1); - if (!isBroadcast) { - avatarDrawable.setDrawPhoto(true); - avatarImage.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + avatarImage = new BackupImageView(context); + avatarImage.setRoundRadius(AndroidUtilities.dp(32)); + avatarDrawable.setInfo(5, null, null, isBroadcast); + avatarImage.setImageDrawable(avatarDrawable); + frameLayout.addView(avatarImage); + FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); + layoutParams1.width = AndroidUtilities.dp(64); + layoutParams1.height = AndroidUtilities.dp(64); + layoutParams1.topMargin = AndroidUtilities.dp(12); + layoutParams1.bottomMargin = AndroidUtilities.dp(12); + layoutParams1.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(16); + layoutParams1.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(16) : 0; + layoutParams1.gravity = Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + avatarImage.setLayoutParams(layoutParams1); + if (!isBroadcast) { + avatarDrawable.setDrawPhoto(true); + avatarImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items; + CharSequence[] items; - if (avatar != null) { - items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; - } else { - items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; - } + if (avatar != null) { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; + } else { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; + } - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (i == 0) { - avatarUpdater.openCamera(); - } else if (i == 1) { - avatarUpdater.openGallery(); - } else if (i == 2) { - avatar = null; - uploadedAvatar = null; - avatarImage.setImage(avatar, "50_50", avatarDrawable); - } + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + avatarUpdater.openCamera(); + } else if (i == 1) { + avatarUpdater.openGallery(); + } else if (i == 2) { + avatar = null; + uploadedAvatar = null; + avatarImage.setImage(avatar, "50_50", avatarDrawable); } - }); - showAlertDialog(builder); - } - }); - } - - nameTextView = new EditText(getParentActivity()); - nameTextView.setHint(isBroadcast ? LocaleController.getString("EnterListName", R.string.EnterListName) : LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder)); - if (nameToSet != null) { - nameTextView.setText(nameToSet); - nameToSet = null; - } - nameTextView.setMaxLines(4); - nameTextView.setGravity(Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - nameTextView.setHintTextColor(0xff979797); - nameTextView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); - nameTextView.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); - nameTextView.setPadding(0, 0, 0, AndroidUtilities.dp(8)); - AndroidUtilities.clearCursorDrawable(nameTextView); - nameTextView.setTextColor(0xff212121); - frameLayout.addView(nameTextView); - layoutParams1 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(96); - layoutParams1.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(96) : AndroidUtilities.dp(16); - layoutParams1.gravity = Gravity.CENTER_VERTICAL; - nameTextView.setLayoutParams(layoutParams1); - if (!isBroadcast) { - nameTextView.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - avatarDrawable.setInfo(5, nameTextView.length() > 0 ? nameTextView.getText().toString() : null, null, isBroadcast); - avatarImage.invalidate(); - } - }); - } - - GreySectionCell sectionCell = new GreySectionCell(getParentActivity()); - sectionCell.setText(LocaleController.formatPluralString("Members", selectedContacts.size())); - linearLayout.addView(sectionCell); - - listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); - linearLayout.addView(listView); - layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + } + }); + showAlertDialog(builder); + } + }); } + + nameTextView = new EditText(context); + nameTextView.setHint(isBroadcast ? LocaleController.getString("EnterListName", R.string.EnterListName) : LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder)); + if (nameToSet != null) { + nameTextView.setText(nameToSet); + nameToSet = null; + } + nameTextView.setMaxLines(4); + nameTextView.setGravity(Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + nameTextView.setHintTextColor(0xff979797); + nameTextView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + nameTextView.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); + nameTextView.setPadding(0, 0, 0, AndroidUtilities.dp(8)); + AndroidUtilities.clearCursorDrawable(nameTextView); + nameTextView.setTextColor(0xff212121); + frameLayout.addView(nameTextView); + layoutParams1 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(96); + layoutParams1.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(96) : AndroidUtilities.dp(16); + layoutParams1.gravity = Gravity.CENTER_VERTICAL; + nameTextView.setLayoutParams(layoutParams1); + if (!isBroadcast) { + nameTextView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + avatarDrawable.setInfo(5, nameTextView.length() > 0 ? nameTextView.getText().toString() : null, null, isBroadcast); + avatarImage.invalidate(); + } + }); + } + + GreySectionCell sectionCell = new GreySectionCell(context); + sectionCell.setText(LocaleController.formatPluralString("Members", selectedContacts.size())); + linearLayout.addView(sectionCell); + + listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setAdapter(listAdapter = new ListAdapter(context)); + linearLayout.addView(listView); + layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + return fragmentView; } @@ -336,7 +330,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati avatarImage.setImage(avatar, "50_50", avatarDrawable); if (createAfterUpload) { FileLog.e("tmessages", "avatar did uploaded"); - MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar, false); + MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, false); } } }); @@ -402,10 +396,14 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati FileLog.e("tmessages", e); } } + int chat_id = (Integer)args[0]; NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); Bundle args2 = new Bundle(); - args2.putInt("chat_id", (Integer)args[0]); + args2.putInt("chat_id", chat_id); presentFragment(new ChatActivity(args2), true); + if (uploadedAvatar != null) { + MessagesController.getInstance().changeChatAvatar(chat_id, uploadedAvatar); + } } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java index 88ae3a8b7..10181960b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java @@ -10,18 +10,17 @@ package org.telegram.ui; import android.content.Context; import android.os.Bundle; -import android.text.Html; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.Surface; import android.view.View; -import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import org.telegram.android.AndroidUtilities; import org.telegram.android.LocaleController; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.TLRPC; @@ -45,45 +44,39 @@ public class IdenticonActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("EncryptionKey", R.string.EncryptionKey)); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("EncryptionKey", R.string.EncryptionKey)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); } - }); - - fragmentView = inflater.inflate(R.layout.identicon_layout, null, false); - ImageView identiconView = (ImageView) fragmentView.findViewById(R.id.identicon_view); - TextView textView = (TextView)fragmentView.findViewById(R.id.identicon_text); - TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance().getEncryptedChat(chat_id); - if (encryptedChat != null) { - IdenticonDrawable drawable = new IdenticonDrawable(); - identiconView.setImageDrawable(drawable); - drawable.setEncryptedChat(encryptedChat); - TLRPC.User user = MessagesController.getInstance().getUser(encryptedChat.user_id); - textView.setText(Html.fromHtml(LocaleController.formatString("EncryptionKeyDescription", R.string.EncryptionKeyDescription, user.first_name, user.first_name))); } + }); - fragmentView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + fragmentView = inflater.inflate(R.layout.identicon_layout, null, false); + ImageView identiconView = (ImageView) fragmentView.findViewById(R.id.identicon_view); + TextView textView = (TextView) fragmentView.findViewById(R.id.identicon_text); + TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance().getEncryptedChat(chat_id); + if (encryptedChat != null) { + IdenticonDrawable drawable = new IdenticonDrawable(); + identiconView.setImageDrawable(drawable); + drawable.setEncryptedChat(encryptedChat); + TLRPC.User user = MessagesController.getInstance().getUser(encryptedChat.user_id); + textView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("EncryptionKeyDescription", R.string.EncryptionKeyDescription, user.first_name, user.first_name))); } + + fragmentView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java index 983d43cd9..2d3599521 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java @@ -19,7 +19,6 @@ import android.os.Bundle; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; -import android.text.Html; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -255,7 +254,7 @@ public class IntroActivity extends Activity { container.addView(view, 0); headerTextView.setText(getString(titles[position])); - messageTextView.setText(Html.fromHtml(getString(messages[position]))); + messageTextView.setText(AndroidUtilities.replaceTags(getString(messages[position]))); return view; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java index 0ff48eb81..a6efe56be 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java @@ -52,192 +52,186 @@ public class LanguageSelectActivity extends BaseFragment { public ArrayList searchResult; @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - searching = false; - searchWas = false; + public View createView(Context context, LayoutInflater inflater) { + searching = false; + searchWas = false; - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("Language", R.string.Language)); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("Language", R.string.Language)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } - } - }); - - ActionBarMenu menu = actionBar.createMenu(); - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - searching = true; - } - - @Override - public boolean onSearchCollapse() { - search(null); - searching = false; - searchWas = false; - if (listView != null) { - emptyTextView.setVisibility(View.GONE); - listView.setAdapter(listAdapter); - } - - return true; - } - - @Override - public void onTextChanged(EditText editText) { - String text = editText.getText().toString(); - search(text); - if (text.length() != 0) { - searchWas = true; - if (listView != null) { - listView.setAdapter(searchListViewAdapter); - } - } - } - }); - item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - - listAdapter = new ListAdapter(getParentActivity()); - searchListViewAdapter = new SearchAdapter(getParentActivity()); - - fragmentView = new FrameLayout(getParentActivity()); - - LinearLayout emptyTextLayout = new LinearLayout(getParentActivity()); - emptyTextLayout.setVisibility(View.INVISIBLE); - emptyTextLayout.setOrientation(LinearLayout.VERTICAL); - ((FrameLayout) fragmentView).addView(emptyTextLayout); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextLayout.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - emptyTextLayout.setLayoutParams(layoutParams); - emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(20); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); - emptyTextLayout.addView(emptyTextView); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.weight = 0.5f; - emptyTextView.setLayoutParams(layoutParams1); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - emptyTextLayout.addView(frameLayout); - layoutParams1 = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams1.weight = 0.5f; - frameLayout.setLayoutParams(layoutParams1); - - listView = new ListView(getParentActivity()); - listView.setEmptyView(emptyTextLayout); - listView.setVerticalScrollBarEnabled(false); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setAdapter(listAdapter); - ((FrameLayout) fragmentView).addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - LocaleController.LocaleInfo localeInfo = null; - if (searching && searchWas) { - if (i >= 0 && i < searchResult.size()) { - localeInfo = searchResult.get(i); - } - } else { - if (i >= 0 && i < LocaleController.getInstance().sortedLanguages.size()) { - localeInfo = LocaleController.getInstance().sortedLanguages.get(i); - } - } - if (localeInfo != null) { - LocaleController.getInstance().applyLanguage(localeInfo, true); - parentLayout.rebuildAllFragmentViews(false); - } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { finishFragment(); } - }); + } + }); - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { - LocaleController.LocaleInfo localeInfo = null; - if (searching && searchWas) { - if (i >= 0 && i < searchResult.size()) { - localeInfo = searchResult.get(i); - } - } else { - if (i >= 0 && i < LocaleController.getInstance().sortedLanguages.size()) { - localeInfo = LocaleController.getInstance().sortedLanguages.get(i); - } + ActionBarMenu menu = actionBar.createMenu(); + ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { + searching = true; + } + + @Override + public boolean onSearchCollapse() { + search(null); + searching = false; + searchWas = false; + if (listView != null) { + emptyTextView.setVisibility(View.GONE); + listView.setAdapter(listAdapter); + } + + return true; + } + + @Override + public void onTextChanged(EditText editText) { + String text = editText.getText().toString(); + search(text); + if (text.length() != 0) { + searchWas = true; + if (listView != null) { + listView.setAdapter(searchListViewAdapter); } - if (localeInfo == null || localeInfo.pathToFile == null || getParentActivity() == null) { - return false; + } + } + }); + item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); + + listAdapter = new ListAdapter(context); + searchListViewAdapter = new SearchAdapter(context); + + fragmentView = new FrameLayout(context); + + LinearLayout emptyTextLayout = new LinearLayout(context); + emptyTextLayout.setVisibility(View.INVISIBLE); + emptyTextLayout.setOrientation(LinearLayout.VERTICAL); + ((FrameLayout) fragmentView).addView(emptyTextLayout); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextLayout.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + emptyTextLayout.setLayoutParams(layoutParams); + emptyTextLayout.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff808080); + emptyTextView.setTextSize(20); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + emptyTextLayout.addView(emptyTextView); + LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.weight = 0.5f; + emptyTextView.setLayoutParams(layoutParams1); + + FrameLayout frameLayout = new FrameLayout(context); + emptyTextLayout.addView(frameLayout); + layoutParams1 = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams1.weight = 0.5f; + frameLayout.setLayoutParams(layoutParams1); + + listView = new ListView(context); + listView.setEmptyView(emptyTextLayout); + listView.setVerticalScrollBarEnabled(false); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setAdapter(listAdapter); + ((FrameLayout) fragmentView).addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + LocaleController.LocaleInfo localeInfo = null; + if (searching && searchWas) { + if (i >= 0 && i < searchResult.size()) { + localeInfo = searchResult.get(i); } - final LocaleController.LocaleInfo finalLocaleInfo = localeInfo; - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("DeleteLocalization", R.string.DeleteLocalization)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (LocaleController.getInstance().deleteLanguage(finalLocaleInfo)) { - if (searchResult != null) { - searchResult.remove(finalLocaleInfo); - } - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } - if (searchListViewAdapter != null) { - searchListViewAdapter.notifyDataSetChanged(); - } + } else { + if (i >= 0 && i < LocaleController.getInstance().sortedLanguages.size()) { + localeInfo = LocaleController.getInstance().sortedLanguages.get(i); + } + } + if (localeInfo != null) { + LocaleController.getInstance().applyLanguage(localeInfo, true); + parentLayout.rebuildAllFragmentViews(false); + } + finishFragment(); + } + }); + + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + LocaleController.LocaleInfo localeInfo = null; + if (searching && searchWas) { + if (i >= 0 && i < searchResult.size()) { + localeInfo = searchResult.get(i); + } + } else { + if (i >= 0 && i < LocaleController.getInstance().sortedLanguages.size()) { + localeInfo = LocaleController.getInstance().sortedLanguages.get(i); + } + } + if (localeInfo == null || localeInfo.pathToFile == null || getParentActivity() == null) { + return false; + } + final LocaleController.LocaleInfo finalLocaleInfo = localeInfo; + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("DeleteLocalization", R.string.DeleteLocalization)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (LocaleController.getInstance().deleteLanguage(finalLocaleInfo)) { + if (searchResult != null) { + searchResult.remove(finalLocaleInfo); + } + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + if (searchListViewAdapter != null) { + searchListViewAdapter.notifyDataSetChanged(); } } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - return true; - } - }); - - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); } - } - - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; } - } + }); + + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java index 79cd7c00f..b2c6096be 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java @@ -99,150 +99,144 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - if (getParentActivity() == null) { - return; - } - - if (currentType != 0) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - boolean showed = preferences.getBoolean("privacyAlertShowed", false); - if (!showed) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("CustomHelp", R.string.CustomHelp)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - applyCurrentPrivacySettings(); - preferences.edit().putBoolean("privacyAlertShowed", true).commit(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - return; - } - } - applyCurrentPrivacySettings(); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (getParentActivity() == null) { + return; } - } - }); - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - doneButton.setVisibility(View.GONE); - - listAdapter = new ListAdapter(getParentActivity()); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - frameLayout.setBackgroundColor(0xfff0f0f0); - - ListView listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - listView.setDrawSelectorOnTop(true); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (i == nobodyRow || i == everybodyRow || i == myContactsRow) { - int newType = currentType; - if (i == nobodyRow) { - newType = 1; - } else if (i == everybodyRow) { - newType = 0; - } else if (i == myContactsRow) { - newType = 2; - } - if (newType == currentType) { + if (currentType != 0) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + boolean showed = preferences.getBoolean("privacyAlertShowed", false); + if (!showed) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("CustomHelp", R.string.CustomHelp)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + applyCurrentPrivacySettings(); + preferences.edit().putBoolean("privacyAlertShowed", true).commit(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); return; } - doneButton.setVisibility(View.VISIBLE); - currentType = newType; - updateRows(); - } else if (i == neverShareRow || i == alwaysShareRow) { - ArrayList createFromArray = null; - if (i == neverShareRow) { - createFromArray = currentMinus; - } else { - createFromArray = currentPlus; - } - if (createFromArray.isEmpty()) { - Bundle args = new Bundle(); - args.putBoolean(i == neverShareRow ? "isNeverShare" : "isAlwaysShare", true); - GroupCreateActivity fragment = new GroupCreateActivity(args); - fragment.setDelegate(new GroupCreateActivity.GroupCreateActivityDelegate() { - @Override - public void didSelectUsers(ArrayList ids) { - if (i == neverShareRow) { - currentMinus = ids; + } + applyCurrentPrivacySettings(); + } + } + }); + + ActionBarMenu menu = actionBar.createMenu(); + doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + doneButton.setVisibility(View.GONE); + + listAdapter = new ListAdapter(context); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(0xfff0f0f0); + + ListView listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setDrawSelectorOnTop(true); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == nobodyRow || i == everybodyRow || i == myContactsRow) { + int newType = currentType; + if (i == nobodyRow) { + newType = 1; + } else if (i == everybodyRow) { + newType = 0; + } else if (i == myContactsRow) { + newType = 2; + } + if (newType == currentType) { + return; + } + doneButton.setVisibility(View.VISIBLE); + currentType = newType; + updateRows(); + } else if (i == neverShareRow || i == alwaysShareRow) { + ArrayList createFromArray = null; + if (i == neverShareRow) { + createFromArray = currentMinus; + } else { + createFromArray = currentPlus; + } + if (createFromArray.isEmpty()) { + Bundle args = new Bundle(); + args.putBoolean(i == neverShareRow ? "isNeverShare" : "isAlwaysShare", true); + GroupCreateActivity fragment = new GroupCreateActivity(args); + fragment.setDelegate(new GroupCreateActivity.GroupCreateActivityDelegate() { + @Override + public void didSelectUsers(ArrayList ids) { + if (i == neverShareRow) { + currentMinus = ids; + for (Integer id : currentMinus) { + currentPlus.remove(id); + } + } else { + currentPlus = ids; + for (Integer id : currentPlus) { + currentMinus.remove(id); + } + } + doneButton.setVisibility(View.VISIBLE); + listAdapter.notifyDataSetChanged(); + } + }); + presentFragment(fragment); + } else { + LastSeenUsersActivity fragment = new LastSeenUsersActivity(createFromArray, i == alwaysShareRow); + fragment.setDelegate(new LastSeenUsersActivity.LastSeenUsersActivityDelegate() { + @Override + public void didUpdatedUserList(ArrayList ids, boolean added) { + if (i == neverShareRow) { + currentMinus = ids; + if (added) { for (Integer id : currentMinus) { currentPlus.remove(id); } - } else { - currentPlus = ids; + } + } else { + currentPlus = ids; + if (added) { for (Integer id : currentPlus) { currentMinus.remove(id); } } - doneButton.setVisibility(View.VISIBLE); - listAdapter.notifyDataSetChanged(); } - }); - presentFragment(fragment); - } else { - LastSeenUsersActivity fragment = new LastSeenUsersActivity(createFromArray, i == alwaysShareRow); - fragment.setDelegate(new LastSeenUsersActivity.LastSeenUsersActivityDelegate() { - @Override - public void didUpdatedUserList(ArrayList ids, boolean added) { - if (i == neverShareRow) { - currentMinus = ids; - if (added) { - for (Integer id : currentMinus) { - currentPlus.remove(id); - } - } - } else { - currentPlus = ids; - if (added) { - for (Integer id : currentPlus) { - currentMinus.remove(id); - } - } - } - doneButton.setVisibility(View.VISIBLE); - listAdapter.notifyDataSetChanged(); - } - }); - presentFragment(fragment); - } + doneButton.setVisibility(View.VISIBLE); + listAdapter.notifyDataSetChanged(); + } + }); + presentFragment(fragment); } } - }); - } else { - ViewGroup parent = (ViewGroup) fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java index db8badfc5..a0ce4a77e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java @@ -75,127 +75,121 @@ public class LastSeenUsersActivity extends BaseFragment implements NotificationC } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - if (isAlwaysShare) { - actionBar.setTitle(LocaleController.getString("AlwaysShareWithTitle", R.string.AlwaysShareWithTitle)); - } else { - actionBar.setTitle(LocaleController.getString("NeverShareWithTitle", R.string.NeverShareWithTitle)); - } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == block_user) { - Bundle args = new Bundle(); - args.putBoolean(isAlwaysShare ? "isAlwaysShare" : "isNeverShare", true); - GroupCreateActivity fragment = new GroupCreateActivity(args); - fragment.setDelegate(new GroupCreateActivity.GroupCreateActivityDelegate() { - @Override - public void didSelectUsers(ArrayList ids) { - for (Integer id : ids) { - if (uidArray.contains(id)) { - continue; - } - uidArray.add(id); - } - listViewAdapter.notifyDataSetChanged(); - if (delegate != null) { - delegate.didUpdatedUserList(uidArray, true); - } - } - }); - presentFragment(fragment); - } - } - }); - - ActionBarMenu menu = actionBar.createMenu(); - menu.addItem(block_user, R.drawable.plus); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - - TextView emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(20); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setVisibility(View.INVISIBLE); - emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); - frameLayout.addView(emptyTextView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - emptyTextView.setLayoutParams(layoutParams); - emptyTextView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - listView = new ListView(getParentActivity()); - listView.setEmptyView(emptyTextView); - listView.setVerticalScrollBarEnabled(false); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setAdapter(listViewAdapter = new ListAdapter(getParentActivity())); - if (Build.VERSION.SDK_INT >= 11) { - listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (i < uidArray.size()) { - Bundle args = new Bundle(); - args.putInt("user_id", uidArray.get(i)); - presentFragment(new ProfileActivity(args)); - } - } - }); - - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { - if (i < 0 || i >= uidArray.size() || getParentActivity() == null) { - return true; - } - selectedUserId = uidArray.get(i); - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items = new CharSequence[] {LocaleController.getString("Delete", R.string.Delete)}; - builder.setItems(items, new DialogInterface.OnClickListener() { + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (isAlwaysShare) { + actionBar.setTitle(LocaleController.getString("AlwaysShareWithTitle", R.string.AlwaysShareWithTitle)); + } else { + actionBar.setTitle(LocaleController.getString("NeverShareWithTitle", R.string.NeverShareWithTitle)); + } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == block_user) { + Bundle args = new Bundle(); + args.putBoolean(isAlwaysShare ? "isAlwaysShare" : "isNeverShare", true); + GroupCreateActivity fragment = new GroupCreateActivity(args); + fragment.setDelegate(new GroupCreateActivity.GroupCreateActivityDelegate() { @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (i == 0) { - uidArray.remove((Integer)selectedUserId); - listViewAdapter.notifyDataSetChanged(); - if (delegate != null) { - delegate.didUpdatedUserList(uidArray, false); + public void didSelectUsers(ArrayList ids) { + for (Integer id : ids) { + if (uidArray.contains(id)) { + continue; } + uidArray.add(id); + } + listViewAdapter.notifyDataSetChanged(); + if (delegate != null) { + delegate.didUpdatedUserList(uidArray, true); } } }); - showAlertDialog(builder); + presentFragment(fragment); + } + } + }); + + ActionBarMenu menu = actionBar.createMenu(); + menu.addItem(block_user, R.drawable.plus); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + TextView emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff808080); + emptyTextView.setTextSize(20); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setVisibility(View.INVISIBLE); + emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); + frameLayout.addView(emptyTextView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + emptyTextView.setLayoutParams(layoutParams); + emptyTextView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + listView = new ListView(context); + listView.setEmptyView(emptyTextView); + listView.setVerticalScrollBarEnabled(false); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setAdapter(listViewAdapter = new ListAdapter(context)); + if (Build.VERSION.SDK_INT >= 11) { + listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); + } + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (i < uidArray.size()) { + Bundle args = new Bundle(); + args.putInt("user_id", uidArray.get(i)); + presentFragment(new ProfileActivity(args)); + } + } + }); + + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + if (i < 0 || i >= uidArray.size() || getParentActivity() == null) { return true; } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + selectedUserId = uidArray.get(i); + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + CharSequence[] items = new CharSequence[]{LocaleController.getString("Delete", R.string.Delete)}; + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + uidArray.remove((Integer) selectedUserId); + listViewAdapter.notifyDataSetChanged(); + if (delegate != null) { + delegate.didUpdatedUserList(uidArray, false); + } + } + } + }); + showAlertDialog(builder); + return true; } - } + }); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index ce359b74f..e75d44830 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -104,7 +104,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa protected void onCreate(Bundle savedInstanceState) { ApplicationLoader.postInitApplication(); - if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { + if (!UserConfig.isClientActivated()) { Intent intent = getIntent(); if (intent != null && intent.getAction() != null && (Intent.ACTION_SEND.equals(intent.getAction()) || intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE))) { super.onCreate(savedInstanceState); @@ -205,7 +205,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa int viewX = location[0]; int viewY = location[1]; - if (x > viewX && x < viewX + layersActionBarLayout.getWidth() && y > viewY && y < viewY + layersActionBarLayout.getHeight()) { + if (layersActionBarLayout.checkTransitionAnimation() || x > viewX && x < viewX + layersActionBarLayout.getWidth() && y > viewY && y < viewY + layersActionBarLayout.getHeight()) { return false; } else { if (!layersActionBarLayout.fragmentsStack.isEmpty()) { @@ -335,7 +335,6 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa NotificationCenter.getInstance().addObserver(this, NotificationCenter.mainUserInfoChanged); NotificationCenter.getInstance().addObserver(this, NotificationCenter.closeOtherAppActivities); NotificationCenter.getInstance().addObserver(this, NotificationCenter.didUpdatedConnectionState); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.needPasswordEnter); if (Build.VERSION.SDK_INT < 14) { NotificationCenter.getInstance().addObserver(this, NotificationCenter.screenStateChanged); } else { @@ -343,17 +342,12 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } if (actionBarLayout.fragmentsStack.isEmpty()) { - if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { + if (!UserConfig.isClientActivated()) { actionBarLayout.addFragmentToStack(new LoginActivity()); drawerLayoutContainer.setAllowOpenDrawer(false, false); } else { - if (UserConfig.isWaitingForPasswordEnter()) { - actionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); - drawerLayoutContainer.setAllowOpenDrawer(false, false); - } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); - drawerLayoutContainer.setAllowOpenDrawer(true, false); - } + actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + drawerLayoutContainer.setAllowOpenDrawer(true, false); } try { @@ -411,7 +405,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else { allowOpen = actionBarLayout.fragmentsStack.size() <= 1; } - if (actionBarLayout.fragmentsStack.size() == 1 && (actionBarLayout.fragmentsStack.get(0) instanceof LoginActivity || actionBarLayout.fragmentsStack.get(0) instanceof AccountPasswordActivity)) { + if (actionBarLayout.fragmentsStack.size() == 1 && actionBarLayout.fragmentsStack.get(0) instanceof LoginActivity) { allowOpen = false; } drawerLayoutContainer.setAllowOpenDrawer(allowOpen, false); @@ -476,7 +470,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa documentsUrisArray = null; contactsToSend = null; - if (UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter() && (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { + if (UserConfig.isClientActivated() && (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { if (intent != null && intent.getAction() != null && !restore) { if (Intent.ACTION_SEND.equals(intent.getAction())) { boolean error = false; @@ -864,35 +858,25 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa if (!pushOpened && !isNew) { if (AndroidUtilities.isTablet()) { - if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { + if (!UserConfig.isClientActivated()) { if (layersActionBarLayout.fragmentsStack.isEmpty()) { layersActionBarLayout.addFragmentToStack(new LoginActivity()); drawerLayoutContainer.setAllowOpenDrawer(false, false); } } else { if (actionBarLayout.fragmentsStack.isEmpty()) { - if (UserConfig.isWaitingForPasswordEnter()) { - layersActionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); - drawerLayoutContainer.setAllowOpenDrawer(false, false); - } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); - drawerLayoutContainer.setAllowOpenDrawer(true, false); - } + actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + drawerLayoutContainer.setAllowOpenDrawer(true, false); } } } else { if (actionBarLayout.fragmentsStack.isEmpty()) { - if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { + if (!UserConfig.isClientActivated()) { actionBarLayout.addFragmentToStack(new LoginActivity()); drawerLayoutContainer.setAllowOpenDrawer(false, false); } else { - if (UserConfig.isWaitingForPasswordEnter()) { - actionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); - drawerLayoutContainer.setAllowOpenDrawer(false, false); - } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); - drawerLayoutContainer.setAllowOpenDrawer(true, false); - } + actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + drawerLayoutContainer.setAllowOpenDrawer(true, false); } } } @@ -1001,7 +985,6 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa NotificationCenter.getInstance().removeObserver(this, NotificationCenter.mainUserInfoChanged); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeOtherAppActivities); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didUpdatedConnectionState); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.needPasswordEnter); if (Build.VERSION.SDK_INT < 14) { NotificationCenter.getInstance().removeObserver(this, NotificationCenter.screenStateChanged); } else { @@ -1218,28 +1201,6 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } } else if (id == NotificationCenter.mainUserInfoChanged) { drawerLayoutAdapter.notifyDataSetChanged(); - } else if (id == NotificationCenter.needPasswordEnter) { - if (AndroidUtilities.isTablet()) { - for (int a = 0; a < layersActionBarLayout.fragmentsStack.size() - 1; a++) { - layersActionBarLayout.removeFragmentFromStack(layersActionBarLayout.fragmentsStack.get(0)); - a--; - } - for (int a = 0; a < actionBarLayout.fragmentsStack.size() - 1; a++) { - actionBarLayout.removeFragmentFromStack(actionBarLayout.fragmentsStack.get(0)); - a--; - } - rightActionBarLayout.closeLastFragment(false); - actionBarLayout.closeLastFragment(false); - layersActionBarLayout.presentFragment(new AccountPasswordActivity(1), false, true, true); - drawerLayoutContainer.setAllowOpenDrawer(false, false); - } else { - for (int a = 0; a < actionBarLayout.fragmentsStack.size() - 1; a++) { - actionBarLayout.removeFragmentFromStack(actionBarLayout.fragmentsStack.get(0)); - a--; - } - actionBarLayout.presentFragment(new AccountPasswordActivity(1), true); - drawerLayoutContainer.setAllowOpenDrawer(false, false); - } } else if (id == NotificationCenter.screenStateChanged) { if (!ApplicationLoader.mainInterfacePaused) { if (!ApplicationLoader.isScreenOn) { @@ -1452,7 +1413,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override public boolean needPresentFragment(BaseFragment fragment, boolean removeLast, boolean forceWithoutAnimation, ActionBarLayout layout) { if (AndroidUtilities.isTablet()) { - drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof AccountPasswordActivity) && !(fragment instanceof LoginActivity) && layersActionBarLayout.getVisibility() != View.VISIBLE, true); + drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity) && layersActionBarLayout.getVisibility() != View.VISIBLE, true); if (fragment instanceof MessagesActivity) { MessagesActivity messagesActivity = (MessagesActivity)fragment; if (messagesActivity.isMainDialogList() && layout != actionBarLayout) { @@ -1521,7 +1482,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else if (layout != layersActionBarLayout) { layersActionBarLayout.setVisibility(View.VISIBLE); drawerLayoutContainer.setAllowOpenDrawer(false, true); - if (fragment instanceof LoginActivity || fragment instanceof AccountPasswordActivity) { + if (fragment instanceof LoginActivity) { backgroundTablet.setVisibility(View.VISIBLE); shadowTabletSide.setVisibility(View.GONE); shadowTablet.setBackgroundColor(0x00000000); @@ -1533,7 +1494,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } return true; } else { - drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity) && !(fragment instanceof AccountPasswordActivity), false); + drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity), false); return true; } } @@ -1541,7 +1502,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override public boolean needAddFragmentToStack(BaseFragment fragment, ActionBarLayout layout) { if (AndroidUtilities.isTablet()) { - drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity) && !(fragment instanceof AccountPasswordActivity) && layersActionBarLayout.getVisibility() != View.VISIBLE, true); + drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity) && layersActionBarLayout.getVisibility() != View.VISIBLE, true); if (fragment instanceof MessagesActivity) { MessagesActivity messagesActivity = (MessagesActivity)fragment; if (messagesActivity.isMainDialogList() && layout != actionBarLayout) { @@ -1586,7 +1547,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else if (layout != layersActionBarLayout) { layersActionBarLayout.setVisibility(View.VISIBLE); drawerLayoutContainer.setAllowOpenDrawer(false, true); - if (fragment instanceof LoginActivity || fragment instanceof AccountPasswordActivity) { + if (fragment instanceof LoginActivity) { backgroundTablet.setVisibility(View.VISIBLE); shadowTabletSide.setVisibility(View.GONE); shadowTablet.setBackgroundColor(0x00000000); @@ -1598,7 +1559,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } return true; } else { - drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity) && !(fragment instanceof AccountPasswordActivity), false); + drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity), false); return true; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index e9c476fee..86e4b1cab 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -13,7 +13,6 @@ import android.location.Location; import android.location.LocationManager; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.TextView; import com.google.android.gms.maps.CameraUpdate; @@ -47,6 +46,7 @@ import org.telegram.ui.ActionBar.BaseFragment; import java.util.List; public class LocationActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + private GoogleMap googleMap; private TextView distanceTextView; private Marker userMarker; @@ -88,170 +88,159 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (mapView != null) { mapView.onDestroy(); } - if (avatarImageView != null) { - avatarImageView.setImageDrawable(null); - } } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - if (messageObject != null) { - actionBar.setTitle(LocaleController.getString("ChatLocation", R.string.ChatLocation)); - } else { - actionBar.setTitle(LocaleController.getString("ShareLocation", R.string.ShareLocation)); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (messageObject != null) { + actionBar.setTitle(LocaleController.getString("ChatLocation", R.string.ChatLocation)); + } else { + actionBar.setTitle(LocaleController.getString("ShareLocation", R.string.ShareLocation)); + } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == map_list_menu_map) { + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == map_list_menu_map) { + if (googleMap != null) { + googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); + } + } else if (id == map_list_menu_satellite) { + if (googleMap != null) { + googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); + } + } else if (id == map_list_menu_hybrid) { + if (googleMap != null) { + googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); + } + } else if (id == map_to_my_location) { + if (myLocation != null) { + LatLng latLng = new LatLng(myLocation.getLatitude(), myLocation.getLongitude()); if (googleMap != null) { - googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); - } - } else if (id == map_list_menu_satellite) { - if (googleMap != null) { - googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); - } - } else if (id == map_list_menu_hybrid) { - if (googleMap != null) { - googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); - } - } else if (id == map_to_my_location) { - if (myLocation != null) { - LatLng latLng = new LatLng(myLocation.getLatitude(), myLocation.getLongitude()); - if (googleMap != null) { - CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 8); - googleMap.animateCamera(position); - } + CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 8); + googleMap.animateCamera(position); } } } + } + }); + + ActionBarMenu menu = actionBar.createMenu(); + menu.addItem(map_to_my_location, R.drawable.ic_ab_location); + + ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other); + item.addSubItem(map_list_menu_map, LocaleController.getString("Map", R.string.Map), 0); + item.addSubItem(map_list_menu_satellite, LocaleController.getString("Satellite", R.string.Satellite), 0); + item.addSubItem(map_list_menu_hybrid, LocaleController.getString("Hybrid", R.string.Hybrid), 0); + + if (messageObject != null) { + fragmentView = inflater.inflate(R.layout.location_view_layout, null, false); + } else { + fragmentView = inflater.inflate(R.layout.location_attach_layout, null, false); + } + + avatarImageView = (BackupImageView) fragmentView.findViewById(R.id.location_avatar_view); + if (avatarImageView != null) { + avatarImageView.setRoundRadius(AndroidUtilities.dp(32)); + } + nameTextView = (TextView) fragmentView.findViewById(R.id.location_name_label); + distanceTextView = (TextView) fragmentView.findViewById(R.id.location_distance_label); + View bottomView = fragmentView.findViewById(R.id.location_bottom_view); + TextView sendButton = (TextView) fragmentView.findViewById(R.id.location_send_button); + if (sendButton != null) { + sendButton.setText(LocaleController.getString("SendLocation", R.string.SendLocation).toUpperCase()); + sendButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + } + + mapView = (MapView) fragmentView.findViewById(R.id.map_view); + mapView.onCreate(null); + try { + MapsInitializer.initialize(context); + googleMap = mapView.getMap(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + if (googleMap != null) { + googleMap.setMyLocationEnabled(true); + googleMap.getUiSettings().setMyLocationButtonEnabled(false); + googleMap.getUiSettings().setZoomControlsEnabled(false); + googleMap.getUiSettings().setCompassEnabled(false); + googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { + @Override + public void onMyLocationChange(Location location) { + positionMarker(location); + } }); + myLocation = getLastLocation(); - ActionBarMenu menu = actionBar.createMenu(); - menu.addItem(map_to_my_location, R.drawable.ic_ab_location); - - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other); - item.addSubItem(map_list_menu_map, LocaleController.getString("Map", R.string.Map), 0); - item.addSubItem(map_list_menu_satellite, LocaleController.getString("Satellite", R.string.Satellite), 0); - item.addSubItem(map_list_menu_hybrid, LocaleController.getString("Hybrid", R.string.Hybrid), 0); - - if (messageObject != null) { - fragmentView = inflater.inflate(R.layout.location_view_layout, null, false); - } else { - fragmentView = inflater.inflate(R.layout.location_attach_layout, null, false); - } - - avatarImageView = (BackupImageView)fragmentView.findViewById(R.id.location_avatar_view); - if (avatarImageView != null) { - avatarImageView.processDetach = false; - avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(32)); - } - nameTextView = (TextView)fragmentView.findViewById(R.id.location_name_label); - distanceTextView = (TextView)fragmentView.findViewById(R.id.location_distance_label); - View bottomView = fragmentView.findViewById(R.id.location_bottom_view); - TextView sendButton = (TextView) fragmentView.findViewById(R.id.location_send_button); if (sendButton != null) { - sendButton.setText(LocaleController.getString("SendLocation", R.string.SendLocation).toUpperCase()); - sendButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - } + userLocation = new Location("network"); + userLocation.setLatitude(20.659322); + userLocation.setLongitude(-11.406250); + LatLng latLng = new LatLng(20.659322, -11.406250); + userMarker = googleMap.addMarker(new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin)).draggable(true)); - mapView = (MapView)fragmentView.findViewById(R.id.map_view); - mapView.onCreate(null); - try { - MapsInitializer.initialize(getParentActivity()); - googleMap = mapView.getMap(); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - - if (googleMap != null) { - googleMap.setMyLocationEnabled(true); - googleMap.getUiSettings().setMyLocationButtonEnabled(false); - googleMap.getUiSettings().setZoomControlsEnabled(false); - googleMap.getUiSettings().setCompassEnabled(false); - googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { + sendButton.setOnClickListener(new View.OnClickListener() { @Override - public void onMyLocationChange(Location location) { - positionMarker(location); + public void onClick(View view) { + if (delegate != null) { + delegate.didSelectLocation(userLocation.getLatitude(), userLocation.getLongitude()); + } + finishFragment(); } }); - myLocation = getLastLocation(); - if (sendButton != null) { - userLocation = new Location("network"); - userLocation.setLatitude(20.659322); - userLocation.setLongitude(-11.406250); - LatLng latLng = new LatLng(20.659322, -11.406250); - userMarker = googleMap.addMarker(new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin)).draggable(true)); + googleMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { + @Override + public void onMarkerDragStart(Marker marker) { + } - sendButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (delegate != null) { - delegate.didSelectLocation(userLocation.getLatitude(), userLocation.getLongitude()); - } - finishFragment(); - } - }); + @Override + public void onMarkerDrag(Marker marker) { + userLocationMoved = true; + } - googleMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { - @Override - public void onMarkerDragStart(Marker marker) { - } - - @Override - public void onMarkerDrag(Marker marker) { - userLocationMoved = true; - } - - @Override - public void onMarkerDragEnd(Marker marker) { - LatLng latLng = marker.getPosition(); - userLocation.setLatitude(latLng.latitude); - userLocation.setLongitude(latLng.longitude); - } - }); - } - - if (bottomView != null) { - bottomView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (userLocation != null) { - LatLng latLng = new LatLng(userLocation.getLatitude(), userLocation.getLongitude()); - CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 8); - googleMap.animateCamera(position); - } - } - }); - } - - if (messageObject != null) { - updateUserData(); - userLocation = new Location("network"); - userLocation.setLatitude(messageObject.messageOwner.media.geo.lat); - userLocation.setLongitude(messageObject.messageOwner.media.geo._long); - LatLng latLng = new LatLng(userLocation.getLatitude(), userLocation.getLongitude()); - userMarker = googleMap.addMarker(new MarkerOptions().position(latLng). - icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin))); - CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 8); - googleMap.moveCamera(position); - } - - positionMarker(myLocation); + @Override + public void onMarkerDragEnd(Marker marker) { + LatLng latLng = marker.getPosition(); + userLocation.setLatitude(latLng.latitude); + userLocation.setLongitude(latLng.longitude); + } + }); } - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + + if (bottomView != null) { + bottomView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (userLocation != null) { + LatLng latLng = new LatLng(userLocation.getLatitude(), userLocation.getLongitude()); + CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 8); + googleMap.animateCamera(position); + } + } + }); } + + if (messageObject != null) { + userLocation = new Location("network"); + userLocation.setLatitude(messageObject.messageOwner.media.geo.lat); + userLocation.setLongitude(messageObject.messageOwner.media.geo._long); + LatLng latLng = new LatLng(userLocation.getLatitude(), userLocation.getLongitude()); + userMarker = googleMap.addMarker(new MarkerOptions().position(latLng). + icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin))); + CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 8); + googleMap.moveCamera(position); + } + + positionMarker(myLocation); } + return fragmentView; } @@ -297,7 +286,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (userLocation != null && distanceTextView != null) { float distance = location.distanceTo(userLocation); if (distance < 1000) { - distanceTextView.setText(String.format("%d %s", (int)(distance), LocaleController.getString("MetersAway", R.string.MetersAway))); + distanceTextView.setText(String.format("%d %s", (int) (distance), LocaleController.getString("MetersAway", R.string.MetersAway))); } else { distanceTextView.setText(String.format("%.2f %s", distance / 1000.0f, LocaleController.getString("KMetersAway", R.string.KMetersAway))); } @@ -326,7 +315,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter @Override public void didReceivedNotification(int id, Object... args) { if (id == NotificationCenter.updateInterfaces) { - int mask = (Integer)args[0]; + int mask = (Integer) args[0]; if ((mask & MessagesController.UPDATE_MASK_AVATAR) != 0 || (mask & MessagesController.UPDATE_MASK_NAME) != 0) { updateUserData(); } @@ -353,6 +342,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (mapView != null) { mapView.onResume(); } + updateUserData(); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 90b6a3fe1..b7b6fcf7c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -16,8 +16,10 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; +import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; +import android.os.Vibrator; import android.telephony.TelephonyManager; import android.text.Editable; import android.text.InputFilter; @@ -26,12 +28,12 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; +import android.text.method.PasswordTransformationMethod; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.inputmethod.EditorInfo; @@ -80,7 +82,7 @@ import java.util.TimerTask; public class LoginActivity extends BaseFragment { private int currentViewNum = 0; - private SlideView[] views = new SlideView[3]; + private SlideView[] views = new SlideView[5]; private ProgressDialog progressDialog; private final static int done_button = 1; @@ -104,104 +106,72 @@ public class LoginActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == done_button) { - views[currentViewNum].onNextPressed(); - } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == done_button) { + views[currentViewNum].onNextPressed(); + } else if (id == -1) { + onBackPressed(); } - }); - - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - fragmentView = new ScrollView(getParentActivity()); - ScrollView scrollView = (ScrollView) fragmentView; - scrollView.setFillViewport(true); - - FrameLayout frameLayout = new FrameLayout(getParentActivity()); - scrollView.addView(frameLayout); - ScrollView.LayoutParams layoutParams = (ScrollView.LayoutParams) frameLayout.getLayoutParams(); - layoutParams.width = ScrollView.LayoutParams.MATCH_PARENT; - layoutParams.height = ScrollView.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - frameLayout.setLayoutParams(layoutParams); - - views[0] = new PhoneView(getParentActivity()); - views[0].setVisibility(View.VISIBLE); - frameLayout.addView(views[0]); - FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) views[0].getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.leftMargin = AndroidUtilities.dp(16); - layoutParams1.rightMargin = AndroidUtilities.dp(16); - layoutParams1.topMargin = AndroidUtilities.dp(30); - layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; - views[0].setLayoutParams(layoutParams1); - - views[1] = new LoginActivitySmsView(getParentActivity()); - views[1].setVisibility(View.GONE); - frameLayout.addView(views[1]); - layoutParams1 = (FrameLayout.LayoutParams) views[1].getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.leftMargin = AndroidUtilities.dp(16); - layoutParams1.rightMargin = AndroidUtilities.dp(16); - layoutParams1.topMargin = AndroidUtilities.dp(30); - layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; - views[1].setLayoutParams(layoutParams1); - - views[2] = new RegisterView(getParentActivity()); - views[2].setVisibility(View.GONE); - frameLayout.addView(views[2]); - layoutParams1 = (FrameLayout.LayoutParams) views[2].getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.leftMargin = AndroidUtilities.dp(16); - layoutParams1.rightMargin = AndroidUtilities.dp(16); - layoutParams1.topMargin = AndroidUtilities.dp(30); - layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; - views[2].setLayoutParams(layoutParams1); - - try { - if (views[0] == null || views[1] == null || views[2] == null) { - FrameLayout parent = (FrameLayout)((ScrollView) fragmentView).getChildAt(0); - for (int a = 0; a < views.length; a++) { - if (views[a] == null) { - views[a] = (SlideView)parent.getChildAt(a); - } - } - } - } catch (Exception e) { - FileLog.e("tmessages", e); } + }); - actionBar.setTitle(views[0].getHeaderName()); + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - Bundle savedInstanceState = loadCurrentState(); + fragmentView = new ScrollView(context); + ScrollView scrollView = (ScrollView) fragmentView; + scrollView.setFillViewport(true); + + FrameLayout frameLayout = new FrameLayout(context); + scrollView.addView(frameLayout); + ScrollView.LayoutParams layoutParams = (ScrollView.LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = ScrollView.LayoutParams.MATCH_PARENT; + layoutParams.height = ScrollView.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + frameLayout.setLayoutParams(layoutParams); + + views[0] = new PhoneView(context); + views[1] = new LoginActivitySmsView(context); + views[2] = new LoginActivityRegisterView(context); + views[3] = new LoginActivityPasswordView(context); + views[4] = new LoginActivityRecoverView(context); + + for (int a = 0; a < 5; a++) { + views[a].setVisibility(a == 0 ? View.VISIBLE : View.GONE); + frameLayout.addView(views[a]); + FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) views[a].getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = a == 0 ? FrameLayout.LayoutParams.WRAP_CONTENT : FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.leftMargin = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18); + layoutParams1.rightMargin = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18); + layoutParams1.topMargin = AndroidUtilities.dp(30); + layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; + views[a].setLayoutParams(layoutParams1); + } + + Bundle savedInstanceState = loadCurrentState(); + if (savedInstanceState != null) { + currentViewNum = savedInstanceState.getInt("currentViewNum", 0); + } + actionBar.setTitle(views[currentViewNum].getHeaderName()); + for (int a = 0; a < views.length; a++) { if (savedInstanceState != null) { - currentViewNum = savedInstanceState.getInt("currentViewNum", 0); + views[a].restoreStateParams(savedInstanceState); } - for (int a = 0; a < views.length; a++) { - SlideView v = views[a]; - if (v != null) { - if (savedInstanceState != null) { - v.restoreStateParams(savedInstanceState); - } - v.setVisibility(currentViewNum == a ? View.VISIBLE : View.GONE); - } - } - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + if (currentViewNum == a) { + actionBar.setBackButtonImage(views[a].needBackButton() ? R.drawable.ic_ab_back : 0); + views[a].setVisibility(View.VISIBLE); + views[a].onShow(); + } else { + views[a].setVisibility(View.GONE); } } + return fragmentView; } @@ -280,7 +250,7 @@ public class LoginActivity extends BaseFragment { editor.putInt(key, (Integer) obj); } } else if (obj instanceof Bundle) { - putBundleToEditor((Bundle)obj, editor, key); + putBundleToEditor((Bundle) obj, editor, key); } } } @@ -295,18 +265,22 @@ public class LoginActivity extends BaseFragment { } clearCurrentState(); return true; - } else if (currentViewNum != 1 && currentViewNum != 2) { + } else if (currentViewNum == 3) { + views[currentViewNum].onBackPressed(); setPage(0, true, null, true); + } else if (currentViewNum == 4) { + views[currentViewNum].onBackPressed(); + setPage(3, true, null, true); } return false; } - public void needShowAlert(final String text) { + public void needShowAlert(String title, String text) { if (text == null || getParentActivity() == null) { return; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setTitle(title); builder.setMessage(text); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); showAlertDialog(builder); @@ -336,10 +310,11 @@ public class LoginActivity extends BaseFragment { } public void setPage(int page, boolean animated, Bundle params, boolean back) { - if(android.os.Build.VERSION.SDK_INT > 13) { + if (android.os.Build.VERSION.SDK_INT > 13) { final SlideView outView = views[currentViewNum]; final SlideView newView = views[page]; currentViewNum = page; + actionBar.setBackButtonImage(newView.needBackButton() ? R.drawable.ic_ab_back : 0); newView.setParams(params); actionBar.setTitle(newView.getHeaderName()); @@ -383,6 +358,7 @@ public class LoginActivity extends BaseFragment { } }).setDuration(300).translationX(0).start(); } else { + actionBar.setBackButtonImage(views[page].needBackButton() ? R.drawable.ic_ab_back : 0); views[currentViewNum].setVisibility(View.GONE); currentViewNum = page; views[page].setParams(params); @@ -415,12 +391,8 @@ public class LoginActivity extends BaseFragment { public void needFinishActivity() { clearCurrentState(); - if (UserConfig.isWaitingForPasswordEnter()) { - presentFragment(new AccountPasswordActivity(1), true); - } else { - presentFragment(new MessagesActivity(null), true); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); - } + presentFragment(new MessagesActivity(null), true); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); } public class PhoneView extends SlideView implements AdapterView.OnItemSelectedListener { @@ -458,8 +430,6 @@ public class LoginActivity extends BaseFragment { LayoutParams layoutParams = (LayoutParams) countryButton.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(20); - layoutParams.rightMargin = AndroidUtilities.dp(20); layoutParams.bottomMargin = AndroidUtilities.dp(14); countryButton.setLayoutParams(layoutParams); countryButton.setOnClickListener(new OnClickListener() { @@ -484,9 +454,9 @@ public class LoginActivity extends BaseFragment { layoutParams = (LayoutParams) view.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = 1; - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); layoutParams.topMargin = AndroidUtilities.dp(-17.5f); + layoutParams.leftMargin = AndroidUtilities.dp(4); + layoutParams.rightMargin = AndroidUtilities.dp(4); view.setLayoutParams(layoutParams); LinearLayout linearLayout = new LinearLayout(context); @@ -506,7 +476,6 @@ public class LoginActivity extends BaseFragment { layoutParams = (LayoutParams) textView.getLayoutParams(); layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(24); textView.setLayoutParams(layoutParams); codeField = new EditText(context); @@ -598,7 +567,6 @@ public class LoginActivity extends BaseFragment { layoutParams = (LayoutParams) phoneField.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(36); - layoutParams.rightMargin = AndroidUtilities.dp(24); phoneField.setLayoutParams(layoutParams); phoneField.addTextChangedListener(new TextWatcher() { @Override @@ -616,7 +584,7 @@ public class LoginActivity extends BaseFragment { int toDelete = 0; for (int a = start; a >= 0; a--) { substr = str.substring(a, a + 1); - if(phoneChars.contains(substr)) { + if (phoneChars.contains(substr)) { break; } toDelete++; @@ -668,8 +636,6 @@ public class LoginActivity extends BaseFragment { layoutParams = (LayoutParams) textView.getLayoutParams(); layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); layoutParams.topMargin = AndroidUtilities.dp(28); layoutParams.bottomMargin = AndroidUtilities.dp(10); layoutParams.gravity = Gravity.LEFT; @@ -701,7 +667,7 @@ public class LoginActivity extends BaseFragment { String country = null; try { - TelephonyManager telephonyManager = (TelephonyManager)ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE); + TelephonyManager telephonyManager = (TelephonyManager) ApplicationLoader.applicationContext.getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { country = telephonyManager.getSimCountryIso().toUpperCase(); } @@ -793,14 +759,14 @@ public class LoginActivity extends BaseFragment { return; } if (countryState == 1) { - needShowAlert(LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); return; } else if (countryState == 2 && !BuildVars.DEBUG_VERSION) { - needShowAlert(LocaleController.getString("WrongCountry", R.string.WrongCountry)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("WrongCountry", R.string.WrongCountry)); return; } if (codeField.length() == 0) { - needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); return; } TLRPC.TL_auth_sendCode req = new TLRPC.TL_auth_sendCode(); @@ -834,22 +800,22 @@ public class LoginActivity extends BaseFragment { public void run() { nextPressed = false; if (error == null) { - final TLRPC.TL_auth_sentCode res = (TLRPC.TL_auth_sentCode)response; + final TLRPC.TL_auth_sentCode res = (TLRPC.TL_auth_sentCode) response; params.putString("phoneHash", res.phone_code_hash); params.putInt("calltime", res.send_call_timeout * 1000); setPage(1, true, params, false); } else { if (error.text != null) { if (error.text.contains("PHONE_NUMBER_INVALID")) { - needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); } else if (error.text.contains("PHONE_CODE_EXPIRED")) { - needShowAlert(LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); } else if (error.code != -1000) { - needShowAlert(error.text); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); } } } @@ -936,8 +902,6 @@ public class LoginActivity extends BaseFragment { layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.LEFT; - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); confirmTextView.setLayoutParams(layoutParams); codeField = new EditText(context); @@ -956,8 +920,6 @@ public class LoginActivity extends BaseFragment { layoutParams.height = AndroidUtilities.dp(36); layoutParams.gravity = Gravity.CENTER_HORIZONTAL; layoutParams.topMargin = AndroidUtilities.dp(20); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); codeField.setLayoutParams(layoutParams); codeField.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override @@ -981,8 +943,6 @@ public class LoginActivity extends BaseFragment { layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.LEFT; layoutParams.topMargin = AndroidUtilities.dp(30); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); timeText.setLayoutParams(layoutParams); problemText = new TextView(context); @@ -999,8 +959,6 @@ public class LoginActivity extends BaseFragment { layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.LEFT; layoutParams.topMargin = AndroidUtilities.dp(20); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); problemText.setLayoutParams(layoutParams); problemText.setOnClickListener(new OnClickListener() { @Override @@ -1016,7 +974,7 @@ public class LoginActivity extends BaseFragment { mailer.putExtra(Intent.EXTRA_TEXT, "Phone: " + requestPhone + "\nApp version: " + version + "\nOS version: SDK " + Build.VERSION.SDK_INT + "\nDevice Name: " + Build.MANUFACTURER + Build.MODEL + "\nLocale: " + Locale.getDefault() + "\nError: " + lastError); getContext().startActivity(Intent.createChooser(mailer, "Send email...")); } catch (Exception e) { - needShowAlert(LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); } } }); @@ -1041,8 +999,6 @@ public class LoginActivity extends BaseFragment { layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; layoutParams.bottomMargin = AndroidUtilities.dp(10); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); wrongNumber.setLayoutParams(layoutParams); wrongNumber.setText(LocaleController.getString("WrongNumber", R.string.WrongNumber)); wrongNumber.setOnClickListener(new OnClickListener() { @@ -1133,7 +1089,7 @@ public class LoginActivity extends BaseFragment { private void destroyCodeTimer() { try { - synchronized(timerSync) { + synchronized (timerSync) { if (codeTimer != null) { codeTimer.cancel(); codeTimer = null; @@ -1192,7 +1148,7 @@ public class LoginActivity extends BaseFragment { private void destroyTimer() { try { - synchronized(timerSync) { + synchronized (timerSync) { if (timeTimer != null) { timeTimer.cancel(); timeTimer = null; @@ -1224,10 +1180,10 @@ public class LoginActivity extends BaseFragment { AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { - needHideProgress(); nextPressed = false; if (error == null) { - TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization)response; + needHideProgress(); + TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization) response; destroyTimer(); destroyCodeTimer(); UserConfig.clearConfig(); @@ -1253,6 +1209,7 @@ public class LoginActivity extends BaseFragment { lastError = error.text; if (error.text.contains("PHONE_NUMBER_UNOCCUPIED")) { + needHideProgress(); Bundle params = new Bundle(); params.putString("phoneFormated", requestPhone); params.putString("phoneHash", phoneHash); @@ -1261,21 +1218,47 @@ public class LoginActivity extends BaseFragment { destroyTimer(); destroyCodeTimer(); } else if (error.text.contains("SESSION_PASSWORD_NEEDED")) { - needFinishActivity(); + TLRPC.TL_account_getPassword req2 = new TLRPC.TL_account_getPassword(); + ConnectionsManager.getInstance().performRpc(req2, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + if (error == null) { + TLRPC.TL_account_password password = (TLRPC.TL_account_password) response; + Bundle bundle = new Bundle(); + bundle.putString("current_salt", Utilities.bytesToHex(password.current_salt)); + bundle.putString("hint", password.hint); + bundle.putString("email_unconfirmed_pattern", password.email_unconfirmed_pattern); + bundle.putString("phoneFormated", requestPhone); + bundle.putString("phoneHash", phoneHash); + bundle.putString("code", req.phone_code); + bundle.putInt("has_recovery", password.has_recovery ? 1 : 0); + setPage(3, true, bundle, false); + } else { + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); destroyTimer(); destroyCodeTimer(); } else { + needHideProgress(); createTimer(); if (error.text.contains("PHONE_NUMBER_INVALID")) { - needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); } else if (error.text.contains("PHONE_CODE_EXPIRED")) { - needShowAlert(LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait)); } else { - needShowAlert(error.text); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); } } } @@ -1363,7 +1346,635 @@ public class LoginActivity extends BaseFragment { } } - public class RegisterView extends SlideView { + public class LoginActivityPasswordView extends SlideView { + + private EditText codeField; + private TextView confirmTextView; + private TextView resetAccountButton; + private TextView resetAccountText; + + private Bundle currentParams; + private boolean nextPressed; + private byte[] current_salt; + private String hint; + private String email_unconfirmed_pattern; + private boolean has_recovery; + private String requestPhone; + private String phoneHash; + private String phoneCode; + + public LoginActivityPasswordView(Context context) { + super(context); + + setOrientation(VERTICAL); + + confirmTextView = new TextView(context); + confirmTextView.setTextColor(0xff757575); + confirmTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + confirmTextView.setGravity(Gravity.LEFT); + confirmTextView.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + confirmTextView.setText(LocaleController.getString("LoginPasswordText", R.string.LoginPasswordText)); + addView(confirmTextView); + LayoutParams layoutParams = (LayoutParams) confirmTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.LEFT; + confirmTextView.setLayoutParams(layoutParams); + + codeField = new EditText(context); + codeField.setTextColor(0xff212121); + AndroidUtilities.clearCursorDrawable(codeField); + codeField.setHintTextColor(0xff979797); + codeField.setHint(LocaleController.getString("LoginPassword", R.string.LoginPassword)); + codeField.setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI); + codeField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + codeField.setMaxLines(1); + codeField.setPadding(0, 0, 0, 0); + codeField.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + codeField.setTransformationMethod(PasswordTransformationMethod.getInstance()); + codeField.setTypeface(Typeface.DEFAULT); + addView(codeField); + layoutParams = (LayoutParams) codeField.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams.topMargin = AndroidUtilities.dp(20); + codeField.setLayoutParams(layoutParams); + codeField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT) { + onNextPressed(); + return true; + } + return false; + } + }); + + TextView cancelButton = new TextView(context); + cancelButton.setGravity(Gravity.LEFT | Gravity.TOP); + cancelButton.setTextColor(0xff4d83b3); + cancelButton.setText(LocaleController.getString("ForgotPassword", R.string.ForgotPassword)); + cancelButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + cancelButton.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + cancelButton.setPadding(0, AndroidUtilities.dp(14), 0, 0); + addView(cancelButton); + layoutParams = (LayoutParams) cancelButton.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + cancelButton.setLayoutParams(layoutParams); + cancelButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (has_recovery) { + needShowProgress(); + TLRPC.TL_auth_requestPasswordRecovery req = new TLRPC.TL_auth_requestPasswordRecovery(); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + if (error == null) { + final TLRPC.TL_auth_passwordRecovery res = (TLRPC.TL_auth_passwordRecovery) response; + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.formatString("RestoreEmailSent", R.string.RestoreEmailSent, res.email_pattern)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Bundle bundle = new Bundle(); + bundle.putString("email_unconfirmed_pattern", res.email_pattern); + setPage(4, true, bundle, false); + } + }); + AlertDialog dialog = showAlertDialog(builder); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } else { + if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } else { + resetAccountText.setVisibility(VISIBLE); + resetAccountButton.setVisibility(VISIBLE); + AndroidUtilities.hideKeyboard(codeField); + needShowAlert(LocaleController.getString("RestorePasswordNoEmailTitle", R.string.RestorePasswordNoEmailTitle), LocaleController.getString("RestorePasswordNoEmailText", R.string.RestorePasswordNoEmailText)); + } + } + }); + + resetAccountButton = new TextView(context); + resetAccountButton.setGravity(Gravity.LEFT | Gravity.TOP); + resetAccountButton.setTextColor(0xffff6666); + resetAccountButton.setVisibility(GONE); + resetAccountButton.setText(LocaleController.getString("ResetMyAccount", R.string.ResetMyAccount)); + resetAccountButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + resetAccountButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + resetAccountButton.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + resetAccountButton.setPadding(0, AndroidUtilities.dp(14), 0, 0); + addView(resetAccountButton); + layoutParams = (LayoutParams) resetAccountButton.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.topMargin = AndroidUtilities.dp(34); + resetAccountButton.setLayoutParams(layoutParams); + resetAccountButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("ResetMyAccountWarningText", R.string.ResetMyAccountWarningText)); + builder.setTitle(LocaleController.getString("ResetMyAccountWarning", R.string.ResetMyAccountWarning)); + builder.setPositiveButton(LocaleController.getString("ResetMyAccountWarningReset", R.string.ResetMyAccountWarningReset), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + needShowProgress(); + TLRPC.TL_account_deleteAccount req = new TLRPC.TL_account_deleteAccount(); + req.reason = "Forgot password"; + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + if (error == null) { + Bundle params = new Bundle(); + params.putString("phoneFormated", requestPhone); + params.putString("phoneHash", phoneHash); + params.putString("code", phoneCode); + setPage(2, true, params, false); + } else { + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassWithoutLogin | RPCRequest.RPCRequestClassFailOnServerErrors); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + }); + + resetAccountText = new TextView(context); + resetAccountText.setGravity(Gravity.LEFT | Gravity.TOP); + resetAccountText.setVisibility(GONE); + resetAccountText.setTextColor(0xff757575); + resetAccountText.setText(LocaleController.getString("ResetMyAccountText", R.string.ResetMyAccountText)); + resetAccountText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + resetAccountText.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + addView(resetAccountText); + layoutParams = (LayoutParams) resetAccountText.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.bottomMargin = AndroidUtilities.dp(14); + layoutParams.topMargin = AndroidUtilities.dp(7); + resetAccountText.setLayoutParams(layoutParams); + } + + @Override + public String getHeaderName() { + return LocaleController.getString("LoginPassword", R.string.LoginPassword); + } + + @Override + public void setParams(Bundle params) { + if (params == null) { + return; + } + if (params.isEmpty()) { + resetAccountButton.setVisibility(VISIBLE); + resetAccountText.setVisibility(VISIBLE); + AndroidUtilities.hideKeyboard(codeField); + return; + } + resetAccountButton.setVisibility(GONE); + resetAccountText.setVisibility(GONE); + codeField.setText(""); + currentParams = params; + current_salt = Utilities.hexToBytes(currentParams.getString("current_salt")); + hint = currentParams.getString("hint"); + has_recovery = currentParams.getInt("has_recovery") == 1; + email_unconfirmed_pattern = currentParams.getString("email_unconfirmed_pattern"); + requestPhone = params.getString("phoneFormated"); + phoneHash = params.getString("phoneHash"); + phoneCode = params.getString("code"); + + AndroidUtilities.showKeyboard(codeField); + codeField.requestFocus(); + + + if (hint != null && hint.length() > 0) { + codeField.setHint(hint); + } else { + codeField.setHint(LocaleController.getString("LoginPassword", R.string.LoginPassword)); + } + } + + private void onPasscodeError(boolean clear) { + if (getParentActivity() == null) { + return; + } + Vibrator v = (Vibrator) getParentActivity().getSystemService(Context.VIBRATOR_SERVICE); + if (v != null) { + v.vibrate(200); + } + if (clear) { + codeField.setText(""); + } + AndroidUtilities.shakeTextView(confirmTextView, 2, 0); + } + + @Override + public void onNextPressed() { + if (nextPressed) { + return; + } + + String oldPassword = codeField.getText().toString(); + if (oldPassword.length() == 0) { + onPasscodeError(false); + return; + } + nextPressed = true; + byte[] oldPasswordBytes = null; + try { + oldPasswordBytes = oldPassword.getBytes("UTF-8"); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + needShowProgress(); + byte[] hash = new byte[current_salt.length * 2 + oldPasswordBytes.length]; + System.arraycopy(current_salt, 0, hash, 0, current_salt.length); + System.arraycopy(oldPasswordBytes, 0, hash, current_salt.length, oldPasswordBytes.length); + System.arraycopy(current_salt, 0, hash, hash.length - current_salt.length, current_salt.length); + + final TLRPC.TL_auth_checkPassword req = new TLRPC.TL_auth_checkPassword(); + req.password_hash = Utilities.computeSHA256(hash, 0, hash.length); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + nextPressed = false; + if (error == null) { + TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization) response; + UserConfig.clearConfig(); + MessagesController.getInstance().cleanUp(); + UserConfig.setCurrentUser(res.user); + UserConfig.saveConfig(true); + MessagesStorage.getInstance().cleanUp(true); + ArrayList users = new ArrayList<>(); + users.add(res.user); + MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); + MessagesController.getInstance().putUser(res.user, false); + ContactsController.getInstance().checkAppAccount(); + MessagesController.getInstance().getBlockedUsers(true); + needFinishActivity(); + ConnectionsManager.getInstance().initPushConnection(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + ConnectionsManager.getInstance().updateDcSettings(0); + } + }); + } else { + if (error.text.equals("PASSWORD_HASH_INVALID")) { + onPasscodeError(true); + } else if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } + + @Override + public boolean needBackButton() { + return true; + } + + @Override + public void onBackPressed() { + currentParams = null; + } + + @Override + public void onShow() { + super.onShow(); + if (codeField != null) { + codeField.requestFocus(); + codeField.setSelection(codeField.length()); + } + } + + @Override + public void saveStateParams(Bundle bundle) { + String code = codeField.getText().toString(); + if (code != null && code.length() != 0) { + bundle.putString("passview_code", code); + } + if (currentParams != null) { + bundle.putBundle("passview_params", currentParams); + } + } + + @Override + public void restoreStateParams(Bundle bundle) { + currentParams = bundle.getBundle("passview_params"); + if (currentParams != null) { + setParams(currentParams); + } + String code = bundle.getString("passview_code"); + if (code != null) { + codeField.setText(code); + } + } + } + + public class LoginActivityRecoverView extends SlideView { + + private EditText codeField; + private TextView confirmTextView; + private TextView cancelButton; + + private Bundle currentParams; + private boolean nextPressed; + private String email_unconfirmed_pattern; + + public LoginActivityRecoverView(Context context) { + super(context); + + setOrientation(VERTICAL); + + confirmTextView = new TextView(context); + confirmTextView.setTextColor(0xff757575); + confirmTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + confirmTextView.setGravity(Gravity.LEFT); + confirmTextView.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + confirmTextView.setText(LocaleController.getString("RestoreEmailSentInfo", R.string.RestoreEmailSentInfo)); + addView(confirmTextView); + LayoutParams layoutParams = (LayoutParams) confirmTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.LEFT; + confirmTextView.setLayoutParams(layoutParams); + + codeField = new EditText(context); + codeField.setTextColor(0xff212121); + AndroidUtilities.clearCursorDrawable(codeField); + codeField.setHintTextColor(0xff979797); + codeField.setHint(LocaleController.getString("PasswordCode", R.string.PasswordCode)); + codeField.setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI); + codeField.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + codeField.setMaxLines(1); + codeField.setPadding(0, 0, 0, 0); + codeField.setInputType(InputType.TYPE_CLASS_PHONE); + codeField.setTransformationMethod(PasswordTransformationMethod.getInstance()); + codeField.setTypeface(Typeface.DEFAULT); + addView(codeField); + layoutParams = (LayoutParams) codeField.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams.topMargin = AndroidUtilities.dp(20); + codeField.setLayoutParams(layoutParams); + codeField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT) { + onNextPressed(); + return true; + } + return false; + } + }); + + cancelButton = new TextView(context); + cancelButton.setGravity(Gravity.LEFT | Gravity.BOTTOM); + cancelButton.setTextColor(0xff4d83b3); + cancelButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + cancelButton.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + cancelButton.setPadding(0, AndroidUtilities.dp(14), 0, 0); + addView(cancelButton); + layoutParams = (LayoutParams) cancelButton.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; + layoutParams.bottomMargin = AndroidUtilities.dp(14); + cancelButton.setLayoutParams(layoutParams); + cancelButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("RestoreEmailTroubleText", R.string.RestoreEmailTroubleText)); + builder.setTitle(LocaleController.getString("RestorePasswordNoEmailTitle", R.string.RestorePasswordNoEmailTitle)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + setPage(3, true, new Bundle(), true); + } + }); + AlertDialog dialog = showAlertDialog(builder); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } + }); + } + + @Override + public boolean needBackButton() { + return true; + } + + @Override + public String getHeaderName() { + return LocaleController.getString("LoginPassword", R.string.LoginPassword); + } + + @Override + public void setParams(Bundle params) { + if (params == null) { + return; + } + codeField.setText(""); + currentParams = params; + email_unconfirmed_pattern = currentParams.getString("email_unconfirmed_pattern"); + cancelButton.setText(LocaleController.formatString("RestoreEmailTrouble", R.string.RestoreEmailTrouble, email_unconfirmed_pattern)); + + AndroidUtilities.showKeyboard(codeField); + codeField.requestFocus(); + } + + private void onPasscodeError(boolean clear) { + if (getParentActivity() == null) { + return; + } + Vibrator v = (Vibrator) getParentActivity().getSystemService(Context.VIBRATOR_SERVICE); + if (v != null) { + v.vibrate(200); + } + if (clear) { + codeField.setText(""); + } + AndroidUtilities.shakeTextView(confirmTextView, 2, 0); + } + + @Override + public void onNextPressed() { + if (nextPressed) { + return; + } + + String oldPassword = codeField.getText().toString(); + if (oldPassword.length() == 0) { + onPasscodeError(false); + return; + } + nextPressed = true; + byte[] oldPasswordBytes = null; + try { + oldPasswordBytes = oldPassword.getBytes("UTF-8"); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + String code = codeField.getText().toString(); + if (code.length() == 0) { + onPasscodeError(false); + return; + } + needShowProgress(); + TLRPC.TL_auth_recoverPassword req = new TLRPC.TL_auth_recoverPassword(); + req.code = code; + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + nextPressed = false; + if (error == null) { + TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization) response; + UserConfig.clearConfig(); + MessagesController.getInstance().cleanUp(); + UserConfig.setCurrentUser(res.user); + UserConfig.saveConfig(true); + MessagesStorage.getInstance().cleanUp(true); + ArrayList users = new ArrayList<>(); + users.add(res.user); + MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); + MessagesController.getInstance().putUser(res.user, false); + ContactsController.getInstance().checkAppAccount(); + MessagesController.getInstance().getBlockedUsers(true); + needFinishActivity(); + ConnectionsManager.getInstance().initPushConnection(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + ConnectionsManager.getInstance().updateDcSettings(0); + } + }); + } else { + if (error.text.startsWith("CODE_INVALID")) { + onPasscodeError(true); + } else if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } + + @Override + public void onBackPressed() { + currentParams = null; + } + + @Override + public void onShow() { + super.onShow(); + if (codeField != null) { + codeField.requestFocus(); + codeField.setSelection(codeField.length()); + } + } + + @Override + public void saveStateParams(Bundle bundle) { + String code = codeField.getText().toString(); + if (code != null && code.length() != 0) { + bundle.putString("recoveryview_code", code); + } + if (currentParams != null) { + bundle.putBundle("recoveryview_params", currentParams); + } + } + + @Override + public void restoreStateParams(Bundle bundle) { + currentParams = bundle.getBundle("recoveryview_params"); + if (currentParams != null) { + setParams(currentParams); + } + String code = bundle.getString("recoveryview_code"); + if (code != null) { + codeField.setText(code); + } + } + } + + public class LoginActivityRegisterView extends SlideView { private EditText firstNameField; private EditText lastNameField; @@ -1373,7 +1984,7 @@ public class LoginActivity extends BaseFragment { private Bundle currentParams; private boolean nextPressed = false; - public RegisterView(Context context) { + public LoginActivityRegisterView(Context context) { super(context); setOrientation(VERTICAL); @@ -1388,8 +1999,6 @@ public class LoginActivity extends BaseFragment { layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.topMargin = AndroidUtilities.dp(8); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); layoutParams.gravity = Gravity.LEFT; textView.setLayoutParams(layoutParams); @@ -1406,8 +2015,6 @@ public class LoginActivity extends BaseFragment { layoutParams = (LayoutParams) firstNameField.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); layoutParams.topMargin = AndroidUtilities.dp(26); firstNameField.setLayoutParams(layoutParams); firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { @@ -1434,8 +2041,6 @@ public class LoginActivity extends BaseFragment { layoutParams = (LayoutParams) lastNameField.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); layoutParams.topMargin = AndroidUtilities.dp(10); lastNameField.setLayoutParams(layoutParams); @@ -1460,8 +2065,6 @@ public class LoginActivity extends BaseFragment { layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; layoutParams.bottomMargin = AndroidUtilities.dp(10); - layoutParams.leftMargin = AndroidUtilities.dp(24); - layoutParams.rightMargin = AndroidUtilities.dp(24); wrongNumber.setLayoutParams(layoutParams); wrongNumber.setOnClickListener(new OnClickListener() { @Override @@ -1560,23 +2163,23 @@ public class LoginActivity extends BaseFragment { }); } else { if (error.text.contains("PHONE_NUMBER_INVALID")) { - needShowAlert(LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) { - needShowAlert(LocaleController.getString("InvalidCode", R.string.InvalidCode)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode)); } else if (error.text.contains("PHONE_CODE_EXPIRED")) { - needShowAlert(LocaleController.getString("CodeExpired", R.string.CodeExpired)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired)); } else if (error.text.contains("FIRSTNAME_INVALID")) { - needShowAlert(LocaleController.getString("InvalidFirstName", R.string.InvalidFirstName)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidFirstName", R.string.InvalidFirstName)); } else if (error.text.contains("LASTNAME_INVALID")) { - needShowAlert(LocaleController.getString("InvalidLastName", R.string.InvalidLastName)); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidLastName", R.string.InvalidLastName)); } else { - needShowAlert(error.text); + needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text); } } } }); } - }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassWithoutLogin); + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassWithoutLogin | RPCRequest.RPCRequestClassFailOnServerErrors); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java index a34f7e354..90d6f84fb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java @@ -216,364 +216,358 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setTitle(""); - actionBar.setAllowOverlayTitle(false); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - if (Build.VERSION.SDK_INT < 11 && listView != null) { - listView.setAdapter(null); - listView = null; - photoVideoAdapter = null; - documentsAdapter = null; - } - finishFragment(); - } else if (id == -2) { - selectedFiles.clear(); - actionBar.hideActionMode(); - listView.invalidateViews(); - } else if (id == shared_media_item) { - if (selectedMode == 0) { - return; - } - selectedMode = 0; - switchToCurrentSelectedMode(); - } else if (id == files_item) { - if (selectedMode == 1) { - return; - } - selectedMode = 1; - switchToCurrentSelectedMode(); - } else if (id == delete) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("items", selectedFiles.size()))); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ArrayList ids = new ArrayList<>(selectedFiles.keySet()); - ArrayList random_ids = null; - TLRPC.EncryptedChat currentEncryptedChat = null; - if ((int) dialog_id == 0) { - currentEncryptedChat = MessagesController.getInstance().getEncryptedChat((int) (dialog_id >> 32)); - } - if (currentEncryptedChat != null) { - random_ids = new ArrayList<>(); - for (HashMap.Entry entry : selectedFiles.entrySet()) { - MessageObject msg = entry.getValue(); - if (msg.messageOwner.random_id != 0 && msg.type != 10) { - random_ids.add(msg.messageOwner.random_id); - } - } - } - MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat); - actionBar.hideActionMode(); - selectedFiles.clear(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (id == forward) { - Bundle args = new Bundle(); - args.putBoolean("onlySelect", true); - args.putBoolean("serverOnly", true); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(new MessagesActivity.MessagesActivityDelegate() { - @Override - public void didSelectDialog(MessagesActivity fragment, long did, boolean param) { - int lower_part = (int)did; - if (lower_part != 0) { - Bundle args = new Bundle(); - args.putBoolean("scrollToTopOnResume", true); - if (lower_part > 0) { - args.putInt("user_id", lower_part); - } else if (lower_part < 0) { - args.putInt("chat_id", -lower_part); - } - - ArrayList fmessages = new ArrayList<>(); - ArrayList ids = new ArrayList<>(selectedFiles.keySet()); - Collections.sort(ids); - for (Integer id : ids) { - if (id > 0) { - fmessages.add(selectedFiles.get(id)); - } - } - selectedFiles.clear(); - actionBar.hideActionMode(); - - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - ChatActivity chatActivity = new ChatActivity(args); - presentFragment(chatActivity, true); - chatActivity.showReplyForMessageObjectOrForward(true, null, fmessages, false); - - if (!AndroidUtilities.isTablet()) { - removeSelfFromStack(); - Activity parentActivity = getParentActivity(); - if (parentActivity == null) { - parentActivity = chatActivity.getParentActivity(); - } - if (parentActivity != null) { - parentActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - } - } - } else { - fragment.finishFragment(); - } - } - }); - presentFragment(fragment); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setTitle(""); + actionBar.setAllowOverlayTitle(false); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + if (Build.VERSION.SDK_INT < 11 && listView != null) { + listView.setAdapter(null); + listView = null; + photoVideoAdapter = null; + documentsAdapter = null; } - } - }); - - selectedFiles.clear(); - actionModeViews.clear(); - - final ActionBarMenu menu = actionBar.createMenu(); - searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - dropDownContainer.setVisibility(View.GONE); - searching = true; - } - - @Override - public boolean onSearchCollapse() { - dropDownContainer.setVisibility(View.VISIBLE); - documentsSearchAdapter.searchDocuments(null); - searching = false; - searchWas = false; + finishFragment(); + } else if (id == -2) { + selectedFiles.clear(); + actionBar.hideActionMode(); + listView.invalidateViews(); + } else if (id == shared_media_item) { + if (selectedMode == 0) { + return; + } + selectedMode = 0; switchToCurrentSelectedMode(); - - return true; - } - - @Override - public void onTextChanged(EditText editText) { - if (documentsSearchAdapter == null) { + } else if (id == files_item) { + if (selectedMode == 1) { return; } - String text = editText.getText().toString(); - if (text.length() != 0) { - searchWas = true; - switchToCurrentSelectedMode(); - } - documentsSearchAdapter.searchDocuments(text); - } - }); - searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - searchItem.setVisibility(View.GONE); - - dropDownContainer = new ActionBarMenuItem(getParentActivity(), menu, R.drawable.bar_selector); - dropDownContainer.setSubMenuOpenSide(1); - dropDownContainer.addSubItem(shared_media_item, LocaleController.getString("SharedMediaTitle", R.string.SharedMediaTitle), 0); - dropDownContainer.addSubItem(files_item, LocaleController.getString("DocumentsTitle", R.string.DocumentsTitle), 0); - actionBar.addView(dropDownContainer); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.rightMargin = AndroidUtilities.dp(40); - layoutParams.leftMargin = AndroidUtilities.isTablet() ? AndroidUtilities.dp(64) : AndroidUtilities.dp(56); - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - dropDownContainer.setLayoutParams(layoutParams); - dropDownContainer.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dropDownContainer.toggleSubMenu(); - } - }); - - dropDown = new TextView(getParentActivity()); - dropDown.setGravity(Gravity.LEFT); - dropDown.setSingleLine(true); - dropDown.setLines(1); - dropDown.setMaxLines(1); - dropDown.setEllipsize(TextUtils.TruncateAt.END); - dropDown.setTextColor(0xffffffff); - dropDown.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - dropDown.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_drop_down, 0); - dropDown.setCompoundDrawablePadding(AndroidUtilities.dp(4)); - dropDown.setPadding(0, 0, AndroidUtilities.dp(10), 0); - dropDownContainer.addView(dropDown); - layoutParams = (FrameLayout.LayoutParams) dropDown.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(16); - layoutParams.gravity = Gravity.CENTER_VERTICAL; - dropDown.setLayoutParams(layoutParams); - - final ActionBarMenu actionMode = actionBar.createActionMode(); - actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - - selectedMessagesCountTextView = new TextView(actionMode.getContext()); - selectedMessagesCountTextView.setTextSize(18); - selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - selectedMessagesCountTextView.setTextColor(0xff737373); - selectedMessagesCountTextView.setSingleLine(true); - selectedMessagesCountTextView.setLines(1); - selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); - selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); - selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); - selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - actionMode.addView(selectedMessagesCountTextView); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams)selectedMessagesCountTextView.getLayoutParams(); - layoutParams1.weight = 1; - layoutParams1.width = 0; - layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; - selectedMessagesCountTextView.setLayoutParams(layoutParams1); - - if ((int) dialog_id != 0) { - actionModeViews.add(actionMode.addItem(forward, R.drawable.ic_ab_fwd_forward, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - } - actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - - photoVideoAdapter = new SharedPhotoVideoAdapter(getParentActivity()); - documentsAdapter = new SharedDocumentsAdapter(getParentActivity()); - documentsSearchAdapter = new DocumentsSearchAdapter(getParentActivity()); - - FrameLayout frameLayout; - fragmentView = frameLayout = new FrameLayout(getParentActivity()); - - listView = new SectionsListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setDrawSelectorOnTop(true); - listView.setClipToPadding(false); - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (selectedMode == 1 && view instanceof SharedDocumentCell) { - SharedDocumentCell cell = (SharedDocumentCell) view; - MessageObject message = cell.getDocument(); - MediaActivity.this.onItemClick(i, view, message, 0); - } - } - }); - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - if (scrollState == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); - } - scrolling = scrollState != SCROLL_STATE_IDLE; - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (searching && searchWas) { + selectedMode = 1; + switchToCurrentSelectedMode(); + } else if (id == delete) { + if (getParentActivity() == null) { return; } - if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !sharedMediaData[selectedMode].loading && !sharedMediaData[selectedMode].endReached) { - sharedMediaData[selectedMode].loading = true; - int type; - if (selectedMode == 0) { - type = SharedMediaQuery.MEDIA_PHOTOVIDEO; - } else if (selectedMode == 1) { - type = SharedMediaQuery.MEDIA_FILE; - } else { - type = SharedMediaQuery.MEDIA_AUDIO; + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("items", selectedFiles.size()))); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ArrayList ids = new ArrayList<>(selectedFiles.keySet()); + ArrayList random_ids = null; + TLRPC.EncryptedChat currentEncryptedChat = null; + if ((int) dialog_id == 0) { + currentEncryptedChat = MessagesController.getInstance().getEncryptedChat((int) (dialog_id >> 32)); + } + if (currentEncryptedChat != null) { + random_ids = new ArrayList<>(); + for (HashMap.Entry entry : selectedFiles.entrySet()) { + MessageObject msg = entry.getValue(); + if (msg.messageOwner.random_id != 0 && msg.type != 10) { + random_ids.add(msg.messageOwner.random_id); + } + } + } + MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat); + actionBar.hideActionMode(); + selectedFiles.clear(); } - SharedMediaQuery.loadMedia(dialog_id, 0, 50, sharedMediaData[selectedMode].max_id, type, !sharedMediaData[selectedMode].cacheEndReached, classGuid); - } - } - }); - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int i, long id) { - if (selectedMode == 1 && view instanceof SharedDocumentCell) { - SharedDocumentCell cell = (SharedDocumentCell) view; - MessageObject message = cell.getDocument(); - return MediaActivity.this.onItemLongClick(message, view, 0); - } - return false; - } - }); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (id == forward) { + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putBoolean("serverOnly", true); + MessagesActivity fragment = new MessagesActivity(args); + fragment.setDelegate(new MessagesActivity.MessagesActivityDelegate() { + @Override + public void didSelectDialog(MessagesActivity fragment, long did, boolean param) { + int lower_part = (int) did; + if (lower_part != 0) { + Bundle args = new Bundle(); + args.putBoolean("scrollToTopOnResume", true); + if (lower_part > 0) { + args.putInt("user_id", lower_part); + } else if (lower_part < 0) { + args.putInt("chat_id", -lower_part); + } - for (int a = 0; a < 6; a++) { - cellCache.add(new SharedPhotoVideoCell(getParentActivity())); + ArrayList fmessages = new ArrayList<>(); + ArrayList ids = new ArrayList<>(selectedFiles.keySet()); + Collections.sort(ids); + for (Integer id : ids) { + if (id > 0) { + fmessages.add(selectedFiles.get(id)); + } + } + selectedFiles.clear(); + actionBar.hideActionMode(); + + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + ChatActivity chatActivity = new ChatActivity(args); + presentFragment(chatActivity, true); + chatActivity.showReplyPanel(true, null, fmessages, null, false, false); + + if (!AndroidUtilities.isTablet()) { + removeSelfFromStack(); + Activity parentActivity = getParentActivity(); + if (parentActivity == null) { + parentActivity = chatActivity.getParentActivity(); + } + if (parentActivity != null) { + parentActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } + } + } else { + fragment.finishFragment(); + } + } + }); + presentFragment(fragment); + } + } + }); + + selectedFiles.clear(); + actionModeViews.clear(); + + final ActionBarMenu menu = actionBar.createMenu(); + searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { + dropDownContainer.setVisibility(View.GONE); + searching = true; } - emptyView = new LinearLayout(getParentActivity()); - emptyView.setOrientation(LinearLayout.VERTICAL); - emptyView.setGravity(Gravity.CENTER); - emptyView.setVisibility(View.GONE); - emptyView.setBackgroundColor(0xfff0f0f0); - frameLayout.addView(emptyView); - layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - emptyView.setLayoutParams(layoutParams); - emptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); + @Override + public boolean onSearchCollapse() { + dropDownContainer.setVisibility(View.VISIBLE); + documentsSearchAdapter.searchDocuments(null); + searching = false; + searchWas = false; + switchToCurrentSelectedMode(); - emptyImageView = new ImageView(getParentActivity()); - emptyView.addView(emptyImageView); - layoutParams1 = (LinearLayout.LayoutParams) emptyImageView.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = LinearLayout.LayoutParams.WRAP_CONTENT; - emptyImageView.setLayoutParams(layoutParams1); - - emptyTextView = new TextView(getParentActivity()); - emptyTextView.setTextColor(0xff8a8a8a); - emptyTextView.setGravity(Gravity.CENTER); - emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); - emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); - emptyView.addView(emptyTextView); - layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams1.topMargin = AndroidUtilities.dp(24); - layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.gravity = Gravity.CENTER; - emptyTextView.setLayoutParams(layoutParams1); - - progressView = new LinearLayout(getParentActivity()); - progressView.setGravity(Gravity.CENTER); - progressView.setOrientation(LinearLayout.VERTICAL); - progressView.setVisibility(View.GONE); - progressView.setBackgroundColor(0xfff0f0f0); - frameLayout.addView(progressView); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - progressView.setLayoutParams(layoutParams); - - ProgressBar progressBar = new ProgressBar(getParentActivity()); - progressView.addView(progressBar); - layoutParams1 = (LinearLayout.LayoutParams) progressBar.getLayoutParams(); - layoutParams1.width = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = LinearLayout.LayoutParams.WRAP_CONTENT; - progressBar.setLayoutParams(layoutParams1); - - switchToCurrentSelectedMode(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + return true; } + + @Override + public void onTextChanged(EditText editText) { + if (documentsSearchAdapter == null) { + return; + } + String text = editText.getText().toString(); + if (text.length() != 0) { + searchWas = true; + switchToCurrentSelectedMode(); + } + documentsSearchAdapter.searchDocuments(text); + } + }); + searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); + searchItem.setVisibility(View.GONE); + + dropDownContainer = new ActionBarMenuItem(context, menu, R.drawable.bar_selector); + dropDownContainer.setSubMenuOpenSide(1); + dropDownContainer.addSubItem(shared_media_item, LocaleController.getString("SharedMediaTitle", R.string.SharedMediaTitle), 0); + dropDownContainer.addSubItem(files_item, LocaleController.getString("DocumentsTitle", R.string.DocumentsTitle), 0); + actionBar.addView(dropDownContainer); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.rightMargin = AndroidUtilities.dp(40); + layoutParams.leftMargin = AndroidUtilities.isTablet() ? AndroidUtilities.dp(64) : AndroidUtilities.dp(56); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + dropDownContainer.setLayoutParams(layoutParams); + dropDownContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dropDownContainer.toggleSubMenu(); + } + }); + + dropDown = new TextView(context); + dropDown.setGravity(Gravity.LEFT); + dropDown.setSingleLine(true); + dropDown.setLines(1); + dropDown.setMaxLines(1); + dropDown.setEllipsize(TextUtils.TruncateAt.END); + dropDown.setTextColor(0xffffffff); + dropDown.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + dropDown.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_drop_down, 0); + dropDown.setCompoundDrawablePadding(AndroidUtilities.dp(4)); + dropDown.setPadding(0, 0, AndroidUtilities.dp(10), 0); + dropDownContainer.addView(dropDown); + layoutParams = (FrameLayout.LayoutParams) dropDown.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.gravity = Gravity.CENTER_VERTICAL; + dropDown.setLayoutParams(layoutParams); + + final ActionBarMenu actionMode = actionBar.createActionMode(); + actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + + selectedMessagesCountTextView = new TextView(actionMode.getContext()); + selectedMessagesCountTextView.setTextSize(18); + selectedMessagesCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + selectedMessagesCountTextView.setTextColor(0xff737373); + selectedMessagesCountTextView.setSingleLine(true); + selectedMessagesCountTextView.setLines(1); + selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); + selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); + selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); + selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + actionMode.addView(selectedMessagesCountTextView); + LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) selectedMessagesCountTextView.getLayoutParams(); + layoutParams1.weight = 1; + layoutParams1.width = 0; + layoutParams1.height = LinearLayout.LayoutParams.MATCH_PARENT; + selectedMessagesCountTextView.setLayoutParams(layoutParams1); + + if ((int) dialog_id != 0) { + actionModeViews.add(actionMode.addItem(forward, R.drawable.ic_ab_fwd_forward, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); } + actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + + photoVideoAdapter = new SharedPhotoVideoAdapter(context); + documentsAdapter = new SharedDocumentsAdapter(context); + documentsSearchAdapter = new DocumentsSearchAdapter(context); + + FrameLayout frameLayout; + fragmentView = frameLayout = new FrameLayout(context); + + listView = new SectionsListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setDrawSelectorOnTop(true); + listView.setClipToPadding(false); + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (selectedMode == 1 && view instanceof SharedDocumentCell) { + SharedDocumentCell cell = (SharedDocumentCell) view; + MessageObject message = cell.getDocument(); + MediaActivity.this.onItemClick(i, view, message, 0); + } + } + }); + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (scrollState == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + scrolling = scrollState != SCROLL_STATE_IDLE; + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (searching && searchWas) { + return; + } + if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !sharedMediaData[selectedMode].loading && !sharedMediaData[selectedMode].endReached) { + sharedMediaData[selectedMode].loading = true; + int type; + if (selectedMode == 0) { + type = SharedMediaQuery.MEDIA_PHOTOVIDEO; + } else if (selectedMode == 1) { + type = SharedMediaQuery.MEDIA_FILE; + } else { + type = SharedMediaQuery.MEDIA_AUDIO; + } + SharedMediaQuery.loadMedia(dialog_id, 0, 50, sharedMediaData[selectedMode].max_id, type, !sharedMediaData[selectedMode].cacheEndReached, classGuid); + } + } + }); + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int i, long id) { + if (selectedMode == 1 && view instanceof SharedDocumentCell) { + SharedDocumentCell cell = (SharedDocumentCell) view; + MessageObject message = cell.getDocument(); + return MediaActivity.this.onItemLongClick(message, view, 0); + } + return false; + } + }); + + for (int a = 0; a < 6; a++) { + cellCache.add(new SharedPhotoVideoCell(context)); + } + + emptyView = new LinearLayout(context); + emptyView.setOrientation(LinearLayout.VERTICAL); + emptyView.setGravity(Gravity.CENTER); + emptyView.setVisibility(View.GONE); + emptyView.setBackgroundColor(0xfff0f0f0); + frameLayout.addView(emptyView); + layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + emptyView.setLayoutParams(layoutParams); + emptyView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + emptyImageView = new ImageView(context); + emptyView.addView(emptyImageView); + layoutParams1 = (LinearLayout.LayoutParams) emptyImageView.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = LinearLayout.LayoutParams.WRAP_CONTENT; + emptyImageView.setLayoutParams(layoutParams1); + + emptyTextView = new TextView(context); + emptyTextView.setTextColor(0xff8a8a8a); + emptyTextView.setGravity(Gravity.CENTER); + emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); + emptyView.addView(emptyTextView); + layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); + layoutParams1.topMargin = AndroidUtilities.dp(24); + layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.CENTER; + emptyTextView.setLayoutParams(layoutParams1); + + progressView = new LinearLayout(context); + progressView.setGravity(Gravity.CENTER); + progressView.setOrientation(LinearLayout.VERTICAL); + progressView.setVisibility(View.GONE); + progressView.setBackgroundColor(0xfff0f0f0); + frameLayout.addView(progressView); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + progressView.setLayoutParams(layoutParams); + + ProgressBar progressBar = new ProgressBar(context); + progressView.addView(progressBar); + layoutParams1 = (LinearLayout.LayoutParams) progressBar.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = LinearLayout.LayoutParams.WRAP_CONTENT; + progressBar.setLayoutParams(layoutParams1); + + switchToCurrentSelectedMode(); + return fragmentView; } @@ -742,7 +736,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No object.viewX = coords[0]; object.viewY = coords[1] - AndroidUtilities.statusBarHeight; object.parentView = listView; - object.imageReceiver = imageView.imageReceiver; + object.imageReceiver = imageView.getImageReceiver(); object.thumb = object.imageReceiver.getBitmap(); return object; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index 1f5155ffa..4d56274f6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -11,6 +11,7 @@ package org.telegram.ui; import android.animation.ObjectAnimator; import android.animation.StateListAnimator; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.res.Configuration; import android.graphics.Outline; @@ -155,459 +156,456 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - searching = false; - searchWas = false; + public View createView(Context context, LayoutInflater inflater) { + searching = false; + searchWas = false; - ActionBarMenu menu = actionBar.createMenu(); - if (!onlySelect && searchString == null) { - passcodeItem = menu.addItem(passcode_menu_item, R.drawable.lock_close); + ActionBarMenu menu = actionBar.createMenu(); + if (!onlySelect && searchString == null) { + passcodeItem = menu.addItem(passcode_menu_item, R.drawable.lock_close); + updatePasscodeButton(); + } + ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { + searching = true; + if (messagesListView != null) { + if (searchString != null) { + messagesListView.setEmptyView(progressView); + searchEmptyView.setVisibility(View.INVISIBLE); + } else { + messagesListView.setEmptyView(searchEmptyView); + progressView.setVisibility(View.INVISIBLE); + } + emptyView.setVisibility(View.INVISIBLE); + if (!onlySelect) { + floatingButton.setVisibility(View.GONE); + } + } updatePasscodeButton(); } - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - searching = true; - if (messagesListView != null) { - if (searchString != null) { - messagesListView.setEmptyView(progressView); - searchEmptyView.setVisibility(View.INVISIBLE); - } else { - messagesListView.setEmptyView(searchEmptyView); - progressView.setVisibility(View.INVISIBLE); - } - emptyView.setVisibility(View.INVISIBLE); - if (!onlySelect) { - floatingButton.setVisibility(View.GONE); - } - } - updatePasscodeButton(); - } - @Override - public boolean onSearchCollapse() { - if (searchString != null) { - finishFragment(); - return false; - } - searching = false; - searchWas = false; - if (messagesListView != null) { - if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.INVISIBLE); - emptyView.setVisibility(View.INVISIBLE); - progressView.setVisibility(View.VISIBLE); - messagesListView.setEmptyView(progressView); - } else { - messagesListView.setEmptyView(emptyView); - searchEmptyView.setVisibility(View.INVISIBLE); - progressView.setVisibility(View.INVISIBLE); - } - if (!onlySelect) { - floatingButton.setVisibility(View.VISIBLE); - floatingHidden = true; - ViewProxy.setTranslationY(floatingButton, AndroidUtilities.dp(100)); - hideFloatingButton(false); - } - if (messagesListView.getAdapter() != dialogsAdapter) { - messagesListView.setAdapter(dialogsAdapter); - dialogsAdapter.notifyDataSetChanged(); - } - } - if (dialogsSearchAdapter != null) { - dialogsSearchAdapter.searchDialogs(null, false); - } - updatePasscodeButton(); - return true; - } - - @Override - public void onTextChanged(EditText editText) { - String text = editText.getText().toString(); - if (text.length() != 0) { - searchWas = true; - if (dialogsSearchAdapter != null) { - messagesListView.setAdapter(dialogsSearchAdapter); - dialogsSearchAdapter.notifyDataSetChanged(); - } - if (searchEmptyView != null && messagesListView.getEmptyView() == emptyView) { - messagesListView.setEmptyView(searchEmptyView); - emptyView.setVisibility(View.INVISIBLE); - progressView.setVisibility(View.INVISIBLE); - } - } - if (dialogsSearchAdapter != null) { - dialogsSearchAdapter.searchDialogs(text, serverOnly); - } - } - }); - item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - if (onlySelect) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setTitle(LocaleController.getString("SelectChat", R.string.SelectChat)); - } else { + @Override + public boolean onSearchCollapse() { if (searchString != null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - } else { - actionBar.setBackButtonDrawable(new MenuDrawable()); + finishFragment(); + return false; } - actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); - } - actionBar.setAllowOverlayTitle(true); - - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - if (onlySelect) { - finishFragment(); - } else if (parentLayout != null) { - parentLayout.getDrawerLayoutContainer().openDrawer(false); - } - } else if (id == passcode_menu_item) { - UserConfig.appLocked = !UserConfig.appLocked; - UserConfig.saveConfig(false); - updatePasscodeButton(); - } - } - }); - - fragmentView = inflater.inflate(R.layout.messages_list, null, false); - - if (searchString == null) { - dialogsAdapter = new DialogsAdapter(getParentActivity(), serverOnly); - if (AndroidUtilities.isTablet() && openedDialogId != 0) { - dialogsAdapter.setOpenedDialogId(openedDialogId); - } - } - int type = 0; - if (searchString != null) { - type = 2; - } else if (!onlySelect) { - type = 1; - } - dialogsSearchAdapter = new DialogsSearchAdapter(getParentActivity(), type); - dialogsSearchAdapter.setDelegate(new DialogsSearchAdapter.MessagesActivitySearchAdapterDelegate() { - @Override - public void searchStateChanged(boolean search) { - if (searching && searchWas && messagesListView != null) { - progressView.setVisibility(search ? View.VISIBLE : View.INVISIBLE); - searchEmptyView.setVisibility(search ? View.INVISIBLE : View.VISIBLE); - messagesListView.setEmptyView(search ? progressView : searchEmptyView); - } - } - }); - - messagesListView = (ListView)fragmentView.findViewById(R.id.messages_list_view); - if (dialogsAdapter != null) { - messagesListView.setAdapter(dialogsAdapter); - } - if (Build.VERSION.SDK_INT >= 11) { - messagesListView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - - progressView = fragmentView.findViewById(R.id.progressLayout); - searchEmptyView = fragmentView.findViewById(R.id.search_empty_view); - searchEmptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - emptyView = fragmentView.findViewById(R.id.list_empty_view); - emptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - - TextView textView = (TextView)fragmentView.findViewById(R.id.list_empty_view_text1); - textView.setText(LocaleController.getString("NoChats", R.string.NoChats)); - textView = (TextView)fragmentView.findViewById(R.id.list_empty_view_text2); - String help = LocaleController.getString("NoChatsHelp", R.string.NoChatsHelp); - if (AndroidUtilities.isTablet() && !AndroidUtilities.isSmallTablet()) { - help = help.replace("\n", " "); - } - textView.setText(help); - textView = (TextView)fragmentView.findViewById(R.id.search_empty_text); - textView.setText(LocaleController.getString("NoResult", R.string.NoResult)); - - floatingButton = (ImageView) fragmentView.findViewById(R.id.floating_button); - floatingButton.setVisibility(onlySelect ? View.GONE : View.VISIBLE); - floatingButton.setScaleType(ImageView.ScaleType.CENTER); - if (Build.VERSION.SDK_INT >= 21) { - StateListAnimator animator = new StateListAnimator(); - animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); - animator.addState(new int[] {}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); - floatingButton.setStateListAnimator(animator); - floatingButton.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); - } - }); - } - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)floatingButton.getLayoutParams(); - layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(14) : 0; - layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(14); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM; - floatingButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Bundle args = new Bundle(); - args.putBoolean("destroyAfterSelect", true); - presentFragment(new ContactsActivity(args)); - } - }); - - if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.INVISIBLE); - emptyView.setVisibility(View.INVISIBLE); - progressView.setVisibility(View.VISIBLE); - messagesListView.setEmptyView(progressView); - } else { - messagesListView.setEmptyView(emptyView); - searchEmptyView.setVisibility(View.INVISIBLE); - progressView.setVisibility(View.INVISIBLE); - } - - messagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (messagesListView == null || messagesListView.getAdapter() == null) { - return; - } - long dialog_id = 0; - int message_id = 0; - BaseFragmentAdapter adapter = (BaseFragmentAdapter) messagesListView.getAdapter(); - if (adapter == dialogsAdapter) { - TLRPC.TL_dialog dialog = dialogsAdapter.getItem(i); - if (dialog == null) { - return; - } - dialog_id = dialog.id; - } else if (adapter == dialogsSearchAdapter) { - Object obj = dialogsSearchAdapter.getItem(i); - if (obj instanceof TLRPC.User) { - dialog_id = ((TLRPC.User) obj).id; - if (dialogsSearchAdapter.isGlobalSearch(i)) { - ArrayList users = new ArrayList<>(); - users.add((TLRPC.User)obj); - MessagesController.getInstance().putUsers(users, false); - MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); - } - } else if (obj instanceof TLRPC.Chat) { - if (((TLRPC.Chat) obj).id > 0) { - dialog_id = -((TLRPC.Chat) obj).id; - } else { - dialog_id = AndroidUtilities.makeBroadcastId(((TLRPC.Chat) obj).id); - } - } else if (obj instanceof TLRPC.EncryptedChat) { - dialog_id = ((long)((TLRPC.EncryptedChat) obj).id) << 32; - } else if (obj instanceof MessageObject) { - MessageObject messageObject = (MessageObject)obj; - dialog_id = messageObject.getDialogId(); - message_id = messageObject.getId(); - dialogsSearchAdapter.addHashtagsFromMessage(dialogsSearchAdapter.getLastSearchString()); - } else if (obj instanceof String) { - actionBar.openSearchField((String) obj); - } - } - - if (dialog_id == 0) { - return; - } - - if (onlySelect) { - didSelectResult(dialog_id, true, false); + searching = false; + searchWas = false; + if (messagesListView != null) { + if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { + searchEmptyView.setVisibility(View.INVISIBLE); + emptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.VISIBLE); + messagesListView.setEmptyView(progressView); } else { - Bundle args = new Bundle(); - int lower_part = (int)dialog_id; - int high_id = (int)(dialog_id >> 32); - if (lower_part != 0) { - if (high_id == 1) { - args.putInt("chat_id", lower_part); - } else { - if (lower_part > 0) { - args.putInt("user_id", lower_part); - } else if (lower_part < 0) { - args.putInt("chat_id", -lower_part); - } - } - } else { - args.putInt("enc_id", high_id); - } - if (message_id != 0) { - args.putInt("message_id", message_id); - } else { - if (actionBar != null) { - actionBar.closeSearchField(); - } - } - if (AndroidUtilities.isTablet()) { - if (openedDialogId == dialog_id) { - return; - } - if (dialogsAdapter != null) { - dialogsAdapter.setOpenedDialogId(openedDialogId = dialog_id); - updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); - } - } - if (searchString != null) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - presentFragment(new ChatActivity(args)); - } else { - presentFragment(new ChatActivity(args)); - } + messagesListView.setEmptyView(emptyView); + searchEmptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); + } + if (!onlySelect) { + floatingButton.setVisibility(View.VISIBLE); + floatingHidden = true; + ViewProxy.setTranslationY(floatingButton, AndroidUtilities.dp(100)); + hideFloatingButton(false); + } + if (messagesListView.getAdapter() != dialogsAdapter) { + messagesListView.setAdapter(dialogsAdapter); + dialogsAdapter.notifyDataSetChanged(); } } - }); - - messagesListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { - if (onlySelect || searching && searchWas || getParentActivity() == null) { - if (searchWas && searching) { - BaseFragmentAdapter adapter = (BaseFragmentAdapter) messagesListView.getAdapter(); - if (adapter == dialogsSearchAdapter) { - Object item = adapter.getItem(i); - if (item instanceof String) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); - builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - dialogsSearchAdapter.clearRecentHashtags(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - return true; - } - } - } - return false; - } - TLRPC.TL_dialog dialog; - if (serverOnly) { - if (i >= MessagesController.getInstance().dialogsServerOnly.size()) { - return false; - } - dialog = MessagesController.getInstance().dialogsServerOnly.get(i); - } else { - if (i >= MessagesController.getInstance().dialogs.size()) { - return false; - } - dialog = MessagesController.getInstance().dialogs.get(i); - } - selectedDialog = dialog.id; - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - - int lower_id = (int)selectedDialog; - int high_id = (int)(selectedDialog >> 32); - - final boolean isChat = lower_id < 0 && high_id != 1; - builder.setItems(new CharSequence[]{LocaleController.getString("ClearHistory", R.string.ClearHistory), - isChat ? LocaleController.getString("DeleteChat", R.string.DeleteChat) : LocaleController.getString("Delete", R.string.Delete)}, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, final int which) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - if (which == 0) { - builder.setMessage(LocaleController.getString("AreYouSureClearHistory", R.string.AreYouSureClearHistory)); - } else { - if (isChat) { - builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); - } else { - builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); - } - } - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - MessagesController.getInstance().deleteDialog(selectedDialog, 0, which == 0); - if (which != 0) { - if (isChat) { - MessagesController.getInstance().deleteUserFromChat((int) -selectedDialog, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null); - } - if (AndroidUtilities.isTablet()) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats, selectedDialog); - } - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - return true; + if (dialogsSearchAdapter != null) { + dialogsSearchAdapter.searchDialogs(null, false); } - }); - - messagesListView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); - } - } - - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (searching && searchWas) { - if (visibleItemCount > 0 && absListView.getLastVisiblePosition() == totalItemCount - 1 && !dialogsSearchAdapter.isMessagesSearchEndReached()) { - dialogsSearchAdapter.loadMoreSearchMessages(); - } - return; - } - if (visibleItemCount > 0) { - if (absListView.getLastVisiblePosition() == MessagesController.getInstance().dialogs.size() && !serverOnly || absListView.getLastVisiblePosition() == MessagesController.getInstance().dialogsServerOnly.size() && serverOnly) { - MessagesController.getInstance().loadDialogs(MessagesController.getInstance().dialogs.size(), MessagesController.getInstance().dialogsServerOnly.size(), 100, true); - } - } - - if (floatingButton.getVisibility() != View.GONE) { - final View topChild = absListView.getChildAt(0); - int firstViewTop = 0; - if (topChild != null) { - firstViewTop = topChild.getTop(); - } - boolean goingDown; - boolean changed = true; - if (prevPosition == firstVisibleItem) { - final int topDelta = prevTop - firstViewTop; - goingDown = firstViewTop < prevTop; - changed = Math.abs(topDelta) > 1; - } else { - goingDown = firstVisibleItem > prevPosition; - } - if (changed && scrollUpdated) { - hideFloatingButton(goingDown); - } - prevPosition = firstVisibleItem; - prevTop = firstViewTop; - scrollUpdated = true; - } - } - }); - - if (searchString != null) { - actionBar.openSearchField(searchString); + updatePasscodeButton(); + return true; } + + @Override + public void onTextChanged(EditText editText) { + String text = editText.getText().toString(); + if (text.length() != 0) { + searchWas = true; + if (dialogsSearchAdapter != null) { + messagesListView.setAdapter(dialogsSearchAdapter); + dialogsSearchAdapter.notifyDataSetChanged(); + } + if (searchEmptyView != null && messagesListView.getEmptyView() == emptyView) { + messagesListView.setEmptyView(searchEmptyView); + emptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); + } + } + if (dialogsSearchAdapter != null) { + dialogsSearchAdapter.searchDialogs(text, serverOnly); + } + } + }); + item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); + if (onlySelect) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setTitle(LocaleController.getString("SelectChat", R.string.SelectChat)); } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + if (searchString != null) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + } else { + actionBar.setBackButtonDrawable(new MenuDrawable()); + } + actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); + } + actionBar.setAllowOverlayTitle(true); + + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + if (onlySelect) { + finishFragment(); + } else if (parentLayout != null) { + parentLayout.getDrawerLayoutContainer().openDrawer(false); + } + } else if (id == passcode_menu_item) { + UserConfig.appLocked = !UserConfig.appLocked; + UserConfig.saveConfig(false); + updatePasscodeButton(); + } + } + }); + + fragmentView = inflater.inflate(R.layout.messages_list, null, false); + + if (searchString == null) { + dialogsAdapter = new DialogsAdapter(context, serverOnly); + if (AndroidUtilities.isTablet() && openedDialogId != 0) { + dialogsAdapter.setOpenedDialogId(openedDialogId); } } + int type = 0; + if (searchString != null) { + type = 2; + } else if (!onlySelect) { + type = 1; + } + dialogsSearchAdapter = new DialogsSearchAdapter(context, type); + dialogsSearchAdapter.setDelegate(new DialogsSearchAdapter.MessagesActivitySearchAdapterDelegate() { + @Override + public void searchStateChanged(boolean search) { + if (searching && searchWas && messagesListView != null) { + progressView.setVisibility(search ? View.VISIBLE : View.INVISIBLE); + searchEmptyView.setVisibility(search ? View.INVISIBLE : View.VISIBLE); + messagesListView.setEmptyView(search ? progressView : searchEmptyView); + } + } + }); + + messagesListView = (ListView) fragmentView.findViewById(R.id.messages_list_view); + if (dialogsAdapter != null) { + messagesListView.setAdapter(dialogsAdapter); + } + if (Build.VERSION.SDK_INT >= 11) { + messagesListView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); + } + + progressView = fragmentView.findViewById(R.id.progressLayout); + searchEmptyView = fragmentView.findViewById(R.id.search_empty_view); + searchEmptyView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + emptyView = fragmentView.findViewById(R.id.list_empty_view); + emptyView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + + TextView textView = (TextView) fragmentView.findViewById(R.id.list_empty_view_text1); + textView.setText(LocaleController.getString("NoChats", R.string.NoChats)); + textView = (TextView) fragmentView.findViewById(R.id.list_empty_view_text2); + String help = LocaleController.getString("NoChatsHelp", R.string.NoChatsHelp); + if (AndroidUtilities.isTablet() && !AndroidUtilities.isSmallTablet()) { + help = help.replace("\n", " "); + } + textView.setText(help); + textView = (TextView) fragmentView.findViewById(R.id.search_empty_text); + textView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + + floatingButton = (ImageView) fragmentView.findViewById(R.id.floating_button); + floatingButton.setVisibility(onlySelect ? View.GONE : View.VISIBLE); + floatingButton.setScaleType(ImageView.ScaleType.CENTER); + if (Build.VERSION.SDK_INT >= 21) { + StateListAnimator animator = new StateListAnimator(); + animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); + animator.addState(new int[]{}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); + floatingButton.setStateListAnimator(animator); + floatingButton.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + } + }); + } + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) floatingButton.getLayoutParams(); + layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(14) : 0; + layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(14); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM; + floatingButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Bundle args = new Bundle(); + args.putBoolean("destroyAfterSelect", true); + presentFragment(new ContactsActivity(args)); + } + }); + + if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { + searchEmptyView.setVisibility(View.INVISIBLE); + emptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.VISIBLE); + messagesListView.setEmptyView(progressView); + } else { + messagesListView.setEmptyView(emptyView); + searchEmptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); + } + + messagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (messagesListView == null || messagesListView.getAdapter() == null) { + return; + } + long dialog_id = 0; + int message_id = 0; + BaseFragmentAdapter adapter = (BaseFragmentAdapter) messagesListView.getAdapter(); + if (adapter == dialogsAdapter) { + TLRPC.TL_dialog dialog = dialogsAdapter.getItem(i); + if (dialog == null) { + return; + } + dialog_id = dialog.id; + } else if (adapter == dialogsSearchAdapter) { + Object obj = dialogsSearchAdapter.getItem(i); + if (obj instanceof TLRPC.User) { + dialog_id = ((TLRPC.User) obj).id; + if (dialogsSearchAdapter.isGlobalSearch(i)) { + ArrayList users = new ArrayList<>(); + users.add((TLRPC.User) obj); + MessagesController.getInstance().putUsers(users, false); + MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); + } + } else if (obj instanceof TLRPC.Chat) { + if (((TLRPC.Chat) obj).id > 0) { + dialog_id = -((TLRPC.Chat) obj).id; + } else { + dialog_id = AndroidUtilities.makeBroadcastId(((TLRPC.Chat) obj).id); + } + } else if (obj instanceof TLRPC.EncryptedChat) { + dialog_id = ((long) ((TLRPC.EncryptedChat) obj).id) << 32; + } else if (obj instanceof MessageObject) { + MessageObject messageObject = (MessageObject) obj; + dialog_id = messageObject.getDialogId(); + message_id = messageObject.getId(); + dialogsSearchAdapter.addHashtagsFromMessage(dialogsSearchAdapter.getLastSearchString()); + } else if (obj instanceof String) { + actionBar.openSearchField((String) obj); + } + } + + if (dialog_id == 0) { + return; + } + + if (onlySelect) { + didSelectResult(dialog_id, true, false); + } else { + Bundle args = new Bundle(); + int lower_part = (int) dialog_id; + int high_id = (int) (dialog_id >> 32); + if (lower_part != 0) { + if (high_id == 1) { + args.putInt("chat_id", lower_part); + } else { + if (lower_part > 0) { + args.putInt("user_id", lower_part); + } else if (lower_part < 0) { + args.putInt("chat_id", -lower_part); + } + } + } else { + args.putInt("enc_id", high_id); + } + if (message_id != 0) { + args.putInt("message_id", message_id); + } else { + if (actionBar != null) { + actionBar.closeSearchField(); + } + } + if (AndroidUtilities.isTablet()) { + if (openedDialogId == dialog_id) { + return; + } + if (dialogsAdapter != null) { + dialogsAdapter.setOpenedDialogId(openedDialogId = dialog_id); + updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); + } + } + if (searchString != null) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + presentFragment(new ChatActivity(args)); + } else { + presentFragment(new ChatActivity(args)); + } + } + } + }); + + messagesListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + if (onlySelect || searching && searchWas || getParentActivity() == null) { + if (searchWas && searching) { + BaseFragmentAdapter adapter = (BaseFragmentAdapter) messagesListView.getAdapter(); + if (adapter == dialogsSearchAdapter) { + Object item = adapter.getItem(i); + if (item instanceof String) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogsSearchAdapter.clearRecentHashtags(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + } + } + return false; + } + TLRPC.TL_dialog dialog; + if (serverOnly) { + if (i >= MessagesController.getInstance().dialogsServerOnly.size()) { + return false; + } + dialog = MessagesController.getInstance().dialogsServerOnly.get(i); + } else { + if (i >= MessagesController.getInstance().dialogs.size()) { + return false; + } + dialog = MessagesController.getInstance().dialogs.get(i); + } + selectedDialog = dialog.id; + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + + int lower_id = (int) selectedDialog; + int high_id = (int) (selectedDialog >> 32); + + final boolean isChat = lower_id < 0 && high_id != 1; + builder.setItems(new CharSequence[]{LocaleController.getString("ClearHistory", R.string.ClearHistory), + isChat ? LocaleController.getString("DeleteChat", R.string.DeleteChat) : LocaleController.getString("Delete", R.string.Delete)}, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, final int which) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + if (which == 0) { + builder.setMessage(LocaleController.getString("AreYouSureClearHistory", R.string.AreYouSureClearHistory)); + } else { + if (isChat) { + builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); + } else { + builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); + } + } + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (which != 0) { + if (isChat) { + MessagesController.getInstance().deleteUserFromChat((int) -selectedDialog, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null); + } else { + MessagesController.getInstance().deleteDialog(selectedDialog, 0, false); + } + if (AndroidUtilities.isTablet()) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats, selectedDialog); + } + } else { + MessagesController.getInstance().deleteDialog(selectedDialog, 0, true); + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + }); + + messagesListView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (searching && searchWas) { + if (visibleItemCount > 0 && absListView.getLastVisiblePosition() == totalItemCount - 1 && !dialogsSearchAdapter.isMessagesSearchEndReached()) { + dialogsSearchAdapter.loadMoreSearchMessages(); + } + return; + } + if (visibleItemCount > 0) { + if (absListView.getLastVisiblePosition() == MessagesController.getInstance().dialogs.size() && !serverOnly || absListView.getLastVisiblePosition() == MessagesController.getInstance().dialogsServerOnly.size() && serverOnly) { + MessagesController.getInstance().loadDialogs(MessagesController.getInstance().dialogs.size(), MessagesController.getInstance().dialogsServerOnly.size(), 100, true); + } + } + + if (floatingButton.getVisibility() != View.GONE) { + final View topChild = absListView.getChildAt(0); + int firstViewTop = 0; + if (topChild != null) { + firstViewTop = topChild.getTop(); + } + boolean goingDown; + boolean changed = true; + if (prevPosition == firstVisibleItem) { + final int topDelta = prevTop - firstViewTop; + goingDown = firstViewTop < prevTop; + changed = Math.abs(topDelta) > 1; + } else { + goingDown = firstVisibleItem > prevPosition; + } + if (changed && scrollUpdated) { + hideFloatingButton(goingDown); + } + prevPosition = firstVisibleItem; + prevTop = firstViewTop; + scrollUpdated = true; + } + } + }); + + if (searchString != null) { + actionBar.openSearchField(searchString); + } + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java index 3bc8e8594..a8f3bfd52 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java @@ -156,391 +156,385 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("NotificationsAndSounds", R.string.NotificationsAndSounds)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("NotificationsAndSounds", R.string.NotificationsAndSounds)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); } - }); + } + }); - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; - listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - listView.setAdapter(new ListAdapter(getParentActivity())); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - boolean enabled = false; - if (i == messageAlertRow || i == groupAlertRow) { + listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + listView.setAdapter(new ListAdapter(context)); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + boolean enabled = false; + if (i == messageAlertRow || i == groupAlertRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (i == messageAlertRow) { + enabled = preferences.getBoolean("EnableAll", true); + editor.putBoolean("EnableAll", !enabled); + } else if (i == groupAlertRow) { + enabled = preferences.getBoolean("EnableGroup", true); + editor.putBoolean("EnableGroup", !enabled); + } + editor.commit(); + updateServerNotificationsSettings(i == groupAlertRow); + } else if (i == messagePreviewRow || i == groupPreviewRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (i == messagePreviewRow) { + enabled = preferences.getBoolean("EnablePreviewAll", true); + editor.putBoolean("EnablePreviewAll", !enabled); + } else if (i == groupPreviewRow) { + enabled = preferences.getBoolean("EnablePreviewGroup", true); + editor.putBoolean("EnablePreviewGroup", !enabled); + } + editor.commit(); + updateServerNotificationsSettings(i == groupPreviewRow); + } else if (i == messageSoundRow || i == groupSoundRow) { + try { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (i == messageAlertRow) { - enabled = preferences.getBoolean("EnableAll", true); - editor.putBoolean("EnableAll", !enabled); - } else if (i == groupAlertRow) { - enabled = preferences.getBoolean("EnableGroup", true); - editor.putBoolean("EnableGroup", !enabled); - } - editor.commit(); - updateServerNotificationsSettings(i == groupAlertRow); - } else if (i == messagePreviewRow || i == groupPreviewRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (i == messagePreviewRow) { - enabled = preferences.getBoolean("EnablePreviewAll", true); - editor.putBoolean("EnablePreviewAll", !enabled); - } else if (i == groupPreviewRow) { - enabled = preferences.getBoolean("EnablePreviewGroup", true); - editor.putBoolean("EnablePreviewGroup", !enabled); - } - editor.commit(); - updateServerNotificationsSettings(i == groupPreviewRow); - } else if (i == messageSoundRow || i == groupSoundRow) { - try { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); - Uri currentSound = null; + Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); + Uri currentSound = null; - String defaultPath = null; - Uri defaultUri = Settings.System.DEFAULT_NOTIFICATION_URI; - if (defaultUri != null) { - defaultPath = defaultUri.getPath(); - } + String defaultPath = null; + Uri defaultUri = Settings.System.DEFAULT_NOTIFICATION_URI; + if (defaultUri != null) { + defaultPath = defaultUri.getPath(); + } - if (i == messageSoundRow) { - String path = preferences.getString("GlobalSoundPath", defaultPath); - if (path != null && !path.equals("NoSound")) { - if (path.equals(defaultPath)) { - currentSound = defaultUri; - } else { - currentSound = Uri.parse(path); - } - } - } else if (i == groupSoundRow) { - String path = preferences.getString("GroupSoundPath", defaultPath); - if (path != null && !path.equals("NoSound")) { - if (path.equals(defaultPath)) { - currentSound = defaultUri; - } else { - currentSound = Uri.parse(path); - } + if (i == messageSoundRow) { + String path = preferences.getString("GlobalSoundPath", defaultPath); + if (path != null && !path.equals("NoSound")) { + if (path.equals(defaultPath)) { + currentSound = defaultUri; + } else { + currentSound = Uri.parse(path); } } - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); - startActivityForResult(tmpIntent, i); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else if (i == resetNotificationsRow) { - if (reseting) { - return; - } - reseting = true; - TLRPC.TL_account_resetNotifySettings req = new TLRPC.TL_account_resetNotifySettings(); - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(TLObject response, TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - MessagesController.getInstance().enableJoined = true; - reseting = false; - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.clear(); - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } - if (getParentActivity() != null) { - Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("ResetNotificationsText", R.string.ResetNotificationsText), Toast.LENGTH_SHORT); - toast.show(); - } - } - }); + } else if (i == groupSoundRow) { + String path = preferences.getString("GroupSoundPath", defaultPath); + if (path != null && !path.equals("NoSound")) { + if (path.equals(defaultPath)) { + currentSound = defaultUri; + } else { + currentSound = Uri.parse(path); + } } - }); - } else if (i == inappSoundRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnableInAppSounds", true); - editor.putBoolean("EnableInAppSounds", !enabled); - editor.commit(); - } else if (i == inappVibrateRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnableInAppVibrate", true); - editor.putBoolean("EnableInAppVibrate", !enabled); - editor.commit(); - } else if (i == inappPreviewRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnableInAppPreview", true); - editor.putBoolean("EnableInAppPreview", !enabled); - editor.commit(); - } else if (i == inchatSoundRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnableInChatSound", true); - editor.putBoolean("EnableInChatSound", !enabled); - editor.commit(); - NotificationsController.getInstance().setInChatSoundEnabled(!enabled); - } else if (i == inappPriorityRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnableInAppPriority", false); - editor.putBoolean("EnableInAppPriority", !enabled); - editor.commit(); - } else if (i == contactJoinedRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnableContactJoined", true); - MessagesController.getInstance().enableJoined = !enabled; - editor.putBoolean("EnableContactJoined", !enabled); - editor.commit(); - } else if (i == pebbleAlertRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnablePebbleNotifications", false); - editor.putBoolean("EnablePebbleNotifications", !enabled); - editor.commit(); - } else if (i == badgeNumberRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("badgeNumber", true); - editor.putBoolean("badgeNumber", !enabled); - editor.commit(); - NotificationsController.getInstance().setBadgeEnabled(!enabled); - } else if (i == notificationsServiceRow) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - enabled = preferences.getBoolean("pushService", true); - if (!enabled) { - final SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean("pushService", !enabled); - editor.commit(); - ApplicationLoader.startPushService(); - } else { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("NotificationsServiceDisableInfo", R.string.NotificationsServiceDisableInfo)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + } + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); + startActivityForResult(tmpIntent, i); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (i == resetNotificationsRow) { + if (reseting) { + return; + } + reseting = true; + TLRPC.TL_account_resetNotifySettings req = new TLRPC.TL_account_resetNotifySettings(); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { @Override - public void onClick(DialogInterface dialogInterface, int i) { - ApplicationLoader.stopPushService(); - final SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean("pushService", false); + public void run() { + MessagesController.getInstance().enableJoined = true; + reseting = false; + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.clear(); editor.commit(); - listView.invalidateViews(); + if (listView != null) { + listView.invalidateViews(); + } + if (getParentActivity() != null) { + Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("ResetNotificationsText", R.string.ResetNotificationsText), Toast.LENGTH_SHORT); + toast.show(); + } } }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); } - } else if (i == messageLedRow || i == groupLedRow) { + }); + } else if (i == inappSoundRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableInAppSounds", true); + editor.putBoolean("EnableInAppSounds", !enabled); + editor.commit(); + } else if (i == inappVibrateRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableInAppVibrate", true); + editor.putBoolean("EnableInAppVibrate", !enabled); + editor.commit(); + } else if (i == inappPreviewRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableInAppPreview", true); + editor.putBoolean("EnableInAppPreview", !enabled); + editor.commit(); + } else if (i == inchatSoundRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableInChatSound", true); + editor.putBoolean("EnableInChatSound", !enabled); + editor.commit(); + NotificationsController.getInstance().setInChatSoundEnabled(!enabled); + } else if (i == inappPriorityRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableInAppPriority", false); + editor.putBoolean("EnableInAppPriority", !enabled); + editor.commit(); + } else if (i == contactJoinedRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableContactJoined", true); + MessagesController.getInstance().enableJoined = !enabled; + editor.putBoolean("EnableContactJoined", !enabled); + editor.commit(); + } else if (i == pebbleAlertRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnablePebbleNotifications", false); + editor.putBoolean("EnablePebbleNotifications", !enabled); + editor.commit(); + } else if (i == badgeNumberRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("badgeNumber", true); + editor.putBoolean("badgeNumber", !enabled); + editor.commit(); + NotificationsController.getInstance().setBadgeEnabled(!enabled); + } else if (i == notificationsServiceRow) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + enabled = preferences.getBoolean("pushService", true); + if (!enabled) { + final SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("pushService", !enabled); + editor.commit(); + ApplicationLoader.startPushService(); + } else { if (getParentActivity() == null) { return; } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("NotificationsServiceDisableInfo", R.string.NotificationsServiceDisableInfo)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ApplicationLoader.stopPushService(); + final SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("pushService", false); + editor.commit(); + listView.invalidateViews(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + } else if (i == messageLedRow || i == groupLedRow) { + if (getParentActivity() == null) { + return; + } - LayoutInflater li = (LayoutInflater)getParentActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = li.inflate(R.layout.settings_color_dialog_layout, null, false); - final ColorPickerView colorPickerView = (ColorPickerView)view.findViewById(R.id.color_picker); + LayoutInflater li = (LayoutInflater) getParentActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = li.inflate(R.layout.settings_color_dialog_layout, null, false); + final ColorPickerView colorPickerView = (ColorPickerView) view.findViewById(R.id.color_picker); - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - if (i == messageLedRow) { - colorPickerView.setOldCenterColor(preferences.getInt("MessagesLed", 0xff00ff00)); - } else if (i == groupLedRow) { - colorPickerView.setOldCenterColor(preferences.getInt("GroupLed", 0xff00ff00)); + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + if (i == messageLedRow) { + colorPickerView.setOldCenterColor(preferences.getInt("MessagesLed", 0xff00ff00)); + } else if (i == groupLedRow) { + colorPickerView.setOldCenterColor(preferences.getInt("GroupLed", 0xff00ff00)); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("LedColor", R.string.LedColor)); + builder.setView(view); + builder.setPositiveButton(LocaleController.getString("Set", R.string.Set), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int which) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (i == messageLedRow) { + editor.putInt("MessagesLed", colorPickerView.getColor()); + } else if (i == groupLedRow) { + editor.putInt("GroupLed", colorPickerView.getColor()); + } + editor.commit(); + listView.invalidateViews(); } - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("LedColor", R.string.LedColor)); - builder.setView(view); - builder.setPositiveButton(LocaleController.getString("Set", R.string.Set), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int which) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (i == messageLedRow) { - editor.putInt("MessagesLed", colorPickerView.getColor()); - } else if (i == groupLedRow) { - editor.putInt("GroupLed", colorPickerView.getColor()); - } - editor.commit(); + }); + builder.setNeutralButton(LocaleController.getString("LedDisabled", R.string.LedDisabled), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (i == messageLedRow) { + editor.putInt("MessagesLed", 0); + } else if (i == groupLedRow) { + editor.putInt("GroupLed", 0); + } + editor.commit(); + listView.invalidateViews(); + } + }); + showAlertDialog(builder); + } else if (i == messagePopupNotificationRow || i == groupPopupNotificationRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("PopupNotification", R.string.PopupNotification)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("NoPopup", R.string.NoPopup), + LocaleController.getString("OnlyWhenScreenOn", R.string.OnlyWhenScreenOn), + LocaleController.getString("OnlyWhenScreenOff", R.string.OnlyWhenScreenOff), + LocaleController.getString("AlwaysShowPopup", R.string.AlwaysShowPopup) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (i == messagePopupNotificationRow) { + editor.putInt("popupAll", which); + } else if (i == groupPopupNotificationRow) { + editor.putInt("popupGroup", which); + } + editor.commit(); + if (listView != null) { listView.invalidateViews(); } - }); - builder.setNeutralButton(LocaleController.getString("LedDisabled", R.string.LedDisabled), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (i == messageLedRow) { - editor.putInt("MessagesLed", 0); - } else if (i == groupLedRow) { - editor.putInt("GroupLed", 0); - } - editor.commit(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == messageVibrateRow || i == groupVibrateRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("Vibrate", R.string.Vibrate)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), + LocaleController.getString("Default", R.string.Default), + LocaleController.getString("Short", R.string.Short), + LocaleController.getString("Long", R.string.Long), + LocaleController.getString("OnlyIfSilent", R.string.OnlyIfSilent) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + String param = "vibrate_messages"; + if (i == groupVibrateRow) { + param = "vibrate_group"; + } + if (which == 0) { + editor.putInt(param, 2); + } else if (which == 1) { + editor.putInt(param, 0); + } else if (which == 2) { + editor.putInt(param, 1); + } else if (which == 3) { + editor.putInt(param, 3); + } else if (which == 4) { + editor.putInt(param, 4); + } + editor.commit(); + if (listView != null) { listView.invalidateViews(); } - }); - showAlertDialog(builder); - } else if (i == messagePopupNotificationRow || i == groupPopupNotificationRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("PopupNotification", R.string.PopupNotification)); - builder.setItems(new CharSequence[] { - LocaleController.getString("NoPopup", R.string.NoPopup), - LocaleController.getString("OnlyWhenScreenOn", R.string.OnlyWhenScreenOn), - LocaleController.getString("OnlyWhenScreenOff", R.string.OnlyWhenScreenOff), - LocaleController.getString("AlwaysShowPopup", R.string.AlwaysShowPopup) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (i == messagePopupNotificationRow) { - editor.putInt("popupAll", which); - } else if (i == groupPopupNotificationRow) { - editor.putInt("popupGroup", which); - } - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == messagePriorityRow || i == groupPriorityRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("NotificationsPriority", R.string.NotificationsPriority)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("NotificationsPriorityDefault", R.string.NotificationsPriorityDefault), + LocaleController.getString("NotificationsPriorityHigh", R.string.NotificationsPriorityHigh), + LocaleController.getString("NotificationsPriorityMax", R.string.NotificationsPriorityMax) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + if (i == messagePriorityRow) { + preferences.edit().putInt("priority_messages", which).commit(); + } else if (i == groupPriorityRow) { + preferences.edit().putInt("priority_group", which).commit(); } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == messageVibrateRow || i == groupVibrateRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("Vibrate", R.string.Vibrate)); - builder.setItems(new CharSequence[] { - LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), - LocaleController.getString("Default", R.string.Default), - LocaleController.getString("Short", R.string.Short), - LocaleController.getString("Long", R.string.Long), - LocaleController.getString("OnlyIfSilent", R.string.OnlyIfSilent) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - String param = "vibrate_messages"; - if (i == groupVibrateRow) { - param = "vibrate_group"; - } - if (which == 0) { - editor.putInt(param, 2); - } else if (which == 1) { - editor.putInt(param, 0); - } else if (which == 2) { - editor.putInt(param, 1); - } else if (which == 3) { - editor.putInt(param, 3); - } else if (which == 4) { - editor.putInt(param, 4); - } - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } + if (listView != null) { + listView.invalidateViews(); } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == messagePriorityRow || i == groupPriorityRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("NotificationsPriority", R.string.NotificationsPriority)); - builder.setItems(new CharSequence[] { - LocaleController.getString("NotificationsPriorityDefault", R.string.NotificationsPriorityDefault), - LocaleController.getString("NotificationsPriorityHigh", R.string.NotificationsPriorityHigh), - LocaleController.getString("NotificationsPriorityMax", R.string.NotificationsPriorityMax) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - if (i == messagePriorityRow) { - preferences.edit().putInt("priority_messages", which).commit(); - } else if (i == groupPriorityRow) { - preferences.edit().putInt("priority_group", which).commit(); - } - if (listView != null) { - listView.invalidateViews(); - } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == repeatRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("RepeatNotifications", R.string.RepeatNotifications)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("RepeatDisabled", R.string.RepeatDisabled), + LocaleController.formatPluralString("Minutes", 5), + LocaleController.formatPluralString("Minutes", 10), + LocaleController.formatPluralString("Minutes", 30), + LocaleController.formatPluralString("Hours", 1), + LocaleController.formatPluralString("Hours", 2), + LocaleController.formatPluralString("Hours", 4) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int minutes = 0; + if (which == 1) { + minutes = 5; + } else if (which == 2) { + minutes = 10; + } else if (which == 3) { + minutes = 30; + } else if (which == 4) { + minutes = 60; + } else if (which == 5) { + minutes = 60 * 2; + } else if (which == 6) { + minutes = 60 * 4; } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == repeatRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("RepeatNotifications", R.string.RepeatNotifications)); - builder.setItems(new CharSequence[] { - LocaleController.getString("RepeatDisabled", R.string.RepeatDisabled), - LocaleController.formatPluralString("Minutes", 5), - LocaleController.formatPluralString("Minutes", 10), - LocaleController.formatPluralString("Minutes", 30), - LocaleController.formatPluralString("Hours", 1), - LocaleController.formatPluralString("Hours", 2), - LocaleController.formatPluralString("Hours", 4) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int minutes = 0; - if (which == 1) { - minutes = 5; - } else if (which == 2) { - minutes = 10; - } else if (which == 3) { - minutes = 30; - } else if (which == 4) { - minutes = 60; - } else if (which == 5) { - minutes = 60 * 2; - } else if (which == 6) { - minutes = 60 * 4; - } - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - preferences.edit().putInt("repeat_messages", minutes).commit(); - if (listView != null) { - listView.invalidateViews(); - } + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + preferences.edit().putInt("repeat_messages", minutes).commit(); + if (listView != null) { + listView.invalidateViews(); } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - if (view instanceof TextCheckCell) { - ((TextCheckCell) view).setChecked(!enabled); - } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + if (view instanceof TextCheckCell) { + ((TextCheckCell) view).setChecked(!enabled); } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + return fragmentView; } @@ -577,7 +571,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif Ringtone rng = RingtoneManager.getRingtone(getParentActivity(), ringtone); if (rng != null) { if(ringtone.equals(Settings.System.DEFAULT_NOTIFICATION_URI)) { - name = LocaleController.getString("Default", R.string.Default); + name = LocaleController.getString("SoundDefault", R.string.SoundDefault); } else { name = rng.getTitle(getParentActivity()); } @@ -724,9 +718,9 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif textCell.setMultilineDetail(false); String value = null; if (i == messageSoundRow) { - value = preferences.getString("GlobalSound", LocaleController.getString("Default", R.string.Default)); + value = preferences.getString("GlobalSound", LocaleController.getString("SoundDefault", R.string.SoundDefault)); } else if (i == groupSoundRow) { - value = preferences.getString("GroupSound", LocaleController.getString("Default", R.string.Default)); + value = preferences.getString("GroupSound", LocaleController.getString("SoundDefault", R.string.SoundDefault)); } if (value.equals("NoSound")) { value = LocaleController.getString("NoSound", R.string.NoSound); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java index a0548ca3a..f5cad11a8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java @@ -55,9 +55,6 @@ import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Adapters.BaseFragmentAdapter; -import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; -import org.telegram.ui.AnimationCompat.AnimatorSetProxy; -import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; @@ -111,297 +108,295 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - if (type != 3) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); + public View createView(Context context, LayoutInflater inflater) { + if (type != 3) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + } + actionBar.setAllowOverlayTitle(false); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_NEXT) { + processNext(); + } else if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_DONE) { + processDone(); + } + } else if (id == pin_item) { + currentPasswordType = 0; + updateDropDownTextView(); + } else if (id == password_item) { + currentPasswordType = 1; + updateDropDownTextView(); + } } - actionBar.setAllowOverlayTitle(false); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + }); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + if (type != 0) { + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + titleTextView = new TextView(context); + titleTextView.setTextColor(0xff757575); + if (type == 1) { + if (UserConfig.passcodeHash.length() != 0) { + titleTextView.setText(LocaleController.getString("EnterNewPasscode", R.string.EnterNewPasscode)); + } else { + titleTextView.setText(LocaleController.getString("EnterNewFirstPasscode", R.string.EnterNewFirstPasscode)); + } + } else { + titleTextView.setText(LocaleController.getString("EnterCurrentPasscode", R.string.EnterCurrentPasscode)); + } + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + titleTextView.setGravity(Gravity.CENTER_HORIZONTAL); + frameLayout.addView(titleTextView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) titleTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams.topMargin = AndroidUtilities.dp(38); + titleTextView.setLayoutParams(layoutParams); + + passwordEditText = new EditText(context); + passwordEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + passwordEditText.setTextColor(0xff000000); + passwordEditText.setMaxLines(1); + passwordEditText.setLines(1); + passwordEditText.setGravity(Gravity.CENTER_HORIZONTAL); + passwordEditText.setSingleLine(true); + if (type == 1) { + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_NEXT); + } else { + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); + } + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + passwordEditText.setTypeface(Typeface.DEFAULT); + AndroidUtilities.clearCursorDrawable(passwordEditText); + frameLayout.addView(passwordEditText); + layoutParams = (FrameLayout.LayoutParams) passwordEditText.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(90); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(40); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.rightMargin = AndroidUtilities.dp(40); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + passwordEditText.setLayoutParams(layoutParams); + passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_NEXT) { - processNext(); - } else if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_DONE) { + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT) { + processNext(); + return true; + } else if (i == EditorInfo.IME_ACTION_DONE) { + processDone(); + return true; + } + return false; + } + }); + passwordEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (passwordEditText.length() == 4) { + if (type == 2 && UserConfig.passcodeType == 0) { processDone(); + } else if (type == 1 && currentPasswordType == 0) { + if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_NEXT) { + processNext(); + } else if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_DONE) { + processDone(); + } } - } else if (id == pin_item) { - currentPasswordType = 0; - updateDropDownTextView(); - } else if (id == password_item) { - currentPasswordType = 1; - updateDropDownTextView(); } } }); + if (android.os.Build.VERSION.SDK_INT < 11) { + passwordEditText.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + menu.clear(); + } + }); + } else { + passwordEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; + public void onDestroyActionMode(ActionMode mode) { + } - if (type != 0) { - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return false; + } - titleTextView = new TextView(getParentActivity()); - titleTextView.setTextColor(0xff757575); - if (type == 1) { - titleTextView.setText(LocaleController.getString("EnterNewPasscode", R.string.EnterNewPasscode)); - } else { - titleTextView.setText(LocaleController.getString("EnterCurrentPasscode", R.string.EnterCurrentPasscode)); - } - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - titleTextView.setGravity(Gravity.CENTER_HORIZONTAL); - frameLayout.addView(titleTextView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) titleTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER_HORIZONTAL; - layoutParams.topMargin = AndroidUtilities.dp(38); - titleTextView.setLayoutParams(layoutParams); - - passwordEditText = new EditText(getParentActivity()); - passwordEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - passwordEditText.setTextColor(0xff000000); - passwordEditText.setMaxLines(1); - passwordEditText.setLines(1); - passwordEditText.setGravity(Gravity.CENTER_HORIZONTAL); - passwordEditText.setSingleLine(true); - if (type == 1) { - passwordEditText.setImeOptions(EditorInfo.IME_ACTION_NEXT); - } else { - passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); - } - passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); - passwordEditText.setTypeface(Typeface.DEFAULT); - AndroidUtilities.clearCursorDrawable(passwordEditText); - frameLayout.addView(passwordEditText); - layoutParams = (FrameLayout.LayoutParams) passwordEditText.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.dp(90); - layoutParams.height = AndroidUtilities.dp(36); - layoutParams.leftMargin = AndroidUtilities.dp(40); - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - layoutParams.rightMargin = AndroidUtilities.dp(40); - layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; - passwordEditText.setLayoutParams(layoutParams); - passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_NEXT) { - processNext(); - return true; - } else if (i == EditorInfo.IME_ACTION_DONE) { - processDone(); - return true; - } + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } }); - passwordEditText.addTextChangedListener(new TextWatcher() { + } + + if (type == 1) { + dropDownContainer = new ActionBarMenuItem(context, menu, R.drawable.bar_selector); + dropDownContainer.setSubMenuOpenSide(1); + dropDownContainer.addSubItem(pin_item, LocaleController.getString("PasscodePIN", R.string.PasscodePIN), 0); + dropDownContainer.addSubItem(password_item, LocaleController.getString("PasscodePassword", R.string.PasscodePassword), 0); + actionBar.addView(dropDownContainer); + layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.rightMargin = AndroidUtilities.dp(40); + layoutParams.leftMargin = AndroidUtilities.isTablet() ? AndroidUtilities.dp(64) : AndroidUtilities.dp(56); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + dropDownContainer.setLayoutParams(layoutParams); + dropDownContainer.setOnClickListener(new View.OnClickListener() { @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - if (passwordEditText.length() == 4) { - if (type == 2 && UserConfig.passcodeType == 0) { - processDone(); - } else if (type == 1 && currentPasswordType == 0) { - if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_NEXT) { - processNext(); - } else if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_DONE) { - processDone(); - } - } - } + public void onClick(View view) { + dropDownContainer.toggleSubMenu(); } }); - if (android.os.Build.VERSION.SDK_INT < 11) { - passwordEditText.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { - menu.clear(); - } - }); - } else { - passwordEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return false; - } - public void onDestroyActionMode(ActionMode mode) { - } - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - return false; - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - return false; - } - }); - } - - if (type == 1) { - dropDownContainer = new ActionBarMenuItem(getParentActivity(), menu, R.drawable.bar_selector); - dropDownContainer.setSubMenuOpenSide(1); - dropDownContainer.addSubItem(pin_item, LocaleController.getString("PasscodePIN", R.string.PasscodePIN), 0); - dropDownContainer.addSubItem(password_item, LocaleController.getString("PasscodePassword", R.string.PasscodePassword), 0); - actionBar.addView(dropDownContainer); - layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.rightMargin = AndroidUtilities.dp(40); - layoutParams.leftMargin = AndroidUtilities.isTablet() ? AndroidUtilities.dp(64) : AndroidUtilities.dp(56); - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - dropDownContainer.setLayoutParams(layoutParams); - dropDownContainer.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dropDownContainer.toggleSubMenu(); - } - }); - - dropDown = new TextView(getParentActivity()); - dropDown.setGravity(Gravity.LEFT); - dropDown.setSingleLine(true); - dropDown.setLines(1); - dropDown.setMaxLines(1); - dropDown.setEllipsize(TextUtils.TruncateAt.END); - dropDown.setTextColor(0xffffffff); - dropDown.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - dropDown.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_drop_down, 0); - dropDown.setCompoundDrawablePadding(AndroidUtilities.dp(4)); - dropDown.setPadding(0, 0, AndroidUtilities.dp(10), 0); - dropDownContainer.addView(dropDown); - layoutParams = (FrameLayout.LayoutParams) dropDown.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(16); - layoutParams.gravity = Gravity.CENTER_VERTICAL; - layoutParams.bottomMargin = AndroidUtilities.dp(1); - dropDown.setLayoutParams(layoutParams); - } else { - actionBar.setTitle(LocaleController.getString("Passcode", R.string.Passcode)); - } - - updateDropDownTextView(); + dropDown = new TextView(context); + dropDown.setGravity(Gravity.LEFT); + dropDown.setSingleLine(true); + dropDown.setLines(1); + dropDown.setMaxLines(1); + dropDown.setEllipsize(TextUtils.TruncateAt.END); + dropDown.setTextColor(0xffffffff); + dropDown.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + dropDown.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_drop_down, 0); + dropDown.setCompoundDrawablePadding(AndroidUtilities.dp(4)); + dropDown.setPadding(0, 0, AndroidUtilities.dp(10), 0); + dropDownContainer.addView(dropDown); + layoutParams = (FrameLayout.LayoutParams) dropDown.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.gravity = Gravity.CENTER_VERTICAL; + layoutParams.bottomMargin = AndroidUtilities.dp(1); + dropDown.setLayoutParams(layoutParams); } else { actionBar.setTitle(LocaleController.getString("Passcode", R.string.Passcode)); - frameLayout.setBackgroundColor(0xfff0f0f0); - listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - listView.setDrawSelectorOnTop(true); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (i == changePasscodeRow) { - presentFragment(new PasscodeActivity(1)); - } else if (i == passcodeRow) { - TextCheckCell cell = (TextCheckCell) view; - if (UserConfig.passcodeHash.length() != 0) { - UserConfig.passcodeHash = ""; - UserConfig.appLocked = false; - UserConfig.saveConfig(false); - int count = listView.getChildCount(); - for (int a = 0; a < count; a++) { - View child = listView.getChildAt(a); - if (child instanceof TextSettingsCell) { - TextSettingsCell textCell = (TextSettingsCell) child; - textCell.setTextColor(0xffc6c6c6); - break; - } - } - cell.setChecked(UserConfig.passcodeHash.length() != 0); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetPasscode); - } else { - presentFragment(new PasscodeActivity(1)); - } - } else if (i == autoLockRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AutoLock", R.string.AutoLock)); - final NumberPicker numberPicker = new NumberPicker(getParentActivity()); - numberPicker.setMinValue(0); - numberPicker.setMaxValue(4); - if (UserConfig.autoLockIn == 0) { - numberPicker.setValue(0); - } else if (UserConfig.autoLockIn == 60) { - numberPicker.setValue(1); - } else if (UserConfig.autoLockIn == 60 * 5) { - numberPicker.setValue(2); - } else if (UserConfig.autoLockIn == 60 * 60) { - numberPicker.setValue(3); - } else if (UserConfig.autoLockIn == 60 * 60 * 5) { - numberPicker.setValue(4); - } - numberPicker.setFormatter(new NumberPicker.Formatter() { - @Override - public String format(int value) { - if (value == 0) { - return LocaleController.getString("Disabled", R.string.Disabled); - } else if (value == 1) { - return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", 1)); - } else if (value == 2) { - return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", 5)); - } else if (value == 3) { - return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", 1)); - } else if (value == 4) { - return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", 5)); - } - return ""; - } - }); - builder.setView(numberPicker); - builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - which = numberPicker.getValue(); - if (which == 0) { - UserConfig.autoLockIn = 0; - } else if (which == 1) { - UserConfig.autoLockIn = 60; - } else if (which == 2) { - UserConfig.autoLockIn = 60 * 5; - } else if (which == 3) { - UserConfig.autoLockIn = 60 * 60; - } else if (which == 4) { - UserConfig.autoLockIn = 60 * 60 * 5; - } - listView.invalidateViews(); - UserConfig.saveConfig(false); - } - }); - showAlertDialog(builder); - } - } - }); } + + updateDropDownTextView(); } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + actionBar.setTitle(LocaleController.getString("Passcode", R.string.Passcode)); + frameLayout.setBackgroundColor(0xfff0f0f0); + listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setDrawSelectorOnTop(true); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter = new ListAdapter(context)); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == changePasscodeRow) { + presentFragment(new PasscodeActivity(1)); + } else if (i == passcodeRow) { + TextCheckCell cell = (TextCheckCell) view; + if (UserConfig.passcodeHash.length() != 0) { + UserConfig.passcodeHash = ""; + UserConfig.appLocked = false; + UserConfig.saveConfig(false); + int count = listView.getChildCount(); + for (int a = 0; a < count; a++) { + View child = listView.getChildAt(a); + if (child instanceof TextSettingsCell) { + TextSettingsCell textCell = (TextSettingsCell) child; + textCell.setTextColor(0xffc6c6c6); + break; + } + } + cell.setChecked(UserConfig.passcodeHash.length() != 0); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetPasscode); + } else { + presentFragment(new PasscodeActivity(1)); + } + } else if (i == autoLockRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AutoLock", R.string.AutoLock)); + final NumberPicker numberPicker = new NumberPicker(getParentActivity()); + numberPicker.setMinValue(0); + numberPicker.setMaxValue(4); + if (UserConfig.autoLockIn == 0) { + numberPicker.setValue(0); + } else if (UserConfig.autoLockIn == 60) { + numberPicker.setValue(1); + } else if (UserConfig.autoLockIn == 60 * 5) { + numberPicker.setValue(2); + } else if (UserConfig.autoLockIn == 60 * 60) { + numberPicker.setValue(3); + } else if (UserConfig.autoLockIn == 60 * 60 * 5) { + numberPicker.setValue(4); + } + numberPicker.setFormatter(new NumberPicker.Formatter() { + @Override + public String format(int value) { + if (value == 0) { + return LocaleController.getString("Disabled", R.string.Disabled); + } else if (value == 1) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", 1)); + } else if (value == 2) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", 5)); + } else if (value == 3) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", 1)); + } else if (value == 4) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", 5)); + } + return ""; + } + }); + builder.setView(numberPicker); + builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + which = numberPicker.getValue(); + if (which == 0) { + UserConfig.autoLockIn = 0; + } else if (which == 1) { + UserConfig.autoLockIn = 60; + } else if (which == 2) { + UserConfig.autoLockIn = 60 * 5; + } else if (which == 3) { + UserConfig.autoLockIn = 60 * 60; + } else if (which == 4) { + UserConfig.autoLockIn = 60 * 60 * 5; + } + listView.invalidateViews(); + UserConfig.saveConfig(false); + } + }); + showAlertDialog(builder); + } + } + }); } + return fragmentView; } @@ -526,7 +521,7 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter } catch (Exception e) { FileLog.e("tmessages", e); } - shakeTextView(2, 0); + AndroidUtilities.shakeTextView(titleTextView, 2, 0); passwordEditText.setText(""); return; } @@ -550,23 +545,6 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter } } - private void shakeTextView(final float x, final int num) { - if (num == 6) { - titleTextView.clearAnimation(); - return; - } - AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); - animatorSetProxy.playTogether(ObjectAnimatorProxy.ofFloat(titleTextView, "translationX", AndroidUtilities.dp(x))); - animatorSetProxy.setDuration(50); - animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - shakeTextView(num == 5 ? 0 : -x, num + 1); - } - }); - animatorSetProxy.start(); - } - private void onPasscodeError() { if (getParentActivity() == null) { return; @@ -575,7 +553,7 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter if (v != null) { v.vibrate(200); } - shakeTextView(2, 0); + AndroidUtilities.shakeTextView(titleTextView, 2, 0); } private void fixLayoutInternal() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java index b2ad1a747..fa330b1db 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java @@ -95,129 +95,123 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati @SuppressWarnings("unchecked") @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackgroundColor(0xff333333); - actionBar.setItemsBackground(R.drawable.bar_selector_picker); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setTitle(LocaleController.getString("Gallery", R.string.Gallery)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - if (Build.VERSION.SDK_INT < 11) { - listView.setAdapter(null); - listView = null; - listAdapter = null; - } - finishFragment(); - } else if (id == 1) { - if (delegate != null) { - finishFragment(false); - delegate.startPhotoSelectActivity(); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackgroundColor(0xff333333); + actionBar.setItemsBackground(R.drawable.bar_selector_picker); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setTitle(LocaleController.getString("Gallery", R.string.Gallery)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + if (Build.VERSION.SDK_INT < 11) { + listView.setAdapter(null); + listView = null; + listAdapter = null; + } + finishFragment(); + } else if (id == 1) { + if (delegate != null) { + finishFragment(false); + delegate.startPhotoSelectActivity(); } } - }); - - ActionBarMenu menu = actionBar.createMenu(); - menu.addItem(1, R.drawable.ic_ab_other); - - fragmentView = new FrameLayout(getParentActivity()); - - FrameLayout frameLayout = (FrameLayout) fragmentView; - frameLayout.setBackgroundColor(0xff000000); - - listView = new ListView(getParentActivity()); - listView.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), AndroidUtilities.dp(4)); - listView.setClipToPadding(false); - listView.setHorizontalScrollBarEnabled(false); - listView.setVerticalScrollBarEnabled(false); - listView.setSelector(new ColorDrawable(0)); - listView.setDividerHeight(0); - listView.setDivider(null); - listView.setDrawingCacheEnabled(false); - listView.setScrollingCacheEnabled(false); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(48); - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); - AndroidUtilities.setListViewEdgeEffectColor(listView, 0xff333333); - - emptyView = new TextView(getParentActivity()); - emptyView.setTextColor(0xff808080); - emptyView.setTextSize(20); - emptyView.setGravity(Gravity.CENTER); - emptyView.setVisibility(View.GONE); - emptyView.setText(LocaleController.getString("NoPhotos", R.string.NoPhotos)); - frameLayout.addView(emptyView); - layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(48); - emptyView.setLayoutParams(layoutParams); - emptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - progressView = new FrameLayout(getParentActivity()); - progressView.setVisibility(View.GONE); - frameLayout.addView(progressView); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(48); - progressView.setLayoutParams(layoutParams); - - ProgressBar progressBar = new ProgressBar(getParentActivity()); - progressView.addView(progressBar); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER; - progressView.setLayoutParams(layoutParams); - - photoPickerBottomLayout = new PhotoPickerBottomLayout(getParentActivity()); - frameLayout.addView(photoPickerBottomLayout); - layoutParams = (FrameLayout.LayoutParams) photoPickerBottomLayout.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = AndroidUtilities.dp(48); - layoutParams.gravity = Gravity.BOTTOM; - photoPickerBottomLayout.setLayoutParams(layoutParams); - photoPickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - finishFragment(); - } - }); - photoPickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - sendSelectedPhotos(); - finishFragment(); - } - }); - - if (loading && (albumsSorted == null || albumsSorted != null && albumsSorted.isEmpty())) { - progressView.setVisibility(View.VISIBLE); - listView.setEmptyView(null); - } else { - progressView.setVisibility(View.GONE); - listView.setEmptyView(emptyView); } - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + }); + + ActionBarMenu menu = actionBar.createMenu(); + menu.addItem(1, R.drawable.ic_ab_other); + + fragmentView = new FrameLayout(context); + + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(0xff000000); + + listView = new ListView(context); + listView.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), AndroidUtilities.dp(4)); + listView.setClipToPadding(false); + listView.setHorizontalScrollBarEnabled(false); + listView.setVerticalScrollBarEnabled(false); + listView.setSelector(new ColorDrawable(0)); + listView.setDividerHeight(0); + listView.setDivider(null); + listView.setDrawingCacheEnabled(false); + listView.setScrollingCacheEnabled(false); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.bottomMargin = AndroidUtilities.dp(48); + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter = new ListAdapter(context)); + AndroidUtilities.setListViewEdgeEffectColor(listView, 0xff333333); + + emptyView = new TextView(context); + emptyView.setTextColor(0xff808080); + emptyView.setTextSize(20); + emptyView.setGravity(Gravity.CENTER); + emptyView.setVisibility(View.GONE); + emptyView.setText(LocaleController.getString("NoPhotos", R.string.NoPhotos)); + frameLayout.addView(emptyView); + layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.bottomMargin = AndroidUtilities.dp(48); + emptyView.setLayoutParams(layoutParams); + emptyView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + progressView = new FrameLayout(context); + progressView.setVisibility(View.GONE); + frameLayout.addView(progressView); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.bottomMargin = AndroidUtilities.dp(48); + progressView.setLayoutParams(layoutParams); + + ProgressBar progressBar = new ProgressBar(context); + progressView.addView(progressBar); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER; + progressView.setLayoutParams(layoutParams); + + photoPickerBottomLayout = new PhotoPickerBottomLayout(context); + frameLayout.addView(photoPickerBottomLayout); + layoutParams = (FrameLayout.LayoutParams) photoPickerBottomLayout.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.gravity = Gravity.BOTTOM; + photoPickerBottomLayout.setLayoutParams(layoutParams); + photoPickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finishFragment(); + } + }); + photoPickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + sendSelectedPhotos(); + finishFragment(); + } + }); + + if (loading && (albumsSorted == null || albumsSorted != null && albumsSorted.isEmpty())) { + progressView.setVisibility(View.VISIBLE); + listView.setEmptyView(null); } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + progressView.setVisibility(View.GONE); + listView.setEmptyView(emptyView); } + photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java index 43e856ee3..af94958c1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java @@ -19,7 +19,6 @@ import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.widget.FrameLayout; import org.telegram.android.AndroidUtilities; @@ -432,44 +431,38 @@ public class PhotoCropActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackgroundColor(0xff333333); - actionBar.setItemsBackground(R.drawable.bar_selector_picker); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("CropImage", R.string.CropImage)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - if (delegate != null && !doneButtonPressed) { - Bitmap bitmap = view.getBitmap(); - if (bitmap == imageToCrop) { - sameBitmap = true; - } - delegate.didFinishEdit(bitmap, getArguments()); - doneButtonPressed = true; + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackgroundColor(0xff333333); + actionBar.setItemsBackground(R.drawable.bar_selector_picker); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("CropImage", R.string.CropImage)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (delegate != null && !doneButtonPressed) { + Bitmap bitmap = view.getBitmap(); + if (bitmap == imageToCrop) { + sameBitmap = true; } - finishFragment(); + delegate.didFinishEdit(bitmap, getArguments()); + doneButtonPressed = true; } + finishFragment(); } - }); - - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - fragmentView = view = new PhotoCropView(getParentActivity()); - ((PhotoCropView) fragmentView).freeform = getArguments().getBoolean("freeform", false); - fragmentView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + fragmentView = view = new PhotoCropView(context); + ((PhotoCropView) fragmentView).freeform = getArguments().getBoolean("freeform", false); + fragmentView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java index 3e92b919c..d58873cad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java @@ -142,275 +142,269 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen @SuppressWarnings("unchecked") @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackgroundColor(0xff333333); - actionBar.setItemsBackground(R.drawable.bar_selector_picker); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - if (selectedAlbum != null) { - actionBar.setTitle(selectedAlbum.bucketName); - } else if (type == 0) { - actionBar.setTitle(LocaleController.getString("SearchImagesTitle", R.string.SearchImagesTitle)); - } else if (type == 1) { - actionBar.setTitle(LocaleController.getString("SearchGifsTitle", R.string.SearchGifsTitle)); - } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - if (Build.VERSION.SDK_INT < 11) { - listView.setAdapter(null); - listView = null; - listAdapter = null; - } - finishFragment(); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackgroundColor(0xff333333); + actionBar.setItemsBackground(R.drawable.bar_selector_picker); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + if (selectedAlbum != null) { + actionBar.setTitle(selectedAlbum.bucketName); + } else if (type == 0) { + actionBar.setTitle(LocaleController.getString("SearchImagesTitle", R.string.SearchImagesTitle)); + } else if (type == 1) { + actionBar.setTitle(LocaleController.getString("SearchGifsTitle", R.string.SearchGifsTitle)); + } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + if (Build.VERSION.SDK_INT < 11) { + listView.setAdapter(null); + listView = null; + listAdapter = null; } + finishFragment(); } - }); + } + }); - if (selectedAlbum == null) { - ActionBarMenu menu = actionBar.createMenu(); - searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { + if (selectedAlbum == null) { + ActionBarMenu menu = actionBar.createMenu(); + searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { - } + } - @Override - public boolean onSearchCollapse() { - finishFragment(); - return false; - } + @Override + public boolean onSearchCollapse() { + finishFragment(); + return false; + } - @Override - public void onTextChanged(EditText editText) { - if (editText.getText().length() == 0) { - searchResult.clear(); - searchResultKeys.clear(); - lastSearchString = null; - nextSearchBingString = null; - giphySearchEndReached = true; - searching = false; - requestQueue.cancelAll("search"); - if (type == 0) { - emptyView.setText(LocaleController.getString("NoRecentPhotos", R.string.NoRecentPhotos)); - } else if (type == 1) { - emptyView.setText(LocaleController.getString("NoRecentGIFs", R.string.NoRecentGIFs)); - } - updateSearchInterface(); - } - } - - @Override - public void onSearchPressed(EditText editText) { - if (editText.getText().toString().length() == 0) { - return; - } + @Override + public void onTextChanged(EditText editText) { + if (editText.getText().length() == 0) { searchResult.clear(); searchResultKeys.clear(); + lastSearchString = null; nextSearchBingString = null; giphySearchEndReached = true; + searching = false; + requestQueue.cancelAll("search"); if (type == 0) { - searchBingImages(editText.getText().toString(), 0, 53); + emptyView.setText(LocaleController.getString("NoRecentPhotos", R.string.NoRecentPhotos)); } else if (type == 1) { - searchGiphyImages(editText.getText().toString(), 0, 53); - } - lastSearchString = editText.getText().toString(); - if (lastSearchString.length() == 0) { - lastSearchString = null; - if (type == 0) { - emptyView.setText(LocaleController.getString("NoRecentPhotos", R.string.NoRecentPhotos)); - } else if (type == 1) { - emptyView.setText(LocaleController.getString("NoRecentGIFs", R.string.NoRecentGIFs)); - } - } else { - emptyView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + emptyView.setText(LocaleController.getString("NoRecentGIFs", R.string.NoRecentGIFs)); } updateSearchInterface(); } - }); - } - - if (selectedAlbum == null) { - if (type == 0) { - searchItem.getSearchField().setHint(LocaleController.getString("SearchImagesTitle", R.string.SearchImagesTitle)); - } else if (type == 1) { - searchItem.getSearchField().setHint(LocaleController.getString("SearchGifsTitle", R.string.SearchGifsTitle)); } - } - fragmentView = new FrameLayout(getParentActivity()); - - FrameLayout frameLayout = (FrameLayout) fragmentView; - frameLayout.setBackgroundColor(0xff000000); - - listView = new GridView(getParentActivity()); - listView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4)); - listView.setClipToPadding(false); - listView.setDrawSelectorOnTop(true); - listView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); - listView.setHorizontalScrollBarEnabled(false); - listView.setVerticalScrollBarEnabled(false); - listView.setNumColumns(GridView.AUTO_FIT); - listView.setVerticalSpacing(AndroidUtilities.dp(4)); - listView.setHorizontalSpacing(AndroidUtilities.dp(4)); - listView.setSelector(R.drawable.list_selector); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); - AndroidUtilities.setListViewEdgeEffectColor(listView, 0xff333333); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - ArrayList arrayList = null; - if (selectedAlbum != null) { - arrayList = (ArrayList) selectedAlbum.photos; - } else { - if (searchResult.isEmpty() && lastSearchString == null) { - arrayList = (ArrayList) recentImages; - } else { - arrayList = (ArrayList) searchResult; - } - } - if (i < 0 || i >= arrayList.size()) { + public void onSearchPressed(EditText editText) { + if (editText.getText().toString().length() == 0) { return; } - PhotoViewer.getInstance().setParentActivity(getParentActivity()); - PhotoViewer.getInstance().openPhotoForSelect(arrayList, i, singlePhoto ? 1 : 0, PhotoPickerActivity.this); + searchResult.clear(); + searchResultKeys.clear(); + nextSearchBingString = null; + giphySearchEndReached = true; + if (type == 0) { + searchBingImages(editText.getText().toString(), 0, 53); + } else if (type == 1) { + searchGiphyImages(editText.getText().toString(), 0, 53); + } + lastSearchString = editText.getText().toString(); + if (lastSearchString.length() == 0) { + lastSearchString = null; + if (type == 0) { + emptyView.setText(LocaleController.getString("NoRecentPhotos", R.string.NoRecentPhotos)); + } else if (type == 1) { + emptyView.setText(LocaleController.getString("NoRecentGIFs", R.string.NoRecentGIFs)); + } + } else { + emptyView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + } + updateSearchInterface(); + } + }); + } + + if (selectedAlbum == null) { + if (type == 0) { + searchItem.getSearchField().setHint(LocaleController.getString("SearchImagesTitle", R.string.SearchImagesTitle)); + } else if (type == 1) { + searchItem.getSearchField().setHint(LocaleController.getString("SearchGifsTitle", R.string.SearchGifsTitle)); + } + } + + fragmentView = new FrameLayout(context); + + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(0xff000000); + + listView = new GridView(context); + listView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4)); + listView.setClipToPadding(false); + listView.setDrawSelectorOnTop(true); + listView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); + listView.setHorizontalScrollBarEnabled(false); + listView.setVerticalScrollBarEnabled(false); + listView.setNumColumns(GridView.AUTO_FIT); + listView.setVerticalSpacing(AndroidUtilities.dp(4)); + listView.setHorizontalSpacing(AndroidUtilities.dp(4)); + listView.setSelector(R.drawable.list_selector); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter = new ListAdapter(context)); + AndroidUtilities.setListViewEdgeEffectColor(listView, 0xff333333); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + ArrayList arrayList = null; + if (selectedAlbum != null) { + arrayList = (ArrayList) selectedAlbum.photos; + } else { + if (searchResult.isEmpty() && lastSearchString == null) { + arrayList = (ArrayList) recentImages; + } else { + arrayList = (ArrayList) searchResult; + } + } + if (i < 0 || i >= arrayList.size()) { + return; + } + PhotoViewer.getInstance().setParentActivity(getParentActivity()); + PhotoViewer.getInstance().openPhotoForSelect(arrayList, i, singlePhoto ? 1 : 0, PhotoPickerActivity.this); + } + }); + + if (selectedAlbum == null) { + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (searchResult.isEmpty() && lastSearchString == null) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + recentImages.clear(); + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + MessagesStorage.getInstance().clearWebRecent(type); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + return false; + } + }); + } + + emptyView = new TextView(context); + emptyView.setTextColor(0xff808080); + emptyView.setTextSize(20); + emptyView.setGravity(Gravity.CENTER); + emptyView.setVisibility(View.GONE); + if (selectedAlbum != null) { + emptyView.setText(LocaleController.getString("NoPhotos", R.string.NoPhotos)); + } else { + if (type == 0) { + emptyView.setText(LocaleController.getString("NoRecentPhotos", R.string.NoRecentPhotos)); + } else if (type == 1) { + emptyView.setText(LocaleController.getString("NoRecentGIFs", R.string.NoRecentGIFs)); + } + } + frameLayout.addView(emptyView); + layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); + emptyView.setLayoutParams(layoutParams); + emptyView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + if (selectedAlbum == null) { + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView absListView, int i) { + if (i == SCROLL_STATE_TOUCH_SCROLL) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + } + + @Override + public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !searching) { + if (type == 0 && nextSearchBingString != null) { + searchBingImages(lastSearchString, searchResult.size(), 54); + } else if (type == 1 && !giphySearchEndReached) { + searchGiphyImages(searchItem.getSearchField().getText().toString(), searchResult.size(), 54); + } + } } }); - if (selectedAlbum == null) { - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (searchResult.isEmpty() && lastSearchString == null) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); - builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - recentImages.clear(); - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } - MessagesStorage.getInstance().clearWebRecent(type); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - return true; - } - return false; - } - }); - } - - emptyView = new TextView(getParentActivity()); - emptyView.setTextColor(0xff808080); - emptyView.setTextSize(20); - emptyView.setGravity(Gravity.CENTER); - emptyView.setVisibility(View.GONE); - if (selectedAlbum != null) { - emptyView.setText(LocaleController.getString("NoPhotos", R.string.NoPhotos)); - } else { - if (type == 0) { - emptyView.setText(LocaleController.getString("NoRecentPhotos", R.string.NoRecentPhotos)); - } else if (type == 1) { - emptyView.setText(LocaleController.getString("NoRecentGIFs", R.string.NoRecentGIFs)); - } - } - frameLayout.addView(emptyView); - layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); + progressView = new FrameLayout(context); + progressView.setVisibility(View.GONE); + frameLayout.addView(progressView); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); - emptyView.setLayoutParams(layoutParams); - emptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); + progressView.setLayoutParams(layoutParams); - if (selectedAlbum == null) { - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - if (i == SCROLL_STATE_TOUCH_SCROLL) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); - } - } + ProgressBar progressBar = new ProgressBar(context); + progressView.addView(progressBar); + layoutParams = (FrameLayout.LayoutParams) progressBar.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER; + progressBar.setLayoutParams(layoutParams); - @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !searching) { - if (type == 0 && nextSearchBingString != null) { - searchBingImages(lastSearchString, searchResult.size(), 54); - } else if (type == 1 && !giphySearchEndReached) { - searchGiphyImages(searchItem.getSearchField().getText().toString(), searchResult.size(), 54); - } - } - } - }); - - progressView = new FrameLayout(getParentActivity()); - progressView.setVisibility(View.GONE); - frameLayout.addView(progressView); - layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); - progressView.setLayoutParams(layoutParams); - - ProgressBar progressBar = new ProgressBar(getParentActivity()); - progressView.addView(progressBar); - layoutParams = (FrameLayout.LayoutParams) progressBar.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER; - progressBar.setLayoutParams(layoutParams); - - updateSearchInterface(); - } - - photoPickerBottomLayout = new PhotoPickerBottomLayout(getParentActivity()); - frameLayout.addView(photoPickerBottomLayout); - layoutParams = (FrameLayout.LayoutParams) photoPickerBottomLayout.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = AndroidUtilities.dp(48); - layoutParams.gravity = Gravity.BOTTOM; - photoPickerBottomLayout.setLayoutParams(layoutParams); - photoPickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - delegate.actionButtonPressed(true); - finishFragment(); - } - }); - photoPickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - sendSelectedPhotos(); - } - }); - if (singlePhoto) { - photoPickerBottomLayout.setVisibility(View.GONE); - } - - listView.setEmptyView(emptyView); - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } + updateSearchInterface(); } + + photoPickerBottomLayout = new PhotoPickerBottomLayout(context); + frameLayout.addView(photoPickerBottomLayout); + layoutParams = (FrameLayout.LayoutParams) photoPickerBottomLayout.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.gravity = Gravity.BOTTOM; + photoPickerBottomLayout.setLayoutParams(layoutParams); + photoPickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + delegate.actionButtonPressed(true); + finishFragment(); + } + }); + photoPickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + sendSelectedPhotos(); + } + }); + if (singlePhoto) { + photoPickerBottomLayout.setVisibility(View.GONE); + } + + listView.setEmptyView(emptyView); + photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + return fragmentView; } @@ -488,7 +482,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen object.viewX = coords[0]; object.viewY = coords[1] - AndroidUtilities.statusBarHeight; object.parentView = listView; - object.imageReceiver = cell.photoImage.imageReceiver; + object.imageReceiver = cell.photoImage.getImageReceiver(); object.thumb = object.imageReceiver.getBitmap(); cell.checkBox.setVisibility(View.GONE); return object; @@ -534,7 +528,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { PhotoPickerPhotoCell cell = getCellForIndex(index); if (cell != null) { - return cell.photoImage.imageReceiver.getBitmap(); + return cell.photoImage.getImageReceiver().getBitmap(); } return null; } @@ -1057,7 +1051,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen cell.checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), false); showing = PhotoViewer.getInstance().isShowingImage(photoEntry.thumbUrl); } - imageView.imageReceiver.setVisible(!showing, false); + imageView.getImageReceiver().setVisible(!showing, false); cell.checkBox.setVisibility(singlePhoto || showing ? View.GONE : View.VISIBLE); } else if (viewType == 1) { if (view == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index e6104eb0e..b8a8832d8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -207,7 +207,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC } @Override - public void onTextChanged(CharSequence text) { + public void onTextChanged(CharSequence text, boolean big) { } @@ -264,8 +264,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC avatarContainer.setLayoutParams(layoutParams2); avatarImageView = new BackupImageView(this); - avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(21)); - avatarImageView.processDetach = false; + avatarImageView.setRoundRadius(AndroidUtilities.dp(21)); avatarContainer.addView(avatarImageView); layoutParams2 = (FrameLayout.LayoutParams) avatarImageView.getLayoutParams(); layoutParams2.width = AndroidUtilities.dp(42); @@ -549,7 +548,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC TextView messageText = (TextView)view.findViewById(R.id.message_text); BackupImageView imageView = (BackupImageView) view.findViewById(R.id.message_image); - imageView.imageReceiver.setAspectFit(true); + imageView.setAspectFit(true); if (messageObject.type == 1) { TLRPC.PhotoSize currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize()); @@ -986,6 +985,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC } ConnectionsManager.getInstance().setAppPaused(false, false); fixLayout(); + checkAndUpdateAvatar(); wakeLock.acquire(7000); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java index 0fdf3a59f..6f5d0e901 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java @@ -19,12 +19,10 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.ListView; -import android.widget.Toast; import org.telegram.android.AndroidUtilities; import org.telegram.android.ContactsController; import org.telegram.android.LocaleController; -import org.telegram.android.MessagesController; import org.telegram.android.NotificationCenter; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; @@ -51,10 +49,10 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int lastSeenRow; private int lastSeenDetailRow; private int securitySectionRow; - private int terminateSessionsRow; + private int sessionsRow; private int passwordRow; private int passcodeRow; - private int terminateSessionsDetailRow; + private int sessionsDetailRow; private int deleteAccountSectionRow; private int deleteAccountRow; private int deleteAccountDetailRow; @@ -73,12 +71,12 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio lastSeenDetailRow = rowCount++; securitySectionRow = rowCount++; passcodeRow = rowCount++; - terminateSessionsRow = rowCount++; - terminateSessionsDetailRow = rowCount++; + passwordRow = rowCount++; + sessionsRow = rowCount++; + sessionsDetailRow = rowCount++; deleteAccountSectionRow = rowCount++; deleteAccountRow = rowCount++; deleteAccountDetailRow = rowCount++; - passwordRow = -1; NotificationCenter.getInstance().addObserver(this, NotificationCenter.privacyRulesUpdated); @@ -92,158 +90,114 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("PrivacySettings", R.string.PrivacySettings)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("PrivacySettings", R.string.PrivacySettings)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); } - }); - - listAdapter = new ListAdapter(getParentActivity()); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - frameLayout.setBackgroundColor(0xfff0f0f0); - - ListView listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - listView.setDrawSelectorOnTop(true); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (i == blockedRow) { - presentFragment(new BlockedUsersActivity()); - } else if (i == terminateSessionsRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureSessions", R.string.AreYouSureSessions)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - TLRPC.TL_auth_resetAuthorizations req = new TLRPC.TL_auth_resetAuthorizations(); - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - if (getParentActivity() == null) { - return; - } - if (error == null && response instanceof TLRPC.TL_boolTrue) { - Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("TerminateAllSessions", R.string.TerminateAllSessions), Toast.LENGTH_SHORT); - toast.show(); - } else { - Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("UnknownError", R.string.UnknownError), Toast.LENGTH_SHORT); - toast.show(); - } - } - }); - UserConfig.registeredForPush = false; - UserConfig.registeredForInternalPush = false; - UserConfig.saveConfig(false); - MessagesController.getInstance().registerForPush(UserConfig.pushString); - ConnectionsManager.getInstance().initPushConnection(); - } - }); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == deleteAccountRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("DeleteAccountTitle", R.string.DeleteAccountTitle)); - builder.setItems(new CharSequence[] { - LocaleController.formatPluralString("Months", 1), - LocaleController.formatPluralString("Months", 3), - LocaleController.formatPluralString("Months", 6), - LocaleController.formatPluralString("Years", 1) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int value = 0; - if (which == 0) { - value = 30; - } else if (which == 1) { - value = 90; - } else if (which == 2) { - value = 182; - } else if (which == 3) { - value = 365; - } - final ProgressDialog progressDialog = new ProgressDialog(getParentActivity()); - progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.setCancelable(false); - progressDialog.show(); - - final TLRPC.TL_account_setAccountTTL req = new TLRPC.TL_account_setAccountTTL(); - req.ttl = new TLRPC.TL_accountDaysTTL(); - req.ttl.days = value; - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - try { - progressDialog.dismiss(); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - if (response instanceof TLRPC.TL_boolTrue) { - ContactsController.getInstance().setDeleteAccountTTL(req.ttl.days); - listAdapter.notifyDataSetChanged(); - } - } - }); - } - }); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == lastSeenRow) { - presentFragment(new LastSeenActivity()); - } else if (i == passwordRow) { - presentFragment(new AccountPasswordActivity(0)); - } else if (i == passcodeRow) { - if (UserConfig.passcodeHash.length() > 0) { - presentFragment(new PasscodeActivity(2)); - } else { - presentFragment(new PasscodeActivity(0)); - } - } - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + + listAdapter = new ListAdapter(context); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(0xfff0f0f0); + + ListView listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setDrawSelectorOnTop(true); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == blockedRow) { + presentFragment(new BlockedUsersActivity()); + } else if (i == sessionsRow) { + presentFragment(new SessionsActivity()); + } else if (i == deleteAccountRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("DeleteAccountTitle", R.string.DeleteAccountTitle)); + builder.setItems(new CharSequence[]{ + LocaleController.formatPluralString("Months", 1), + LocaleController.formatPluralString("Months", 3), + LocaleController.formatPluralString("Months", 6), + LocaleController.formatPluralString("Years", 1) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int value = 0; + if (which == 0) { + value = 30; + } else if (which == 1) { + value = 90; + } else if (which == 2) { + value = 182; + } else if (which == 3) { + value = 365; + } + final ProgressDialog progressDialog = new ProgressDialog(getParentActivity()); + progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); + progressDialog.show(); + + final TLRPC.TL_account_setAccountTTL req = new TLRPC.TL_account_setAccountTTL(); + req.ttl = new TLRPC.TL_accountDaysTTL(); + req.ttl.days = value; + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (response instanceof TLRPC.TL_boolTrue) { + ContactsController.getInstance().setDeleteAccountTTL(req.ttl.days); + listAdapter.notifyDataSetChanged(); + } + } + }); + } + }); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == lastSeenRow) { + presentFragment(new LastSeenActivity()); + } else if (i == passwordRow) { + presentFragment(new TwoStepVerificationActivity(0)); + } else if (i == passcodeRow) { + if (UserConfig.passcodeHash.length() > 0) { + presentFragment(new PasscodeActivity(2)); + } else { + presentFragment(new PasscodeActivity(0)); + } + } + } + }); + return fragmentView; } @@ -327,7 +281,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio @Override public boolean isEnabled(int i) { - return i == passcodeRow || i == passwordRow || i == blockedRow || i == terminateSessionsRow || i == lastSeenRow && !ContactsController.getInstance().getLoadingLastSeenInfo() || i == deleteAccountRow && !ContactsController.getInstance().getLoadingDeleteInfo(); + return i == passcodeRow || i == passwordRow || i == blockedRow || i == sessionsRow || i == lastSeenRow && !ContactsController.getInstance().getLoadingLastSeenInfo() || i == deleteAccountRow && !ContactsController.getInstance().getLoadingDeleteInfo(); } @Override @@ -361,10 +315,10 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio TextSettingsCell textCell = (TextSettingsCell) view; if (i == blockedRow) { textCell.setText(LocaleController.getString("BlockedUsers", R.string.BlockedUsers), true); - } else if (i == terminateSessionsRow) { - textCell.setText(LocaleController.getString("TerminateAllSessions", R.string.TerminateAllSessions), false); + } else if (i == sessionsRow) { + textCell.setText(LocaleController.getString("SessionsTitle", R.string.SessionsTitle), false); } else if (i == passwordRow) { - textCell.setText(LocaleController.getString("Password", R.string.Password), true); + textCell.setText(LocaleController.getString("TwoStepVerification", R.string.TwoStepVerification), true); } else if (i == passcodeRow) { textCell.setText(LocaleController.getString("Passcode", R.string.Passcode), true); } else if (i == lastSeenRow) { @@ -401,8 +355,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } else if (i == lastSeenDetailRow) { ((TextInfoPrivacyCell) view).setText(LocaleController.getString("LastSeenHelp", R.string.LastSeenHelp)); view.setBackgroundResource(R.drawable.greydivider); - } else if (i == terminateSessionsDetailRow) { - ((TextInfoPrivacyCell) view).setText(LocaleController.getString("ClearOtherSessionsHelp", R.string.ClearOtherSessionsHelp)); + } else if (i == sessionsDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("SessionsInfo", R.string.SessionsInfo)); view.setBackgroundResource(R.drawable.greydivider); } } else if (type == 2) { @@ -423,9 +377,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio @Override public int getItemViewType(int i) { - if (i == lastSeenRow || i == blockedRow || i == deleteAccountRow || i == terminateSessionsRow || i == passwordRow || i == passcodeRow) { + if (i == lastSeenRow || i == blockedRow || i == deleteAccountRow || i == sessionsRow || i == passwordRow || i == passcodeRow) { return 0; - } else if (i == deleteAccountDetailRow || i == lastSeenDetailRow || i == terminateSessionsDetailRow) { + } else if (i == deleteAccountDetailRow || i == lastSeenDetailRow || i == sessionsDetailRow) { return 1; } else if (i == securitySectionRow || i == deleteAccountSectionRow || i == privacySectionRow) { return 2; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index c697dccc2..99fae5d7e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -20,7 +20,6 @@ import android.graphics.Outline; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.text.Html; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; @@ -208,9 +207,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. @Override public void onFragmentDestroy() { super.onFragmentDestroy(); - if (avatarImage != null) { - avatarImage.setImageDrawable(null); - } NotificationCenter.getInstance().removeObserver(this, NotificationCenter.mediaCountDidLoaded); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats); @@ -227,434 +223,425 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(user_id != 0 ? 5 : chat_id)); - actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(user_id != 0 ? 5 : chat_id)); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setExtraHeight(AndroidUtilities.dp(88), false); - if (AndroidUtilities.isTablet()) { - actionBar.setOccupyStatusBar(false); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(user_id != 0 ? 5 : chat_id)); + actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(user_id != 0 ? 5 : chat_id)); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setExtraHeight(AndroidUtilities.dp(88), false); + if (AndroidUtilities.isTablet()) { + actionBar.setOccupyStatusBar(false); + } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(final int id) { + if (getParentActivity() == null) { + return; + } + if (id == -1) { + finishFragment(); + } else if (id == block_contact) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + if (!userBlocked) { + builder.setMessage(LocaleController.getString("AreYouSureBlockContact", R.string.AreYouSureBlockContact)); + } else { + builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact)); + } + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (!userBlocked) { + MessagesController.getInstance().blockUser(user_id); + } else { + MessagesController.getInstance().unblockUser(user_id); + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (id == add_contact) { + TLRPC.User user = MessagesController.getInstance().getUser(user_id); + Bundle args = new Bundle(); + args.putInt("user_id", user.id); + presentFragment(new ContactAddActivity(args)); + } else if (id == share_contact) { + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putBoolean("serverOnly", true); + MessagesActivity fragment = new MessagesActivity(args); + fragment.setDelegate(ProfileActivity.this); + presentFragment(fragment); + } else if (id == edit_contact) { + Bundle args = new Bundle(); + args.putInt("user_id", user_id); + presentFragment(new ContactAddActivity(args)); + } else if (id == delete_contact) { + final TLRPC.User user = MessagesController.getInstance().getUser(user_id); + if (user == null || getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSureDeleteContact", R.string.AreYouSureDeleteContact)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ArrayList arrayList = new ArrayList<>(); + arrayList.add(user); + ContactsController.getInstance().deleteContact(arrayList); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (id == add_member) { + Bundle args = new Bundle(); + args.putBoolean("onlyUsers", true); + args.putBoolean("destroyAfterSelect", true); + args.putBoolean("returnAsResult", true); + //args.putBoolean("allowUsernameSearch", false); + if (chat_id > 0) { + args.putString("selectAlertString", LocaleController.getString("AddToTheGroup", R.string.AddToTheGroup)); + } + ContactsActivity fragment = new ContactsActivity(args); + fragment.setDelegate(new ContactsActivity.ContactsActivityDelegate() { + @Override + public void didSelectContact(TLRPC.User user, String param) { + MessagesController.getInstance().addUserToChat(chat_id, user, info, param != null ? Utilities.parseInt(param) : 0); + } + }); + if (info != null) { + HashMap users = new HashMap<>(); + for (TLRPC.TL_chatParticipant p : info.participants) { + users.put(p.user_id, null); + } + fragment.setIgnoreUsers(users); + } + presentFragment(fragment); + } else if (id == leave_group) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + kickUser(null); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (id == edit_name) { + Bundle args = new Bundle(); + args.putInt("chat_id", chat_id); + presentFragment(new ChangeChatNameActivity(args)); + } } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(final int id) { + }); + + createActionBarMenu(); + + listAdapter = new ListAdapter(context); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + avatarImage = new BackupImageView(context); + avatarImage.setRoundRadius(AndroidUtilities.dp(30)); + actionBar.addView(avatarImage); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + layoutParams.width = AndroidUtilities.dp(60); + layoutParams.height = AndroidUtilities.dp(60); + layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(17); + layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(17) : 0; + layoutParams.bottomMargin = AndroidUtilities.dp(22); + avatarImage.setLayoutParams(layoutParams); + avatarImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (user_id != 0) { + TLRPC.User user = MessagesController.getInstance().getUser(user_id); + if (user.photo != null && user.photo.photo_big != null) { + PhotoViewer.getInstance().setParentActivity(getParentActivity()); + PhotoViewer.getInstance().openPhoto(user.photo.photo_big, ProfileActivity.this); + } + } else if (chat_id != 0) { + TLRPC.Chat chat = MessagesController.getInstance().getChat(chat_id); + if (chat.photo != null && chat.photo.photo_big != null) { + PhotoViewer.getInstance().setParentActivity(getParentActivity()); + PhotoViewer.getInstance().openPhoto(chat.photo.photo_big, ProfileActivity.this); + } + } + } + }); + + nameTextView = new TextView(context); + nameTextView.setTextColor(0xffffffff); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + nameTextView.setLines(1); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setEllipsize(TextUtils.TruncateAt.END); + nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + actionBar.addView(nameTextView); + layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); + layoutParams.bottomMargin = AndroidUtilities.dp(51); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + nameTextView.setLayoutParams(layoutParams); + + onlineTextView = new TextView(context); + onlineTextView.setTextColor(AvatarDrawable.getProfileTextColorForId(user_id != 0 ? 5 : chat_id)); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + onlineTextView.setLines(1); + onlineTextView.setMaxLines(1); + onlineTextView.setSingleLine(true); + onlineTextView.setEllipsize(TextUtils.TruncateAt.END); + onlineTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + actionBar.addView(onlineTextView); + layoutParams = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); + layoutParams.bottomMargin = AndroidUtilities.dp(30); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + onlineTextView.setLayoutParams(layoutParams); + + listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + AndroidUtilities.setListViewEdgeEffectColor(listView, AvatarDrawable.getProfileBackColorForId(user_id != 0 ? 5 : chat_id)); + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + + listView.setAdapter(listAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (getParentActivity() == null) { + return; + } + if (i == sharedMediaRow) { + Bundle args = new Bundle(); + if (user_id != 0) { + args.putLong("dialog_id", dialog_id != 0 ? dialog_id : user_id); + } else { + args.putLong("dialog_id", -chat_id); + } + presentFragment(new MediaActivity(args)); + } else if (i == settingsKeyRow) { + Bundle args = new Bundle(); + args.putInt("chat_id", (int) (dialog_id >> 32)); + presentFragment(new IdenticonActivity(args)); + } else if (i == settingsTimerRow) { if (getParentActivity() == null) { return; } - if (id == -1) { - finishFragment(); - } else if (id == block_contact) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - if (!userBlocked) { - builder.setMessage(LocaleController.getString("AreYouSureBlockContact", R.string.AreYouSureBlockContact)); - } else { - builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact)); + showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat)); + } else if (i == settingsNotificationsRow) { + Bundle args = new Bundle(); + if (user_id != 0) { + args.putLong("dialog_id", dialog_id == 0 ? user_id : dialog_id); + } else if (chat_id != 0) { + args.putLong("dialog_id", -chat_id); + } + presentFragment(new ProfileNotificationsActivity(args)); + } else if (i == startSecretChatRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSureSecretChat", R.string.AreYouSureSecretChat)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + creatingChat = true; + SecretChatHelper.getInstance().startSecretChat(getParentActivity(), MessagesController.getInstance().getUser(user_id)); } - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (!userBlocked) { - MessagesController.getInstance().blockUser(user_id); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == phoneRow) { + final TLRPC.User user = MessagesController.getInstance().getUser(user_id); + if (user == null || user.phone == null || user.phone.length() == 0 || getParentActivity() == null) { + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setItems(new CharSequence[]{LocaleController.getString("Call", R.string.Call), LocaleController.getString("Copy", R.string.Copy)}, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + try { + Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:+" + user.phone)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getParentActivity().startActivityForResult(intent, 500); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (i == 1) { + if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { + android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + clipboard.setText("+" + user.phone); } else { - MessagesController.getInstance().unblockUser(user_id); + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", "+" + user.phone); + clipboard.setPrimaryClip(clip); } } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (id == add_contact) { - TLRPC.User user = MessagesController.getInstance().getUser(user_id); - Bundle args = new Bundle(); - args.putInt("user_id", user.id); - presentFragment(new ContactAddActivity(args)); - } else if (id == share_contact) { - Bundle args = new Bundle(); - args.putBoolean("onlySelect", true); - args.putBoolean("serverOnly", true); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(ProfileActivity.this); - presentFragment(fragment); - } else if (id == edit_contact) { - Bundle args = new Bundle(); - args.putInt("user_id", user_id); - presentFragment(new ContactAddActivity(args)); - } else if (id == delete_contact) { - final TLRPC.User user = MessagesController.getInstance().getUser(user_id); - if (user == null || getParentActivity() == null) { - return; } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureDeleteContact", R.string.AreYouSureDeleteContact)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ArrayList arrayList = new ArrayList<>(); - arrayList.add(user); - ContactsController.getInstance().deleteContact(arrayList); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (id == add_member) { - Bundle args = new Bundle(); - args.putBoolean("onlyUsers", true); - args.putBoolean("destroyAfterSelect", true); - args.putBoolean("returnAsResult", true); - //args.putBoolean("allowUsernameSearch", false); - if (chat_id > 0) { - args.putString("selectAlertString", LocaleController.getString("AddToTheGroup", R.string.AddToTheGroup)); - } - ContactsActivity fragment = new ContactsActivity(args); - fragment.setDelegate(new ContactsActivity.ContactsActivityDelegate() { - @Override - public void didSelectContact(TLRPC.User user, String param) { - MessagesController.getInstance().addUserToChat(chat_id, user, info, param != null ? Utilities.parseInt(param) : 0); - } - }); - if (info != null) { - HashMap users = new HashMap<>(); - for (TLRPC.TL_chatParticipant p : info.participants) { - users.put(p.user_id, null); - } - fragment.setIgnoreUsers(users); - } - presentFragment(fragment); - } else if (id == leave_group) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - kickUser(null); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (id == edit_name) { - Bundle args = new Bundle(); - args.putInt("chat_id", chat_id); - presentFragment(new ChangeChatNameActivity(args)); - } - } - }); - - createActionBarMenu(); - - listAdapter = new ListAdapter(getParentActivity()); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - - avatarImage = new BackupImageView(getParentActivity()); - avatarImage.imageReceiver.setRoundRadius(AndroidUtilities.dp(30)); - avatarImage.processDetach = false; - actionBar.addView(avatarImage); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; - layoutParams.width = AndroidUtilities.dp(60); - layoutParams.height = AndroidUtilities.dp(60); - layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(17); - layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(17) : 0; - layoutParams.bottomMargin = AndroidUtilities.dp(22); - avatarImage.setLayoutParams(layoutParams); - avatarImage.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (user_id != 0) { - TLRPC.User user = MessagesController.getInstance().getUser(user_id); - if (user.photo != null && user.photo.photo_big != null) { - PhotoViewer.getInstance().setParentActivity(getParentActivity()); - PhotoViewer.getInstance().openPhoto(user.photo.photo_big, ProfileActivity.this); - } - } else if (chat_id != 0) { - TLRPC.Chat chat = MessagesController.getInstance().getChat(chat_id); - if (chat.photo != null && chat.photo.photo_big != null) { - PhotoViewer.getInstance().setParentActivity(getParentActivity()); - PhotoViewer.getInstance().openPhoto(chat.photo.photo_big, ProfileActivity.this); - } - } - } - }); - - nameTextView = new TextView(getParentActivity()); - nameTextView.setTextColor(0xffffffff); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - nameTextView.setLines(1); - nameTextView.setMaxLines(1); - nameTextView.setSingleLine(true); - nameTextView.setEllipsize(TextUtils.TruncateAt.END); - nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - actionBar.addView(nameTextView); - layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); - layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); - layoutParams.bottomMargin = AndroidUtilities.dp(51); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; - nameTextView.setLayoutParams(layoutParams); - - onlineTextView = new TextView(getParentActivity()); - onlineTextView.setTextColor(AvatarDrawable.getProfileTextColorForId(user_id != 0 ? 5 : chat_id)); - onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - onlineTextView.setLines(1); - onlineTextView.setMaxLines(1); - onlineTextView.setSingleLine(true); - onlineTextView.setEllipsize(TextUtils.TruncateAt.END); - onlineTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - actionBar.addView(onlineTextView); - layoutParams = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); - layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); - layoutParams.bottomMargin = AndroidUtilities.dp(30); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; - onlineTextView.setLayoutParams(layoutParams); - - listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - AndroidUtilities.setListViewEdgeEffectColor(listView, AvatarDrawable.getProfileBackColorForId(user_id != 0 ? 5 : chat_id)); - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (getParentActivity() == null) { + }); + showAlertDialog(builder); + } else if (i > emptyRowChat2 && i < membersEndRow) { + int user_id = info.participants.get(sortedUsers.get(i - emptyRowChat2 - 1)).user_id; + if (user_id == UserConfig.getClientUserId()) { return; } - if (i == sharedMediaRow) { - Bundle args = new Bundle(); - if (user_id != 0) { - args.putLong("dialog_id", dialog_id != 0 ? dialog_id : user_id); - } else { - args.putLong("dialog_id", -chat_id); - } - presentFragment(new MediaActivity(args)); - } else if (i == settingsKeyRow) { - Bundle args = new Bundle(); - args.putInt("chat_id", (int)(dialog_id >> 32)); - presentFragment(new IdenticonActivity(args)); - } else if (i == settingsTimerRow) { + Bundle args = new Bundle(); + args.putInt("user_id", user_id); + presentFragment(new ProfileActivity(args)); + } + } + }); + if (chat_id != 0) { + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + if (i > emptyRowChat2 && i < membersEndRow) { if (getParentActivity() == null) { - return; - } - showAlertDialog(AndroidUtilities.buildTTLAlert(getParentActivity(), currentEncryptedChat)); - } else if (i == settingsNotificationsRow) { - Bundle args = new Bundle(); - if (user_id != 0) { - args.putLong("dialog_id", dialog_id == 0 ? user_id : dialog_id); - } else if (chat_id != 0) { - args.putLong("dialog_id", -chat_id); - } - presentFragment(new ProfileNotificationsActivity(args)); - } else if (i == startSecretChatRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureSecretChat", R.string.AreYouSureSecretChat)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - creatingChat = true; - SecretChatHelper.getInstance().startSecretChat(getParentActivity(), MessagesController.getInstance().getUser(user_id)); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == phoneRow) { - final TLRPC.User user = MessagesController.getInstance().getUser(user_id); - if (user == null || user.phone == null || user.phone.length() == 0 || getParentActivity() == null) { - return; + return false; } + TLRPC.TL_chatParticipant user = info.participants.get(sortedUsers.get(i - emptyRowChat2 - 1)); + if (user.user_id == UserConfig.getClientUserId()) { + return false; + } + if (info.admin_id != UserConfig.getClientUserId() && user.inviter_id != UserConfig.getClientUserId()) { + return false; + } + selectedUser = user; + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setItems(new CharSequence[] {LocaleController.getString("Call", R.string.Call), LocaleController.getString("Copy", R.string.Copy)}, new DialogInterface.OnClickListener() { + CharSequence[] items = new CharSequence[]{chat_id > 0 ? LocaleController.getString("KickFromGroup", R.string.KickFromGroup) : LocaleController.getString("KickFromBroadcast", R.string.KickFromBroadcast)}; + + builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { if (i == 0) { - try { - Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:+" + user.phone)); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - getParentActivity().startActivityForResult(intent, 500); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else if (i == 1) { - if(Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setText("+" + user.phone); - } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager)ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", "+" + user.phone); - clipboard.setPrimaryClip(clip); - } + kickUser(selectedUser); } } }); showAlertDialog(builder); - } else if (i > emptyRowChat2 && i < membersEndRow) { - int user_id = info.participants.get(sortedUsers.get(i - emptyRowChat2 - 1)).user_id; - if (user_id == UserConfig.getClientUserId()) { + + return true; + } + return false; + } + }); + } + if (dialog_id != 0) { + SharedMediaQuery.getMediaCount(dialog_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true); + } else { + SharedMediaQuery.getMediaCount(user_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true); + } + + frameLayout.addView(actionBar); + + if (user_id != 0 || chat_id >= 0 && !currentChat.left) { + writeButton = new ImageView(context); + writeButton.setBackgroundResource(R.drawable.floating_user_states); + writeButton.setScaleType(ImageView.ScaleType.CENTER); + if (user_id != 0) { + writeButton.setImageResource(R.drawable.floating_message); + writeButton.setPadding(0, AndroidUtilities.dp(3), 0, 0); + } else if (chat_id != 0) { + writeButton.setImageResource(R.drawable.floating_camera); + } + frameLayout.addView(writeButton); + if (Build.VERSION.SDK_INT >= 21) { + StateListAnimator animator = new StateListAnimator(); + animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); + animator.addState(new int[]{}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); + writeButton.setStateListAnimator(animator); + writeButton.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + } + }); + } + layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 0); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 16); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); + writeButton.setLayoutParams(layoutParams); + writeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentActivity() == null) { + return; + } + if (user_id != 0) { + TLRPC.User user = MessagesController.getInstance().getUser(user_id); + if (user == null || user instanceof TLRPC.TL_userEmpty) { return; } + NotificationCenter.getInstance().removeObserver(ProfileActivity.this, NotificationCenter.closeChats); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); Bundle args = new Bundle(); args.putInt("user_id", user_id); - presentFragment(new ProfileActivity(args)); + presentFragment(new ChatActivity(args), true); + } else if (chat_id != 0) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + CharSequence[] items; + TLRPC.Chat chat = MessagesController.getInstance().getChat(chat_id); + if (chat.photo == null || chat.photo.photo_big == null || chat.photo instanceof TLRPC.TL_chatPhotoEmpty) { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; + } else { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; + } + + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + int action = 0; + if (i == 0) { + avatarUpdater.openCamera(); + } else if (i == 1) { + avatarUpdater.openGallery(); + } else if (i == 2) { + MessagesController.getInstance().changeChatAvatar(chat_id, null); + } + } + }); + showAlertDialog(builder); } } }); - if (chat_id != 0) { - listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { - if (i > emptyRowChat2 && i < membersEndRow) { - if (getParentActivity() == null) { - return false; - } - - TLRPC.TL_chatParticipant user = info.participants.get(sortedUsers.get(i - emptyRowChat2 - 1)); - if (user.user_id == UserConfig.getClientUserId()) { - return false; - } - if (info.admin_id != UserConfig.getClientUserId() && user.inviter_id != UserConfig.getClientUserId()) { - return false; - } - selectedUser = user; - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items = new CharSequence[]{chat_id > 0 ? LocaleController.getString("KickFromGroup", R.string.KickFromGroup) : LocaleController.getString("KickFromBroadcast", R.string.KickFromBroadcast)}; - - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (i == 0) { - kickUser(selectedUser); - } - } - }); - showAlertDialog(builder); - - return true; - } - return false; - } - }); - } - if (dialog_id != 0) { - SharedMediaQuery.getMediaCount(dialog_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true); - } else { - SharedMediaQuery.getMediaCount(user_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true); - } - - frameLayout.addView(actionBar); - - if (user_id != 0 || chat_id >= 0 && !currentChat.left) { - writeButton = new ImageView(getParentActivity()); - writeButton.setBackgroundResource(R.drawable.floating_user_states); - writeButton.setScaleType(ImageView.ScaleType.CENTER); - if (user_id != 0) { - writeButton.setImageResource(R.drawable.floating_message); - writeButton.setPadding(0, AndroidUtilities.dp(3), 0, 0); - } else if (chat_id != 0) { - writeButton.setImageResource(R.drawable.floating_camera); - } - frameLayout.addView(writeButton); - if (Build.VERSION.SDK_INT >= 21) { - StateListAnimator animator = new StateListAnimator(); - animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); - animator.addState(new int[] {}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); - writeButton.setStateListAnimator(animator); - writeButton.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); - } - }); - } - layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 0); - layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 16); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); - writeButton.setLayoutParams(layoutParams); - writeButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (getParentActivity() == null) { - return; - } - if (user_id != 0) { - TLRPC.User user = MessagesController.getInstance().getUser(user_id); - if (user == null || user instanceof TLRPC.TL_userEmpty) { - return; - } - NotificationCenter.getInstance().removeObserver(ProfileActivity.this, NotificationCenter.closeChats); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - Bundle args = new Bundle(); - args.putInt("user_id", user_id); - presentFragment(new ChatActivity(args), true); - } else if (chat_id != 0) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items; - TLRPC.Chat chat = MessagesController.getInstance().getChat(chat_id); - if (chat.photo == null || chat.photo.photo_big == null || chat.photo instanceof TLRPC.TL_chatPhotoEmpty) { - items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; - } else { - items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; - } - - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - int action = 0; - if (i == 0) { - avatarUpdater.openCamera(); - } else if (i == 1) { - avatarUpdater.openGallery(); - } else if (i == 2) { - MessagesController.getInstance().changeChatAvatar(chat_id, null); - } - } - }); - showAlertDialog(builder); - } - } - }); - } - - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - checkListViewScroll(); - } - }); - - updateProfileData(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } } + + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + checkListViewScroll(); + } + }); + return fragmentView; } @@ -733,7 +720,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } - avatarImage.imageReceiver.setRoundRadius(AndroidUtilities.dp(avatarSize / 2)); + avatarImage.setRoundRadius(AndroidUtilities.dp(avatarSize / 2)); layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(avatarSize); layoutParams.height = AndroidUtilities.dp(avatarSize); @@ -889,6 +876,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } + updateProfileData(); fixLayout(); } @@ -924,11 +912,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. object.viewX = coords[0]; object.viewY = coords[1] - AndroidUtilities.statusBarHeight; object.parentView = avatarImage; - object.imageReceiver = avatarImage.imageReceiver; + object.imageReceiver = avatarImage.getImageReceiver(); object.user_id = user_id; object.thumb = object.imageReceiver.getBitmap(); object.size = -1; - object.radius = avatarImage.imageReceiver.getRoundRadius(); + object.radius = avatarImage.getImageReceiver().getRoundRadius(); return object; } return null; @@ -944,7 +932,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. @Override public void willHidePhotoViewer() { - avatarImage.imageReceiver.setVisible(true, true); + avatarImage.getImageReceiver().setVisible(true, true); } @Override @@ -1044,7 +1032,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats); NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); MessagesController.getInstance().deleteUserFromChat(chat_id, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), info); - MessagesController.getInstance().deleteDialog(-chat_id, 0, false); finishFragment(); } } @@ -1123,7 +1110,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } onlineTextView.setText(LocaleController.formatUserStatus(user)); - avatarImage.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); + avatarImage.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); } else if (chat_id != 0) { TLRPC.Chat chat = MessagesController.getInstance().getChat(chat_id); if (chat != null) { @@ -1137,7 +1124,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } if (count != 0 && onlineCount > 1) { - onlineTextView.setText(Html.fromHtml(String.format("%s, %s", LocaleController.formatPluralString("Members", count), LocaleController.formatPluralString("Online", onlineCount)))); + onlineTextView.setText(String.format("%s, %s", LocaleController.formatPluralString("Members", count), LocaleController.formatPluralString("Online", onlineCount))); } else { onlineTextView.setText(LocaleController.formatPluralString("Members", count)); } @@ -1150,7 +1137,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } avatarImage.setImage(photo, "50_50", new AvatarDrawable(chat, true)); - avatarImage.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); + avatarImage.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java index 59514828c..e845fd4de 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java @@ -85,220 +85,214 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("NotificationsAndSounds", R.string.NotificationsAndSounds)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("NotificationsAndSounds", R.string.NotificationsAndSounds)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); } - }); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - - listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - AndroidUtilities.setListViewEdgeEffectColor(listView, AvatarDrawable.getProfileBackColorForId(5)); - frameLayout.addView(listView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - listView.setLayoutParams(layoutParams); - listView.setAdapter(new ListAdapter(getParentActivity())); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (i == settingsVibrateRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("Vibrate", R.string.Vibrate)); - builder.setItems(new CharSequence[] { - LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), - LocaleController.getString("SettingsDefault", R.string.SettingsDefault), - LocaleController.getString("SystemDefault", R.string.SystemDefault), - LocaleController.getString("Short", R.string.Short), - LocaleController.getString("Long", R.string.Long) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (which == 0) { - editor.putInt("vibrate_" + dialog_id, 2); - } else if (which == 1) { - editor.putInt("vibrate_" + dialog_id, 0); - } else if (which == 2) { - editor.putInt("vibrate_" + dialog_id, 4); - } else if (which == 3) { - editor.putInt("vibrate_" + dialog_id, 1); - } else if (which == 4) { - editor.putInt("vibrate_" + dialog_id, 3); - } - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == settingsNotificationsRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setItems(new CharSequence[] { - LocaleController.getString("Default", R.string.Default), - LocaleController.getString("Enabled", R.string.Enabled), - LocaleController.getString("NotificationsDisabled", R.string.NotificationsDisabled) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface d, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("notify2_" + dialog_id, which); - MessagesStorage.getInstance().setDialogFlags(dialog_id, which == 2 ? 1 : 0); - editor.commit(); - TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); - if (dialog != null) { - dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); - if (which == 2) { - dialog.notify_settings.mute_until = Integer.MAX_VALUE; - } - } - if (listView != null) { - listView.invalidateViews(); - } - NotificationsController.updateServerNotificationsSettings(dialog_id); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == settingsSoundRow) { - try { - Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - Uri currentSound = null; - - String defaultPath = null; - Uri defaultUri = Settings.System.DEFAULT_NOTIFICATION_URI; - if (defaultUri != null) { - defaultPath = defaultUri.getPath(); - } - - String path = preferences.getString("sound_path_" + dialog_id, defaultPath); - if (path != null && !path.equals("NoSound")) { - if (path.equals(defaultPath)) { - currentSound = defaultUri; - } else { - currentSound = Uri.parse(path); - } - } - - tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); - startActivityForResult(tmpIntent, 12); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else if (i == settingsLedRow) { - if (getParentActivity() == null) { - return; - } - - LayoutInflater li = (LayoutInflater)getParentActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = li.inflate(R.layout.settings_color_dialog_layout, null, false); - final ColorPickerView colorPickerView = (ColorPickerView)view.findViewById(R.id.color_picker); - - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - if (preferences.contains("color_" + dialog_id)) { - colorPickerView.setOldCenterColor(preferences.getInt("color_" + dialog_id, 0xff00ff00)); - } else { - if ((int)dialog_id < 0) { - colorPickerView.setOldCenterColor(preferences.getInt("GroupLed", 0xff00ff00)); - } else { - colorPickerView.setOldCenterColor(preferences.getInt("MessagesLed", 0xff00ff00)); - } - } - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("LedColor", R.string.LedColor)); - builder.setView(view); - builder.setPositiveButton(LocaleController.getString("Set", R.string.Set), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int which) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("color_" + dialog_id, colorPickerView.getColor()); - editor.commit(); - listView.invalidateViews(); - } - }); - builder.setNeutralButton(LocaleController.getString("LedDisabled", R.string.LedDisabled), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("color_" + dialog_id, 0); - editor.commit(); - listView.invalidateViews(); - } - }); - builder.setNegativeButton(LocaleController.getString("Default", R.string.Default), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.remove("color_" + dialog_id); - editor.commit(); - listView.invalidateViews(); - } - }); - showAlertDialog(builder); - } else if (i == settingsPriorityRow) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("NotificationsPriority", R.string.NotificationsPriority)); - builder.setItems(new CharSequence[] { - LocaleController.getString("SettingsDefault", R.string.SettingsDefault), - LocaleController.getString("NotificationsPriorityDefault", R.string.NotificationsPriorityDefault), - LocaleController.getString("NotificationsPriorityHigh", R.string.NotificationsPriorityHigh), - LocaleController.getString("NotificationsPriorityMax", R.string.NotificationsPriorityMax) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - which = 3; - } else { - which--; - } - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - preferences.edit().putInt("priority_" + dialog_id, which).commit(); - if (listView != null) { - listView.invalidateViews(); - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } - } - }); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + AndroidUtilities.setListViewEdgeEffectColor(listView, AvatarDrawable.getProfileBackColorForId(5)); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + listView.setLayoutParams(layoutParams); + listView.setAdapter(new ListAdapter(context)); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == settingsVibrateRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("Vibrate", R.string.Vibrate)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), + LocaleController.getString("SettingsDefault", R.string.SettingsDefault), + LocaleController.getString("SystemDefault", R.string.SystemDefault), + LocaleController.getString("Short", R.string.Short), + LocaleController.getString("Long", R.string.Long) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (which == 0) { + editor.putInt("vibrate_" + dialog_id, 2); + } else if (which == 1) { + editor.putInt("vibrate_" + dialog_id, 0); + } else if (which == 2) { + editor.putInt("vibrate_" + dialog_id, 4); + } else if (which == 3) { + editor.putInt("vibrate_" + dialog_id, 1); + } else if (which == 4) { + editor.putInt("vibrate_" + dialog_id, 3); + } + editor.commit(); + if (listView != null) { + listView.invalidateViews(); + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == settingsNotificationsRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("Default", R.string.Default), + LocaleController.getString("Enabled", R.string.Enabled), + LocaleController.getString("NotificationsDisabled", R.string.NotificationsDisabled) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("notify2_" + dialog_id, which); + MessagesStorage.getInstance().setDialogFlags(dialog_id, which == 2 ? 1 : 0); + editor.commit(); + TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); + if (dialog != null) { + dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); + if (which == 2) { + dialog.notify_settings.mute_until = Integer.MAX_VALUE; + } + } + if (listView != null) { + listView.invalidateViews(); + } + NotificationsController.updateServerNotificationsSettings(dialog_id); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == settingsSoundRow) { + try { + Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + Uri currentSound = null; + + String defaultPath = null; + Uri defaultUri = Settings.System.DEFAULT_NOTIFICATION_URI; + if (defaultUri != null) { + defaultPath = defaultUri.getPath(); + } + + String path = preferences.getString("sound_path_" + dialog_id, defaultPath); + if (path != null && !path.equals("NoSound")) { + if (path.equals(defaultPath)) { + currentSound = defaultUri; + } else { + currentSound = Uri.parse(path); + } + } + + tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); + startActivityForResult(tmpIntent, 12); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (i == settingsLedRow) { + if (getParentActivity() == null) { + return; + } + + LayoutInflater li = (LayoutInflater) getParentActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = li.inflate(R.layout.settings_color_dialog_layout, null, false); + final ColorPickerView colorPickerView = (ColorPickerView) view.findViewById(R.id.color_picker); + + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + if (preferences.contains("color_" + dialog_id)) { + colorPickerView.setOldCenterColor(preferences.getInt("color_" + dialog_id, 0xff00ff00)); + } else { + if ((int) dialog_id < 0) { + colorPickerView.setOldCenterColor(preferences.getInt("GroupLed", 0xff00ff00)); + } else { + colorPickerView.setOldCenterColor(preferences.getInt("MessagesLed", 0xff00ff00)); + } + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("LedColor", R.string.LedColor)); + builder.setView(view); + builder.setPositiveButton(LocaleController.getString("Set", R.string.Set), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int which) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("color_" + dialog_id, colorPickerView.getColor()); + editor.commit(); + listView.invalidateViews(); + } + }); + builder.setNeutralButton(LocaleController.getString("LedDisabled", R.string.LedDisabled), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("color_" + dialog_id, 0); + editor.commit(); + listView.invalidateViews(); + } + }); + builder.setNegativeButton(LocaleController.getString("Default", R.string.Default), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.remove("color_" + dialog_id); + editor.commit(); + listView.invalidateViews(); + } + }); + showAlertDialog(builder); + } else if (i == settingsPriorityRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("NotificationsPriority", R.string.NotificationsPriority)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("SettingsDefault", R.string.SettingsDefault), + LocaleController.getString("NotificationsPriorityDefault", R.string.NotificationsPriorityDefault), + LocaleController.getString("NotificationsPriorityHigh", R.string.NotificationsPriorityHigh), + LocaleController.getString("NotificationsPriorityMax", R.string.NotificationsPriorityMax) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == 0) { + which = 3; + } else { + which--; + } + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + preferences.edit().putInt("priority_" + dialog_id, which).commit(); + if (listView != null) { + listView.invalidateViews(); + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + } + }); + return fragmentView; } @@ -314,7 +308,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi Ringtone rng = RingtoneManager.getRingtone(ApplicationLoader.applicationContext, ringtone); if (rng != null) { if(ringtone.equals(Settings.System.DEFAULT_NOTIFICATION_URI)) { - name = LocaleController.getString("Default", R.string.Default); + name = LocaleController.getString("SoundDefault", R.string.SoundDefault); } else { name = rng.getTitle(getParentActivity()); } @@ -437,7 +431,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi } } } else if (i == settingsSoundRow) { - String value = preferences.getString("sound_" + dialog_id, LocaleController.getString("Default", R.string.Default)); + String value = preferences.getString("sound_" + dialog_id, LocaleController.getString("SoundDefault", R.string.SoundDefault)); if (value.equals("NoSound")) { value = LocaleController.getString("NoSound", R.string.NoSound); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java new file mode 100644 index 000000000..fb90c3100 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java @@ -0,0 +1,475 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui; + +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Build; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.android.MessagesController; +import org.telegram.android.NotificationCenter; +import org.telegram.messenger.ConnectionsManager; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.RPCRequest; +import org.telegram.messenger.TLObject; +import org.telegram.messenger.TLRPC; +import org.telegram.messenger.UserConfig; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.Adapters.BaseFragmentAdapter; +import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Cells.SessionCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.TextSettingsCell; + +import java.util.ArrayList; + +public class SessionsActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + + private ListAdapter listAdapter; + private ArrayList sessions = new ArrayList<>(); + private TLRPC.TL_authorization currentSession = null; + private boolean loading; + private LinearLayout emptyLayout; + + private int currentSessionSectionRow; + private int currentSessionRow; + private int terminateAllSessionsRow; + private int terminateAllSessionsDetailRow; + private int otherSessionsSectionRow; + private int otherSessionsStartRow; + private int otherSessionsEndRow; + private int otherSessionsTerminateDetail; + private int noOtherSessionsRow; + private int rowCount; + + @Override + public boolean onFragmentCreate() { + super.onFragmentCreate(); + updateRows(); + loadSessions(false); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.newSessionReceived); + return true; + } + + @Override + public void onFragmentDestroy() { + super.onFragmentDestroy(); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.newSessionReceived); + } + + @Override + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("SessionsTitle", R.string.SessionsTitle)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + listAdapter = new ListAdapter(context); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(0xfff0f0f0); + + emptyLayout = new LinearLayout(context); + emptyLayout.setOrientation(LinearLayout.VERTICAL); + emptyLayout.setGravity(Gravity.CENTER); + emptyLayout.setBackgroundResource(R.drawable.greydivider_bottom); + emptyLayout.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AndroidUtilities.displaySize.y - AndroidUtilities.getCurrentActionBarHeight())); + + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.devices); + emptyLayout.addView(imageView); + LinearLayout.LayoutParams layoutParams2 = (LinearLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams2.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = LinearLayout.LayoutParams.WRAP_CONTENT; + imageView.setLayoutParams(layoutParams2); + + TextView textView = new TextView(context); + textView.setTextColor(0xff8a8a8a); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setText(LocaleController.getString("NoOtherSessions", R.string.NoOtherSessions)); + emptyLayout.addView(textView); + layoutParams2 = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams2.topMargin = AndroidUtilities.dp(16); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + textView.setLayoutParams(layoutParams2); + + textView = new TextView(context); + textView.setTextColor(0xff8a8a8a); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + textView.setPadding(AndroidUtilities.dp(20), 0, AndroidUtilities.dp(20), 0); + textView.setText(LocaleController.getString("NoOtherSessionsInfo", R.string.NoOtherSessionsInfo)); + emptyLayout.addView(textView); + layoutParams2 = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams2.topMargin = AndroidUtilities.dp(14); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + textView.setLayoutParams(layoutParams2); + + FrameLayout progressView = new FrameLayout(context); + frameLayout.addView(progressView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + progressView.setLayoutParams(layoutParams); + progressView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + ProgressBar progressBar = new ProgressBar(context); + progressView.addView(progressBar); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER; + progressView.setLayoutParams(layoutParams); + + ListView listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setDrawSelectorOnTop(true); + listView.setEmptyView(progressView); + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == terminateAllSessionsRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSureSessions", R.string.AreYouSureSessions)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + TLRPC.TL_auth_resetAuthorizations req = new TLRPC.TL_auth_resetAuthorizations(); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (getParentActivity() == null) { + return; + } + if (error == null && response instanceof TLRPC.TL_boolTrue) { + Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("TerminateAllSessions", R.string.TerminateAllSessions), Toast.LENGTH_SHORT); + toast.show(); + } else { + Toast toast = Toast.makeText(getParentActivity(), LocaleController.getString("UnknownError", R.string.UnknownError), Toast.LENGTH_SHORT); + toast.show(); + } + finishFragment(); + } + }); + UserConfig.registeredForPush = false; + UserConfig.registeredForInternalPush = false; + UserConfig.saveConfig(false); + MessagesController.getInstance().registerForPush(UserConfig.pushString); + ConnectionsManager.getInstance().initPushConnection(); + } + }); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i >= otherSessionsStartRow && i < otherSessionsEndRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("TerminateSessionQuestion", R.string.TerminateSessionQuestion)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int option) { + final ProgressDialog progressDialog = new ProgressDialog(getParentActivity()); + progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); + progressDialog.show(); + + final TLRPC.TL_authorization authorization = sessions.get(i - otherSessionsStartRow); + TLRPC.TL_account_resetAuthorization req = new TLRPC.TL_account_resetAuthorization(); + req.hash = authorization.hash; + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (error == null) { + sessions.remove(authorization); + updateRows(); + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + } + } + }); + } + }); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + } + }); + + return fragmentView; + } + + @Override + public void onResume() { + super.onResume(); + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + } + + @Override + public void didReceivedNotification(int id, Object... args) { + if (id == NotificationCenter.newSessionReceived) { + loadSessions(true); + } + } + + private void loadSessions(boolean silent) { + if (loading) { + return; + } + if (!silent) { + loading = true; + } + TLRPC.TL_account_getAuthorizations req = new TLRPC.TL_account_getAuthorizations(); + long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + loading = false; + if (error == null) { + sessions.clear(); + TLRPC.TL_account_authorizations res = (TLRPC.TL_account_authorizations) response; + for (TLRPC.TL_authorization authorization : res.authorizations) { + if ((authorization.flags & 1) != 0) { + currentSession = authorization; + } else { + sessions.add(authorization); + } + } + updateRows(); + } + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + } + }); + } + }); + ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid); + } + + private void updateRows() { + rowCount = 0; + if (currentSession != null) { + currentSessionSectionRow = rowCount++; + currentSessionRow = rowCount++; + } else { + currentSessionRow = -1; + currentSessionSectionRow = -1; + } + if (sessions.isEmpty()) { + noOtherSessionsRow = -1; + terminateAllSessionsRow = -1; + terminateAllSessionsDetailRow = -1; + otherSessionsSectionRow = -1; + otherSessionsStartRow = -1; + otherSessionsEndRow = -1; + otherSessionsTerminateDetail = -1; + } else { + noOtherSessionsRow = -1; + terminateAllSessionsRow = rowCount++; + terminateAllSessionsDetailRow = rowCount++; + otherSessionsSectionRow = rowCount++; + otherSessionsStartRow = otherSessionsSectionRow + 1; + otherSessionsEndRow = otherSessionsStartRow + sessions.size(); + rowCount += sessions.size(); + otherSessionsTerminateDetail = rowCount++; + } + } + + private class ListAdapter extends BaseFragmentAdapter { + private Context mContext; + + public ListAdapter(Context context) { + mContext = context; + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int i) { + return i == terminateAllSessionsRow || i >= otherSessionsStartRow && i < otherSessionsEndRow; + } + + @Override + public int getCount() { + return loading ? 0 : rowCount; + } + + @Override + public Object getItem(int i) { + return null; + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + int type = getItemViewType(i); + if (type == 0) { + if (view == null) { + view = new TextSettingsCell(mContext); + view.setBackgroundColor(0xffffffff); + } + TextSettingsCell textCell = (TextSettingsCell) view; + if (i == terminateAllSessionsRow) { + textCell.setTextColor(0xffdb5151); + textCell.setText(LocaleController.getString("TerminateAllSessions", R.string.TerminateAllSessions), false); + } + } else if (type == 1) { + if (view == null) { + view = new TextInfoPrivacyCell(mContext); + } + if (i == terminateAllSessionsDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("ClearOtherSessionsHelp", R.string.ClearOtherSessionsHelp)); + view.setBackgroundResource(R.drawable.greydivider); + } else if (i == otherSessionsTerminateDetail) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("TerminateSessionInfo", R.string.TerminateSessionInfo)); + view.setBackgroundResource(R.drawable.greydivider_bottom); + } + } else if (type == 2) { + if (view == null) { + view = new HeaderCell(mContext); + view.setBackgroundColor(0xffffffff); + } + if (i == currentSessionSectionRow) { + ((HeaderCell) view).setText(LocaleController.getString("CurrentSession", R.string.CurrentSession)); + } else if (i == otherSessionsSectionRow) { + ((HeaderCell) view).setText(LocaleController.getString("OtherSessions", R.string.OtherSessions)); + } + } else if (type == 3) { + ViewGroup.LayoutParams layoutParams = emptyLayout.getLayoutParams(); + if (layoutParams != null) { + layoutParams.height = Math.max(AndroidUtilities.dp(220), AndroidUtilities.displaySize.y - AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(128) - (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0)); + emptyLayout.setLayoutParams(layoutParams); + } + return emptyLayout; + } else if (type == 4) { + if (view == null) { + view = new SessionCell(mContext); + view.setBackgroundColor(0xffffffff); + } + if (i == currentSessionRow) { + ((SessionCell) view).setSession(currentSession, !sessions.isEmpty()); + } else { + ((SessionCell) view).setSession(sessions.get(i - otherSessionsStartRow), i != otherSessionsEndRow - 1); + } + } + return view; + } + + @Override + public int getItemViewType(int i) { + if (i == terminateAllSessionsRow) { + return 0; + } else if (i == terminateAllSessionsDetailRow || i == otherSessionsTerminateDetail) { + return 1; + } else if (i == currentSessionSectionRow || i == otherSessionsSectionRow) { + return 2; + } else if (i == noOtherSessionsRow) { + return 3; + } else if (i == currentSessionRow || i >= otherSessionsStartRow && i < otherSessionsEndRow) { + return 4; + } + return 0; + } + + @Override + public int getViewTypeCount() { + return 5; + } + + @Override + public boolean isEmpty() { + return loading; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index e3a5eef4f..f6ac527a5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -268,439 +268,430 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(5)); - actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setExtraHeight(AndroidUtilities.dp(88), false); - if (AndroidUtilities.isTablet()) { - actionBar.setOccupyStatusBar(false); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(5)); + actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setExtraHeight(AndroidUtilities.dp(88), false); + if (AndroidUtilities.isTablet()) { + actionBar.setOccupyStatusBar(false); + } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == edit_name) { + presentFragment(new ChangeNameActivity()); + } else if (id == logout) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSureLogout", R.string.AreYouSureLogout)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.clear().commit(); + MessagesController.getInstance().unregistedPush(); + MessagesController.getInstance().logOut(); + UserConfig.clearConfig(); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.appDidLogout); + MessagesStorage.getInstance().cleanUp(false); + MessagesController.getInstance().cleanUp(); + ContactsController.getInstance().deleteAllAppAccounts(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } } - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == edit_name) { - presentFragment(new ChangeNameActivity()); - } else if (id == logout) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSureLogout", R.string.AreYouSureLogout)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.clear().commit(); - MessagesController.getInstance().unregistedPush(); - MessagesController.getInstance().logOut(); - UserConfig.clearConfig(); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.appDidLogout); - MessagesStorage.getInstance().cleanUp(false); - MessagesController.getInstance().cleanUp(); - ContactsController.getInstance().deleteAllAppAccounts(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } + }); + ActionBarMenu menu = actionBar.createMenu(); + ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other); + item.addSubItem(edit_name, LocaleController.getString("EditName", R.string.EditName), 0); + item.addSubItem(logout, LocaleController.getString("LogOut", R.string.LogOut), 0); + + listAdapter = new ListAdapter(context); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + avatarImage = new BackupImageView(context); + avatarImage.setRoundRadius(AndroidUtilities.dp(30)); + actionBar.addView(avatarImage); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + layoutParams.width = AndroidUtilities.dp(60); + layoutParams.height = AndroidUtilities.dp(60); + layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(17); + layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(17) : 0; + layoutParams.bottomMargin = AndroidUtilities.dp(22); + avatarImage.setLayoutParams(layoutParams); + avatarImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); + if (user.photo != null && user.photo.photo_big != null) { + PhotoViewer.getInstance().setParentActivity(getParentActivity()); + PhotoViewer.getInstance().openPhoto(user.photo.photo_big, SettingsActivity.this); } - }); - ActionBarMenu menu = actionBar.createMenu(); - ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other); - item.addSubItem(edit_name, LocaleController.getString("EditName", R.string.EditName), 0); - item.addSubItem(logout, LocaleController.getString("LogOut", R.string.LogOut), 0); - - listAdapter = new ListAdapter(getParentActivity()); - - fragmentView = new FrameLayout(getParentActivity()); - FrameLayout frameLayout = (FrameLayout) fragmentView; - - avatarImage = new BackupImageView(getParentActivity()); - avatarImage.imageReceiver.setRoundRadius(AndroidUtilities.dp(30)); - avatarImage.processDetach = false; - actionBar.addView(avatarImage); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; - layoutParams.width = AndroidUtilities.dp(60); - layoutParams.height = AndroidUtilities.dp(60); - layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(17); - layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(17) : 0; - layoutParams.bottomMargin = AndroidUtilities.dp(22); - avatarImage.setLayoutParams(layoutParams); - avatarImage.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); - if (user.photo != null && user.photo.photo_big != null) { - PhotoViewer.getInstance().setParentActivity(getParentActivity()); - PhotoViewer.getInstance().openPhoto(user.photo.photo_big, SettingsActivity.this); - } - } - }); - - nameTextView = new TextView(getParentActivity()); - nameTextView.setTextColor(0xffffffff); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - nameTextView.setLines(1); - nameTextView.setMaxLines(1); - nameTextView.setSingleLine(true); - nameTextView.setEllipsize(TextUtils.TruncateAt.END); - nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - actionBar.addView(nameTextView); - layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); - layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); - layoutParams.bottomMargin = AndroidUtilities.dp(51); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; - nameTextView.setLayoutParams(layoutParams); - - onlineTextView = new TextView(getParentActivity()); - onlineTextView.setTextColor(AvatarDrawable.getProfileTextColorForId(5)); - onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - onlineTextView.setLines(1); - onlineTextView.setMaxLines(1); - onlineTextView.setSingleLine(true); - onlineTextView.setEllipsize(TextUtils.TruncateAt.END); - onlineTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); - actionBar.addView(onlineTextView); - layoutParams = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); - layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); - layoutParams.bottomMargin = AndroidUtilities.dp(30); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; - onlineTextView.setLayoutParams(layoutParams); - - listView = new ListView(getParentActivity()); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setVerticalScrollBarEnabled(false); - AndroidUtilities.setListViewEdgeEffectColor(listView, AvatarDrawable.getProfileBackColorForId(5)); - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (i == textSizeRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("TextSize", R.string.TextSize)); - final NumberPicker numberPicker = new NumberPicker(getParentActivity()); - numberPicker.setMinValue(12); - numberPicker.setMaxValue(30); - numberPicker.setValue(MessagesController.getInstance().fontSize); - builder.setView(numberPicker); - builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("fons_size", numberPicker.getValue()); - MessagesController.getInstance().fontSize = numberPicker.getValue(); - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } - } - }); - showAlertDialog(builder); - } else if (i == enableAnimationsRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - boolean animations = preferences.getBoolean("view_animations", true); - SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean("view_animations", !animations); - editor.commit(); - if (view instanceof TextCheckCell) { - ((TextCheckCell) view).setChecked(!animations); - } - } else if (i == notificationRow) { - presentFragment(new NotificationsSettingsActivity()); - } else if (i == backgroundRow) { - presentFragment(new WallpapersActivity()); - } else if (i == askQuestionRow) { - if (getParentActivity() == null) { - return; - } - final TextView message = new TextView(getParentActivity()); - message.setText(Html.fromHtml(LocaleController.getString("AskAQuestionInfo", R.string.AskAQuestionInfo))); - message.setTextSize(18); - message.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(5), AndroidUtilities.dp(8), AndroidUtilities.dp(6)); - message.setMovementMethod(new LinkMovementMethodMy()); - - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setView(message); - builder.setPositiveButton(LocaleController.getString("AskButton", R.string.AskButton), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - performAskAQuestion(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == sendLogsRow) { - sendLogs(); - } else if (i == clearLogsRow) { - FileLog.cleanupLogs(); - } else if (i == sendByEnterRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - boolean send = preferences.getBoolean("send_by_enter", false); - SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean("send_by_enter", !send); - editor.commit(); - if (view instanceof TextCheckCell) { - ((TextCheckCell) view).setChecked(!send); - } - } else if (i == saveToGalleryRow) { - MediaController.getInstance().toggleSaveToGallery(); - if (view instanceof TextCheckCell) { - ((TextCheckCell) view).setChecked(MediaController.getInstance().canSaveToGallery()); - } - } else if (i == privacyRow) { - presentFragment(new PrivacySettingsActivity()); - } else if (i == languageRow) { - presentFragment(new LanguageSelectActivity()); - } else if (i == switchBackendButtonRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("AreYouSure", R.string.AreYouSure)); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ConnectionsManager.getInstance().switchBackend(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == telegramFaqRow) { - try { - Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl))); - getParentActivity().startActivityForResult(pickIntent, 500); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else if (i == contactsReimportRow) { - - } else if (i == contactsSortRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("SortBy", R.string.SortBy)); - builder.setItems(new CharSequence[] { - LocaleController.getString("Default", R.string.Default), - LocaleController.getString("SortFirstName", R.string.SortFirstName), - LocaleController.getString("SortLastName", R.string.SortLastName) - }, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("sortContactsBy", which); - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showAlertDialog(builder); - } else if (i == wifiDownloadRow || i == mobileDownloadRow || i == roamingDownloadRow) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - - int mask = 0; - if (i == mobileDownloadRow) { - builder.setTitle(LocaleController.getString("WhenUsingMobileData", R.string.WhenUsingMobileData)); - mask = MediaController.getInstance().mobileDataDownloadMask; - } else if (i == wifiDownloadRow) { - builder.setTitle(LocaleController.getString("WhenConnectedOnWiFi", R.string.WhenConnectedOnWiFi)); - mask = MediaController.getInstance().wifiDownloadMask; - } else if (i == roamingDownloadRow) { - builder.setTitle(LocaleController.getString("WhenRoaming", R.string.WhenRoaming)); - mask = MediaController.getInstance().roamingDownloadMask; - } - builder.setMultiChoiceItems( - new CharSequence[]{LocaleController.getString("AttachPhoto", R.string.AttachPhoto), LocaleController.getString("AttachAudio", R.string.AttachAudio), LocaleController.getString("AttachVideo", R.string.AttachVideo), LocaleController.getString("AttachDocument", R.string.AttachDocument)}, - new boolean[]{(mask & MediaController.AUTODOWNLOAD_MASK_PHOTO) != 0, (mask & MediaController.AUTODOWNLOAD_MASK_AUDIO) != 0, (mask & MediaController.AUTODOWNLOAD_MASK_VIDEO) != 0, (mask & MediaController.AUTODOWNLOAD_MASK_DOCUMENT) != 0}, - new DialogInterface.OnMultiChoiceClickListener() { - @Override - public void onClick(DialogInterface dialog, int which, boolean isChecked) { - int mask = 0; - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - if (i == mobileDownloadRow) { - mask = MediaController.getInstance().mobileDataDownloadMask; - } else if (i == wifiDownloadRow) { - mask = MediaController.getInstance().wifiDownloadMask; - } else if (i == roamingDownloadRow) { - mask = MediaController.getInstance().roamingDownloadMask; - } - - int maskDiff = 0; - if (which == 0) { - maskDiff = MediaController.AUTODOWNLOAD_MASK_PHOTO; - } else if (which == 1) { - maskDiff = MediaController.AUTODOWNLOAD_MASK_AUDIO; - } else if (which == 2) { - maskDiff = MediaController.AUTODOWNLOAD_MASK_VIDEO; - } else if (which == 3) { - maskDiff = MediaController.AUTODOWNLOAD_MASK_DOCUMENT; - } - - if (isChecked) { - mask |= maskDiff; - } else { - mask &= ~maskDiff; - } - - if (i == mobileDownloadRow) { - editor.putInt("mobileDataDownloadMask", mask); - mask = MediaController.getInstance().mobileDataDownloadMask = mask; - } else if (i == wifiDownloadRow) { - editor.putInt("wifiDownloadMask", mask); - MediaController.getInstance().wifiDownloadMask = mask; - } else if (i == roamingDownloadRow) { - editor.putInt("roamingDownloadMask", mask); - MediaController.getInstance().roamingDownloadMask = mask; - } - editor.commit(); - if (listView != null) { - listView.invalidateViews(); - } - } - }); - builder.setNegativeButton(LocaleController.getString("OK", R.string.OK), null); - showAlertDialog(builder); - } else if (i == usernameRow) { - presentFragment(new ChangeUsernameActivity()); - } else if (i == numberRow) { - presentFragment(new ChangePhoneHelpActivity()); - } - } - }); - - frameLayout.addView(actionBar); - - writeButton = new ImageView(getParentActivity()); - writeButton.setBackgroundResource(R.drawable.floating_user_states); - writeButton.setImageResource(R.drawable.floating_camera); - writeButton.setScaleType(ImageView.ScaleType.CENTER); - if (Build.VERSION.SDK_INT >= 21) { - StateListAnimator animator = new StateListAnimator(); - animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); - animator.addState(new int[] {}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); - writeButton.setStateListAnimator(animator); - writeButton.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); - } - }); } - frameLayout.addView(writeButton); - layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 0); - layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 16); - layoutParams.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); - writeButton.setLayoutParams(layoutParams); - writeButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { + }); + + nameTextView = new TextView(context); + nameTextView.setTextColor(0xffffffff); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + nameTextView.setLines(1); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setEllipsize(TextUtils.TruncateAt.END); + nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + actionBar.addView(nameTextView); + layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); + layoutParams.bottomMargin = AndroidUtilities.dp(51); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + nameTextView.setLayoutParams(layoutParams); + + onlineTextView = new TextView(context); + onlineTextView.setTextColor(AvatarDrawable.getProfileTextColorForId(5)); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + onlineTextView.setLines(1); + onlineTextView.setMaxLines(1); + onlineTextView.setSingleLine(true); + onlineTextView.setEllipsize(TextUtils.TruncateAt.END); + onlineTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + actionBar.addView(onlineTextView); + layoutParams = (FrameLayout.LayoutParams) onlineTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 97); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 97 : 16); + layoutParams.bottomMargin = AndroidUtilities.dp(30); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + onlineTextView.setLayoutParams(layoutParams); + + listView = new ListView(context); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + AndroidUtilities.setListViewEdgeEffectColor(listView, AvatarDrawable.getProfileBackColorForId(5)); + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == textSizeRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("TextSize", R.string.TextSize)); + final NumberPicker numberPicker = new NumberPicker(getParentActivity()); + numberPicker.setMinValue(12); + numberPicker.setMaxValue(30); + numberPicker.setValue(MessagesController.getInstance().fontSize); + builder.setView(numberPicker); + builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("fons_size", numberPicker.getValue()); + MessagesController.getInstance().fontSize = numberPicker.getValue(); + editor.commit(); + if (listView != null) { + listView.invalidateViews(); + } + } + }); + showAlertDialog(builder); + } else if (i == enableAnimationsRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + boolean animations = preferences.getBoolean("view_animations", true); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("view_animations", !animations); + editor.commit(); + if (view instanceof TextCheckCell) { + ((TextCheckCell) view).setChecked(!animations); + } + } else if (i == notificationRow) { + presentFragment(new NotificationsSettingsActivity()); + } else if (i == backgroundRow) { + presentFragment(new WallpapersActivity()); + } else if (i == askQuestionRow) { + if (getParentActivity() == null) { + return; + } + final TextView message = new TextView(getParentActivity()); + message.setText(Html.fromHtml(LocaleController.getString("AskAQuestionInfo", R.string.AskAQuestionInfo))); + message.setTextSize(18); + message.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(5), AndroidUtilities.dp(8), AndroidUtilities.dp(6)); + message.setMovementMethod(new LinkMovementMethodMy()); + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setView(message); + builder.setPositiveButton(LocaleController.getString("AskButton", R.string.AskButton), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + performAskAQuestion(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == sendLogsRow) { + sendLogs(); + } else if (i == clearLogsRow) { + FileLog.cleanupLogs(); + } else if (i == sendByEnterRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + boolean send = preferences.getBoolean("send_by_enter", false); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("send_by_enter", !send); + editor.commit(); + if (view instanceof TextCheckCell) { + ((TextCheckCell) view).setChecked(!send); + } + } else if (i == saveToGalleryRow) { + MediaController.getInstance().toggleSaveToGallery(); + if (view instanceof TextCheckCell) { + ((TextCheckCell) view).setChecked(MediaController.getInstance().canSaveToGallery()); + } + } else if (i == privacyRow) { + presentFragment(new PrivacySettingsActivity()); + } else if (i == languageRow) { + presentFragment(new LanguageSelectActivity()); + } else if (i == switchBackendButtonRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("AreYouSure", R.string.AreYouSure)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ConnectionsManager.getInstance().switchBackend(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == telegramFaqRow) { + try { + Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl))); + getParentActivity().startActivityForResult(pickIntent, 500); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (i == contactsReimportRow) { + + } else if (i == contactsSortRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("SortBy", R.string.SortBy)); + builder.setItems(new CharSequence[]{ + LocaleController.getString("Default", R.string.Default), + LocaleController.getString("SortFirstName", R.string.SortFirstName), + LocaleController.getString("SortLastName", R.string.SortLastName) + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("sortContactsBy", which); + editor.commit(); + if (listView != null) { + listView.invalidateViews(); + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else if (i == wifiDownloadRow || i == mobileDownloadRow || i == roamingDownloadRow) { if (getParentActivity() == null) { return; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items; + int mask = 0; + if (i == mobileDownloadRow) { + builder.setTitle(LocaleController.getString("WhenUsingMobileData", R.string.WhenUsingMobileData)); + mask = MediaController.getInstance().mobileDataDownloadMask; + } else if (i == wifiDownloadRow) { + builder.setTitle(LocaleController.getString("WhenConnectedOnWiFi", R.string.WhenConnectedOnWiFi)); + mask = MediaController.getInstance().wifiDownloadMask; + } else if (i == roamingDownloadRow) { + builder.setTitle(LocaleController.getString("WhenRoaming", R.string.WhenRoaming)); + mask = MediaController.getInstance().roamingDownloadMask; + } + builder.setMultiChoiceItems( + new CharSequence[]{LocaleController.getString("AttachPhoto", R.string.AttachPhoto), LocaleController.getString("AttachAudio", R.string.AttachAudio), LocaleController.getString("AttachVideo", R.string.AttachVideo), LocaleController.getString("AttachDocument", R.string.AttachDocument)}, + new boolean[]{(mask & MediaController.AUTODOWNLOAD_MASK_PHOTO) != 0, (mask & MediaController.AUTODOWNLOAD_MASK_AUDIO) != 0, (mask & MediaController.AUTODOWNLOAD_MASK_VIDEO) != 0, (mask & MediaController.AUTODOWNLOAD_MASK_DOCUMENT) != 0}, + new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int which, boolean isChecked) { + int mask = 0; + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + if (i == mobileDownloadRow) { + mask = MediaController.getInstance().mobileDataDownloadMask; + } else if (i == wifiDownloadRow) { + mask = MediaController.getInstance().wifiDownloadMask; + } else if (i == roamingDownloadRow) { + mask = MediaController.getInstance().roamingDownloadMask; + } - TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); - if (user == null) { - user = UserConfig.getCurrentUser(); - } - if (user == null) { - return; - } - boolean fullMenu = false; - if (user.photo != null && user.photo.photo_big != null && !(user.photo instanceof TLRPC.TL_userProfilePhotoEmpty)) { - items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; - fullMenu = true; - } else { - items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; - } + int maskDiff = 0; + if (which == 0) { + maskDiff = MediaController.AUTODOWNLOAD_MASK_PHOTO; + } else if (which == 1) { + maskDiff = MediaController.AUTODOWNLOAD_MASK_AUDIO; + } else if (which == 2) { + maskDiff = MediaController.AUTODOWNLOAD_MASK_VIDEO; + } else if (which == 3) { + maskDiff = MediaController.AUTODOWNLOAD_MASK_DOCUMENT; + } - final boolean full = fullMenu; - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (i == 0) { - avatarUpdater.openCamera(); - } else if (i == 1) { - avatarUpdater.openGallery(); - } else if (i == 2) { - MessagesController.getInstance().deleteUserPhoto(null); - } - } - }); + if (isChecked) { + mask |= maskDiff; + } else { + mask &= ~maskDiff; + } + + if (i == mobileDownloadRow) { + editor.putInt("mobileDataDownloadMask", mask); + mask = MediaController.getInstance().mobileDataDownloadMask = mask; + } else if (i == wifiDownloadRow) { + editor.putInt("wifiDownloadMask", mask); + MediaController.getInstance().wifiDownloadMask = mask; + } else if (i == roamingDownloadRow) { + editor.putInt("roamingDownloadMask", mask); + MediaController.getInstance().roamingDownloadMask = mask; + } + editor.commit(); + if (listView != null) { + listView.invalidateViews(); + } + } + }); + builder.setNegativeButton(LocaleController.getString("OK", R.string.OK), null); showAlertDialog(builder); + } else if (i == usernameRow) { + presentFragment(new ChangeUsernameActivity()); + } else if (i == numberRow) { + presentFragment(new ChangePhoneHelpActivity()); } - }); - - listView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (totalItemCount == 0) { - return; - } - int height = 0; - View child = view.getChildAt(0); - if (child != null) { - if (firstVisibleItem == 0) { - height = AndroidUtilities.dp(88) + (child.getTop() < 0 ? child.getTop() : 0); - } - if (actionBar.getExtraHeight() != height) { - actionBar.setExtraHeight(height, true); - needLayout(); - } - } - } - }); - - updateUserData(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } + }); + + frameLayout.addView(actionBar); + + writeButton = new ImageView(context); + writeButton.setBackgroundResource(R.drawable.floating_user_states); + writeButton.setImageResource(R.drawable.floating_camera); + writeButton.setScaleType(ImageView.ScaleType.CENTER); + if (Build.VERSION.SDK_INT >= 21) { + StateListAnimator animator = new StateListAnimator(); + animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); + animator.addState(new int[]{}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); + writeButton.setStateListAnimator(animator); + writeButton.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + } + }); } + frameLayout.addView(writeButton); + layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 0); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 16); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); + writeButton.setLayoutParams(layoutParams); + writeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + + CharSequence[] items; + + TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); + if (user == null) { + user = UserConfig.getCurrentUser(); + } + if (user == null) { + return; + } + boolean fullMenu = false; + if (user.photo != null && user.photo.photo_big != null && !(user.photo instanceof TLRPC.TL_userProfilePhotoEmpty)) { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; + fullMenu = true; + } else { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; + } + + final boolean full = fullMenu; + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + avatarUpdater.openCamera(); + } else if (i == 1) { + avatarUpdater.openGallery(); + } else if (i == 2) { + MessagesController.getInstance().deleteUserPhoto(null); + } + } + }); + showAlertDialog(builder); + } + }); + + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (totalItemCount == 0) { + return; + } + int height = 0; + View child = view.getChildAt(0); + if (child != null) { + if (firstVisibleItem == 0) { + height = AndroidUtilities.dp(88) + (child.getTop() < 0 ? child.getTop() : 0); + } + if (actionBar.getExtraHeight() != height) { + actionBar.setExtraHeight(height, true); + needLayout(); + } + } + } + }); + return fragmentView; } @@ -729,11 +720,11 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter object.viewX = coords[0]; object.viewY = coords[1] - AndroidUtilities.statusBarHeight; object.parentView = avatarImage; - object.imageReceiver = avatarImage.imageReceiver; + object.imageReceiver = avatarImage.getImageReceiver(); object.user_id = UserConfig.getClientUserId(); object.thumb = object.imageReceiver.getBitmap(); object.size = -1; - object.radius = avatarImage.imageReceiver.getRoundRadius(); + object.radius = avatarImage.getImageReceiver().getRoundRadius(); return object; } } @@ -750,7 +741,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter @Override public void willHidePhotoViewer() { - avatarImage.imageReceiver.setVisible(true, true); + avatarImage.getImageReceiver().setVisible(true, true); } @Override @@ -888,6 +879,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } + updateUserData(); fixLayout(); } @@ -927,7 +919,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter writeButton.clearAnimation(); } - avatarImage.imageReceiver.setRoundRadius(AndroidUtilities.dp(avatarSize / 2)); + avatarImage.setRoundRadius(AndroidUtilities.dp(avatarSize / 2)); layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(avatarSize); layoutParams.height = AndroidUtilities.dp(avatarSize); @@ -982,12 +974,12 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter avatarDrawable.setColor(0xff5c98cd); if (avatarImage != null) { avatarImage.setImage(photo, "50_50", avatarDrawable); - avatarImage.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); + avatarImage.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name)); onlineTextView.setText(LocaleController.getString("Online", R.string.Online)); - avatarImage.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); + avatarImage.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java new file mode 100644 index 000000000..74f7e9de3 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java @@ -0,0 +1,1085 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui; + +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Typeface; +import android.os.Vibrator; +import android.text.InputType; +import android.text.method.PasswordTransformationMethod; +import android.util.TypedValue; +import android.view.ActionMode; +import android.view.ContextMenu; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.android.NotificationCenter; +import org.telegram.messenger.ConnectionsManager; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.RPCRequest; +import org.telegram.messenger.TLObject; +import org.telegram.messenger.TLRPC; +import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenu; +import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.Adapters.BaseFragmentAdapter; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.TextSettingsCell; + +public class TwoStepVerificationActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + + private ListAdapter listAdapter; + private ListView listView; + private TextView titleTextView; + private TextView bottomTextView; + private TextView bottomButton; + private EditText passwordEditText; + private ProgressDialog progressDialog; + private FrameLayout progressView; + private ActionBarMenuItem doneItem; + private ScrollView scrollView; + + private int type; + private int passwordSetState; + private String firstPassword; + private String hint; + private String email; + private boolean emailOnly; + private boolean loading; + private boolean destroyed; + private boolean waitingForEmail; + private TLRPC.account_Password currentPassword; + private boolean passwordEntered = true; + private byte[] currentPasswordHash = new byte[0]; + private Runnable shortPollRunnable; + + private int setPasswordRow; + private int setPasswordDetailRow; + private int changePasswordRow; + private int shadowRow; + private int turnPasswordOffRow; + private int setRecoveryEmailRow; + private int changeRecoveryEmailRow; + private int abortPasswordRow; + private int passwordSetupDetailRow; + private int passwordEnabledDetailRow; + private int passwordEmailVerifyDetailRow; + private int rowCount; + + private final static int done_button = 1; + + public TwoStepVerificationActivity(int type) { + super(); + this.type = type; + if (type == 0) { + loadPasswordInfo(false); + } + } + + @Override + public boolean onFragmentCreate() { + super.onFragmentCreate(); + updateRows(); + if (type == 0) { + NotificationCenter.getInstance().addObserver(this, NotificationCenter.didSetTwoStepPassword); + } + return true; + } + + @Override + public void onFragmentDestroy() { + super.onFragmentDestroy(); + if (type == 0) { + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didSetTwoStepPassword); + if (shortPollRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(shortPollRunnable); + shortPollRunnable = null; + } + destroyed = true; + } + if (progressDialog != null) { + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + progressDialog = null; + } + if (!AndroidUtilities.isTablet() && getParentActivity() != null) { + getParentActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + } + } + + @Override + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(false); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + processDone(); + } + } + }); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(0xfff0f0f0); + + ActionBarMenu menu = actionBar.createMenu(); + doneItem = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + scrollView = new ScrollView(context); + scrollView.setFillViewport(true); + frameLayout.addView(scrollView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) scrollView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + scrollView.setLayoutParams(layoutParams); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + scrollView.addView(linearLayout); + ScrollView.LayoutParams layoutParams2 = (ScrollView.LayoutParams) linearLayout.getLayoutParams(); + layoutParams2.width = ScrollView.LayoutParams.MATCH_PARENT; + layoutParams2.height = ScrollView.LayoutParams.WRAP_CONTENT; + linearLayout.setLayoutParams(layoutParams2); + + titleTextView = new TextView(context); + titleTextView.setTextColor(0xff757575); + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + titleTextView.setGravity(Gravity.CENTER_HORIZONTAL); + linearLayout.addView(titleTextView); + LinearLayout.LayoutParams layoutParams3 = (LinearLayout.LayoutParams) titleTextView.getLayoutParams(); + layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams3.topMargin = AndroidUtilities.dp(38); + titleTextView.setLayoutParams(layoutParams3); + + passwordEditText = new EditText(context); + passwordEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + passwordEditText.setTextColor(0xff000000); + passwordEditText.setMaxLines(1); + passwordEditText.setLines(1); + passwordEditText.setGravity(Gravity.CENTER_HORIZONTAL); + passwordEditText.setSingleLine(true); + passwordEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + passwordEditText.setTypeface(Typeface.DEFAULT); + AndroidUtilities.clearCursorDrawable(passwordEditText); + linearLayout.addView(passwordEditText); + layoutParams3 = (LinearLayout.LayoutParams) passwordEditText.getLayoutParams(); + layoutParams3.topMargin = AndroidUtilities.dp(32); + layoutParams3.height = AndroidUtilities.dp(36); + layoutParams3.leftMargin = AndroidUtilities.dp(40); + layoutParams3.rightMargin = AndroidUtilities.dp(40); + layoutParams3.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams3.width = LinearLayout.LayoutParams.MATCH_PARENT; + passwordEditText.setLayoutParams(layoutParams3); + passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT || i == EditorInfo.IME_ACTION_DONE) { + processDone(); + return true; + } + return false; + } + }); + if (android.os.Build.VERSION.SDK_INT < 11) { + passwordEditText.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + menu.clear(); + } + }); + } else { + passwordEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + public void onDestroyActionMode(ActionMode mode) { + } + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return false; + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + }); + } + + bottomTextView = new TextView(context); + bottomTextView.setTextColor(0xff757575); + bottomTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + bottomTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + bottomTextView.setText(LocaleController.getString("YourEmailInfo", R.string.YourEmailInfo)); + linearLayout.addView(bottomTextView); + layoutParams3 = (LinearLayout.LayoutParams) bottomTextView.getLayoutParams(); + layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + layoutParams3.topMargin = AndroidUtilities.dp(30); + layoutParams3.leftMargin = AndroidUtilities.dp(40); + layoutParams3.rightMargin = AndroidUtilities.dp(40); + bottomTextView.setLayoutParams(layoutParams3); + + LinearLayout linearLayout2 = new LinearLayout(context); + linearLayout2.setGravity(Gravity.BOTTOM | Gravity.CENTER_VERTICAL); + linearLayout.addView(linearLayout2); + layoutParams3 = (LinearLayout.LayoutParams) linearLayout2.getLayoutParams(); + layoutParams3.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = LinearLayout.LayoutParams.MATCH_PARENT; + linearLayout2.setLayoutParams(layoutParams3); + + bottomButton = new TextView(context); + bottomButton.setTextColor(0xff4d83b3); + bottomButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + bottomButton.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM); + bottomButton.setText(LocaleController.getString("YourEmailSkip", R.string.YourEmailSkip)); + bottomButton.setPadding(0, AndroidUtilities.dp(10), 0, 0); + linearLayout2.addView(bottomButton); + layoutParams3 = (LinearLayout.LayoutParams) bottomButton.getLayoutParams(); + layoutParams3.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM; + layoutParams3.bottomMargin = AndroidUtilities.dp(14); + layoutParams3.leftMargin = AndroidUtilities.dp(40); + layoutParams3.rightMargin = AndroidUtilities.dp(40); + bottomButton.setLayoutParams(layoutParams3); + bottomButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (type == 0) { + if (currentPassword.has_recovery) { + needShowProgress(); + TLRPC.TL_auth_requestPasswordRecovery req = new TLRPC.TL_auth_requestPasswordRecovery(); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + if (error == null) { + final TLRPC.TL_auth_passwordRecovery res = (TLRPC.TL_auth_passwordRecovery) response; + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.formatString("RestoreEmailSent", R.string.RestoreEmailSent, res.email_pattern)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + TwoStepVerificationActivity fragment = new TwoStepVerificationActivity(1); + fragment.currentPassword = currentPassword; + fragment.currentPassword.email_unconfirmed_pattern = res.email_pattern; + fragment.passwordSetState = 4; + presentFragment(fragment); + } + }); + AlertDialog dialog = showAlertDialog(builder); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } else { + if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } else { + showAlertWithText(LocaleController.getString("RestorePasswordNoEmailTitle", R.string.RestorePasswordNoEmailTitle), LocaleController.getString("RestorePasswordNoEmailText", R.string.RestorePasswordNoEmailText)); + } + } else { + if (passwordSetState == 4) { + showAlertWithText(LocaleController.getString("RestorePasswordNoEmailTitle", R.string.RestorePasswordNoEmailTitle), LocaleController.getString("RestoreEmailTroubleText", R.string.RestoreEmailTroubleText)); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("YourEmailSkipWarningText", R.string.YourEmailSkipWarningText)); + builder.setTitle(LocaleController.getString("YourEmailSkipWarning", R.string.YourEmailSkipWarning)); + builder.setPositiveButton(LocaleController.getString("YourEmailSkip", R.string.YourEmailSkip), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + email = ""; + setNewPassword(false); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + } + } + }); + + if (type == 0) { + progressView = new FrameLayout(context); + frameLayout.addView(progressView); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + progressView.setLayoutParams(layoutParams); + progressView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + + ProgressBar progressBar = new ProgressBar(context); + progressView.addView(progressBar); + layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER; + progressView.setLayoutParams(layoutParams); + + listView = new ListView(context); + listView.setDivider(null); + listView.setEmptyView(progressView); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setDrawSelectorOnTop(true); + frameLayout.addView(listView); + layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter = new ListAdapter(context)); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == setPasswordRow || i == changePasswordRow) { + TwoStepVerificationActivity fragment = new TwoStepVerificationActivity(1); + fragment.currentPasswordHash = currentPasswordHash; + fragment.currentPassword = currentPassword; + presentFragment(fragment); + } else if (i == setRecoveryEmailRow || i == changeRecoveryEmailRow) { + TwoStepVerificationActivity fragment = new TwoStepVerificationActivity(1); + fragment.currentPasswordHash = currentPasswordHash; + fragment.currentPassword = currentPassword; + fragment.emailOnly = true; + fragment.passwordSetState = 3; + presentFragment(fragment); + } else if (i == turnPasswordOffRow || i == abortPasswordRow) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setMessage(LocaleController.getString("TurnPasswordOffQuestion", R.string.TurnPasswordOffQuestion)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + setNewPassword(true); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } + } + }); + + updateRows(); + + actionBar.setTitle(LocaleController.getString("TwoStepVerification", R.string.TwoStepVerification)); + titleTextView.setText(LocaleController.getString("PleaseEnterCurrentPassword", R.string.PleaseEnterCurrentPassword)); + } else if (type == 1) { + setPasswordSetState(passwordSetState); + } + + return fragmentView; + } + + @Override + public void didReceivedNotification(int id, Object... args) { + if (id == NotificationCenter.didSetTwoStepPassword) { + if (args != null && args.length > 0) { + currentPasswordHash = (byte[]) args[0]; + } + loadPasswordInfo(false); + updateRows(); + } + } + + @Override + public void onResume() { + super.onResume(); + if (type == 1) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (passwordEditText != null) { + passwordEditText.requestFocus(); + AndroidUtilities.showKeyboard(passwordEditText); + } + } + }, 200); + } + if (!AndroidUtilities.isTablet()) { + getParentActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } + } + + @Override + public void onOpenAnimationEnd() { + super.onOpenAnimationEnd(); + if (type == 1) { + AndroidUtilities.showKeyboard(passwordEditText); + } + } + + private void loadPasswordInfo(final boolean silent) { + if (!silent) { + loading = true; + } + TLRPC.TL_account_getPassword req = new TLRPC.TL_account_getPassword(); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + loading = false; + if (error == null) { + if (!silent) { + passwordEntered = currentPassword != null || currentPassword == null && response instanceof TLRPC.TL_account_noPassword; + } + currentPassword = (TLRPC.account_Password) response; + waitingForEmail = currentPassword.email_unconfirmed_pattern.length() > 0; + byte[] salt = new byte[currentPassword.new_salt.length + 8]; + Utilities.random.nextBytes(salt); + System.arraycopy(currentPassword.new_salt, 0, salt, 0, currentPassword.new_salt.length); + currentPassword.new_salt = salt; + } + if (type == 0 && !destroyed && shortPollRunnable == null) { + shortPollRunnable = new Runnable() { + @Override + public void run() { + if (shortPollRunnable == null) { + return; + } + loadPasswordInfo(true); + shortPollRunnable = null; + } + }; + AndroidUtilities.runOnUIThread(shortPollRunnable, 5000); + } + updateRows(); + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } + + private void setPasswordSetState(int state) { + if (passwordEditText == null) { + return; + } + passwordSetState = state; + if (passwordSetState == 0) { + actionBar.setTitle(LocaleController.getString("YourPassword", R.string.YourPassword)); + if (currentPassword instanceof TLRPC.TL_account_noPassword) { + titleTextView.setText(LocaleController.getString("PleaseEnterFirstPassword", R.string.PleaseEnterFirstPassword)); + } else { + titleTextView.setText(LocaleController.getString("PleaseEnterPassword", R.string.PleaseEnterPassword)); + } + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_NEXT); + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + bottomTextView.setVisibility(View.INVISIBLE); + bottomButton.setVisibility(View.INVISIBLE); + } else if (passwordSetState == 1) { + actionBar.setTitle(LocaleController.getString("YourPassword", R.string.YourPassword)); + titleTextView.setText(LocaleController.getString("PleaseReEnterPassword", R.string.PleaseReEnterPassword)); + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_NEXT); + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + bottomTextView.setVisibility(View.INVISIBLE); + bottomButton.setVisibility(View.INVISIBLE); + } else if (passwordSetState == 2) { + actionBar.setTitle(LocaleController.getString("PasswordHint", R.string.PasswordHint)); + titleTextView.setText(LocaleController.getString("PasswordHintText", R.string.PasswordHintText)); + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_NEXT); + passwordEditText.setTransformationMethod(null); + bottomTextView.setVisibility(View.INVISIBLE); + bottomButton.setVisibility(View.INVISIBLE); + } else if (passwordSetState == 3) { + actionBar.setTitle(LocaleController.getString("RecoveryEmail", R.string.RecoveryEmail)); + titleTextView.setText(LocaleController.getString("YourEmail", R.string.YourEmail)); + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); + passwordEditText.setTransformationMethod(null); + passwordEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); + bottomTextView.setVisibility(View.VISIBLE); + bottomButton.setVisibility(emailOnly ? View.INVISIBLE : View.VISIBLE); + } else if (passwordSetState == 4) { + actionBar.setTitle(LocaleController.getString("PasswordRecovery", R.string.PasswordRecovery)); + titleTextView.setText(LocaleController.getString("PasswordCode", R.string.PasswordCode)); + bottomTextView.setText(LocaleController.getString("RestoreEmailSentInfo", R.string.RestoreEmailSentInfo)); + bottomButton.setText(LocaleController.formatString("RestoreEmailTrouble", R.string.RestoreEmailTrouble, currentPassword.email_unconfirmed_pattern)); + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); + passwordEditText.setTransformationMethod(null); + passwordEditText.setInputType(InputType.TYPE_CLASS_PHONE); + bottomTextView.setVisibility(View.VISIBLE); + bottomButton.setVisibility(View.VISIBLE); + } + passwordEditText.setText(""); + } + + private void updateRows() { + rowCount = 0; + setPasswordRow = -1; + setPasswordDetailRow = -1; + changePasswordRow = -1; + turnPasswordOffRow = -1; + setRecoveryEmailRow = -1; + changeRecoveryEmailRow = -1; + abortPasswordRow = -1; + passwordSetupDetailRow = -1; + passwordEnabledDetailRow = -1; + passwordEmailVerifyDetailRow = -1; + shadowRow = -1; + if (!loading && currentPassword != null) { + if (currentPassword instanceof TLRPC.TL_account_noPassword) { + if (waitingForEmail) { + passwordSetupDetailRow = rowCount++; + abortPasswordRow = rowCount++; + shadowRow = rowCount++; + } else { + setPasswordRow = rowCount++; + setPasswordDetailRow = rowCount++; + } + } else if (currentPassword instanceof TLRPC.TL_account_password) { + changePasswordRow = rowCount++; + turnPasswordOffRow = rowCount++; + if (currentPassword.has_recovery) { + changeRecoveryEmailRow = rowCount++; + } else { + setRecoveryEmailRow = rowCount++; + } + if (waitingForEmail) { + passwordEmailVerifyDetailRow = rowCount++; + } else { + passwordEnabledDetailRow = rowCount++; + } + } + } + + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + if (passwordEntered) { + if (listView != null) { + listView.setVisibility(View.VISIBLE); + scrollView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.VISIBLE); + listView.setEmptyView(progressView); + } + if (passwordEditText != null) { + doneItem.setVisibility(View.GONE); + passwordEditText.setVisibility(View.INVISIBLE); + titleTextView.setVisibility(View.INVISIBLE); + bottomTextView.setVisibility(View.INVISIBLE); + bottomButton.setVisibility(View.INVISIBLE); + } + } else { + if (listView != null) { + listView.setEmptyView(null); + listView.setVisibility(View.INVISIBLE); + scrollView.setVisibility(View.VISIBLE); + progressView.setVisibility(View.INVISIBLE); + } + if (passwordEditText != null) { + doneItem.setVisibility(View.VISIBLE); + passwordEditText.setVisibility(View.VISIBLE); + titleTextView.setVisibility(View.VISIBLE); + bottomButton.setVisibility(View.VISIBLE); + bottomTextView.setVisibility(View.INVISIBLE); + bottomButton.setText(LocaleController.getString("ForgotPassword", R.string.ForgotPassword)); + if (currentPassword.hint != null && currentPassword.hint.length() > 0) { + passwordEditText.setHint(currentPassword.hint); + } else { + passwordEditText.setHint(""); + } + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (passwordEditText != null) { + passwordEditText.requestFocus(); + AndroidUtilities.showKeyboard(passwordEditText); + } + } + }, 200); + } + } + } + + private void needShowProgress() { + if (getParentActivity() == null || getParentActivity().isFinishing() || progressDialog != null) { + return; + } + progressDialog = new ProgressDialog(getParentActivity()); + progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); + progressDialog.show(); + } + + private void needHideProgress() { + if (progressDialog == null) { + return; + } + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + progressDialog = null; + } + + private boolean isValidEmail(String text) { + if (text == null || text.length() < 3) { + return false; + } + int dot = text.lastIndexOf("."); + int dog = text.lastIndexOf("@"); + return !(dot < 0 || dog < 0 || dot < dog); + } + + private void showAlertWithText(String title, String text) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); + builder.setTitle(title); + builder.setMessage(text); + showAlertDialog(builder); + } + + private void setNewPassword(final boolean clear) { + final TLRPC.TL_account_updatePasswordSettings req = new TLRPC.TL_account_updatePasswordSettings(); + req.current_password_hash = currentPasswordHash; + req.new_settings = new TLRPC.TL_account_passwordInputSettings(); + if (clear) { + if (waitingForEmail && currentPassword instanceof TLRPC.TL_account_noPassword) { + req.new_settings.flags = 2; + req.new_settings.email = ""; + } else { + req.new_settings.flags = 3; + req.new_settings.hint = ""; + req.new_settings.new_password_hash = new byte[0]; + req.new_settings.new_salt = new byte[0]; + req.new_settings.email = ""; + } + } else { + if (firstPassword != null && firstPassword.length() > 0) { + byte[] newPasswordBytes = null; + try { + newPasswordBytes = firstPassword.getBytes("UTF-8"); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + byte[] new_salt = currentPassword.new_salt; + byte[] hash = new byte[new_salt.length * 2 + newPasswordBytes.length]; + System.arraycopy(new_salt, 0, hash, 0, new_salt.length); + System.arraycopy(newPasswordBytes, 0, hash, new_salt.length, newPasswordBytes.length); + System.arraycopy(new_salt, 0, hash, hash.length - new_salt.length, new_salt.length); + req.new_settings.flags |= 1; + req.new_settings.hint = hint; + req.new_settings.new_password_hash = Utilities.computeSHA256(hash, 0, hash.length); + req.new_settings.new_salt = new_salt; + } + if (email.length() > 0) { + req.new_settings.flags |= 2; + req.new_settings.email = email; + } + } + needShowProgress(); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + if (error == null && response instanceof TLRPC.TL_boolTrue) { + if (clear) { + currentPassword = null; + currentPasswordHash = new byte[0]; + loadPasswordInfo(false); + updateRows(); + } else { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetTwoStepPassword, (Object) req.new_settings.new_password_hash); + finishFragment(); + } + }); + builder.setMessage(LocaleController.getString("YourPasswordSuccessText", R.string.YourPasswordSuccessText)); + builder.setTitle(LocaleController.getString("YourPasswordSuccess", R.string.YourPasswordSuccess)); + AlertDialog dialog = showAlertDialog(builder); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } + } else { + if (error.text.equals("EMAIL_UNCONFIRMED")) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetTwoStepPassword, (Object) req.new_settings.new_password_hash); + finishFragment(); + } + }); + builder.setMessage(LocaleController.getString("YourEmailAlmostThereText", R.string.YourEmailAlmostThereText)); + builder.setTitle(LocaleController.getString("YourEmailAlmostThere", R.string.YourEmailAlmostThere)); + AlertDialog dialog = showAlertDialog(builder); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } else { + if (error.text.equals("EMAIL_INVALID")) { + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("PasswordEmailInvalid", R.string.PasswordEmailInvalid)); + } else if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } + + private void processDone() { + if (type == 0) { + if (!passwordEntered) { + String oldPassword = passwordEditText.getText().toString(); + if (oldPassword.length() == 0) { + onPasscodeError(false); + return; + } + byte[] oldPasswordBytes = null; + try { + oldPasswordBytes = oldPassword.getBytes("UTF-8"); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + needShowProgress(); + byte[] hash = new byte[currentPassword.current_salt.length * 2 + oldPasswordBytes.length]; + System.arraycopy(currentPassword.current_salt, 0, hash, 0, currentPassword.current_salt.length); + System.arraycopy(oldPasswordBytes, 0, hash, currentPassword.current_salt.length, oldPasswordBytes.length); + System.arraycopy(currentPassword.current_salt, 0, hash, hash.length - currentPassword.current_salt.length, currentPassword.current_salt.length); + + final TLRPC.TL_account_getPasswordSettings req = new TLRPC.TL_account_getPasswordSettings(); + req.current_password_hash = Utilities.computeSHA256(hash, 0, hash.length); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + needHideProgress(); + if (error == null) { + currentPasswordHash = req.current_password_hash; + passwordEntered = true; + AndroidUtilities.hideKeyboard(passwordEditText); + updateRows(); + } else { + if (error.text.equals("PASSWORD_HASH_INVALID")) { + onPasscodeError(true); + } else if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } + } else if (type == 1) { + if (passwordSetState == 0) { + if (passwordEditText.getText().length() == 0) { + onPasscodeError(false); + return; + } + titleTextView.setText(LocaleController.getString("ReEnterYourPasscode", R.string.ReEnterYourPasscode)); + firstPassword = passwordEditText.getText().toString(); + setPasswordSetState(1); + } else if (passwordSetState == 1) { + if (!firstPassword.equals(passwordEditText.getText().toString())) { + try { + Toast.makeText(getParentActivity(), LocaleController.getString("PasswordDoNotMatch", R.string.PasswordDoNotMatch), Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + onPasscodeError(true); + return; + } + setPasswordSetState(2); + } else if (passwordSetState == 2) { + hint = passwordEditText.getText().toString(); + if (hint.toLowerCase().equals(firstPassword.toLowerCase())) { + try { + Toast.makeText(getParentActivity(), LocaleController.getString("PasswordAsHintError", R.string.PasswordAsHintError), Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + onPasscodeError(false); + return; + } + if (!currentPassword.has_recovery) { + setPasswordSetState(3); + } else { + email = ""; + setNewPassword(false); + } + } else if (passwordSetState == 3) { + email = passwordEditText.getText().toString(); + if (!isValidEmail(email)) { + onPasscodeError(false); + return; + } + setNewPassword(false); + } else if (passwordSetState == 4) { + String code = passwordEditText.getText().toString(); + if (code.length() == 0) { + onPasscodeError(false); + return; + } + TLRPC.TL_auth_recoverPassword req = new TLRPC.TL_auth_recoverPassword(); + req.code = code; + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (error == null) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetTwoStepPassword); + finishFragment(); + } + }); + builder.setMessage(LocaleController.getString("PasswordReset", R.string.PasswordReset)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + AlertDialog dialog = showAlertDialog(builder); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } else { + if (error.text.startsWith("CODE_INVALID")) { + onPasscodeError(true); + } else if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + showAlertWithText(LocaleController.getString("AppName", R.string.AppName), error.text); + } + } + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors | RPCRequest.RPCRequestClassWithoutLogin); + } + } + } + + private void onPasscodeError(boolean clear) { + if (getParentActivity() == null) { + return; + } + Vibrator v = (Vibrator) getParentActivity().getSystemService(Context.VIBRATOR_SERVICE); + if (v != null) { + v.vibrate(200); + } + if (clear) { + passwordEditText.setText(""); + } + AndroidUtilities.shakeTextView(titleTextView, 2, 0); + } + + private class ListAdapter extends BaseFragmentAdapter { + private Context mContext; + + public ListAdapter(Context context) { + mContext = context; + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int i) { + return i != setPasswordDetailRow && i != shadowRow && i != passwordSetupDetailRow && i != passwordEmailVerifyDetailRow; + } + + @Override + public int getCount() { + return loading || currentPassword == null ? 0 : rowCount; + } + + @Override + public Object getItem(int i) { + return null; + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + int viewType = getItemViewType(i); + if (viewType == 0) { + if (view == null) { + view = new TextSettingsCell(mContext); + view.setBackgroundColor(0xffffffff); + } + TextSettingsCell textCell = (TextSettingsCell) view; + textCell.setTextColor(0xff212121); + if (i == changePasswordRow) { + textCell.setText(LocaleController.getString("ChangePassword", R.string.ChangePassword), true); + } else if (i == setPasswordRow) { + textCell.setText(LocaleController.getString("SetAdditionalPassword", R.string.SetAdditionalPassword), true); + } else if (i == turnPasswordOffRow) { + textCell.setText(LocaleController.getString("TurnPasswordOff", R.string.TurnPasswordOff), true); + } else if (i == changeRecoveryEmailRow) { + textCell.setText(LocaleController.getString("ChangeRecoveryEmail", R.string.ChangeRecoveryEmail), abortPasswordRow != -1); + } else if (i == setRecoveryEmailRow) { + textCell.setText(LocaleController.getString("SetRecoveryEmail", R.string.SetRecoveryEmail), false); + } else if (i == abortPasswordRow) { + textCell.setTextColor(0xffd24949); + textCell.setText(LocaleController.getString("AbortPassword", R.string.AbortPassword), false); + } + } else if (viewType == 1) { + if (view == null) { + view = new TextInfoPrivacyCell(mContext); + } + if (i == setPasswordDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("SetAdditionalPasswordInfo", R.string.SetAdditionalPasswordInfo)); + view.setBackgroundResource(R.drawable.greydivider_bottom); + } else if (i == shadowRow) { + ((TextInfoPrivacyCell) view).setText(""); + view.setBackgroundResource(R.drawable.greydivider_bottom); + } else if (i == passwordSetupDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.formatString("EmailPasswordConfirmText", R.string.EmailPasswordConfirmText, currentPassword.email_unconfirmed_pattern)); + view.setBackgroundResource(R.drawable.greydivider_top); + } else if (i == passwordEnabledDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("EnabledPasswordText", R.string.EnabledPasswordText)); + view.setBackgroundResource(R.drawable.greydivider_bottom); + } else if (i == passwordEmailVerifyDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.formatString("PendingEmailText", R.string.PendingEmailText, currentPassword.email_unconfirmed_pattern)); + view.setBackgroundResource(R.drawable.greydivider_bottom); + } + } + return view; + } + + @Override + public int getItemViewType(int i) { + if (i == setPasswordDetailRow || i == shadowRow || i == passwordSetupDetailRow || i == passwordEnabledDetailRow || i == passwordEmailVerifyDetailRow) { + return 1; + } + return 0; + } + + @Override + public int getViewTypeCount() { + return 2; + } + + @Override + public boolean isEmpty() { + return loading || currentPassword == null; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java index 440ee7616..7121d0a42 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java @@ -10,6 +10,7 @@ package org.telegram.ui; import android.annotation.TargetApi; import android.app.Activity; +import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.SurfaceTexture; @@ -22,7 +23,6 @@ import android.view.LayoutInflater; import android.view.Surface; import android.view.TextureView; import android.view.View; -import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.CheckBox; import android.widget.CompoundButton; @@ -224,189 +224,183 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackgroundColor(0xff333333); - actionBar.setItemsBackground(R.drawable.bar_selector_white); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setTitle(LocaleController.getString("EditVideo", R.string.EditVideo)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == 1) { - synchronized (sync) { - if (videoPlayer != null) { - try { - videoPlayer.stop(); - videoPlayer.release(); - videoPlayer = null; - } catch (Exception e) { - FileLog.e("tmessages", e); - } + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackgroundColor(0xff333333); + actionBar.setItemsBackground(R.drawable.bar_selector_white); + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setTitle(LocaleController.getString("EditVideo", R.string.EditVideo)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == 1) { + synchronized (sync) { + if (videoPlayer != null) { + try { + videoPlayer.stop(); + videoPlayer.release(); + videoPlayer = null; + } catch (Exception e) { + FileLog.e("tmessages", e); } } - if (delegate != null) { - if (compressVideo.getVisibility() == View.GONE || compressVideo.getVisibility() == View.VISIBLE && !compressVideo.isChecked()) { - delegate.didFinishEditVideo(videoPath, startTime, endTime, originalWidth, originalHeight, rotationValue, originalWidth, originalHeight, bitrate, estimatedSize, esimatedDuration); - } else { - delegate.didFinishEditVideo(videoPath, startTime, endTime, resultWidth, resultHeight, rotationValue, originalWidth, originalHeight, bitrate, estimatedSize, esimatedDuration); - } - } - finishFragment(); } + if (delegate != null) { + if (compressVideo.getVisibility() == View.GONE || compressVideo.getVisibility() == View.VISIBLE && !compressVideo.isChecked()) { + delegate.didFinishEditVideo(videoPath, startTime, endTime, originalWidth, originalHeight, rotationValue, originalWidth, originalHeight, bitrate, estimatedSize, esimatedDuration); + } else { + delegate.didFinishEditVideo(videoPath, startTime, endTime, resultWidth, resultHeight, rotationValue, originalWidth, originalHeight, bitrate, estimatedSize, esimatedDuration); + } + } + finishFragment(); } - }); + } + }); - ActionBarMenu menu = actionBar.createMenu(); - menu.addItemWithWidth(1, R.drawable.ic_done, AndroidUtilities.dp(56)); + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(1, R.drawable.ic_done, AndroidUtilities.dp(56)); - fragmentView = inflater.inflate(R.layout.video_editor_layout, null, false); - originalSizeTextView = (TextView) fragmentView.findViewById(R.id.original_size); - editedSizeTextView = (TextView) fragmentView.findViewById(R.id.edited_size); - videoContainerView = fragmentView.findViewById(R.id.video_container); - textContainerView = fragmentView.findViewById(R.id.info_container); - controlView = fragmentView.findViewById(R.id.control_layout); - compressVideo = (CheckBox) fragmentView.findViewById(R.id.compress_video); - compressVideo.setText(LocaleController.getString("CompressVideo", R.string.CompressVideo)); - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - compressVideo.setVisibility(originalHeight != resultHeight || originalWidth != resultWidth ? View.VISIBLE : View.GONE); - compressVideo.setChecked(preferences.getBoolean("compress_video", true)); - compressVideo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean("compress_video", isChecked); - editor.commit(); - updateVideoEditedInfo(); - } - }); + fragmentView = inflater.inflate(R.layout.video_editor_layout, null, false); + originalSizeTextView = (TextView) fragmentView.findViewById(R.id.original_size); + editedSizeTextView = (TextView) fragmentView.findViewById(R.id.edited_size); + videoContainerView = fragmentView.findViewById(R.id.video_container); + textContainerView = fragmentView.findViewById(R.id.info_container); + controlView = fragmentView.findViewById(R.id.control_layout); + compressVideo = (CheckBox) fragmentView.findViewById(R.id.compress_video); + compressVideo.setText(LocaleController.getString("CompressVideo", R.string.CompressVideo)); + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + compressVideo.setVisibility(originalHeight != resultHeight || originalWidth != resultWidth ? View.VISIBLE : View.GONE); + compressVideo.setChecked(preferences.getBoolean("compress_video", true)); + compressVideo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("compress_video", isChecked); + editor.commit(); + updateVideoEditedInfo(); + } + }); - if (Build.VERSION.SDK_INT < 18) { - try { - MediaCodecInfo codecInfo = MediaController.selectCodec(MediaController.MIME_TYPE); - if (codecInfo == null) { + if (Build.VERSION.SDK_INT < 18) { + try { + MediaCodecInfo codecInfo = MediaController.selectCodec(MediaController.MIME_TYPE); + if (codecInfo == null) { + compressVideo.setVisibility(View.GONE); + } else { + String name = codecInfo.getName(); + if (name.equals("OMX.google.h264.encoder") || + name.equals("OMX.ST.VFM.H264Enc") || + name.equals("OMX.Exynos.avc.enc") || + name.equals("OMX.MARVELL.VIDEO.HW.CODA7542ENCODER") || + name.equals("OMX.MARVELL.VIDEO.H264ENCODER") || + name.equals("OMX.k3.video.encoder.avc") || //fix this later + name.equals("OMX.TI.DUCATI1.VIDEO.H264E")) { //fix this later compressVideo.setVisibility(View.GONE); } else { - String name = codecInfo.getName(); - if (name.equals("OMX.google.h264.encoder") || - name.equals("OMX.ST.VFM.H264Enc") || - name.equals("OMX.Exynos.avc.enc") || - name.equals("OMX.MARVELL.VIDEO.HW.CODA7542ENCODER") || - name.equals("OMX.MARVELL.VIDEO.H264ENCODER") || - name.equals("OMX.k3.video.encoder.avc") || //fix this later - name.equals("OMX.TI.DUCATI1.VIDEO.H264E")) { //fix this later + if (MediaController.selectColorFormat(codecInfo, MediaController.MIME_TYPE) == 0) { compressVideo.setVisibility(View.GONE); - } else { - if (MediaController.selectColorFormat(codecInfo, MediaController.MIME_TYPE) == 0) { - compressVideo.setVisibility(View.GONE); - } } } - } catch (Exception e) { - compressVideo.setVisibility(View.GONE); - FileLog.e("tmessages", e); } - } - - TextView titleTextView = (TextView) fragmentView.findViewById(R.id.original_title); - titleTextView.setText(LocaleController.getString("OriginalVideo", R.string.OriginalVideo)); - titleTextView = (TextView) fragmentView.findViewById(R.id.edited_title); - titleTextView.setText(LocaleController.getString("EditedVideo", R.string.EditedVideo)); - - videoTimelineView = (VideoTimelineView) fragmentView.findViewById(R.id.video_timeline_view); - videoTimelineView.setVideoPath(videoPath); - videoTimelineView.setDelegate(new VideoTimelineView.VideoTimelineViewDelegate() { - @Override - public void onLeftProgressChanged(float progress) { - if (videoPlayer == null || !playerPrepared) { - return; - } - try { - if (videoPlayer.isPlaying()) { - videoPlayer.pause(); - playButton.setImageResource(R.drawable.video_play); - } - videoPlayer.setOnSeekCompleteListener(null); - videoPlayer.seekTo((int) (videoDuration * progress)); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - needSeek = true; - videoSeekBarView.setProgress(videoTimelineView.getLeftProgress()); - updateVideoEditedInfo(); - } - - @Override - public void onRifhtProgressChanged(float progress) { - if (videoPlayer == null || !playerPrepared) { - return; - } - try { - if (videoPlayer.isPlaying()) { - videoPlayer.pause(); - playButton.setImageResource(R.drawable.video_play); - } - videoPlayer.setOnSeekCompleteListener(null); - videoPlayer.seekTo((int) (videoDuration * progress)); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - needSeek = true; - videoSeekBarView.setProgress(videoTimelineView.getLeftProgress()); - updateVideoEditedInfo(); - } - }); - - videoSeekBarView = (VideoSeekBarView) fragmentView.findViewById(R.id.video_seekbar); - videoSeekBarView.delegate = new VideoSeekBarView.SeekBarDelegate() { - @Override - public void onSeekBarDrag(float progress) { - if (progress < videoTimelineView.getLeftProgress()) { - progress = videoTimelineView.getLeftProgress(); - videoSeekBarView.setProgress(progress); - } else if (progress > videoTimelineView.getRightProgress()) { - progress = videoTimelineView.getRightProgress(); - videoSeekBarView.setProgress(progress); - } - if (videoPlayer == null || !playerPrepared) { - return; - } - if (videoPlayer.isPlaying()) { - try { - videoPlayer.seekTo((int) (videoDuration * progress)); - lastProgress = progress; - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } else { - lastProgress = progress; - needSeek = true; - } - } - }; - - playButton = (ImageView) fragmentView.findViewById(R.id.play_button); - playButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - play(); - } - }); - - textureView = (TextureView) fragmentView.findViewById(R.id.video_view); - textureView.setSurfaceTextureListener(this); - - updateVideoOriginalInfo(); - updateVideoEditedInfo(); - } else { - ViewGroup parent = (ViewGroup) fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); + } catch (Exception e) { + compressVideo.setVisibility(View.GONE); + FileLog.e("tmessages", e); } } + + TextView titleTextView = (TextView) fragmentView.findViewById(R.id.original_title); + titleTextView.setText(LocaleController.getString("OriginalVideo", R.string.OriginalVideo)); + titleTextView = (TextView) fragmentView.findViewById(R.id.edited_title); + titleTextView.setText(LocaleController.getString("EditedVideo", R.string.EditedVideo)); + + videoTimelineView = (VideoTimelineView) fragmentView.findViewById(R.id.video_timeline_view); + videoTimelineView.setVideoPath(videoPath); + videoTimelineView.setDelegate(new VideoTimelineView.VideoTimelineViewDelegate() { + @Override + public void onLeftProgressChanged(float progress) { + if (videoPlayer == null || !playerPrepared) { + return; + } + try { + if (videoPlayer.isPlaying()) { + videoPlayer.pause(); + playButton.setImageResource(R.drawable.video_play); + } + videoPlayer.setOnSeekCompleteListener(null); + videoPlayer.seekTo((int) (videoDuration * progress)); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + needSeek = true; + videoSeekBarView.setProgress(videoTimelineView.getLeftProgress()); + updateVideoEditedInfo(); + } + + @Override + public void onRifhtProgressChanged(float progress) { + if (videoPlayer == null || !playerPrepared) { + return; + } + try { + if (videoPlayer.isPlaying()) { + videoPlayer.pause(); + playButton.setImageResource(R.drawable.video_play); + } + videoPlayer.setOnSeekCompleteListener(null); + videoPlayer.seekTo((int) (videoDuration * progress)); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + needSeek = true; + videoSeekBarView.setProgress(videoTimelineView.getLeftProgress()); + updateVideoEditedInfo(); + } + }); + + videoSeekBarView = (VideoSeekBarView) fragmentView.findViewById(R.id.video_seekbar); + videoSeekBarView.delegate = new VideoSeekBarView.SeekBarDelegate() { + @Override + public void onSeekBarDrag(float progress) { + if (progress < videoTimelineView.getLeftProgress()) { + progress = videoTimelineView.getLeftProgress(); + videoSeekBarView.setProgress(progress); + } else if (progress > videoTimelineView.getRightProgress()) { + progress = videoTimelineView.getRightProgress(); + videoSeekBarView.setProgress(progress); + } + if (videoPlayer == null || !playerPrepared) { + return; + } + if (videoPlayer.isPlaying()) { + try { + videoPlayer.seekTo((int) (videoDuration * progress)); + lastProgress = progress; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else { + lastProgress = progress; + needSeek = true; + } + } + }; + + playButton = (ImageView) fragmentView.findViewById(R.id.play_button); + playButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + play(); + } + }); + + textureView = (TextureView) fragmentView.findViewById(R.id.video_view); + textureView.setSurfaceTextureListener(this); + + updateVideoOriginalInfo(); + updateVideoEditedInfo(); + return fragmentView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java index b6fe28272..ab3380f21 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java @@ -101,120 +101,114 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent } @Override - public View createView(LayoutInflater inflater) { - if (fragmentView == null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("ChatBackground", R.string.ChatBackground)); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - boolean done; - TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground); - if (wallPaper != null && wallPaper.id != 1000001 && wallPaper instanceof TLRPC.TL_wallPaper) { - int width = AndroidUtilities.displaySize.x; - int height = AndroidUtilities.displaySize.y; - if (width > height) { - int temp = width; - width = height; - height = temp; - } - TLRPC.PhotoSize size = FileLoader.getClosestPhotoSizeWithSize(wallPaper.sizes, Math.min(width, height)); - String fileName = size.location.volume_id + "_" + size.location.local_id + ".jpg"; - File f = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName); + public View createView(Context context, LayoutInflater inflater) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("ChatBackground", R.string.ChatBackground)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + boolean done; + TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground); + if (wallPaper != null && wallPaper.id != 1000001 && wallPaper instanceof TLRPC.TL_wallPaper) { + int width = AndroidUtilities.displaySize.x; + int height = AndroidUtilities.displaySize.y; + if (width > height) { + int temp = width; + width = height; + height = temp; + } + TLRPC.PhotoSize size = FileLoader.getClosestPhotoSizeWithSize(wallPaper.sizes, Math.min(width, height)); + String fileName = size.location.volume_id + "_" + size.location.local_id + ".jpg"; + File f = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName); + File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); + try { + done = Utilities.copyFile(f, toFile); + } catch (Exception e) { + done = false; + FileLog.e("tmessages", e); + } + } else { + if (selectedBackground == -1) { + File fromFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); + done = fromFile.renameTo(toFile); + } else { + done = true; + } + } + + if (done) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("selectedBackground", selectedBackground); + editor.putInt("selectedColor", selectedColor); + editor.commit(); + ApplicationLoader.reloadWallpaper(); + } + finishFragment(); + } + } + }); + + ActionBarMenu menu = actionBar.createMenu(); + doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, null, false); + listAdapter = new ListAdapter(context); + + progressBar = (ProgressBar) fragmentView.findViewById(R.id.action_progress); + backgroundImage = (ImageView) fragmentView.findViewById(R.id.background_image); + listView = (HorizontalListView) fragmentView.findViewById(R.id.listView); + listView.setAdapter(listAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + if (i == 0) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + + CharSequence[] items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("Cancel", R.string.Cancel)}; + + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { try { - done = Utilities.copyFile(f, toFile); + if (i == 0) { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File image = Utilities.generatePicturePath(); + if (image != null) { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); + currentPicturePath = image.getAbsolutePath(); + } + startActivityForResult(takePictureIntent, 10); + } else if (i == 1) { + Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); + photoPickerIntent.setType("image/*"); + startActivityForResult(photoPickerIntent, 11); + } } catch (Exception e) { - done = false; FileLog.e("tmessages", e); } - } else { - if (selectedBackground == -1) { - File fromFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg"); - File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); - done = fromFile.renameTo(toFile); - } else { - done = true; - } } - - if (done) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("selectedBackground", selectedBackground); - editor.putInt("selectedColor", selectedColor); - editor.commit(); - ApplicationLoader.reloadWallpaper(); - } - finishFragment(); - } + }); + showAlertDialog(builder); + } else { + TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); + selectedBackground = wallPaper.id; + listAdapter.notifyDataSetChanged(); + processSelectedBackground(); } - }); - - ActionBarMenu menu = actionBar.createMenu(); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, null, false); - listAdapter = new ListAdapter(getParentActivity()); - - progressBar = (ProgressBar)fragmentView.findViewById(R.id.action_progress); - backgroundImage = (ImageView)fragmentView.findViewById(R.id.background_image); - listView = (HorizontalListView)fragmentView.findViewById(R.id.listView); - listView.setAdapter(listAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (i == 0) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - - CharSequence[] items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("Cancel", R.string.Cancel)}; - - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - try { - if (i == 0) { - Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - File image = Utilities.generatePicturePath(); - if (image != null) { - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); - currentPicturePath = image.getAbsolutePath(); - } - startActivityForResult(takePictureIntent, 10); - } else if (i == 1) { - Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); - photoPickerIntent.setType("image/*"); - startActivityForResult(photoPickerIntent, 11); - } - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } - }); - showAlertDialog(builder); - } else { - TLRPC.WallPaper wallPaper = wallPapers.get(i - 1); - selectedBackground = wallPaper.id; - listAdapter.notifyDataSetChanged(); - processSelectedBackground(); - } - } - }); - - processSelectedBackground(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); } - } + }); + + processSelectedBackground(); + return fragmentView; } diff --git a/TMessagesProj/src/main/res/drawable-hdpi/devices.png b/TMessagesProj/src/main/res/drawable-hdpi/devices.png new file mode 100755 index 0000000000000000000000000000000000000000..76870496865cc9147e621cb66cfd1bfa3fcd03dc GIT binary patch literal 1465 zcmeAS@N?(olHy`uVBq!ia0vp^Q9x|Z!3HD~Cf|6H_V+Po~;1Ffc1+hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb5uTZsl3!k| z30CjxYvq|&T#}fVoa*Ufs{}MbFEca6%G}Y|(#XQe#l^(j&Ct-*#L?8!(ZayQ(!|2p z($Lw`38vR2Ke;qFHLnDwHwB^B6{lWMQpha;+U$~Alv$RV;#QQOs{r=0RVHq?IN>x8 zsy79GHj^*!Xar9B+={Ta0BjMuGaVEo?z^uGgab9lZUn843)p!M^w@d zx*Tbd(ya_m(f$@6A7-TOIGOA!0PaYXi$MN7)Y& zK1Tfy4tyz|S+zV!Yq8^>1za*sWmdkkvkbV{9Q7@>8Fh&31QoeW+*^11)iI^2CO%_7 z>5Pq9yQcly{mwMcW; z!i=tE8CnZ6y3$}=JPf@>7MEDs>Tmze;=RbfZcWadXKU6N88}_sAI$hI(kf!HWS3sR zMN_uhn=LoJnh>13G&Xu+`GQEci#1}pFU>Tce{ImSKObc>F^4$%7 x+9jXaqxUyr`9aN!&8uS?crPrSQuRwDfnnLaz!zy@Cw_nmQ%_evmvv4FO#n8z7a{-v literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/greydivider_top.9.png b/TMessagesProj/src/main/res/drawable-hdpi/greydivider_top.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4523e953c81e60580d803b25cd7833054f85fae6 GIT binary patch literal 990 zcmaJ=J#W)M7&eL&m8z+zU;rf4!(9Lo+n2;7wrZ->PH3dMDrqD#*0HaNN$oTCmAD|*Z#p(a{=BWhTPLM*CEZ`;5GJM43EnGvO<^FYNu0wO0SO#x;= zR^p%tGdXx3qy(7eg)|S-NtluaNrocmek_gVTT60TD|Ta1OJN&?crwqoS}m@X=CEJq zp(IJXkm6IRB=txJt1dCZq#I217&H`^zU>hkyC7mTYIubxEX}l2g5&jR-Jshh+Auye zJRWjFR8r4T*Z=S8IDPMcl+k{^2NDOBRS)rH6yO!#q=Q?Uh(dX?>LY_-zk=~{uZ!~y zOmNV^9#B0lJhLMDlbKi2SL zxnhn%ij$bdV5SU&3Ggs#GKd^X1k#!QT!PX3oYq7>YZKit$fhwv2pjg4H0P*L{C`)Y z@wqoiDe+(O{h!37I@gRtN}MEeEEqjF-3m`AGb*v*8j7%}31a757gO~FMUZ;J3`itE zltP0UOdk8SrvQZlm77RPW5RH`R0Pr#Y=c3I@?`=(%#|cad3+9n$ao2{NTMu3O5bp0 zFi$L=!%7J($B3J#Ijr^ZrMa#!?e6CyCc&>chM9bYm>pGT-)-V{}%j8nA+SWgiwmn(3KG=Ff z#V_Wax1@xUSx3l%uW3~E4lT@ucvG38c)Z3Kd@^@{zUc#a__X`8`1ryZ`}EjY_?C~?~bv4Bebsy z62|QxcD95L24-hQBtLYyTvCxpR9I0_aY3n4aqqSW!B23XfAmmnZ0!A} zrl##<2asO9+8f1*xP-ts;a7? z&Ic6;j_Wcri<_I9nf`u$)k98@v$dkLvooi>yxc46{EV0C?u6q&NubScw-=KnNxbz5 zm(c)fyE{5M{4LH|cDlWB&*89hwPjCo7q)G_Sit4L@I>&o>wj1+YgL=DG;=rqu4mRb@jNmm|bSx+9jpe?WdkCX*HX zX~o|0(b3T|c&a?5f5_Zh;Fx`7tJppHSL%hvKo^qt%E(VY{nJ<1ADYws20ONoIqYpP zXu6TXZ}SA(q5>cktzyVA5<7}jxNJjmp^?vWU}mZ`<3=~pPG%M%TG3w@6y7j+ zmHF~JIq2WBY$=z!1Vm)!RW{~_R->*B?WK4Q1w8d(zbaaAQ^i1!X=lquUZ>OTjK Qd7e$VEJb=IA$|XU0Rq(?f&c&j literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/link.png b/TMessagesProj/src/main/res/drawable-hdpi/link.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad1fcb8f8f3509f92a42ad33e24028b0916f7ae GIT binary patch literal 1416 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_(0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWscy1?p^1XIrJkXw zp^1f|j)IYap|QS!vA&_PuAz~Yfu)t9sR9%z0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*nV6WA zUs__T1av9H3%LbwWAlok!2}F2{ffi_eM3D1ke6TzeSPsO&CP|YE-nd5MYtEM!Nnn! z1*!T$sm1xFMajU3OH&3}Rbb^@l$uzQUlfv`p92fUfQ3Qo7UxZ%{R4|I$^C}xpj8YToxJ|HGM-2yrAl%JXhOzuU%bZs5}wvT~<@wcao zV@SoVH`9GJTmnUoKkszgH|{nnJH6imL^8r(A+#VG1*g$ z=jKKQ&q=I_$5%}J^e2Aq%FC~7@3?;w`+jA8@&1y3-{(}nm+o4%O3plT*6~y|R!_&E z2_j$aPs`hWKzwgTV>UzN7RG;Dv>!BFSTogNQ+WYX-;W2c9C~LcaJ+1s&9v2Q*5{cE z;tX;&|C8})o>6d8L5*ps@tFHT?j!{yJ-SkfZ)^BCrx^?H{4 zw$$3teoN$rgTLxlPue>1KZ|2?PKD;xxPuSm6FT?UdDn{Uzv~rX_)|OO`B4Q2wYL{K z*Gh6!Em<7M>*XTnc2t-DvF!?`sT%%_o4zcW?H{yj?i8I&gE$VY6}9QA8T~A&0hw(j z>sN^-yqmt=XLF@k_5D>T+G}h(5*FI8==%2S`{ueMUt|}_`d{D+D&yMrQeo9D-zSaE zzhsugJxu#>>RQdknO9C-VSRP;j>V>Z8JZm~tuL#(Zx}_dj{PWjaR22bmM`+*hojqE zlMC+VJP(_ed&z9G@u`pl7tix|bSVZ;&nRn9n~=Q8WL@_3S!=v6{8{(y+{~k)PwLkJ jV?qTOA$sCpbPq68ylQ{R?>zrGsBH9f^>bP0l+XkK_xBJ+ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/devices.png b/TMessagesProj/src/main/res/drawable-mdpi/devices.png new file mode 100755 index 0000000000000000000000000000000000000000..b6bd7a72c0fb58eb97febff838d05dae5c63a0a6 GIT binary patch literal 1556 zcmeAS@N?(olHy`uVBq!ia0vp^Q9x|Z!3HD~Cf|6H_V+Po~;1Ffc1+hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb5uTZsl3!k| z30CjxYvq|&T#}fVoa*Ufs{}MbFEcX*7@EdLjxJ`#E+*z~hK8;tmd2KjPEMwlF0RH# zhK`0VFugAM$)&lec_lEtDG0qLIQ4>(LT&-jW|!2W%(B!Jx1#)91+bT`GI6`b5T|)i zy(zfeVuVw#KF~4xpom3^XqXT%^?;c0WDDfL6MkwQFtrx}ll3K4bzp8`>hN@N45_&F zX3lxg8>)@ZeoVQT_k%<|y-bJ%Sk@V#J(&$04sH1y&V z+4(B|wwc()+7bzi>kgCGzUclUt~EW!b@>au5Uoc!UpW61BwX6ft~I%;JjJt^IYrhY zdijCL7FK*lIe&^>Ha&U2QYzoeLOS8+jO#gpUrv6$G~vXBg9R@v0;3KZWU!^@TAxfY zs`Jlpwoee-b1^D^r&g7ROyehs{zB1`lamDV-L`i-A5S%q-Tb6^C$C$Ki0=Hib2L8~ zvd4(ropB`e$)XphSo$K*m2L@o{h+X=yw&KNe}kCbd%ow|73sHcypNBJNR2ruepXs+ zX<70M(dngNCyfzIb80e$U^gx2JAv%T-Nxm|(c;+?g|x?yBC7GiE1Tw)wYaj~2(` z!0u^lw-vAYp?$%pNwvG|J-^4fr@1nVRAt+e&TU!xVwJ|Vdzzx>*Dbj`XYPdc@7cva z&8wE$)W2rV#qLv^jzmmUEl<;H%L!k<=T)!%0jVAQ@7mrZYo;Dk5TB&YW07sR(R**0 zW{zpHV&(rCO1~t3ylZ&j{%rZ1DYbD29{*zzR;s${Q&N=qNAF?koSJzbFZ|K_8o_?h pe7>k_$i&X?q8XQ?{@)i)VEEOZlqZ{Fd=FGkd%F6$taD0e0s!e%O%?zE literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/greydivider_top.9.png b/TMessagesProj/src/main/res/drawable-mdpi/greydivider_top.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1faeb2636004a47c587daf01fa501976a2d23f15 GIT binary patch literal 978 zcmaJ=J#W)M7i=ua)bm3`+P~<#8ym6eF=?(t168|#ya*jv0D3#eI-s8 z3JWkGu_Lj-fCNIo%D~(W1{MY+23YA2Ko#dSNf`*1&Uf$WeV+I0xksxjH?p%AW(7gW zHkNUd@2Apr{22ewFH4{KHpgmhwnjHt-;Rh-b!mryhHrOCli2Ry_8zGSLMG?6+N^Ee z)E(-}cIqQ1e#p^+P+3eu+u0-xbV%0=4Dr{8k0S6~L%gM0iWQoq=PmCPQ1U_LlNc^oJ))PY<^6LDYUPBQKUD&1}9wybcR)I+)0#sR*90e6YNt2O^ zie+>a0t?eIH3*VQJZ+fU}A?5$x2$% z*wM27@9O&#@0c~oQNI5qj$4C}z$S_5cI5EEZRFBWp>9URW;AM1x;5_NYL7A+_h<-A z6I`-v#|u*X@(^HIdLxLL9XO+!;o{wcC$G<*S6@~ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/igvideo.png b/TMessagesProj/src/main/res/drawable-mdpi/igvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b93b3b70d7caba4a434154fcfd199105ccfed1 GIT binary patch literal 1553 zcmeAS@N?(olHy`uVBq!ia0vp^azHG`!3HF+C+nOCQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_naLn2Bde0{8v^KDjP)EVYz|dIVz*yhVSl7_V%D~df&{P2mlz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu09svx0_iVsd64 zh_4CO;OlGUnO9trn3tUD>0+w{G(s;kGsVix)zZws*xB60#LURh(AC7r+|bR{$;H^& z$=KDv#L*F^*Cju>G&eP`1g19yq1OVZUQk-dEdbi=l3J8mmYU*Ll%J~r_On$c7Pq)K z8Ctkmx|#vaGsNx|h~5<3ZUO1V?hk#SWAs5Wixkr^Az<(#kT1*9Wu`uHQV9!ZU~2_JO#;oYKXI-M`?6dPhA{zniz+{A}drn>M;4T=B&_?+Esqn0Nf)`M2jy zIMb5=jW4UB)`m&-9^*eFpV>K|pRIXe!-lyYDs~6_jz4FT`>-)6<^cdstAB*J&~Tyu9=FljpXFg#Nvfwbf5w!Q|4MFFE&@ zd}VrW9c*{FTik%dg1dcnTzPKo26-2ZW~X37VxzPj&Wi`uTsZcBqs-eW0T88U07eEi>g z7AcWsN0T;g*PHG=Q6)3eMC$CH*U6i29y{^FPUvm5iIlC&v-var{>zx_{l|ZD<>19KYn+y0xSYrPNjnKD|=bpvm3kWo^!8O>&nkDN6}ix&?$Sm%FFUHMHN@oaQ8g_ zhu`n_|3Cl#k9#ROcHGwdSTlkkws?$58EcpM9%?eazZ3)8#?q}vGWtn*LNBr^L_)lr zgCH)llQ0EYe&*R*a2P?*J|UgaGl>%vCyOrD#JEbLVz3cpc%-DTTmkAJ2PXw7fZhB2 zOAH8n06XnV5DA5bc_B8d!jrROX>PW_`FU*Q7#J>5hJXll7L>$ul17yRSWTBQ_U18; zff__F1h5B1WfDn1%PIsum(R%&q!$eOU8Iln4v|j*H$i%E!h@3@C+VgLKSlb$?t>ZG zRDOa=G11*zMijvEx~@<-UMv<}MUP8XCvnp6_v3^cce|Yi!l}(jI$Lr|T3=m(ff}a@ ziY~|!FcsOHJgo;XqtXXg5S2YyN!x9c(J;KkDmdvP%q!J_iNyayMR59wkXK;tday(MXu_&|y!6@Pf8vQ{VNrxZm#nsqwv2v~9;y{a|6+X`i=l9Epv- zW&LXs%%S6G>JOw^C{O6wElcwHqcPFCaW>e~T3s)%-H)FjkgbnUhYZdf-n!J5ymv}( z`4)AcptWIC`iiyVi%nn8-{^h9YAb6&-;Lip7rM@t+lTW_Uo_;#dS2dXt!~`xv~Hb8 zS0A}R=Bk#P;i)Uwor_2_MlZKivJT5#x2wG}&~bPD`h&_vZvw3y% SwSLD1^RE++j4^BBY~^1i?3sfA literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/devices.png b/TMessagesProj/src/main/res/drawable-xhdpi/devices.png new file mode 100755 index 0000000000000000000000000000000000000000..9b5663ff931d4c0b5c378e0435a3629dde0c6b10 GIT binary patch literal 1923 zcma)7X;2eq7)}RDEeL`K78KnC1yM*y2!SkwOw3WD1msY0(7_ywiI8l}E+l}8(vb=X zQEMv{Im8*YYLSRoq9}DlV;RMOq9`K83#~wO&`?7I-5_Xxlumbc_j|r?-sgGGoy}hr z{k5~Bry~xBbLK~K;;{8B_H3KxfW4iT@}sfE1LY>7@o);N7OEf|O9G1^fG-zrg5n^d zBy-DeP&f`}N022XqKSeiPz=k7LYoayBUfT<94?%xQ3}PW5DJK(O)>?8V7kym0Avyd zVQsJ=P@rT(Qdwk{3X0E)P7r6Mis=#pGXey@FA!~!76|as~{kl7!)85B$ELejYy^j(`aOWfD%ZikOHxr7C@$g!8DK(0!&;4 z%$rJ*0>*K86TYw=gCIpwB}gKv)oP+ThzP4Tk;rs9-KIgI1Yi~cNTvc6Y6299_oM;` zLc}VW5|zOUz@{h^!RaW2fJOQt1-bI0tOA)R6IL*iMyMo_iGjA1CJhCG|2CD&KUyPb z9P}yPe-%a&GL;Z14np8`l^APWinq;`5@f3&AquM!U^s2EimRkB3L{cj39#d7z>>8x zg#=b3e&hB60mxS%s8At>_#6fSQy|J@5|G9Vr3JINK^$rbk4)xLmveYjb|{My5)v59 z=CMO3xg1!WE{7E8Bv$%;C$(J$wsPxJ8r%xrZ$hx%D z`Y>^-=%9OTLzAe-5K(Y(&d9mSu{US@$A;fY2TVO~*+J)8hni;=T~(ZQlo+zd{Lc1a8dR2(wsCZepFM2tzb04=AXPJqD%ty)PVeDTX&dSbm zWgUwzN(vu+`zxm@=lf_DJk)U8`=!?zfz`#5p$%i4)%CDWn@eu9@3}nY;@`GBv$}Ym z!AtF(ube0|xm|M04ltK}Ti@26dg3j=r=s)0IfwFy3o(_ww_f6%n9b46DG#z*-V~M8 zAvfq$dg(0cG|xN}7oTZqa2hK%+25?~e0;#p-Z|Hy&-j<`hAhDPqI(;+&tSUdscO1) zb-N#UZ&c%(arXGdWa10+{RLg~k~)kdmBhMzHF34x=4W^A+<5}6+dgpMNO^n6d_hR) z^Yd>yqd3+bRb74h&3gX5{q(P5wNB?5HQI}Z-lyii+?|zR9C*Ea-`Hy1UBiOe=x96A zSijg{*;_TFX1DdN{BpXH$LfOxg~jhcR-dWG-RqSj>$`3zhwFLTOQi=#m*m^&?&BNb zW#X{H*2?$ZQsN)Cs}YX^;Sbv#t&)DnWAoQX&8lhI0%kmvf@8;g6VWHU{-81dyj$n@BEDkiRC!vPu3`l%r%{o}UX#n2CSRSns+KcQh}rv2ObB@wVS0pBv4o IS-vs%ZDtbNHIVn-_woIFzP~>2_Uz2Xp~2xn zhGB-vQ+kE&!|{J&fUb`(O~0YrDN?MFIXq8VW`LN2jq3=MU9*8I$h23MUZXLFNsKtv z8mSr6iiKUyjD5Js^(mTR#wH@)v=$Hnb<}V?mHqns1q&QoWiLyHVE7tpI#a6wnp>Tz zTB{3|Y_k*NU@TH7fs2RsECFUf zR_34tGdXwxhyqOWLYjx^6ciOfR-gnrA4{VJ_PkQjOPyHMQrRXUzQXgZR*P$;IUF>2 zD9bW0h`cDKs7ESX@rW6vyl|w;prgF-LcAPUba3+{aVTHW0%Q^#R54!cc5$|e z2@ads2bu=X8m8rVv3;%$Fbt*ag~aqMRMu6NQgDuAD@84rlc1c_1zm=)n8`_5J(n(I zVX35L#6qEq)v>kgB9C;j_7PU@i;cD5`ZThR0_PgCO96I4yJp4dpUY@pz7E#zpG&qc zmZ!<^@nrv+boYwNCqDLcOO2lLkw@hoP+jkAkFL`aygTr5vq-kqj_LcqcJGZR s5B9#@qU-O2`(Ki;#Pd&|43=&%3FgjjGI{*NmH0I?<>HL~Z1U>OKM+SkApigX literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/igvideo.png b/TMessagesProj/src/main/res/drawable-xhdpi/igvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..bad39364076f659a658936026cf42ccca63b0b32 GIT binary patch literal 2441 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 S&+vy70>Sa$%Bu3)weP>jx7;28 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/greydivider_top.9.png b/TMessagesProj/src/main/res/drawable-xxhdpi/greydivider_top.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3d0b3160d5aa71fbcc201e99772e8c29a54688 GIT binary patch literal 1016 zcmaJ=PiWIn98MX`IqX3^XuTLR6a||9G~QbWL!wdyd(=E-ToNj%`>ZVNz1o=5ldle7`rmZH5v`Jkz|oK z%L$SsaeRVHB;o`S_nQs|LEQ0&Itm)}4bO71g&aCm1T$zJD-4PBC~k8a?^!e3HoT>Gf3mAL!m2IRy_zX^2!L!b*eZ~ zLm2rr@+n75&WJ6!Xao9oF9XTf%fXAOGRJ!s}VWYevjWvh2AV?FiST(fs9 zYELdlg5ko>{?+Nu6&auK*qvKqbSED=WZXS6*Jw5Kp1g^ALCcndFNZsCPj22AcnG4g z&EGF^L_9nGYd7}&{>Q1s=ic)A1~#fYt9O)ld+LSC_VTN({U^3t~;+bblNpL!HSpRxW`u6nT;wE)aj14coc2>f-SjZK%wXx~N EKQCHFq5uE@ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/igvideo.png b/TMessagesProj/src/main/res/drawable-xxhdpi/igvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..d13eab92922bbcf410ee2e31e4d619a15fc4fbbd GIT binary patch literal 4398 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index 2e2b6bdd3..743678431 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -85,6 +85,10 @@ جاري الكتابة… يكتب… يكتبون… + %1$s يقوم بإرسال مقطع صوتي... + %1$s يقوم بإرسال صورة... + %1$s يقوم بإرسال مقطع مرئي... + %1$s يقوم بإرسال ملف... هل يوجد لديك سؤال\nحول تيليجرام؟ التقط صورة صورة @@ -117,6 +121,7 @@ المرفق غير مدعوم عداد التدمير الذاتي إشعارات الخدمة + جاري جلب معلومات الرابط... %1$s قام بتعيين عداد التدمير الذاتي إلى to %2$s لقد قمت بتعيين التدمير الذاتي إلى %1$s @@ -150,7 +155,7 @@ %1$s قام بإخراجك من المجموعة %2$s %1$s قام بمغادرة المجموعة %2$s %1$s قام بالتسجيل في تيليجرام! - %1$s,\nتم تسجيل الدخول لحسابك من جهاز جديد يوم %2$s\n\nالجهاز: %3$s\nالموقع: %4$s\n\nإذا لم يكن أنت من سجل الدخول، يمكنك الذهاب للإعدادات ثم تسجيل الخروج من كافة الأجهزة الأخرى.\n\nشكرًا,\nفريق عمل تيليجرام + %1$s,\nتم تسجيل الدخول لحسابك من جهاز جديد يوم %2$s\n\nالجهاز: %3$s\nالموقع: %4$s\n\nإذا لم يكن أنت من سجل الدخول، يمكنك الذهاب للإعدادات ثم تسجيل الخروج من كافة الأجهزة الأخرى. كما يمكنك تفعيل التحقق بخطوتين إذا رغبت بذلك عن طريق إعدادات الخصوصية.\n\nشكرًا,\nفريق عمل تيليجرام %1$s قام بتغيير صورته الشخصية الرد الرد على %1$s @@ -245,7 +250,7 @@ لا يوجد صوت افتراضي الدعم - إذا كان على الصامت + فقط في وضع الصامت خلفية الدردشة الرسائل أرسل بزر الإدخال @@ -305,14 +310,26 @@ تعطيل إيقاف الأصوات داخل المحادثات + افتراضي + + الأجهزة المسجّل دخول منها + الجهاز الحالي + لا يوجد أجهزة مسجّل دخول منها أخرى + يمكنك تسجيل الدخول لحسابك في تيليجرام من جوال آخر، جهاز لوحي، أو أجهزة الكمبيوتر، باستخدام نفس رقم الهاتف. تيليجرام سيقوم بمزامنة كافة بياناتك بشكل لحظي. + الأجهزة المسجّل دخول منها + قم بالتحكم بالأجهزة المسجل دخول منها. + اضغط على الجهاز لتسجيل الخروج منه. + هل ترغب في تسجيل الخروج من هذا الجهاز؟ + تطبيق غير رسمي - رمز المرور + قفل رمز المرور غيًر رمز المرور عندما تختار رمز مرور، ستظهر علامة قفل في صفحة المحادثات. اضغط عليها لقفل أو فتح تيليجرام.\n\nملاحظة: إذا نسيت رمز المرور، ستحتاج لحذف وإعادة تنزيل التطبيق. وستخسر كافة محادثاتك السرية وستعود المحادثات العادية فور إعادة تسجيل الدخول. سوف ترى الآن أيقونة قفل في صفحة المحادثات. اضغط عليها لقفل تطبيق تيليجرام برمز المرور الجديد الخاص بك. الرمز كلمة المرور قم بإدخال رمز المرور الخاص بك الحالي + قم بإدخال رمز مرور قم بإدخال رمز المرور الخاص بك الجديد قم بإدخال رمز المرور الخاص بك قم بإعادة إدخال رمز المرور الخاص بك الجديدة @@ -372,29 +389,55 @@ هل ترغب في مسح سجل البحث؟ مسح - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + التحقق بخطوتين + تعيين كلمة مرور إضافية + يمكنك تعيين كلمة مرور يتم طلبها عند محاولة تسجيل الدخول من جهاز جديد بالإضافة إلى الرمز الذي يأتيك في رسالة قصيرة. + كلمة المرور الخاصة بك + يرجى إعادة إدخال كلمة المرور الخاصة بك: + قم بإدخال كلمة مرور + يرجى إدخال كلمة المرور الجديدة الخاصة بك: + يرجى إعادة إدخال كلمة المرور الخاصة بك: + بريد إسترداد الحساب + بريدك الإلكتروني + فضلًا أضف بريد إلكتروني صحيح. هذه هي الطريقة الوحيدة لإستعادة كلمة المرور بعد نسيانها. + تخطّي + تحذير + الموضوع جدّيّ.\n\nإذا نسيت كلمة المرور الخاصة بك، لن تستطيع الدخول على حساب تيليجرام الخاص بك. لن يكون هناك طريقة لإستعادته. + تقريبًا انتهينا! + يرجى الذهاب لبريدك الإلكتروني والضغط على رابط التأكيد لإنهاء إعدادات التحقق بخطوتين. تأكد من الإطّلاع على مجلد الرسائل الغير مرغوب بها أيضًا. + تم بنجاح! + تم تفعيل كلمة المرور الخاصة بالتحقق بخطوتين. + تغيير كلة المرور + إيقاف كلمة المرور + اختر بريد إلكتروني لإسترداد الحساب + غيّر البريد الإلكتروني لإسترداد الحساب + هل أنت متأكد من رغبتك في تعطيل كلمة المرور؟ + تلميحة كلمة المرور + فضلًا اختر تلميحة لكلمة المرور الخاصة بك: + كلمتي المرور غير متطابقة + إنهاء عملية إعداد التحقق بخطوتين + فضلًا اتّبع هذه الخطوات لإكمال إعدادات التحقق بخطوتين:\n\n١. قم بالإطلاع على بريدة الإلكتروني بما فيه مجلد الرسائل الغير مرغوب بها\n%1$s\n\n٢. اضغط على رابط التأكيد + التلميحة يجب أن تكون مختلفة عن كلمة المرور ذاتها + بريد إلكتروني غير صحيح + عذرًا + لم تقم بإضافة بريد إلكتروني لإستعادة كلمة المرور عند اختيارها، لذلك خياراتك المتبقية هي تذكّر كلمة المرور أو إعادة تعيين حسابك. + لقد قمنا بإرسال رمز الإستعادة إلى بريدك الإلكتروني الذي اخترته مسبقًا:\n\n%1$s + يرجى الإطلاع على بريدك الإلكتروني وإدخال الرمز المكون من ٦ أرقام الذي قمنا بإرساله هنا. + هل تواجه صعوبات في الدخول على بريدك الإلكتروني %1$s؟ + إذا لم تستطع الدخول على بريد الإسترداد الخاص بك، خياراتك المتبقية هي تذكّر كلمة المرور أو إعادة تعيين حسابك. + إعادة تعيين حسابي + إذا قمت بإعادة تعيين حسابك، ستفقد كافّة محادثاتك ورسائلك، بالإضافة إلى الوسائط والملفات التي تمت مشاركتها. + تحذير + لا يمكن الرجوع عن هذا الخيار.\n\nإذا قمت بإعادة تعيين حسابك، كافة رسائلك ومحادثاتك سيتم حذفها. + إعادة تعيين + كلمة المرور + تم تفعيل التحقق بخطوتين، لذلك حسابك محميّ بكلمة مرور إضافية. + هل نسيت كلمة المرور؟ + كلمة مرور الإسترداد + الرمز + تم تعطيل كلمة المرور + لقد قمت بتفعيل التحقق بخطوتين.\nعند محاولة تسجيل الدخول على حساب تيليجرام الخاص بك من جهاز جديد، سيتم طلب كلمة المرور التي اخترتها هنا منك. + البريد الإلكتروني لإسترداد الحساب %1$s غير فعّال بعد ويلزم تفعيله الخصوصية والأمان الخصوصية @@ -486,6 +529,7 @@ رقم الهاتف غير صحيح انتهت صلاحية الرمز الخاص بك، يرجى تسجيل الدخول مرة أخرى محاولات كثيرة خاطئة، نرجو المحاولة لاحقًا + محاولات كثيرة خاطئة، يرجى المحاولة خلال %1$s الرمز غير صحيح الاسم الأول غير صحيح اسم العائلة غير صحيح diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index b38245a61..fd4c0035a 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -85,6 +85,10 @@ schreibt… schreibt... tippen… + %1$s nimmt etwas auf... + %1$s schickt Bild... + %1$s schickt Video... + %1$s schickt Datei... Hast du eine Frage\nzu Telegram? Foto aufnehmen Galerie @@ -117,6 +121,7 @@ Nicht unterstützte Datei Selbstzerstörungs-Timer setzen Servicemeldungen + Lade Linkvorschau... %1$s hat den Selbstzerstörungs-Timer auf %2$s gesetzt Du hast den Selbstzerstörungs-Timer auf %1$s gesetzt @@ -150,7 +155,7 @@ %1$s hat dich aus der Gruppe %2$s entfernt %1$s hat die Gruppe %2$s verlassen %1$s benutzt jetzt Telegram! - %1$s,\nWir haben eine Anmeldung von einem neuen Gerät am %2$s festgestellt.\n\nGerät: %3$s\nStandort: %4$s\n\nWenn du das nicht selbst gewesen bist, melde alle anderen Sitzungen in den Telegram Einstellungen unverzüglich ab.\n\nMit freundlichen Grüßen,\nDein Telegram Team + %1$s,\nWir haben eine Anmeldung von einem neuen Gerät am %2$s festgestellt.\n\nGerät: %3$s\nStandort: %4$s\n\nWenn du das nicht selbst gewesen bist, melde alle anderen Sitzungen in den Telegram Einstellungen unverzüglich ab.\n\nBeachte unsere zweistufige Bestätigung, welche du in den Telegram Einstellungen unter Privatsphäre und Sicherheit optional aktivieren kannst.\n\nDein Telegram Team %1$s hat das Profilbild geändert Antworten %1$s antworten @@ -245,17 +250,17 @@ Kein Ton Standard Support - Nur wenn stumm + Wenn lautlos Chat-Hintergrundbild Nachrichten Mit Enter senden - Alle anderen Sitzungen beenden + Alle anderen Geräte abmelden Ereignisse Kontakt ist Telegram beigetreten PEBBLE Sprache Bedenke bitte, dass der Telegram Support von einem ehrenamtlichen Team betreut wird. Wir versuchen so schnell wie möglich zu antworten, dies kann jedoch manchmal ein bisschen dauern.
]]>Bitte schau auch in den Fragen und Antworten ]]> nach. Dort findest du Antworten auf die meisten Fragen und wichtige Tipps zur Problembehandlung]]>.
- Frage einen Freiwilligen + Eine Frage stellen Fragen und Antworten https://telegram.org/faq/de Lokalisierung löschen? @@ -305,14 +310,26 @@ Deaktiviert Aus In-Chat Töne + Standard + + Sitzungen + Aktuelle Sitzung + Keine anderen Geräte + Du kannst dich von jedem Handy, Tablet und Computer bei Telegram mit derselben Telefonnummer anmelden. Alles wird immer sofort synchronisiert. + Andere Geräte + Überprüfe alle deine angemeldeten Geräte. + Tippe auf eine Sitzung um sie zu beenden. + Dieses Gerät abmelden? + inoffizielle Version - Pincode + Pincode-Sperre Pincode ändern Wenn du die Code-Sperre aktivierst, erscheint ein Schloss ganz oben über der Chatliste. Tippe auf das Schloss, um deine Chats zu sperren und zu entsperren.\n\nÜbrigens: Wenn du den Pincode vergisst, musst du Telegram löschen und neu installieren. Dadurch verlierst du alle Geheimen Chats. Du wirst nun ein Schloss über der Chatliste sehen. Tippe darauf um deine Chats mit dem neuen Pincode zu sperren. Pincode Kennwort Aktuellen Pincode eingeben + Pincode eingeben Neuen Pincode eingeben Deinen Pincode eingeben Neuen Pincode erneut eingben @@ -372,29 +389,55 @@ Suchverlauf löschen? Löschen - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Zweistufige Bestätigung + Zusätzliches Kennwort festlegen + Du kannst ein eigenes Kennwort festlegen, um dich an einem neuen Gerät anzumelden, zusätzlich zum SMS-Code. + Dein Kennwort + Bitte aktuelles Kennwort eingeben + Kennwort eingeben + Bitte neues Kennwort eingeben + Bitte erneut dein Kennwort eingeben + Wiederherstellung + Deine E-Mail + Falls du dein Kennwort vergisst, benötigen wir deine richtige Email Adresse. + Überspringen + Warnung + Keine gute Idee.\n\nWenn du dein Passwort vergisst, verlierst du den Zugang zu deinem Telegram Konto. Für immer, ohne Ausnahme. + Fast geschafft! + Bitte überprüfe deine Mails (auch den Spam-Ordner) um die zweistufige Bestätigung abzuschließen. + Geschafft! + Dein Kennwort für die zweistufige Bestätigung ist jetzt aktiv. + Kennwort ändern + Kennwort deaktivieren + E-Mailadresse festlegen + E‑Mail-Adresse zur Wiederherstellung ändern + Sicher, dass du dein Kennwort deaktivieren willst? + Kennwort-Erinnerung + Bitte Hinweis auf dein Kennwort eingeben + Kennwörter stimmen nicht überein + Einrichten abbrechen + Bitte folge diesen Schritten um die zweistufige Bestätigung abzuschließen:\n\n1. Überprüfe deine Mails (auch den Spam-Ordner)\n%1$s\n\n2. Auf den Link klicken. + Der Hinweis darf nicht das Kennwort sein. + Ungültige E-Mail + Tut uns leid + Da du für diesen Fall keine Email Adresse hinterlegt hast, kannst du nur noch hoffen, dass dir dein Kennwort wieder einfällt oder du musst dein Telegram Konto zurückzusetzen. + Wir haben den Wiederherstellungscode an diese Adresse geschickt:\n\n%1$s + Überprüfe deine Mails und gib den 6-stelligen Code aus userer Email ein. + Du hast keinen Zugang zu deiner Adresse %1$s? + Wenn du nicht in deine Emails kommst, kannst du nur hoffen, dass dir dein Kennwort wieder einfällt oder du musst dein Telegram Konto zurückzusetzen. + KONTO ZURÜCKSETZEN + Wenn du dein Konto zurücksetzt, verlierst du alle Chats und Nachrichten, ebenso deine geteilten Bilder und Videos. + Warnung + Dies kann nicht rückgängig gemacht werden.\n\nWenn du dein Konto zurücksetzt, sind alle Chats gelöscht. + Zurücksetzen + Kennwort + Du hast die zweistufige Bestätigung aktiviert. Dein Konto ist mit einem zusätzlichem Kennwort geschützt. + Kennwort vergessen? + Kennwort zurücksetzen + Code + Kennwort deaktiviert + Du hast die zweistufige Bestätigung aktiviert.\nWenn du dich bei Telegram anmeldest, brauchst du dein Kennwort. + Deine E-Mail Adresse %1$s wurde noch verifiziert und ist daher noch nicht aktiv. Privatsphäre und Sicherheit Privatsphäre @@ -486,6 +529,7 @@ Ungültige Telefonnummer Code ist abgelaufen, bitte melde dich erneut an Zu viele Versuche in zu kurzer Zeit, versuche es bitte später erneut. + Zu viele Versuche, bitte erneut in %1$s versuchen Ungültiger Code Ungültiger Vorname Ungültiger Nachname diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 6056de8d2..b2b2f7b37 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -85,6 +85,10 @@ escribiendo... está escribiendo... están escribiendo... + %1$s está grabando un audio... + %1$s está enviando una foto... + %1$s está enviando un vídeo... + %1$s está enviando un archivo... ¿Tienes preguntas\nsobre Telegram? Hacer foto Galería @@ -117,6 +121,7 @@ Adjunto no soportado Establecer autodestrucción Servicio de notificaciones + Obteniendo información... %1$s activó la autodestrucción en %2$s Activaste la autodestrucción en %1$s @@ -150,7 +155,7 @@ %1$s te expulsó del grupo %2$s %1$s dejó el grupo %2$s ¡%1$s se unió a Telegram! - %1$s,\nDetectamos un inicio de sesión en tu cuenta desde un nuevo dispositivo, el %2$s\n\nDispositivo: %3$s\nUbicación: %4$s\n\nSi no eras tú, puedes ir a Ajustes - Privacidad y seguridad - Cerrar todas las otras sesiones.\n\nAtentamente,\nEl equipo de Telegram + %1$s,\nDetectamos un inicio de sesión en tu cuenta desde un nuevo dispositivo, el %2$s\n\nDispositivo: %3$s\nUbicación: %4$s\n\nSi no eras tú, puedes ir a Ajustes - Privacidad y seguridad - Cerrar todas las otras sesiones.\n\nSi crees que alguien ha iniciado la sesión sin tu consentimiento, puedes activar la verificación en dos pasos, en los ajustes de privacidad y seguridad.\n\nAtentamente,\nEl equipo de Telegram %1$s actualizó su foto de perfil Responder Responder a %1$s @@ -245,7 +250,7 @@ Sin sonido Por defecto Soporte - Only if silent + Sólo si está silenciado Fondo de chat Mensajes Enviar con \'Intro\' @@ -305,6 +310,17 @@ Desactivado Apagado Sonidos en el chat + Por defecto + + Sesiones activas + Sesión actual + Sin otras sesiones activas + Puedes iniciar sesión en Telegram desde otro móvil, tablet o computador, usando el mismo número de teléfono. Todos tus datos se sincronizarán al instante. + Sesiones activas + Controla tus sesiones en otros dispositivos. + Pulsa una sesión para cerrarla. + ¿Cerrar esta sesión? + aplicación no oficial Código de acceso Cambiar código de acceso @@ -313,6 +329,7 @@ PIN Contraseña Pon tu código de acceso actual + Pon un código de acceso Pon tu nuevo código de acceso Pon tu código de acceso Pon, otra vez, tu nuevo código @@ -372,29 +389,55 @@ ¿Quieres borrar el historial de búsqueda? Borrar - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Verificación en dos pasos + Poner contraseña adicional + Puedes poner una contraseña, que será requerida cuando inicies sesión en un nuevo dispositivo, además del código que recibes vía SMS. + Tu contraseña + Por favor, pon tu contraseña + Pon una contraseña + Por favor, pon tu nueva contraseña + Pon, otra vez, tu contraseña + E-mail de recuperación + Tu e-mail + Por favor, añade un e-mail válido. Es la única forma de recuperar una contraseña olvidada. + Omitir + Advertencia + En serio.\n\nSi olvidas tu contraseña, perderás el acceso a tu cuenta de Telegram. No habrá manera de recuperarla. + ¡Ya casi! + Por favor, revisa tu e-mail (no olvides la carpeta de spam) para completar la configuración de la verificación en dos pasos. + ¡Listo! + Tu contraseña para la verificación en dos pasos está activada. + Cambiar contraseña + Desactivar la contraseña + Poner e-mail de recuperación + Cambiar e-mail de recuperación + ¿Quieres desactivar tu contraseña? + Pista para la contraseña + Por favor, crea una pista para tu contraseña + Las contraseñas no coinciden + Anular la configuración de la verificación en dos pasos + Por favor, sigue estos pasos para completar la configuración de la verificación en dos pasos:\n\n1. Revisa tu e-mail (no olvides la carpeta de spam).\n%1$s\n\n2. Haz click en el enlace de validación. + La pista debe ser diferente de tu contraseña + E-mail inválido + Lo sentimos + Como no estableciste un e-mail de recuperación cuando configuraste tu contraseña, las opciones restantes son recordar tu contraseña o restablecer tu cuenta. + Enviamos un código de recuperación al e-mail que nos diste:\n\n%1$s + Por favor, revisa tu e-mail y pon el código de 6 dígitos que te enviamos ahí. + ¿Tienes problemas para acceder a tu e-mail %1$s? + Si no puedes acceder a tu e-mail, las opciones restantes son recordar tu contraseña o restablecer tu cuenta. + RESTABLECER MI CUENTA + Si continúas con el reinicio de tu cuenta, perderás todos tus chats y mensajes, junto con toda la multimedia y archivos que compartiste. + Advertencia + Esta acción no puede deshacerse.\n\nSi reinicias tu cuenta, todos tus mensajes y chats se eliminarán. + Restablecer + Contraseña + Activaste la verificación en dos pasos, así que tu cuenta está protegida con una contraseña adicional. + ¿Olvidaste la contraseña? + Recuperar contraseña + Código + Contraseña desactivada + Tienes activada la verificación en dos pasos.\nNecesitarás la contraseña que configuraste para iniciar tu sesión en Telegram. + Tu e-mail de recuperación %1$s aún no está activo y su confirmación está pendiente. Privacidad y seguridad Privacidad @@ -486,6 +529,7 @@ Número de teléfono inválido Código expirado. Por favor, vuelve a iniciar sesión. Muchos intentos. Por favor, prueba de nuevo más tarde. + Demasiados intentos. Por favor, reinténtalo en %1$s Código inválido Nombre inválido Apellidos inválidos diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index afe56a4fd..8d827737c 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -85,6 +85,10 @@ sta scrivendo… sta scrivendo… stanno scrivendo… + %1$s sta registrando un audio... + %1$s sta inviando una foto... + %1$s sta inviando un video... + %1$s sta inviando un file... Hai una domanda\nsu Telegram? Scatta una foto Galleria @@ -113,10 +117,11 @@ ANNULLA Salva in download Condividi - Applica file di localizzazione + Applica traduzione Allegato non supportato Timer di autodistruzione Notifiche di servizio + Recupero le info del link... %1$s ha impostato il timer di autodistruzione a %2$s Hai impostato il timer di autodistruzione a %1$s @@ -150,7 +155,7 @@ %1$s ti ha espulso dal gruppo %2$s %1$s ha lasciato il gruppo %2$s %1$s ha iniziato a usare Telegram! - %1$s,\nAbbiamo rilevato un accesso al tuo account da un nuovo dispositivo il %2$s\n\nDispositivo: %3$s\nPosizione: %4$s\n\nSe non sei stato tu, puoi andare su Impostazioni - Privacy e Sicurezza - Termina tutte le sessioni.\n\nGrazie,\nil team di Telegram + %1$s,\nAbbiamo rilevato un accesso al tuo account da un nuovo dispositivo il %2$s\n\nDispositivo: %3$s\nPosizione: %4$s\n\nSe non sei stato tu, puoi andare su Impostazioni - Privacy e Sicurezza - Sessioni - Termina tutte le sessioni.\n\nSe pensi che qualcuno si sia collegato al tuo account contro il tuo volere, ti raccomandiamo di attivare la verifica in due passaggi nelle impostazioni di Privacy e Sicurezza.\n\nGrazie,\nil team di Telegram %1$s ha aggiornato la foto del profilo Rispondi Rispondi a %1$s @@ -230,7 +235,7 @@ Avviso Anteprima messaggio Notifiche di gruppo - Suoni + Suono Notifiche in-app Suoni in-app Vibrazione in-app @@ -243,13 +248,13 @@ Utenti bloccati Disconnetti Nessun suono - Default + Predefinita Supporto Solo se silenzioso Sfondo chat Messaggi Spedisci con Invio - Chiudi tutte le altre sessioni + Termina le altre sessioni Eventi Un contatto ha iniziato a usare Telegram PEBBLE @@ -258,8 +263,8 @@ Chiedi a un volontario FAQ di Telegram https://telegram.org/faq/it - Eliminare la localizzazione? - File della localizzazione non valido + Eliminare la traduzione? + File di traduzione non valido Abilitate Disabilitata Servizio notifiche @@ -287,7 +292,7 @@ Salva nella galleria Modifica nome Priorità - Default + Predefinita Bassa Alta Massima @@ -305,14 +310,26 @@ Disabilitato No Suoni in-chat + Predefinito + + Sessioni attive + Sessione corrente + Nessun\'altra sessione attiva + Ti puoi connettere a Telegram da altri dispositivi mobili, tablet e desktop usando lo stesso numero. Tutti i tuoi dati saranno sincronizzati istantaneamente. + Sessioni attive + Controlla le tue sessioni sugli altri dispositivi. + Premi su una sessione per terminarla. + Terminare questa sessione? + app non ufficiale - Codice + Blocco con codice Cambia codice Quando imposti un codice, un\'icona col lucchetto apparirà nella pagina delle chat. Premi su di essa per bloccare e sbloccare l\'app.\n\nNota: se ti dimentichi il codice, dovrai disinstallare e reinstallare l\'app. Tutte le chat segrete verranno perse. Ora visualizzerai un\'icona col lucchetto nella pagina delle chat. Premi su di essa per bloccare la tua app Telegram con il codice. PIN Password Inserisci il tuo codice + Inserisci un codice Inserisci il nuovo codice Inserisci il tuo codice Reinserisci il nuovo codice @@ -372,29 +389,55 @@ Cancellare la cronologia di ricerca? Pulisci - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Verifica in due passaggi + Imposta password aggiuntiva + Puoi impostare una password che ti verrà richiesta quando ti connetti da un nuovo dispositivo in aggiunta al codice che riceverai via SMS. + La tua password + Inserisci la tua password + Inserisci una password + Inserisci la tua nuova password + Reinserisci la tua password + E-mail di recupero + La tua e-mail + Per favore inserisci un\'e-mail valida. È l\'unico modo di recuperare una password dimenticata. + Salta + Attenzione + No, seriamente.\n\nSe dimentichi la tua password, perderai l\'accesso al tuo account Telegram. Non ci sarà modo di ripristinarlo. + Ci siamo quasi! + Per favore controlla la tua e-mail (anche lo spam) per completare la configurazione della verifica in due passaggi. + Fatto! + La password per la verifica in due passaggi è ora attiva. + Cambia password + Disattiva password + Imposta e-mail di recupero + Cambia e-mail di recupero + Sei sicuro di voler disabilitare la tua password? + Suggerimento password + Per favore crea un suggerimento per la tua password + Le password non corrispondono + Annulla configurazione della verifica in due passaggi + Per favore segui questi step per completare la configurazione della verifica in due passaggi:\n\n1. Controlla la tua e-mail (anche lo spam)\n%1$s\n\n2. Clicca sul link di conferma. + Il suggerimento deve essere diverso dalla password + E-mail non valida + Scusa + Siccome non hai fornito un\'email di recupero quando hai impostato la tua password, non ti resta che ricordarti la password o ripristinare il tuo account. + Abbiamo inviato un codice di ripristino alla e-mail che ci hai fornito:\n\n%1$s + Per favore controlla la tua e-mail e inserisci il codice a 6 cifre che ti abbiamo inviato. + Hai problemi ad accedere alla tua e-mail %1$s? + Se non puoi ripristinare l\'accesso alla tua e-mail, non ti resta che ricordarti la password o ripristinare il tuo account. + RIPRISTINA IL MIO ACCOUNT + Perderai tutte le chat e i messaggi, insieme ai media e ai file condivisi, se procederai a ripristinare il tuo account. + Attenzione + Questa azione non può essere annullata.\n\n Se ripristini il tuo account, tutti i tuoi messaggi e chat saranno eliminati. + Ripristina + Password + Hai attivato la verifica in due passaggi, così il tuo account è protetto con una password aggiuntiva. + Password dimenticata? + Recupero password + Codice + Password disattivata + Hai attivato la verifica in due passaggi.\nAvrai bisogno della password che hai impostato per accedere al tuo account Telegram. + La tua e-mail di recupero %1$s non è ancora attiva e attende la conferma. Privacy e Sicurezza Privacy @@ -486,6 +529,7 @@ Numero di telefono non valido Codice scaduto, effettua di nuovo l\'accesso Troppi tentativi, riprova più tardi + Troppi tentativi, per favore riprova di nuova tra %1$s Codice non valido Nome non valido Cognome non valido @@ -499,7 +543,7 @@ Vuoi inoltrare i messaggi a %1$s? Inviare i messaggi a %1$s? Sei sicuro di volerti disconnettere?\n\nRicorda che puoi usare Telegram su tutti i tuoi device insieme.\n\nRicorda, disconnettersi elimina tutte le Chat Segrete. - Chiudere tutte le altre sessioni? + Terminare tutte le altre sessioni? Eliminare il gruppo e uscire da esso? Eliminare questa chat? Condividere le informazioni del proprio contatto? diff --git a/TMessagesProj/src/main/res/values-ko/strings.xml b/TMessagesProj/src/main/res/values-ko/strings.xml index c03fdfe2d..e4c80afb8 100644 --- a/TMessagesProj/src/main/res/values-ko/strings.xml +++ b/TMessagesProj/src/main/res/values-ko/strings.xml @@ -85,6 +85,10 @@ 입력 중... 님이 입력 중... 님이 입력 중... + %1$s님이 녹음 중... + %1$s님이 사진 보내는 중... + %1$s님이 동영상 보내는 중... + %1$s님이 파일 보내는 중... 텔레그램에 관해\n궁금한 사항이 있나요? 사진 촬영 앨범 @@ -117,6 +121,7 @@ 지원하지 않는 형식입니다 자동삭제 타이머 설정 서비스 알림 + 링크 정보를 가져오는 중... %1$s님이 자동삭제를 %2$s 후로 설정했습니다 자동삭제를 %1$s 후로 설정했습니다 @@ -150,7 +155,7 @@ %1$s님이 %2$s 그룹에서 추방했습니다 %1$s님이 %2$s 그룹을 떠났습니다 %1$s님이 텔레그램에 가입했습니다! - %1$s님,\n%2$s에 새 기기에서 회원님의 계정에 로그인하였습니다.\n\n기기: %3$s\n위치: %4$s\n\n본인의 접속이 아니라면 \'설정\'으로 가서 \'다른 모든 세션 종료\'를 실행하세요.\n\n감사합니다.\n텔레그램 팀 드림 + %1$s님,\n%2$s에 새 기기에서 회원님의 계정 로그인이 감지되었습니다. \n\n기기: %3$s\n위치: %4$s\n\n본인의 접속이 아니라면 \'설정\' 창에서 \'모든 세션 종료\' 기능을 실행하세요.\n\n만약 강제접속 의심이 되신다면 2단계 인증을 설정 - 개인정보 및 보안에서 설정할 수 있습니다.\n\n감사합니다.\n텔레그램 팀 %1$s님이 프로필 사진을 변경했습니다 답장 %1$s 그룹에 답장하기 @@ -245,7 +250,7 @@ 알림음 없음 기본값 지원 - Only if silent + 음소거일 중에만 채팅방 배경화면 메시지 엔터키로 메시지 전송 @@ -305,14 +310,26 @@ 비활성화됨 채팅중 소리 설정 + 기본값 + + 활성화된 세션 + 현재 세션 + 활성화된 세션이 없음 + 동일한 휴대번호로 다른 휴대기기,태블릿과 데스크탑에서 텔레그램 로그인이 가능합니다. 모든 데이터는 즉시 동기화 됩니다. + 활성화된 세션 + 다른 기기 세션 관리 + 탭하여 세션 종료 + 해당 세션을 종료하시겠습니까? + 비공식앱 - 잠금번호 + 잠금코드 잠금 잠금번호 변경 잠금코드를 설정하셨을 경우, 대화방에 잠금 아이콘이 표시됩니다. 해당 아이콘을 클릭하여 텔레그램 잠금 설정을 할 수 있습니다.\n\n주의: 잠금코드를 잊어버렸을 경우 앱 삭제후 재설치를 해주셔야합니다. 이 경우 비밀대화 내용은 삭제가 됩니다. 대화방에 잠금아이콘이 표시가 됩니다. 해당 아이콘을 클릭하여 새로운 잠금코드를 설정하여 텔레그램을 잠글수 있습니다. 핀코드 잠금번호 현재 잠금코드 입력 + 잠금코드 입력 새로운 잠금코드 입력 잠금코드를 입력해주세요 잠금코드 재입력 @@ -372,29 +389,55 @@ 검색기록을 지우시겠습니까? 지우기 - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + 2단계 인증 + 개별 비밀번호 설정 + 새로운 기기에 로그인시 수신되는 SMS와는 별도로 개별 비밀번호를 설정 할 수 있습니다. + 비밀번호 + 비밀번호를 입력해주세요 + 비밀번호 입력 + 새로운 비밀번호 입력 + 비밀번호 재입력 + 복구 이메일 + 이메일 + 올바른 이메일을 입력해주세요. 비밀번호 분실시 유일하게 복구가 가능한 수단입니다. + 건너뛱 + 경고 + 비밀번호 분실시\n\n텔레그램에 대한 모든 접속 권한을 상실하시게 됩니다.\n비밀번호 분실시 복구는 불가능 합니다. + 거의 마무리 되었습니다! + 2단계 인증을 완료하시려면 이메일(스팸 폴더도 확인)을 확인해주세요. + 성공! + 2단계 인증 비밀번호가 활성화 되었습니다. + 비밀번호 변경 + 비밀번호 끄기 + 복구 이메일 설정 + 복구 이메일 변경 + 비밀번호를 정말로 삭제하시겠습니까? + 비밀번호 힌트 + 비밀번호 힌트를 생성해주세요 + 비밀번호가 정확하지 않습니다. + 2단계 인증 설정 끝내기 + 2단계 인증 설정을 완료하시려면 아래의 절차대로 진행해주세요:\n\n1.이메일 확인(스팸 폴더 확인)\n%1$s\n\n2.인증 링크 클릭 + 힌트는 비밀번호와 다르게 설정해주세요. + 올바르지 않은 이메일 + 죄송합니다. + 비밀번호 복구 이메일을 설정하지 않았기때문에, 비밀번호를 기억해내시거나 계정 초기화를 진행해주셔야합니다. + 다음 복구 이메일 주소로 복구 코드를 전송하였습니다:\n\n%1$s + 이메일을 확인하여 수신받은 6자리 코드를 입력해주세요. + 이메일 %1$s 접근에 문제가 있으신가요? + 이메일 접근을 하실 수 없을 경우, 비밀번호를 기억해내시거나 계정 초기화를 진행해주셔야 합니다. + 계정 초기화 + 계정 초기화 진행시 모든 대화,메시지 및 공유받은 미디어와 파일이 삭제가 됩니다. + 경고 + 진행하실 경우 취소가 불가능합니다.\n\n계정 초기화 진행시 모든 대화 및 메시지가 삭제됩니다. + 초기화 + 비밀번호 + 2단계 인증이 활성화되어 회원님 계정이 개별 비밀번호로 보안됩니다. + 비밀번호를 잊어버리셨나요? + 비밀번호 복구 + 코드 + 비밀번호 비활성화 + 2단계 인증을 활성화 하였습니다.\n설정된 개별 비밀번호를 사용하여 텔레그램 계정에 로그인 할 수 있습니다. + 복구 이메일 %1$s 이 아직 활성화 되지 않았으며 미승인 상태입니다. 개인정보 및 보안 개인정보 @@ -486,6 +529,7 @@ 올바른 전화번호를 입력해 주세요 코드가 만료되었습니다. 다시 로그인하세요 너무 많이 시도하셨습니다. 나중에 다시 시도하세요 + 너무 많이 시도하셨습니다. %1$s 초 후에 다시 시도하세요. 올바른 코드를 입력해 주세요 올바른 이름을 입력해 주세요 올바른 성을 입력해 주세요 diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 2a05283ae..d652346b1 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -85,6 +85,10 @@ aan het typen is aan het typen zijn aan het typen + %1$s neemt geluid op + %1$s verstuurt een foto + %1$s verstuurt een video + %1$s verstuurt een bestand Heb je een vraag\nover Telegram? Foto maken Galerij @@ -117,6 +121,7 @@ Bestandstype niet ondersteund Zelfvernietigingstimer instellen Servicemeldingen + Link-preview ophalen... %1$s heeft de zelfvernietigingstimer ingesteld op %2$s Je hebt de zelfvernietigingstimer ingesteld op %1$s @@ -150,7 +155,7 @@ %1$s heeft je verwijderd uit de groep %2$s %1$s heeft de groep %2$s verlaten %1$s heeft nu Telegram! - %1$s,\nEr is op je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je alle sessies beëindigen via Instellingen - Privacy en veiligheid - Beëindig alle andere sessies.\n\nBedankt,\nHet Telegram-team + %1$s,\nEr is op je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je die sessie beëindigen via Instellingen - Privacy en veiligheid - Sessies.\n\nAls je dat denkt dat iemand anders zonder jouw toestemming is ingelogd kun je twee-staps-verificatie activeren via instellingen - privacy en veiligheid .\n\nBedankt,\nHet Telegram-team %1$s heeft zijn/haar profielfoto gewijzigd Antwoord Antwoord op %1$s @@ -305,14 +310,26 @@ Uitgeschakeld Uit Chatgeluiden + Standaard + + Actieve sessies + Huidige sessie + Geen andere actieve sessies + Je kunt in Telegram inloggen vanaf andere apparaten (mobiel,tablet,desktop) met hetzelfde telefoonnummer. Al je data zal direct worden gesynchroniseerd. + Actieve sessies + Beheer je sessies van andere apparaten. + Tik op een sessie om deze te beëindigen. + Deze sessie beëindigen? + onofficiële app - Toegangscode + Toegangscode-vergrendeling Toegangscode wijzigen Als je een toegangscode instelt verschijnt er een slotje op de chatspagina. Tik erop om Telegram te vergrendelen of te ontgrendelen.\n\nLet op: vergeet je de toegangscode dan zul je de app moeten verwijderen en herinstalleren. Alle geheime chats gaan daarbij verloren. Je zult nu een slotje op de chatspagina zien. Tik erop om Telegram te vergrendelen met je nieuwe toegangscode. PIN Wachtwoord Huidige toegangscode invoeren + Toegangscode invoeren Nieuwe toegangscode invoeren Toegangscode invoeren Toegangscode opnieuw invoeren @@ -372,29 +389,55 @@ Zoekgeschiedenis wissen? Wissen - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Twee-staps-verificatie + Extra wachtwoord instellen + Naast de code die je per SMS ontvangt kun je een extra wachtwoord instellen voor als je inlogt op een nieuw apparaat. + Je wachtwoord + Wachtwoord invoeren + Wachtwoord invoeren + Nieuw wachtwoord invoeren + Wachtwoord opnieuw invoeren + Herstel-e-mailadres + Je e-mailadres + Voeg je geldige e-mailadres toe. Het is de enige manier om je wachtwoord te herstellen. + Overslaan + Waarschuwing + Let op:\n\nAls je je wachtwoord vergeet verlies je toegang tot je Telegram-account. Er is geen optie om dit te herstellen. + Bijna klaar! + Controleer je e-mail en klik op de bevestigingslink om de twee-staps-verificatie in te schakelen. Kijk voor de zekerheid ook in de ongewenste post. + Gelukt! + Je wachtwoord voor twee-staps-verificatie is nu actief. + Wachtwoord wijzigen + Wachtwoord uitschakelen + Herstel-e-mailadres instellen + Herstel-e-mailadres wijzigen + Weet je zeker dat je je wachtwoord wilt uitschakelen? + Wachtwoordhint + Stel een hint voor je wachtwoord in + Wachtwoorden komen niet overeen + Twee-staps-verificatie annuleren + Volg deze stappen om twee-staps-verificatie in te schakelen:\n\n1.Controleer je e-mail (kijk voor de zekerheid ook in de ongewenste post)\n%1$s\n\n2.n klik op de bevestigingslink. + De hint moet anders zijn dan je wachtwoord + Ongeldig e-mailadres + Sorry + Omdat je geen herstel-e-mailadres hebt opgegeven voor je wachtwoord zul je bij verlies van je wachtwoord je account moeten resetten. + We hebben een herstelcode naar je opgegeven e-mailadres gestuurd:\n\n%1$s + Controleer je e-mail en geef de 6-cijferige code in die we je hebben gestuurd. + Kun je je e-mail niet benaderen %1$s? + Bij verlies van je wachtwoord zul je je account moeten resetten. + ACCOUNT RESETTEN + Al je chats, berichten en alle andere data gaan verloren als je verder gaat met de account-reset. + Waarschuwing + Deze actie kan niet worden hersteld.\n\nAl je chats, berichten en data gaan verloren als je je account reset. + Resetten + Wachtwoord + Twee-staps-verificatie ingeschakeld. Je account is met een extra wachtwoord beveiligd. + Wachtwoord vergeten? + Wachtwoordherstel + Code + Wachtwoord uitgeschakeld + Je hebt twee-staps-verificatie ingeschakeld.\nAls je inlogt op je Telegram-account heb je het ingestelde wachtwoord nodig. + Je herstel-e-mailadres %1$s is nog niet actief en in afwachting van bevestiging. Privacy en veiligheid Privacy @@ -486,12 +529,13 @@ Ongeldig telefoonnummer Code verlopen. Log opnieuw in. Te veel pogingen. Probeer het later opnieuw. + Te veel pogingen, probeer het over %1$s opnieuw Ongeldige code Ongeldige voornaam Ongeldige achternaam Bezig met laden Je hebt geen mediaspeler. Installeer een mediaspeler om door te gaan. - Mail ons op sms@stel.com en vertel ons over je probleem. + E-mail ons op sms@stel.com en vertel ons over je probleem. Je hebt geen apps die bestandstype \'%1$s\' kunnen verwerken, gelieve een compatibele app te installeren Deze gebruiker heeft nog geen Telegram. Wil je een uitnodiging sturen? Weet je het zeker? diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index b75938aa3..b0d1b594a 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -85,6 +85,10 @@ escrevendo... está escrevendo... estão escrevendo... + %1$s está gravando uma mensagem... + %1$s está enviando uma foto... + %1$s está enviando um vídeo... + %1$s está enviando um arquivo... Tem alguma dúvida\nsobre o Telegram? Tirar foto Galeria @@ -117,6 +121,7 @@ Anexo não suportado Definir timer de autodestruição Notificações de serviço + Obtendo informações... %1$s estabeleceu o tempo de autodestruição para %2$s Você estabeleceu o tempo de autodestruição para %1$s @@ -150,7 +155,7 @@ %1$s removeu você do grupo %2$s %1$s saiu do grupo %2$s %1$s entrou para o Telegram! - %1$s,\nDetectamos um acesso à sua conta de um novo dispositivo em %2$s\n\nDispositivo: %3$s\nLocalização: %4$s\n\nCaso não tenha sido você, vá em Configurações – Privacidade e Segurança – Terminar todas as outras sessões.\n\nObrigado,\nEquipe Telegram + %1$s,\nNós detectamos que alguém acessou a sua conta a partir de um novo aparelho em %2$s\n\nAparelho: %3$s\nLocalização: %4$s\n\nSe não foi você, você pode ir em Configurações - Provacidade e Segurança - Sessões, e terminar aquela sessão.\n\nSe você acha que alguém acessou a sua conta contra a sua vontade, você pode habilitar a verificação em duas etapas nas configurações de Privacidade e Segurança.\n\nAtenciosamente,\nEquipe Telegram %1$s atualizou a foto do perfil Responder Responder para %1$s @@ -245,7 +250,7 @@ Sem som Padrão Suporte - Only if silent + Somente no silencioso Papel de Parede Mensagens Enviar usando \'Enter\' @@ -305,14 +310,26 @@ Desativado Desativado Sons no Chat + Padrão + + Sessões Ativas + Sessão atual + Nenhuma outra sessão ativa + Você pode entrar no Telegram a partir de outro celular, tablet ou computador usando o mesmo número de telefone. Todos os seus dados serão sincronizados instantaneamente. + Sessões Ativas + Controle suas sessões em outros aparelho. + Toque em uma sessão para terminá-la. + Encerrar essa sessão? + aplicativo não oficial - Senha + Senha de Bloqueio Alterar Senha Quando você define uma senha adicional, um ícone de cadeado aparece na página de chats. Clique para bloquear e desbloquear o app.\n\nNota: se você esquecer a sua senha, terá de excluir e reinstalar o app. Todos os chats secretos serão perdidos. Você verá o ícone do cadeado na página de chats. Clique para bloquear seu app do Telegram com a sua nova senha. PIN Senha Insira sua senha atual + Insira uma senha Insira sua nova senha Insira sua senha Re-insira sua nova senha @@ -372,29 +389,55 @@ Limpar histórico de busca? Limpar - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Verificação em duas etapas + Configurar senha adicional + Você pode configurar uma senha que será requisitada quando você entrar em um novo aparelho, além do código que você receberá por SMS. + Sua senha + Por favor, digite a sua senha + Insira uma senha + Por favor, digite a sua nova senha + Por favor, digite sua senha novamente + E-mail de recuperação + Seu e-mail + Por favor, adicione um e-mail válido. Essa é a única forma de recuperar uma senha esquecida. + Pular + Atenção + É sério!\n\nSe você esquecer a sua senha, você perderá o acesso a sua conta do Telegram. Não há nenhuma forma de recuperá-la. + Quase lá! + Por favor, verifique o seu e-mail (não esqueça da pasta spam) para completar a configuração da verificação em duas etapas. + Pronto! + A sua senha para a verificação em duas etapas foi ativada. + Alterar senha + Desabilitar senha + Configurar e-mail de recuperação + Alterar e-mail de recuperação. + Você tem certeza que quer desabilitar a sua senha? + Dica da senha + Por favor, crie uma dica para a sua senha + As senhas não são iguais + Cancelar a configuração da verificação em duas etapas + Por favor, siga os seguintes passos para completar a configuração da autenticação em duas etapas:\n\n1. Verifique seu e-mail ( não esqueça da pasta spam)\n%1$s\n\n2. Clique no link de validação. + A dica deve ser diferente da sua senha + E-mail inválido + Desculpe + Como você não indicou um e-mail de recuperação quando configurou a sua senha, as únicas opções restantes são lembrar a senha ou apagar a sua conta. + O código de recuperação foi enviado para o e-mail fornecido: \n\n%1$s + Por favor, verifique o seu e-mail e digite aqui o código de 6 dígitos recebido. + Está tendo problemas para acessar seu e-mail %1$s? + Se você não puder acessar o seu e-mail, as suas únicas opções são são lembrar a senha ou apagar a sua conta. + APAGAR MINHA CONTA + Se você prosseguir e apagar a sua conta, você perderá todos os seus chats e mensagens, assim como todas as suas mídias e arquivos compartilhados. + Aviso + Essa ação não pode ser revertida ou desfeita.\n\nSe você apagar a sua conta, todas as suas mensagens e chats serão apagados. + Apagar + Senha + Você habilitou a verificação em duas etapas, a sua conta está protegida com uma senha adicional. + Esqueceu a senha? + Recuperação de senha + Código + Senha desativada + Você habilitou a verificação em duas etapas. Toda vez que você entrar na sua conta em um novo aparelho, será preciso digitar a senha que você configurar aqui. + O seu e-mail de recuperação %1$s ainda não está ativo e aguarda confirmação. Privacidade e Segurança Privacidade @@ -486,6 +529,7 @@ Número de telefone inválido O código expirou. Por favor, identifique-se novamente. Muitas tentativas. Por favor, tente novamente mais tarde. + Muitas tentativas, por favor tente novamente em %1$s Código inválido Nome inválido Sobrenome inválido diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 35568de2d..dd6aca2f4 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -85,6 +85,10 @@ escrevendo... está escrevendo... estão escrevendo... + %1$s está gravando uma mensagem... + %1$s está enviando uma foto... + %1$s está enviando um vídeo... + %1$s está enviando um arquivo... Tem alguma dúvida\nsobre o Telegram? Tirar foto Galeria @@ -117,6 +121,7 @@ Anexo não suportado Definir timer de autodestruição Notificações de serviço + Obtendo informações... %1$s estabeleceu o tempo de autodestruição para %2$s Você estabeleceu o tempo de autodestruição para %1$s @@ -150,7 +155,7 @@ %1$s removeu você do grupo %2$s %1$s saiu do grupo %2$s %1$s entrou para o Telegram! - %1$s,\nDetectamos um acesso à sua conta de um novo dispositivo em %2$s\n\nDispositivo: %3$s\nLocalização: %4$s\n\nCaso não tenha sido você, vá em Configurações – Privacidade e Segurança – Terminar todas as outras sessões.\n\nObrigado,\nEquipe Telegram + %1$s,\nNós detectamos que alguém acessou a sua conta a partir de um novo aparelho em %2$s\n\nAparelho: %3$s\nLocalização: %4$s\n\nSe não foi você, você pode ir em Configurações - Provacidade e Segurança - Sessões, e terminar aquela sessão.\n\nSe você acha que alguém acessou a sua conta contra a sua vontade, você pode habilitar a verificação em duas etapas nas configurações de Privacidade e Segurança.\n\nAtenciosamente,\nEquipe Telegram %1$s atualizou a foto do perfil Responder Responder para %1$s @@ -245,7 +250,7 @@ Sem som Padrão Suporte - Only if silent + Somente no silencioso Papel de Parede Mensagens Enviar usando \'Enter\' @@ -305,14 +310,26 @@ Desativado Desativado Sons no Chat + Padrão + + Sessões Ativas + Sessão atual + Nenhuma outra sessão ativa + Você pode entrar no Telegram a partir de outro celular, tablet ou computador usando o mesmo número de telefone. Todos os seus dados serão sincronizados instantaneamente. + Sessões Ativas + Controle suas sessões em outros aparelho. + Toque em uma sessão para terminá-la. + Encerrar essa sessão? + aplicativo não oficial - Senha + Senha de Bloqueio Alterar Senha Quando você define uma senha adicional, um ícone de cadeado aparece na página de chats. Clique para bloquear e desbloquear o app.\n\nNota: se você esquecer a sua senha, terá de excluir e reinstalar o app. Todos os chats secretos serão perdidos. Você verá o ícone do cadeado na página de chats. Clique para bloquear seu app do Telegram com a sua nova senha. PIN Senha Insira sua senha atual + Insira uma senha Insira sua nova senha Insira sua senha Re-insira sua nova senha @@ -372,29 +389,55 @@ Limpar histórico de busca? Limpar - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. - Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Verificação em duas etapas + Configurar senha adicional + Você pode configurar uma senha que será requisitada quando você entrar em um novo aparelho, além do código que você receberá por SMS. + Sua senha + Por favor, digite a sua senha + Insira uma senha + Por favor, digite a sua nova senha + Por favor, digite sua senha novamente + E-mail de recuperação + Seu e-mail + Por favor, adicione um e-mail válido. Essa é a única forma de recuperar uma senha esquecida. + Pular + Atenção + É sério!\n\nSe você esquecer a sua senha, você perderá o acesso a sua conta do Telegram. Não há nenhuma forma de recuperá-la. + Quase lá! + Por favor, verifique o seu e-mail (não esqueça da pasta spam) para completar a configuração da verificação em duas etapas. + Pronto! + A sua senha para a verificação em duas etapas foi ativada. + Alterar senha + Desabilitar senha + Configurar e-mail de recuperação + Alterar e-mail de recuperação. + Você tem certeza que quer desabilitar a sua senha? + Dica da senha + Por favor, crie uma dica para a sua senha + As senhas não são iguais + Cancelar a configuração da verificação em duas etapas + Por favor, siga os seguintes passos para completar a configuração da autenticação em duas etapas:\n\n1. Verifique seu e-mail ( não esqueça da pasta spam)\n%1$s\n\n2. Clique no link de validação. + A dica deve ser diferente da sua senha + E-mail inválido + Desculpe + Como você não indicou um e-mail de recuperação quando configurou a sua senha, as únicas opções restantes são lembrar a senha ou apagar a sua conta. + O código de recuperação foi enviado para o e-mail fornecido: \n\n%1$s + Por favor, verifique o seu e-mail e digite aqui o código de 6 dígitos recebido. + Está tendo problemas para acessar seu e-mail %1$s? + Se você não puder acessar o seu e-mail, as suas únicas opções são são lembrar a senha ou apagar a sua conta. + APAGAR MINHA CONTA + Se você prosseguir e apagar a sua conta, você perderá todos os seus chats e mensagens, assim como todas as suas mídias e arquivos compartilhados. + Aviso + Essa ação não pode ser revertida ou desfeita.\n\nSe você apagar a sua conta, todas as suas mensagens e chats serão apagados. + Apagar + Senha + Você habilitou a verificação em duas etapas, a sua conta está protegida com uma senha adicional. + Esqueceu a senha? + Recuperação de senha + Código + Senha desativada + Você habilitou a verificação em duas etapas. Toda vez que você entrar na sua conta em um novo aparelho, será preciso digitar a senha que você configurar aqui. + O seu e-mail de recuperação %1$s ainda não está ativo e aguarda confirmação. Privacidade e Segurança Privacidade @@ -486,6 +529,7 @@ Número de telefone inválido O código expirou. Por favor, identifique-se novamente. Muitas tentativas. Por favor, tente novamente mais tarde. + Muitas tentativas, por favor tente novamente em %1$s Código inválido Nome inválido Sobrenome inválido diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index d5e073006..847bff777 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -85,6 +85,10 @@ typing... is typing... are typing... + %1$s is recording audio... + %1$s is sending photo... + %1$s is sending video... + %1$s is sending file... Got a question\nabout Telegram? Take photo Gallery @@ -117,6 +121,7 @@ Unsupported attachment Set self-destruct timer Service notifications + Getting Link Info... %1$s set the self-destruct timer to %2$s You set the self-destruct timer to %1$s @@ -150,7 +155,7 @@ %1$s removed you from the group %2$s %1$s has left the group %2$s %1$s joined Telegram! - %1$s,\nWe detected a login into your account from a new device on %2$s\n\nDevice: %3$s\nLocation: %4$s\n\nIf this wasn\'t you, you can go to Settings - Privacy and Security - Terminate all other sessions.\n\nSincerely,\nThe Telegram Team + %1$s,\nWe detected a login into your account from a new device on %2$s\n\nDevice: %3$s\nLocation: %4$s\n\nIf this wasn\'t you, you can go to Settings - Privacy and Security - Sessions and terminate that session.\n\nIf you think that somebody logged in to your account against your will, you can enable two-step verification in Privacy and Security settings.\n\nSincerely,\nThe Telegram Team %1$s updated profile photo Reply Reply to %1$s @@ -305,14 +310,26 @@ Disabled Off In-Chat Sounds + Default + + Active Sessions + Current session + No other active sessions + You can log in to Telegram from other mobile, tablet and desktop devices, using the same phone number. All your data will be instantly synchronized. + Active Sessions + Control your sessions on other devices. + Tap on a session to terminate. + Terminate this session? + unofficial app - Passcode + Passcode Lock Change Passcode When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock and unlock your Telegram app.\n\nNote: if you forget the passcode, you\'ll need to delete and reinstall the app. All secret chats will be lost. You will now see a lock icon on the chats page. Tap it to lock your Telegram app with your new passcode. PIN Password Enter your current passcode + Enter a passcode Enter your new passcode Enter your passcode Re-enter your new passcode @@ -372,29 +389,55 @@ Clear search history? Clear - Password - Change password - Old password - Enter old password - New password - Enter new password - Verify new password - Enter your password - Hint - Enter hint - Important: you will lose all your chats, messages and media in the case of a forgotten password. + Two-Step Verification + Set Additional Password + You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS. + Your Password + Please enter your password + Enter a password + Please enter your new password + Please re-enter your password + Recovery E-Mail + Your E-Mail + Please add your valid e-mail. It is the only way to recover a forgotten password. + Skip + Warning + No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it. + Almost there! + Please check your e-mail (don\'t forget the spam folder) to complete Two-Step Verification setup. + Success! + Your password for Two-Step Verification is now active. + Change Password + Turn Password Off + Set Recovery E-Mail + Change Recovery E-Mail + Are you sure you want to disable your password? + Password Hint + Please create a hint for your password Passwords do not match - Incorrect old password - Incorrect password - Incorrect new password - Hint shouldn\'t contain password - Enter password - Important: you will lose all your chats, messages and media. - Delete account - Delete my account - Hint: %1$s - Are you sure you want to delete your account? - We deeply clarify you that you will lose all your chats, messages and media. Are you really sure? + Abort two-step verification setup + Please follow these steps to complete Two-Step Verification Setup:\n\n1. Check your e-mail (don\'t forget the spam folder)\n%1$s\n\n2. Click on the validation link. + Hint must be different from your password + Invalid e-mail + Sorry + Since you haven\'t provided a recovery e-mail when setting up your password, your remaining options are either to remember your password or to reset your account. + We have sent a recovery code to the e-mail you provided:\n\n%1$s + Please check your e-mail and enter the 6-digit code we have sent here. + Having trouble accessing your e-mail %1$s? + If you can\'t restore access to your e-mail, your remaining options are either to remember your password or to reset your account. + RESET MY ACCOUNT + You will lose all your chats and messages, along with any media and files you shared, if you proceed with resetting your account. + Warning + This action can not be undone.\n\nIf you reset your account, all your messages and chats will be deleted. + Reset + Password + You have enabled Two-Step Verification, so your account is protected with an additional password. + Forgot password? + Password Recovery + Code + Password deactivated + You have enabled Two-Step verification.\nYou\'ll need the password you set up here to log in to your Telegram account. + Your recovery e-mail %1$s is not yet active and pending confirmation. Privacy and Security Privacy @@ -486,6 +529,7 @@ Invalid phone number Code expired, please login again Too many attempts, please try again later + Too many attempts, please try again in %1$s Invalid code Invalid first name Invalid last name