update to 10.12.0 (4710)

This commit is contained in:
dkaraush 2024-05-02 20:38:57 +04:00
parent a906f12aae
commit d494ea8cb5
294 changed files with 20468 additions and 4408 deletions

View file

@ -48,6 +48,7 @@ dependencies {
implementation 'com.google.guava:guava:31.1-android'
implementation 'com.google.android.gms:play-services-mlkit-subject-segmentation:16.0.0-beta1'
implementation 'com.google.android.gms:play-services-mlkit-image-labeling:16.0.8'
constraints {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")

View file

@ -182,9 +182,34 @@ JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_getFramesCount(J
delete info;
return 0;
}
long frameCount = info->animation->totalFrame();
long framesCount = info->animation->totalFrame();
delete info;
return (jlong) frameCount;
return (jlong) framesCount;
}
JNIEXPORT jdouble Java_org_telegram_ui_Components_RLottieDrawable_getDuration(JNIEnv *env, jclass clazz, jstring src, jstring json) {
auto info = new LottieInfo();
char const *srcString = env->GetStringUTFChars(src, nullptr);
info->path = srcString;
if (json != nullptr) {
char const *jsonString = env->GetStringUTFChars(json, nullptr);
if (jsonString) {
info->animation = rlottie::Animation::loadFromData(jsonString, info->path, nullptr, FitzModifier::None);
env->ReleaseStringUTFChars(json, jsonString);
}
} else {
info->animation = rlottie::Animation::loadFromFile(info->path, nullptr, FitzModifier::None);
}
if (srcString) {
env->ReleaseStringUTFChars(src, srcString);
}
if (info->animation == nullptr) {
delete info;
return 0;
}
double duration = info->animation->duration();
delete info;
return (jdouble) duration;
}
JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_createWithJson(JNIEnv *env, jclass clazz, jstring json, jstring name, jintArray data, jintArray colorReplacement) {

View file

@ -70,8 +70,9 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_video_WebmEncoder_createEnco
ctx->codec_ctx->time_base = (AVRational){ 1, fps };
ctx->codec_ctx->framerate = (AVRational){ fps, 1 };
ctx->codec_ctx->bit_rate = bitrate;
ctx->codec_ctx->gop_size = 10;
ctx->codec_ctx->max_b_frames = 1;
ctx->codec_ctx->rc_min_rate = bitrate / 8;
ctx->codec_ctx->rc_max_rate = bitrate;
// ctx->codec_ctx->rc_buffer_size = 2 * bitrate;
if (ctx->fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) {
ctx->codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
@ -185,6 +186,9 @@ JNIEXPORT jboolean JNICALL Java_org_telegram_messenger_video_WebmEncoder_writeFr
pkt.stream_index = ctx->video_stream->index;
ret = av_interleaved_write_frame(ctx->fmt_ctx, &pkt);
if (ret < 0) {
LOGE("vp9: failed to av_interleaved_write_frame %d", ret);
}
av_packet_unref(&pkt);
}
@ -200,13 +204,16 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_video_WebmEncoder_stop(
return;
}
avcodec_send_frame(ctx->codec_ctx, NULL);
int ret;
ret = avcodec_send_frame(ctx->codec_ctx, NULL);
if (ret < 0) {
LOGE("vp9: failed to avcodec_send_frame %d", ret);
}
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
int ret;
while (1) {
ret = avcodec_receive_packet(ctx->codec_ctx, &pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
@ -220,10 +227,16 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_video_WebmEncoder_stop(
pkt.stream_index = ctx->video_stream->index;
ret = av_interleaved_write_frame(ctx->fmt_ctx, &pkt);
if (ret < 0) {
LOGE("vp9: failed to av_interleaved_write_frame %d", ret);
}
av_packet_unref(&pkt);
}
av_write_trailer(ctx->fmt_ctx);
ret = av_write_trailer(ctx->fmt_ctx);
if (ret < 0) {
LOGE("vp9: failed to av_write_trailer %d", ret);
}
if (ctx->frame) {
av_frame_free(&ctx->frame);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

View file

@ -27,102 +27,82 @@ uniform float time;
uniform mat4 world;
void main() {
vec3 vLightPosition2 = vec3(-400, 40, 400);
vec3 vLightPosition3 = vec3(0, 200, 400);
vec3 vLightPosition4 = vec3(0, 0, 100);
vec3 vLightPositionNormal = vec3(100, -200, 400);
vec3 vNormalW = normalize(vec3(world * vec4(vNormal, 0.0)));
vec3 vTextureNormal = normalize(texture2D(u_NormalMap, vUV + vec2(-f_xOffset, f_xOffset)).xyz * 2.0 - 1.0);
vec3 finalNormal = normalize(vNormalW + vTextureNormal);
vec3 color = texture2D(u_Texture, vUV).xyz;
vec3 viewDirectionW = normalize(cameraPosition - modelViewVertex);
float border = 0.0;
if (modelIndex == 0) {
border = 1.0;
} else if (modelIndex == 2) {
border = texture2D(u_Texture, vUV).a;
}
float modelDiffuse = 0.1;
if (!night && modelIndex != 1) {
modelDiffuse = 0.01;
}
float diffuse = max(dot(vNormalW, viewDirectionW), (1.0 - modelDiffuse));
vec2 uv = vUV;
if (modelIndex == 2) {
uv *= 2.0;
uv = fract(uv);
if (vUV.x > .5) {
uv.x = 1.0 - uv.x;
}
}
float mixValue = clamp(distance(uv.xy, vec2(0.0)), 0.0, 1.0);
vec4 gradientColorFinal = vec4(mix(gradientColor1, gradientColor2, mixValue), 1.0);
uv.x = 1.0 - uv.x;
float modelNormalSpec = normalSpec, modelSpec1 = 0.0, modelSpec2 = 0.05;
float darken = 1. - length(modelViewVertex - vec3(30., -75., 50.)) / 200.;
if (border > 0.) {
modelNormalSpec += border;
modelSpec1 += border;
modelSpec2 += border;
}
vec3 angleW = normalize(viewDirectionW + vLightPosition2);
float specComp2 = max(0., dot(finalNormal, angleW));
specComp2 = pow(specComp2, max(1., 128.)) * modelSpec1;
angleW = normalize(viewDirectionW + vLightPosition4);
float specComp3 = max(0., dot(finalNormal, angleW));
specComp3 = pow(specComp3, max(1., 30.)) * modelSpec2;
angleW = normalize(viewDirectionW + vLightPositionNormal);
float normalSpecComp = max(0., dot(finalNormal, angleW));
normalSpecComp = pow(normalSpecComp, max(1., 128.)) * modelNormalSpec;
angleW = normalize(viewDirectionW + vLightPosition2);
float normalSpecComp2 = max(0., dot(finalNormal, angleW));
normalSpecComp2 = pow(normalSpecComp2, max(1., 128.)) * modelNormalSpec;
vec4 normalSpecFinal = vec4(normalSpecColor, 0.0) * normalSpecComp2;
vec4 specFinal = vec4(color, 0.0) * (specComp2 + specComp3);
// float snap = fract((-gl_FragCoord.x / resolution.x + gl_FragCoord.y / resolution.y) / 20.0 + .2 * time) > .9 ? 1. : 0.;
vec4 fragColor = gradientColorFinal + specFinal;
vec4 backgroundColor = texture2D(u_BackgroundTexture, vec2(gradientPosition.x + (gl_FragCoord.x / resolution.x) * gradientPosition.y, gradientPosition.z + (1.0 - (gl_FragCoord.y / resolution.y)) * gradientPosition.w));
vec4 color4 = mix(backgroundColor, fragColor, diffuse);
if (night) {
angleW = normalize(viewDirectionW + vLightPosition2);
float normalSpecComp = max(0., dot(finalNormal, angleW));
normalSpecComp = pow(normalSpecComp, max(1., 128.));
if (normalSpecComp > .2 && modelIndex != 0) {
color4.rgb += vec3(.5) * max(0., vTextureNormal.x) * normalSpecComp;
}
if (modelIndex == 1) {
color4.rgb *= .9;
} else {
color4.rgb += vec3(1.0) * .17;
}
float diagonal = ((uv.x + uv.y) / 2.0 - .15) / .6;
vec3 baseColor;
if (modelIndex == 0) {
baseColor = mix(
vec3(0.95686, 0.47451, 0.93725),
vec3(0.46274, 0.49411, 0.9960),
diagonal
);
} else if (modelIndex == 3) {
baseColor = mix(
vec3(0.95686, 0.47451, 0.93725),
vec3(0.46274, 0.49411, 0.9960),
diagonal
);
baseColor = mix(baseColor, vec3(1.0), .3);
} else if (modelIndex == 1) {
baseColor = mix(
vec3(0.67059, 0.25490, 0.80000),
vec3(0.39608, 0.18824, 0.98039),
diagonal
);
} else {
if (modelIndex == 1) {
if (darken > .5) {
color4.rgb *= vec3(0.78039, 0.77254, 0.95294);
} else {
color4.rgb *= vec3(0.83921, 0.83529, 0.96862);
}
} else {
if (darken > .5) {
color4.rgb *= vec3(.945098, .94117, 1.0);
color4.rgb += vec3(.06) * border;
}
baseColor = mix(
vec3(0.91373, 0.62353, 0.99608),
vec3(0.67451, 0.58824, 1.00000),
clamp((uv.y - .2) / .6, 0.0, 1.0)
);
baseColor = mix(baseColor, vec3(1.0), .1 + .45 * texture2D(u_Texture, vUV).a);
if (night) {
baseColor = mix(baseColor, vec3(.0), .06);
}
}
gl_FragColor = color4 * f_alpha;
vec3 pos = modelViewVertex / 100.0 + .5;
vec3 norm = normalize(vec3(world * vec4(vNormal, 0.0)));
vec3 flecksLightPos = vec3(.5, .5, .5);
vec3 flecksLightDir = normalize(flecksLightPos - pos);
vec3 flecksReflectDir = reflect(-flecksLightDir, norm);
float flecksSpec = pow(max(dot(normalize(vec3(0.0) - pos), flecksReflectDir), 0.0), 8.0);
vec3 flecksNormal = normalize(texture2D(u_NormalMap, uv * 1.3 + vec2(.02, .06) * time).xyz * 2.0 - 1.0);
float flecks = max(flecksNormal.x, flecksNormal.y) * flecksSpec;
norm += flecksSpec * flecksNormal;
norm = normalize(norm);
vec3 lightPos = vec3(-3., -3., 20.);
vec3 lightDir = normalize(lightPos - pos);
float diffuse = max(dot(norm, lightDir), 0.0);
float spec = 0.0;
lightPos = vec3(-3., -3., .5);
spec += 2.0 * pow(max(dot(normalize(vec3(0.0) - pos), reflect(-normalize(lightPos - pos), norm)), 0.0), 2.0);
lightPos = vec3(-3., .5, 30.);
spec += (modelIndex == 1 ? 1.5 : 0.5) * pow(max(dot(normalize(vec3(0.0) - pos), reflect(-normalize(lightPos - pos), norm)), 0.0), 32.0);
// lightPos = vec3(3., .5, .5);
// spec += pow(max(dot(normalize(vec3(0.0) - pos), reflect(-normalize(lightPos - pos), norm)), 0.0), 32.0);
if (modelIndex != 0) {
spec *= .25;
}
vec3 color = baseColor;
color *= .94 + .22 * diffuse;
color = mix(color, vec3(1.0), spec);
// color = mix(color, vec3(1.0), 0.35 * flecks);
gl_FragColor = vec4(color, 1.0);
}

View file

@ -207,7 +207,13 @@ import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
@ -265,9 +271,11 @@ public class AndroidUtilities {
public static final RectF rectTmp = new RectF();
public static final Rect rectTmp2 = new Rect();
public static final int[] pointTmp2 = new int[2];
public static Pattern WEB_URL = null;
public static Pattern BAD_CHARS_PATTERN = null;
public static Pattern LONG_BAD_CHARS_PATTERN = null;
public static Pattern BAD_CHARS_MESSAGE_PATTERN = null;
public static Pattern BAD_CHARS_MESSAGE_LONG_PATTERN = null;
private static Pattern singleTagPatter = null;
@ -276,6 +284,7 @@ public class AndroidUtilities {
try {
final String GOOD_IRI_CHAR = "a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF";
BAD_CHARS_PATTERN = Pattern.compile("[\u2500-\u25ff]");
LONG_BAD_CHARS_PATTERN = Pattern.compile("[\u4e00-\u9fff]");
BAD_CHARS_MESSAGE_LONG_PATTERN = Pattern.compile("[\u0300-\u036f\u2066-\u2067]+");
BAD_CHARS_MESSAGE_PATTERN = Pattern.compile("[\u2066-\u2067]+");
final Pattern IP_ADDRESS = Pattern.compile(
@ -565,9 +574,13 @@ public class AndroidUtilities {
}
public static CharSequence replaceArrows(CharSequence text, boolean link) {
return replaceArrows(text, link, dp(8f / 3f), 0);
}
public static CharSequence replaceArrows(CharSequence text, boolean link, float translateX, float translateY) {
ColoredImageSpan span = new ColoredImageSpan(R.drawable.msg_mini_forumarrow, DynamicDrawableSpan.ALIGN_BOTTOM);
span.setScale(.88f, .88f);
span.translate(-dp(8f / 3f), 0);
span.translate(-translateX, translateY);
span.spaceScaleX = .8f;
if (link) {
span.useLinkPaintColor = link;
@ -581,6 +594,23 @@ public class AndroidUtilities {
rightArrow.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
text = AndroidUtilities.replaceMultipleCharSequence(">", text, rightArrow);
span = new ColoredImageSpan(R.drawable.msg_mini_forumarrow, DynamicDrawableSpan.ALIGN_BOTTOM);
span.setScale(.88f, .88f);
span.translate(translateX, translateY);
span.rotate(180f);
span.spaceScaleX = .8f;
if (link) {
span.useLinkPaintColor = link;
}
// SpannableString leftArrow = new SpannableString("< ");
// leftArrow.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// text = AndroidUtilities.replaceMultipleCharSequence("< ", text, leftArrow);
SpannableString leftArrow = new SpannableString("<");
leftArrow.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
text = AndroidUtilities.replaceMultipleCharSequence("<", text, leftArrow);
return text;
}
@ -938,14 +968,56 @@ public class AndroidUtilities {
return true;
};
@Deprecated // use addLinksSafe
public static boolean addLinks(Spannable text, int mask) {
return addLinks(text, mask, false);
}
@Deprecated // use addLinksSafe
public static boolean addLinks(Spannable text, int mask, boolean internalOnly) {
return addLinks(text, mask, internalOnly, true);
}
public static boolean addLinksSafe(Spannable text, int mask, boolean internalOnly, boolean removeOldReplacements) {
SpannableStringBuilder newText = new SpannableStringBuilder(text);
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Boolean> task = () -> {
try {
return addLinks(newText, mask, internalOnly, removeOldReplacements);
} catch (Exception e) {
FileLog.e(e);
return false;
}
};
boolean success = false;
Future<Boolean> future = null;
try {
future = executor.submit(task);
success = future.get(200, TimeUnit.MILLISECONDS);
} catch (TimeoutException ex) {
if (future != null) {
future.cancel(true);
}
} catch (Exception ex) {
FileLog.e(ex);
} finally {
executor.shutdownNow();
}
if (success && text != null) {
URLSpan[] oldSpans = text.getSpans(0, text.length(), URLSpan.class);
for (int i = 0; i < oldSpans.length; ++i) {
text.removeSpan(oldSpans[i]);
}
URLSpan[] newSpans = newText.getSpans(0, newText.length(), URLSpan.class);
for (int i = 0; i < newSpans.length; ++i) {
text.setSpan(newSpans[i], newText.getSpanStart(newSpans[i]), newText.getSpanEnd(newSpans[i]), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return true;
}
return false;
}
@Deprecated // use addLinksSafe
public static boolean addLinks(Spannable text, int mask, boolean internalOnly, boolean removeOldReplacements) {
if (text == null || containsUnsupportedCharacters(text.toString()) || mask == 0) {
return false;

View file

@ -51,11 +51,7 @@ public class AnimatedFileDrawableStream implements FileLoadOperationStream {
debugCanceledCount++;
if (!debugReportSend && debugCanceledCount > 200) {
debugReportSend = true;
if (BuildVars.DEBUG_PRIVATE_VERSION) {
throw new RuntimeException("infinity stream reading!!!");
} else {
FileLog.e(new RuntimeException("infinity stream reading!!!"));
}
FileLog.e(new RuntimeException("infinity stream reading!!!"));
}
return 0;
}

View file

@ -120,4 +120,9 @@ public class AuthTokensHelper {
preferences.edit().putString("log_out_token_" + count, Utilities.bytesToHex(data.toByteArray())).putInt("count", count + 1).apply();
BackupAgent.requestBackup(ApplicationLoader.applicationContext);
}
public static void clearLogInTokens() {
ApplicationLoader.applicationContext.getSharedPreferences("saved_tokens_login", Context.MODE_PRIVATE).edit().clear().apply();
ApplicationLoader.applicationContext.getSharedPreferences("saved_tokens", Context.MODE_PRIVATE).edit().clear().apply();
}
}

View file

@ -1592,6 +1592,51 @@ public class ChatObject {
return chat != null && (getBannedRight(chat.banned_rights, action) || getBannedRight(chat.default_banned_rights, action));
}
public static boolean canUserDoAdminAction(TLRPC.TL_chatAdminRights admin_rights, int action) {
if (admin_rights != null) {
boolean value;
switch (action) {
case ACTION_PIN:
value = admin_rights.pin_messages;
break;
case ACTION_MANAGE_TOPICS:
value = admin_rights.manage_topics;
break;
case ACTION_CHANGE_INFO:
value = admin_rights.change_info;
break;
case ACTION_INVITE:
value = admin_rights.invite_users;
break;
case ACTION_ADD_ADMINS:
value = admin_rights.add_admins;
break;
case ACTION_POST:
value = admin_rights.post_messages;
break;
case ACTION_EDIT_MESSAGES:
value = admin_rights.edit_messages;
break;
case ACTION_DELETE_MESSAGES:
value = admin_rights.delete_messages;
break;
case ACTION_BLOCK_USERS:
value = admin_rights.ban_users;
break;
case ACTION_MANAGE_CALLS:
value = admin_rights.manage_call;
break;
default:
value = false;
break;
}
if (value) {
return true;
}
}
return false;
}
public static boolean canUserDoAdminAction(TLRPC.Chat chat, int action) {
if (chat == null) {
return false;
@ -1643,6 +1688,43 @@ public class ChatObject {
return false;
}
public static boolean canUserDoAction(TLRPC.Chat chat, TLRPC.ChannelParticipant participant, int action) {
if (chat == null) {
return true;
}
if (participant == null) {
return false;
}
if (canUserDoAdminAction(participant.admin_rights, action)) {
return true;
}
if (getBannedRight(participant.banned_rights, action)) {
return false;
}
if (isBannableAction(action)) {
if (participant.admin_rights != null && !isAdminAction(action)) {
return true;
}
if (chat.default_banned_rights == null && (
chat instanceof TLRPC.TL_chat_layer92 ||
chat instanceof TLRPC.TL_chat_old ||
chat instanceof TLRPC.TL_chat_old2 ||
chat instanceof TLRPC.TL_channel_layer92 ||
chat instanceof TLRPC.TL_channel_layer77 ||
chat instanceof TLRPC.TL_channel_layer72 ||
chat instanceof TLRPC.TL_channel_layer67 ||
chat instanceof TLRPC.TL_channel_layer48 ||
chat instanceof TLRPC.TL_channel_old)) {
return true;
}
if (chat.default_banned_rights == null || getBannedRight(chat.default_banned_rights, action)) {
return false;
}
return true;
}
return false;
}
public static boolean canUserDoAction(TLRPC.Chat chat, int action) {
if (chat == null) {
return true;

View file

@ -233,9 +233,9 @@ class ChatsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media;
if (Build.VERSION.SDK_INT >= 18) {
innerMessage = String.format("\uD83D\uDCCA \u2068%s\u2069", mediaPoll.poll.question);
innerMessage = String.format("\uD83D\uDCCA \u2068%s\u2069", mediaPoll.poll.question.text);
} else {
innerMessage = String.format("\uD83D\uDCCA %s", mediaPoll.poll.question);
innerMessage = String.format("\uD83D\uDCCA %s", mediaPoll.poll.question.text);
}
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
if (Build.VERSION.SDK_INT >= 18) {
@ -297,7 +297,7 @@ class ChatsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
} else {
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media;
messageString = "\uD83D\uDCCA " + mediaPoll.poll.question;
messageString = "\uD83D\uDCCA " + mediaPoll.poll.question.text;
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
messageString = "\uD83C\uDFAE " + message.messageOwner.media.game.title;
} else if (message.type == MessageObject.TYPE_MUSIC) {

View file

@ -1497,6 +1497,13 @@ public class DatabaseMigrationHelper {
version = 152;
}
if (version == 152) {
database.executeFast("ALTER TABLE profile_stories ADD COLUMN pin INTEGER default 0;").stepThis().dispose();
database.executeFast("PRAGMA user_version = 153").stepThis().dispose();
version = 153;
}
return version;
}

View file

@ -45,25 +45,40 @@ public class DocumentObject {
}
}
public static boolean containsPhotoSizeType(ArrayList<TLRPC.PhotoSize> sizes, String type) {
if (type == null)
return false;
for (int a = 0, N = sizes.size(); a < N; a++) {
TLRPC.PhotoSize photoSize = sizes.get(a);
if (type.equalsIgnoreCase(photoSize.type))
return true;
}
return false;
}
public static SvgHelper.SvgDrawable getSvgThumb(ArrayList<TLRPC.PhotoSize> sizes, int colorKey, float alpha) {
int w = 0;
int h = 0;
return getSvgThumb(sizes, colorKey, alpha, false);
}
public static SvgHelper.SvgDrawable getSvgThumb(ArrayList<TLRPC.PhotoSize> sizes, int colorKey, float alpha, boolean usePhotoSize) {
int w = 512;
int h = 512;
TLRPC.TL_photoPathSize photoPathSize = null;
for (int a = 0, N = sizes.size(); a < N; a++) {
TLRPC.PhotoSize photoSize = sizes.get(a);
if (photoSize instanceof TLRPC.TL_photoPathSize) {
photoPathSize = (TLRPC.TL_photoPathSize) photoSize;
} else if (photoSize instanceof TLRPC.TL_photoSize) {
} else if (photoSize instanceof TLRPC.TL_photoSize && usePhotoSize) {
w = photoSize.w;
h = photoSize.h;
}
if (photoPathSize != null && w != 0 && h != 0) {
SvgHelper.SvgDrawable pathThumb = SvgHelper.getDrawableByPath(photoPathSize.svgPath, w, h);
if (pathThumb != null) {
pathThumb.setupGradient(colorKey, alpha, false);
}
return pathThumb;
}
if (photoPathSize != null && w != 0 && h != 0) {
SvgHelper.SvgDrawable pathThumb = SvgHelper.getDrawableByPath(photoPathSize.svgPath, w, h);
if (pathThumb != null) {
pathThumb.setupGradient(colorKey, alpha, false);
}
return pathThumb;
}
return null;
}

View file

@ -38,6 +38,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Objects;
public class Emoji {
@ -796,6 +797,14 @@ public class Emoji {
}
super.updateDrawState(ds);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
EmojiSpan emojiSpan = (EmojiSpan) o;
return Float.compare(scale, emojiSpan.scale) == 0 && size == emojiSpan.size && Objects.equals(emoji, emojiSpan.emoji);
}
}
public static void addRecentEmoji(String code) {

View file

@ -867,6 +867,9 @@ public class FileLoadOperation {
startDownloadRequest(-1);
nextPartWasPreloaded = false;
}
if (notLoadedBytesRanges != null) {
notifyStreamListeners();
}
});
} else if (alreadyStarted) {
Utilities.stageQueue.postRunnable(() -> {

View file

@ -91,7 +91,7 @@ public class FileRefController extends BaseController {
} else if (parentObject instanceof MessageObject) {
MessageObject messageObject = (MessageObject) parentObject;
long channelId = messageObject.getChannelId();
return "message" + messageObject.getRealId() + "_" + channelId + "_" + messageObject.scheduled;
return "message" + messageObject.getRealId() + "_" + channelId + "_" + messageObject.scheduled + "_" + messageObject.getQuickReplyId();
} else if (parentObject instanceof TLRPC.Message) {
TLRPC.Message message = (TLRPC.Message) parentObject;
long channelId = message.peer_id != null ? message.peer_id.channel_id : 0;
@ -210,6 +210,11 @@ public class FileRefController extends BaseController {
locationKey = "file_" + req.id.id;
location = new TLRPC.TL_inputDocumentFileLocation();
location.id = req.id.id;
} else if (args[0] instanceof TLRPC.TL_stickers_addStickerToSet) {
TLRPC.TL_stickers_addStickerToSet req = (TLRPC.TL_stickers_addStickerToSet) args[0];
locationKey = "file_" + req.sticker.document.id;
location = new TLRPC.TL_inputDocumentFileLocation();
location.id = req.sticker.document.id;
} else if (args[0] instanceof TLRPC.TL_messages_faveSticker) {
TLRPC.TL_messages_faveSticker req = (TLRPC.TL_messages_faveSticker) args[0];
locationKey = "file_" + req.id.id;
@ -390,6 +395,12 @@ public class FileRefController extends BaseController {
req.peer = getMessagesController().getInputPeer(messageObject.getDialogId());
req.id.add(messageObject.getRealId());
getConnectionsManager().sendRequest(req, (response, error) -> onRequestComplete(locationKey, parentKey, response, error, true, false));
} else if (messageObject.isQuickReply()) {
TLRPC.TL_messages_getQuickReplyMessages req = new TLRPC.TL_messages_getQuickReplyMessages();
req.shortcut_id = messageObject.getQuickReplyId();
req.flags |= 1;
req.id.add(messageObject.getRealId());
getConnectionsManager().sendRequest(req, (response, error) -> onRequestComplete(locationKey, parentKey, response, error, true, false));
} else if (channelId != 0) {
TLRPC.TL_channels_getMessages req = new TLRPC.TL_channels_getMessages();
req.channel = getMessagesController().getInputChannel(channelId);
@ -638,6 +649,15 @@ public class FileRefController extends BaseController {
req.id.file_reference = file_reference;
getConnectionsManager().sendRequest(req, (response, error) -> {
});
} else if (requester.args[0] instanceof TLRPC.TL_stickers_addStickerToSet) {
TLRPC.TL_stickers_addStickerToSet req = (TLRPC.TL_stickers_addStickerToSet) requester.args[0];
if (fromCache && isSameReference(req.sticker.document.file_reference, file_reference)) {
return false;
}
req.sticker.document.file_reference = file_reference;
getConnectionsManager().sendRequest(req, (response, error) -> {
});
} else if (requester.args[0] instanceof TLRPC.TL_messages_faveSticker) {
TLRPC.TL_messages_faveSticker req = (TLRPC.TL_messages_faveSticker) requester.args[0];
@ -717,6 +737,9 @@ public class FileRefController extends BaseController {
} else if (args[0] instanceof TLRPC.TL_messages_saveRecentSticker) {
TLRPC.TL_messages_saveRecentSticker req = (TLRPC.TL_messages_saveRecentSticker) args[0];
//do nothing
} else if (args[0] instanceof TLRPC.TL_stickers_addStickerToSet) {
TLRPC.TL_stickers_addStickerToSet req = (TLRPC.TL_stickers_addStickerToSet) args[0];
//do nothing
} else if (args[0] instanceof TLRPC.TL_messages_faveSticker) {
TLRPC.TL_messages_faveSticker req = (TLRPC.TL_messages_faveSticker) args[0];
//do nothing
@ -779,11 +802,10 @@ public class FileRefController extends BaseController {
continue;
}
if (error != null && BuildVars.LOGS_ENABLED) {
if (requester.args[1] instanceof FileLoadOperation) {
if (requester.args.length > 1 && requester.args[1] instanceof FileLoadOperation) {
FileLoadOperation operation = (FileLoadOperation) requester.args[1];
FileLog.e("debug_loading: " + operation.getCacheFileFinal().getName() + " can't update file reference: " + error.code + " " + error.text);
}
}
if (requester.location instanceof TLRPC.TL_inputFileLocation || requester.location instanceof TLRPC.TL_inputPeerPhotoFileLocation) {
locationReplacement = new TLRPC.InputFileLocation[1];

View file

@ -3584,6 +3584,8 @@ public class ImageLoader {
}
url = url + docExt;
saveImageToCache = !MessageObject.isVideoDocument(object.document) && !MessageObject.isGifDocument(object.document) && !MessageObject.isRoundVideoDocument(object.document) && !MessageObject.canPreviewDocument(object.document);
} else if (parentObject instanceof TLRPC.StickerSet) {
url = url + "." + ext;
}
if (a == 0) {
imageKey = key;

View file

@ -297,6 +297,22 @@ public class ImageLocation {
return imageLocation;
}
public static ImageLocation getForStickerSet(TLRPC.StickerSet set) {
if (set == null) return null;
TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(set.thumbs, 90);
if (photoSize == null) return null;
TLRPC.InputStickerSet inputStickerSet;
if (set.access_hash != 0) {
inputStickerSet = new TLRPC.TL_inputStickerSetID();
inputStickerSet.id = set.id;
inputStickerSet.access_hash = set.access_hash;
} else {
inputStickerSet = new TLRPC.TL_inputStickerSetShortName();
inputStickerSet.short_name = set.short_name;
}
return getForPhoto(photoSize.location, photoSize.size, null, null, null, TYPE_SMALL, photoSize.location.dc_id, inputStickerSet, photoSize.type);
}
private static ImageLocation getForPhoto(TLRPC.FileLocation location, int size, TLRPC.Photo photo, TLRPC.Document document, TLRPC.InputPeer photoPeer, int photoPeerType, int dc_id, TLRPC.InputStickerSet stickerSet, String thumbSize) {
if (location == null || photo == null && photoPeer == null && stickerSet == null && document == null) {
return null;

View file

@ -1647,6 +1647,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
if (drawable instanceof SvgHelper.SvgDrawable) {
svgDrawable = (SvgHelper.SvgDrawable) drawable;
svgDrawable.setParent(this);
} else if (drawable instanceof ClipRoundedDrawable && ((ClipRoundedDrawable) drawable).getDrawable() instanceof SvgHelper.SvgDrawable) {
svgDrawable = (SvgHelper.SvgDrawable) ((ClipRoundedDrawable) drawable).getDrawable();
svgDrawable.setParent(this);
}
if (colorFilter != null && drawable != null) {
drawable.setColorFilter(colorFilter);

View file

@ -577,7 +577,11 @@ public class LocationController extends BaseController implements NotificationCe
info.lastSentProximityMeters = info.proximityMeters = message.media.proximity_notification_radius;
info.account = currentAccount;
info.messageObject = new MessageObject(currentAccount, message, false, false);
info.stopTime = getConnectionsManager().getCurrentTime() + info.period;
if (info.period == 0x7FFFFFFF) {
info.stopTime = Integer.MAX_VALUE;
} else {
info.stopTime = getConnectionsManager().getCurrentTime() + info.period;
}
final SharingLocationInfo old = sharingLocationsMap.get(info.did);
sharingLocationsMap.put(info.did, info);
if (old != null) {

View file

@ -455,6 +455,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
public boolean isMuted;
public boolean canDeleteAfter;
public boolean hasSpoiler;
public String emoji;
public boolean isChatPreviewSpoilerRevealed;
public boolean isAttachSpoilerRevealed;
@ -527,6 +528,39 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
hasSpoiler = false;
super.reset();
}
public void deleteAll() {
if (path != null) {
try {
new File(path).delete();
} catch (Exception ignore) {}
}
if (fullPaintPath != null) {
try {
new File(fullPaintPath).delete();
} catch (Exception ignore) {}
}
if (paintPath != null) {
try {
new File(paintPath).delete();
} catch (Exception ignore) {}
}
if (imagePath != null) {
try {
new File(imagePath).delete();
} catch (Exception ignore) {}
}
if (filterPath != null) {
try {
new File(filterPath).delete();
} catch (Exception ignore) {}
}
if (croppedPaintPath != null) {
try {
new File(croppedPaintPath).delete();
} catch (Exception ignore) {}
}
}
}
public static class SearchImage extends MediaEditState {

View file

@ -1177,7 +1177,24 @@ public class MediaDataController extends BaseController {
}
public TLRPC.TL_messages_stickerSet getStickerSetByName(String name) {
return stickerSetsByName.get(name);
if (name == null) return null;
return stickerSetsByName.get(name.toLowerCase());
}
public void findStickerSetByNameInCache(String name, Utilities.Callback<TLRPC.TL_messages_stickerSet> whenFound) {
if (whenFound == null)
return;
if (name == null) {
whenFound.run(null);
return;
}
getMessagesStorage().getStorageQueue().postRunnable(() -> {
TLRPC.TL_messages_stickerSet cachedSet = getCachedStickerSetInternal(name.toLowerCase(), 0);
AndroidUtilities.runOnUIThread(() -> {
putStickerSet(cachedSet, false);
whenFound.run(cachedSet);
});
});
}
public TLRPC.TL_messages_stickerSet getStickerSetByEmojiOrName(String emoji) {
@ -1363,6 +1380,42 @@ public class MediaDataController extends BaseController {
return null;
}
public void putStickerSet(TLRPC.TL_messages_stickerSet set) {
putStickerSet(set, true);
}
public void putStickerSet(TLRPC.TL_messages_stickerSet set, boolean notify) {
if (set == null || set.set == null) return;
stickerSetsById.put(set.set.id, set);
if (!TextUtils.isEmpty(set.set.short_name)) {
stickerSetsByName.put(set.set.short_name.toLowerCase(), set);
}
for (int i = 0; i < stickerSets.length; ++i) {
ArrayList<TLRPC.TL_messages_stickerSet> sets = stickerSets[i];
if (sets != null) {
for (int j = 0; j < sets.size(); ++j) {
TLRPC.TL_messages_stickerSet setB = sets.get(j);
if (setB != null && setB.set != null && setB.set.id == set.set.id) {
sets.set(j, set);
}
}
}
}
if (groupStickerSets.containsKey(set.set.id)) {
groupStickerSets.put(set.set.id, set);
}
saveStickerSetIntoCache(set);
int type = TYPE_IMAGE;
if (set.set.masks) {
type = TYPE_MASK;
} else if (set.set.emojis) {
type = TYPE_EMOJIPACKS;
}
if (notify) {
getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type, true);
}
}
private boolean cleanedupStickerSetCache;
private void cleanupStickerSetCache() {
if (cleanedupStickerSetCache) {
@ -2071,8 +2124,11 @@ public class MediaDataController extends BaseController {
}
public void storeTempStickerSet(TLRPC.TL_messages_stickerSet set) {
if (set == null || set.set == null) return;
stickerSetsById.put(set.set.id, set);
stickerSetsByName.put(set.set.short_name, set);
if (set.set.short_name != null) {
stickerSetsByName.put(set.set.short_name.toLowerCase(), set);
}
}
public void addNewStickerSet(TLRPC.TL_messages_stickerSet set) {
@ -3236,7 +3292,9 @@ public class MediaDataController extends BaseController {
stickerSets[type].add(finalCurrentIndex, messages_stickerSet);
stickerSetsById.put(stickerSet.id, messages_stickerSet);
installedStickerSetsById.put(stickerSet.id, messages_stickerSet);
stickerSetsByName.put(stickerSet.short_name, messages_stickerSet);
if (stickerSet.short_name != null) {
stickerSetsByName.put(stickerSet.short_name.toLowerCase(), messages_stickerSet);
}
removingStickerSetsUndos.remove(stickerSet.id);
loadHash[type] = calcStickersHash(stickerSets[type]);
@ -5940,7 +5998,7 @@ public class MediaDataController extends BaseController {
object.applyTimestampsHighlightForReplyMsg();
object.messageOwner.reply_to = new TLRPC.TL_messageReplyHeader();
object.messageOwner.reply_to.flags |= 16;
object.messageOwner.reply_to.reply_to_msg_id = messageObject.getId();
object.messageOwner.reply_to.reply_to_msg_id = messageObject.getRealId();
}
}
}
@ -5974,14 +6032,14 @@ public class MediaDataController extends BaseController {
if (messageObject == null) {
continue;
}
if (!messageObject.isReplyToStory() && messageObject.isReply() && messageObject.getId() > 0) {
if (!messageObject.isReplyToStory() && messageObject.isReply() && messageObject.getRealId() > 0) {
if (messageObject.messageOwner.reply_to.reply_to_peer_id != null) {
continue;
}
int reply_to_id = messageObject.messageOwner.reply_to.reply_to_msg_id;
for (int j = 0; j < messages.size(); ++j) {
if (a == j) continue;
if (messages.get(j) != null && messages.get(j).getId() == reply_to_id) {
if (messages.get(j) != null && messages.get(j).getRealId() == reply_to_id) {
messageObject.replyMessageObject = messages.get(j);
messageObject.applyTimestampsHighlightForReplyMsg();
if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) {
@ -6017,7 +6075,7 @@ public class MediaDataController extends BaseController {
long storyDialogId = DialogObject.getPeerDialogId(messageObject.messageOwner.media.peer);
messageObject.messageOwner.media.storyItem = StoriesStorage.checkExpiredStateLocal(currentAccount, storyDialogId, messageObject.messageOwner.media.storyItem);
}
} else if (messageObject.getId() > 0 && messageObject.isReplyToStory()) {
} else if (messageObject.getRealId() > 0 && messageObject.isReplyToStory()) {
if (messageObject.messageOwner.replyStory == null) {
long storyDialogId = DialogObject.getPeerDialogId(messageObject.messageOwner.reply_to.peer);
if (messagesWithUnknownStories == null) {
@ -6033,7 +6091,7 @@ public class MediaDataController extends BaseController {
long storyDialogId = DialogObject.getPeerDialogId(messageObject.messageOwner.reply_to.peer);
messageObject.messageOwner.replyStory = StoriesStorage.checkExpiredStateLocal(currentAccount, storyDialogId, messageObject.messageOwner.replyStory);
}
} else if (messageObject.getId() > 0 && messageObject.isReply()) {
} else if (messageObject.getRealId() > 0 && messageObject.isReply()) {
int messageId = messageObject.messageOwner.reply_to.reply_to_msg_id;
if (messageId == threadMessageId) {
continue;
@ -6987,7 +7045,7 @@ public class MediaDataController extends BaseController {
}
if (spannable instanceof Spannable) {
AndroidUtilities.addLinks((Spannable) spannable, Linkify.WEB_URLS, false, false);
AndroidUtilities.addLinksSafe((Spannable) spannable, Linkify.WEB_URLS, false, false);
URLSpan[] spansUrl = spannable.getSpans(0, message[0].length(), URLSpan.class);
if (spansUrl != null && spansUrl.length > 0) {
if (entities == null) {

View file

@ -159,6 +159,7 @@ public class MessageObject {
public String customName;
public boolean reactionsChanged;
public boolean isReactionPush;
public boolean isStoryReactionPush;
public boolean isStoryPush, isStoryMentionPush, isStoryPushHidden;
public boolean putInDownloadsStore;
public boolean isDownloadingFile;
@ -199,22 +200,21 @@ public class MessageObject {
public boolean isRestrictedMessage;
public long loadedFileSize;
public boolean forceExpired;
public long actionDeleteGroupEventId = -1;
public boolean isSpoilersRevealed;
public boolean isMediaSpoilersRevealed;
public boolean isMediaSpoilersRevealedInSharedMedia;
public boolean revealingMediaSpoilers;
public byte[] sponsoredId;
public int sponsoredChannelPost;
public TLRPC.ChatInvite sponsoredChatInvite;
public String sponsoredChatInviteHash;
public boolean sponsoredShowPeerPhoto;
public String sponsoredTitle, sponsoredUrl;
public boolean sponsoredRecommended;
public TLRPC.Photo sponsoredPhoto;
public String sponsoredInfo, sponsoredAdditionalInfo;
public TLRPC.TL_sponsoredWebPage sponsoredWebPage;
public TLRPC.BotApp sponsoredBotApp;
public String sponsoredButtonText;
public TLRPC.TL_peerColor sponsoredColor;
public boolean sponsoredCanReport;
public boolean replyTextEllipsized;
public boolean replyTextRevealed;
public int overrideLinkColor = -1;
@ -224,8 +224,6 @@ public class MessageObject {
public TLRPC.TL_forumTopic replyToForumTopic; // used only for reply message in view all messages
public String botStartParam;
public boolean animateComments;
public boolean loadingCancelled;
@ -253,7 +251,7 @@ public class MessageObject {
return 0;
}
public ArrayList<TLRPC.TL_pollAnswer> checkedVotes;
public ArrayList<TLRPC.PollAnswer> checkedVotes;
public CharSequence editingMessage;
public ArrayList<TLRPC.MessageEntity> editingMessageEntities;
@ -601,6 +599,7 @@ public class MessageObject {
public float currentX;
public float currentY;
public float timeAlpha;
public float progress;
}
public static class VCardData {
@ -1471,7 +1470,7 @@ public class MessageObject {
backgroundChangeBounds = false;
}
}
public boolean contains(int messageId) {
if (messages == null) {
return false;
@ -1941,6 +1940,7 @@ public class MessageObject {
new_participant = action.new_participant;
}
messageOwner = new TLRPC.TL_message();
messageOwner.realId = -1;
long peerId = MessageObject.getPeerId(prev_participant.peer);
TLObject whoUser;
if (peerId > 0) {
@ -2008,7 +2008,7 @@ public class MessageObject {
}
if (o.delete_messages != n.delete_messages) {
rights.append('\n').append(n.delete_messages ? '+' : '-').append(' ');
rights.append(LocaleController.getString("EventLogPromotedDeleteMessages", R.string.EventLogPromotedDeleteMessages));
rights.append(LocaleController.getString(R.string.EventLogPromotedDeleteMessages));
}
if (o.add_admins != n.add_admins) {
rights.append('\n').append(n.add_admins ? '+' : '-').append(' ');
@ -2043,6 +2043,7 @@ public class MessageObject {
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionDefaultBannedRights) {
TLRPC.TL_channelAdminLogEventActionDefaultBannedRights bannedRights = (TLRPC.TL_channelAdminLogEventActionDefaultBannedRights) event.action;
messageOwner = new TLRPC.TL_message();
messageOwner.realId = -1;
TLRPC.TL_chatBannedRights o = bannedRights.prev_banned_rights;
TLRPC.TL_chatBannedRights n = bannedRights.new_banned_rights;
@ -2120,6 +2121,7 @@ public class MessageObject {
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionParticipantToggleBan) {
TLRPC.TL_channelAdminLogEventActionParticipantToggleBan action = (TLRPC.TL_channelAdminLogEventActionParticipantToggleBan) event.action;
messageOwner = new TLRPC.TL_message();
messageOwner.realId = -1;
long peerId = getPeerId(action.prev_participant.peer);
TLObject whoUser;
if (peerId > 0) {
@ -2306,9 +2308,9 @@ public class MessageObject {
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionDeleteMessage) {
message = ((TLRPC.TL_channelAdminLogEventActionDeleteMessage) event.action).message;
if (fromUser != null && fromUser.id == MessagesController.getInstance(currentAccount).telegramAntispamUserId) {
messageText = LocaleController.getString("EventLogDeletedMessages", R.string.EventLogDeletedMessages).replace("un1", UserObject.getUserName(fromUser));
messageText = LocaleController.getString(R.string.EventLogDeletedMessages).replace("un1", UserObject.getUserName(fromUser));
} else {
messageText = replaceWithLink(LocaleController.getString("EventLogDeletedMessages", R.string.EventLogDeletedMessages), "un1", fromUser);
messageText = replaceWithLink(LocaleController.getString(R.string.EventLogDeletedMessages), "un1", fromUser);
}
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeLinkedChat) {
long newChatId = ((TLRPC.TL_channelAdminLogEventActionChangeLinkedChat) event.action).new_value;
@ -2990,9 +2992,8 @@ public class MessageObject {
message.out = false;
message.realId = message.id;
message.id = mid[0]++;
message.flags &= ~TLRPC.MESSAGE_FLAG_REPLY;
message.reply_to = null;
message.flags = message.flags & ~TLRPC.MESSAGE_FLAG_EDITED;
message.dialog_id = -chat.id;
MessageObject messageObject = new MessageObject(currentAccount, message, null, null, true, true, eventId);
messageObject.currentEvent = event;
if (messageObject.contentType >= 0) {
@ -3016,6 +3017,9 @@ public class MessageObject {
messageObject.generateLinkDescription();
}
}
if (event.action instanceof TLRPC.TL_channelAdminLogEventActionDeleteMessage) {
return;
}
if (contentType >= 0) {
createDateArray(currentAccount, event, messageObjects, messagesByDays, addToEnd);
if (addToEnd) {
@ -5330,13 +5334,13 @@ public class MessageObject {
}
}
}
} else if (sponsoredWebPage != null && sponsoredWebPage.photo != null) {
} else if (sponsoredPhoto != null) {
if (!update || photoThumbs == null) {
photoThumbs = new ArrayList<>(sponsoredWebPage.photo.sizes);
photoThumbs = new ArrayList<>(sponsoredPhoto.sizes);
} else if (!photoThumbs.isEmpty()) {
updatePhotoSizeLocations(photoThumbs, sponsoredWebPage.photo.sizes);
updatePhotoSizeLocations(photoThumbs, sponsoredPhoto.sizes);
}
photoThumbsObject = sponsoredWebPage.photo;
photoThumbsObject = sponsoredPhoto;
if (strippedThumb == null) {
createStrippedThumb();
}
@ -5587,7 +5591,7 @@ public class MessageObject {
if (!TextUtils.isEmpty(linkDescription)) {
if (containsUrls(linkDescription)) {
try {
AndroidUtilities.addLinks((Spannable) linkDescription, Linkify.WEB_URLS);
AndroidUtilities.addLinksSafe((Spannable) linkDescription, Linkify.WEB_URLS, false, true);
} catch (Exception e) {
FileLog.e(e);
}
@ -5708,7 +5712,7 @@ public class MessageObject {
if (useManualParse) {
if (containsUrls(caption)) {
try {
AndroidUtilities.addLinks((Spannable) caption, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
AndroidUtilities.addLinksSafe((Spannable) caption, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, false, true);
} catch (Exception e) {
FileLog.e(e);
}
@ -5920,13 +5924,13 @@ public class MessageObject {
if (messageText instanceof Spannable && containsUrls(messageText)) {
if (messageText.length() < 1000) {
try {
AndroidUtilities.addLinks((Spannable) messageText, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, internalOnly);
AndroidUtilities.addLinksSafe((Spannable) messageText, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, internalOnly, false);
} catch (Exception e) {
FileLog.e(e);
}
} else {
try {
AndroidUtilities.addLinks((Spannable) messageText, Linkify.WEB_URLS, internalOnly);
AndroidUtilities.addLinksSafe((Spannable) messageText, Linkify.WEB_URLS, internalOnly, false);
} catch (Exception e) {
FileLog.e(e);
}
@ -8291,6 +8295,39 @@ public class MessageObject {
return fallback;
}
public static ArrayList<String> findStickerEmoticons(TLRPC.Document document, Integer currentAccountForFull) {
if (document == null) {
return null;
}
ArrayList<String> emojis = new ArrayList<>();
for (int a = 0, N = document.attributes.size(); a < N; a++) {
TLRPC.DocumentAttribute attribute = document.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeCustomEmoji ||
attribute instanceof TLRPC.TL_documentAttributeSticker) {
if (currentAccountForFull != null) {
TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(currentAccountForFull).getStickerSet(attribute.stickerset, true);
if (set != null && set.packs != null) {
for (int p = 0; p < set.packs.size(); ++p) {
TLRPC.TL_stickerPack pack = set.packs.get(p);
if (pack.documents.contains(document.id) && Emoji.getEmojiDrawable(pack.emoticon) != null) {
emojis.add(pack.emoticon);
}
}
}
if (!emojis.isEmpty()) {
return emojis;
}
}
if (!TextUtils.isEmpty(attribute.alt) && Emoji.getEmojiDrawable(attribute.alt) != null) {
emojis.add(attribute.alt);
return emojis;
}
}
}
return null;
}
public static boolean isAnimatedEmoji(TLRPC.Document document) {
if (document == null) {
return false;
@ -9650,7 +9687,12 @@ public class MessageObject {
}
}
}
if (newReaction == null) {
int maxChatReactions = MessagesController.getInstance(currentAccount).getChatMaxUniqReactions(getDialogId());
if (messageOwner.reactions.results.size() + 1 > maxChatReactions) {
return false;
}
newReaction = new TLRPC.TL_reactionCount();
newReaction.reaction = visibleReaction.toTLReaction();
messageOwner.reactions.results.add(newReaction);
@ -9811,7 +9853,7 @@ public class MessageObject {
public static CharSequence peerNameWithIcon(int currentAccount, TLRPC.Peer peer) {
return peerNameWithIcon(currentAccount, peer, !(peer instanceof TLRPC.TL_peerUser));
}
public static CharSequence peerNameWithIcon(int currentAccount, TLRPC.Peer peer, boolean anotherChat) {
if (peer instanceof TLRPC.TL_peerUser) {
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(peer.user_id);
@ -9932,7 +9974,7 @@ public class MessageObject {
return hasLinkPreview && !isGiveawayOrGiveawayResults() &&
webpage != null && (webpage.photo != null || isVideoDocument(webpage.document)) &&
!(webpage != null && TextUtils.isEmpty(webpage.description) && TextUtils.isEmpty(webpage.title)) &&
!(isSponsored() && sponsoredWebPage == null && sponsoredChannelPost == 0) && // drawInstantViewType = 1
!isSponsored() && // drawInstantViewType = 1
!"telegram_megagroup".equals(webpageType) && // drawInstantViewType = 2
!"telegram_background".equals(webpageType) && // drawInstantViewType = 6
!"telegram_voicechat".equals(webpageType) && // drawInstantViewType = 9

View file

@ -348,7 +348,7 @@ public class MessagePreviewParams {
try {
Spannable spanned = SpannableString.valueOf(text);
try {
AndroidUtilities.addLinks(spanned, Linkify.WEB_URLS);
AndroidUtilities.addLinksSafe(spanned, Linkify.WEB_URLS, false, true);
} catch (Exception e2) {
FileLog.e(e2);
}

View file

@ -10,6 +10,7 @@ package org.telegram.messenger;
import static org.telegram.messenger.NotificationsController.TYPE_CHANNEL;
import static org.telegram.messenger.NotificationsController.TYPE_PRIVATE;
import static org.telegram.messenger.NotificationsController.TYPE_REACTIONS_MESSAGES;
import android.Manifest;
import android.app.Activity;
@ -61,6 +62,7 @@ import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Business.QuickRepliesController;
import org.telegram.ui.ChannelMonetizationLayout;
import org.telegram.ui.ChatActivity;
import org.telegram.ui.ChatReactionsEditActivity;
import org.telegram.ui.ChatRightsEditActivity;
@ -70,13 +72,17 @@ import org.telegram.ui.Components.BulletinFactory;
import org.telegram.ui.Components.ImageUpdater;
import org.telegram.ui.Components.JoinCallAlert;
import org.telegram.ui.Components.MotionBackgroundDrawable;
import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet;
import org.telegram.ui.Components.Premium.LimitReachedBottomSheet;
import org.telegram.ui.Components.Premium.boosts.BoostRepository;
import org.telegram.ui.Components.Premium.boosts.PremiumPreviewGiftToUsersBottomSheet;
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
import org.telegram.ui.Components.SwipeGestureSettingsView;
import org.telegram.ui.Components.TranscribeButton;
import org.telegram.ui.DialogsActivity;
import org.telegram.ui.EditWidgetActivity;
import org.telegram.ui.LaunchActivity;
import org.telegram.ui.NotificationsSettingsActivity;
import org.telegram.ui.PremiumPreviewFragment;
import org.telegram.ui.ProfileActivity;
import org.telegram.ui.SecretMediaViewer;
@ -507,6 +513,7 @@ public class MessagesController extends BaseController implements NotificationCe
public boolean saveGifsWithStickers;
private String installReferer;
public Set<String> pendingSuggestions;
public Set<String> dismissedSuggestions;
public Set<String> exportUri;
public Set<String> exportGroupUri;
public Set<String> exportPrivateUri;
@ -599,6 +606,11 @@ public class MessagesController extends BaseController implements NotificationCe
public int businessChatLinksLimit;
public boolean channelRevenueWithdrawalEnabled;
public boolean newNoncontactPeersRequirePremiumWithoutOwnpremium;
public int reactionsUniqMax;
public String premiumManageSubscriptionUrl;
public boolean androidDisableRoundCamera2;
public int storiesPinnedToTopCountMax;
public boolean showAnnualPerMonth = false;
public int savedDialogsPinnedLimitDefault;
public int savedDialogsPinnedLimitPremium;
@ -762,6 +774,14 @@ public class MessagesController extends BaseController implements NotificationCe
return getUserConfig().isPremium() ? reactionsInChatMax : 1;
}
public int getChatMaxUniqReactions(long dialogId) {
TLRPC.ChatFull chatFull = MessagesController.getInstance(currentAccount).getChatFull(-dialogId);
if (chatFull != null && (chatFull instanceof TLRPC.TL_chatFull ? (chatFull.flags & 1048576) != 0 : (chatFull.flags2 & 8192) != 0)) {
return chatFull.reactions_limit;
}
return reactionsUniqMax;
}
public boolean isPremiumUser(TLRPC.User currentUser) {
return !premiumFeaturesBlocked() && currentUser.premium;
}
@ -1409,6 +1429,7 @@ public class MessagesController extends BaseController implements NotificationCe
roundVideoBitrate = mainPreferences.getInt("roundVideoBitrate", 1000);
roundAudioBitrate = mainPreferences.getInt("roundAudioBitrate", 64);
pendingSuggestions = mainPreferences.getStringSet("pendingSuggestions", null);
dismissedSuggestions = mainPreferences.getStringSet("dismissedSuggestions", null);
channelsLimitDefault = mainPreferences.getInt("channelsLimitDefault", 500);
channelsLimitPremium = mainPreferences.getInt("channelsLimitPremium", 2 * channelsLimitDefault);
savedGifsLimitDefault = mainPreferences.getInt("savedGifsLimitDefault", 200);
@ -1518,6 +1539,11 @@ public class MessagesController extends BaseController implements NotificationCe
businessChatLinksLimit = mainPreferences.getInt("businessChatLinksLimit", 100);
channelRevenueWithdrawalEnabled = mainPreferences.getBoolean("channelRevenueWithdrawalEnabled", false);
newNoncontactPeersRequirePremiumWithoutOwnpremium = mainPreferences.getBoolean("newNoncontactPeersRequirePremiumWithoutOwnpremium", false);
reactionsUniqMax = mainPreferences.getInt("reactionsUniqMax", 11);
premiumManageSubscriptionUrl = mainPreferences.getString("premiumManageSubscriptionUrl", ApplicationLoader.isStandaloneBuild() ? "https://t.me/premiumbot?start=status" : "https://play.google.com/store/account/subscriptions?sku=telegram_premium&package=org.telegram.messenger");
androidDisableRoundCamera2 = mainPreferences.getBoolean("androidDisableRoundCamera2", false);
storiesPinnedToTopCountMax = mainPreferences.getInt("storiesPinnedToTopCountMax", 3);
showAnnualPerMonth = mainPreferences.getBoolean("showAnnualPerMonth", false);
scheduleTranscriptionUpdate();
BuildVars.GOOGLE_AUTH_CLIENT_ID = mainPreferences.getString("googleAuthClientId", BuildVars.GOOGLE_AUTH_CLIENT_ID);
if (mainPreferences.contains("dcDomainName2")) {
@ -1544,6 +1570,11 @@ public class MessagesController extends BaseController implements NotificationCe
} else {
pendingSuggestions = new HashSet<>();
}
if (dismissedSuggestions != null) {
dismissedSuggestions = new HashSet<>(dismissedSuggestions);
} else {
dismissedSuggestions = new HashSet<>();
}
exportUri = mainPreferences.getStringSet("exportUri2", null);
if (exportUri != null) {
@ -2284,11 +2315,14 @@ public class MessagesController extends BaseController implements NotificationCe
getNotificationCenter().postNotificationName(NotificationCenter.dialogFiltersUpdated);
}
private Runnable loadAppConfigRunnable = this::loadAppConfig;
public void loadAppConfig() {
loadAppConfig(false);
}
public void loadAppConfig(boolean force) {
AndroidUtilities.cancelRunOnUIThread(loadAppConfigRunnable);
if (force) {
appConfigFetcher.forceRequest(currentAccount, 0);
}
@ -2296,6 +2330,8 @@ public class MessagesController extends BaseController implements NotificationCe
if (config != null && config.config instanceof TLRPC.TL_jsonObject) {
applyAppConfig((TLRPC.TL_jsonObject) config.config);
}
AndroidUtilities.cancelRunOnUIThread(loadAppConfigRunnable);
AndroidUtilities.runOnUIThread(loadAppConfigRunnable, 4 * 60 * 1000 + 10);
}));
}
@ -2982,6 +3018,26 @@ public class MessagesController extends BaseController implements NotificationCe
}
break;
}
case "dismissed_suggestions": {
HashSet<String> newSuggestions = new HashSet<>();
if (value.value instanceof TLRPC.TL_jsonArray) {
TLRPC.TL_jsonArray array = (TLRPC.TL_jsonArray) value.value;
for (int b = 0, N2 = array.value.size(); b < N2; b++) {
TLRPC.JSONValue val = array.value.get(b);
if (val instanceof TLRPC.TL_jsonString) {
TLRPC.TL_jsonString string = (TLRPC.TL_jsonString) val;
newSuggestions.add(string.value);
}
}
}
if (!dismissedSuggestions.equals(newSuggestions)) {
dismissedSuggestions = newSuggestions;
editor.putStringSet("dismissedSuggestions", dismissedSuggestions);
getNotificationCenter().postNotificationName(NotificationCenter.newSuggestionsAvailable);
changed = true;
}
break;
}
case "emojies_sounds": {
try {
HashMap<String, EmojiSound> newEmojies = new HashMap<>();
@ -3974,6 +4030,61 @@ public class MessagesController extends BaseController implements NotificationCe
}
break;
}
case "reactions_uniq_max": {
if (value.value instanceof TLRPC.TL_jsonBool) {
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
if (num.value != reactionsUniqMax) {
reactionsUniqMax = (int) num.value;
editor.putInt("reactionsUniqMax", reactionsUniqMax);
changed = true;
}
}
break;
}
case "premium_manage_subscription_url": {
if (value.value instanceof TLRPC.TL_jsonString) {
TLRPC.TL_jsonString str = (TLRPC.TL_jsonString) value.value;
if (!TextUtils.equals(str.value, premiumManageSubscriptionUrl)) {
premiumManageSubscriptionUrl = str.value;
editor.putString("premiumManageSubscriptionUrl", premiumManageSubscriptionUrl);
changed = true;
}
}
break;
}
case "android_disable_round_camera2": {
if (value.value instanceof TLRPC.TL_jsonBool) {
TLRPC.TL_jsonBool bool = (TLRPC.TL_jsonBool) value.value;
if (bool.value != androidDisableRoundCamera2) {
androidDisableRoundCamera2 = bool.value;
editor.putBoolean("androidDisableRoundCamera2", androidDisableRoundCamera2);
changed = true;
}
}
break;
}
case "stories_pinned_to_top_count_max": {
if (value.value instanceof TLRPC.TL_jsonNumber) {
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
if (num.value != storiesPinnedToTopCountMax) {
storiesPinnedToTopCountMax = (int) num.value;
editor.putInt("storiesPinnedToTopCountMax", storiesPinnedToTopCountMax);
changed = true;
}
}
break;
}
case "show_annual_per_month": {
if (value.value instanceof TLRPC.TL_jsonBool) {
TLRPC.TL_jsonBool bool = (TLRPC.TL_jsonBool) value.value;
if (bool.value != showAnnualPerMonth) {
showAnnualPerMonth = bool.value;
editor.putBoolean("showAnnualPerMonth", showAnnualPerMonth);
changed = true;
}
}
break;
}
}
}
@ -4505,7 +4616,8 @@ public class MessagesController extends BaseController implements NotificationCe
channelRevenueWithdrawalEnabled = false;
collectDeviceStats = false;
smsjobsStickyNotificationEnabled = false;
mainPreferences.edit().remove("getfileExperimentalParams").remove("smsjobsStickyNotificationEnabled").remove("channelRevenueWithdrawalEnabled").apply();
showAnnualPerMonth = false;
mainPreferences.edit().remove("getfileExperimentalParams").remove("smsjobsStickyNotificationEnabled").remove("channelRevenueWithdrawalEnabled").remove("showAnnualPerMonth").apply();
}
private boolean savePremiumFeaturesPreviewOrder(String key, SparseIntArray array, SharedPreferences.Editor editor, ArrayList<TLRPC.JSONValue> value) {
@ -4556,9 +4668,11 @@ public class MessagesController extends BaseController implements NotificationCe
return;
}
if (did == 0) {
if (pendingSuggestions.remove(suggestion)) {
if (pendingSuggestions.remove(suggestion) || !dismissedSuggestions.contains(suggestion)) {
dismissedSuggestions.add(suggestion);
SharedPreferences.Editor editor = mainPreferences.edit();
editor.putStringSet("pendingSuggestions", pendingSuggestions);
editor.putStringSet("dismissedSuggestions", dismissedSuggestions);
editor.commit();
getNotificationCenter().postNotificationName(NotificationCenter.newSuggestionsAvailable);
} else {
@ -4823,7 +4937,9 @@ public class MessagesController extends BaseController implements NotificationCe
public TLRPC.InputPeer getInputPeer(long id) {
TLRPC.InputPeer inputPeer;
if (id < 0) {
if (id == getUserConfig().getClientUserId()) {
inputPeer = new TLRPC.TL_inputPeerSelf();
} else if (id < 0) {
TLRPC.Chat chat = getChat(-id);
if (ChatObject.isChannel(chat)) {
inputPeer = new TLRPC.TL_inputPeerChannel();
@ -4864,6 +4980,16 @@ public class MessagesController extends BaseController implements NotificationCe
return inputPeer;
}
public static TLRPC.InputPeer getInputPeer(TLObject userOrChat) {
if (userOrChat instanceof TLRPC.User) {
return getInputPeer((TLRPC.User) userOrChat);
} else if (userOrChat instanceof TLRPC.Chat) {
return getInputPeer((TLRPC.Chat) userOrChat);
} else {
return null;
}
}
public TLRPC.Peer getPeer(long id) {
TLRPC.Peer inputPeer;
if (id < 0) {
@ -7294,6 +7420,10 @@ public class MessagesController extends BaseController implements NotificationCe
}
public void setParticipantBannedRole(long chatId, TLRPC.User user, TLRPC.Chat chat, TLRPC.TL_chatBannedRights rights, boolean isChannel, BaseFragment parentFragment) {
setParticipantBannedRole(chatId, user, chat, rights, isChannel, parentFragment, null);
}
public void setParticipantBannedRole(long chatId, TLRPC.User user, TLRPC.Chat chat, TLRPC.TL_chatBannedRights rights, boolean isChannel, BaseFragment parentFragment, Runnable whenDone) {
if (user == null && chat == null || rights == null) {
return;
}
@ -7309,6 +7439,9 @@ public class MessagesController extends BaseController implements NotificationCe
if (error == null) {
processUpdates((TLRPC.Updates) response, false);
AndroidUtilities.runOnUIThread(() -> loadFullChat(chatId, 0, true), 1000);
if (whenDone != null) {
AndroidUtilities.runOnUIThread(whenDone);
}
} else {
AndroidUtilities.runOnUIThread(() -> AlertsCreator.processError(currentAccount, error, parentFragment, req, isChannel));
}
@ -10694,7 +10827,7 @@ public class MessagesController extends BaseController implements NotificationCe
editor1.commit();
}
loadingNotificationSettings = 3;
loadingNotificationSettings = 4;
for (int a = 0; a < 3; a++) {
TLRPC.TL_account_getNotifySettings req = new TLRPC.TL_account_getNotifySettings();
if (a == 0) {
@ -10763,7 +10896,7 @@ public class MessagesController extends BaseController implements NotificationCe
}
}
getNotificationsController().getNotificationsSettingsFacade().applySoundSettings(notify_settings.android_sound, editor, 0, 0, type, false);
editor.commit();
editor.apply();
if (loadingNotificationSettings == 0) {
getUserConfig().notificationsSettingsLoaded = true;
getUserConfig().saveConfig(false);
@ -10771,12 +10904,57 @@ public class MessagesController extends BaseController implements NotificationCe
}
}));
}
getConnectionsManager().sendRequest(new TLRPC.TL_account_getReactionsNotifySettings(), (res, err) -> AndroidUtilities.runOnUIThread(() -> {
loadingNotificationSettings--;
if (res instanceof TLRPC.TL_reactionsNotifySettings) {
TLRPC.TL_reactionsNotifySettings notify_settings = (TLRPC.TL_reactionsNotifySettings) res;
SharedPreferences.Editor editor = notificationsPreferences.edit();
editor.putBoolean("EnableReactionsMessages", notify_settings.messages_notify_from != null);
if (notify_settings.messages_notify_from != null) {
editor.putBoolean("EnableReactionsMessagesContacts", notify_settings.messages_notify_from instanceof TLRPC.TL_reactionNotificationsFromContacts);
}
editor.putBoolean("EnableReactionsStories", notify_settings.stories_notify_from != null);
if (notify_settings.stories_notify_from != null) {
editor.putBoolean("EnableReactionsStoriesContacts", notify_settings.stories_notify_from instanceof TLRPC.TL_reactionNotificationsFromContacts);
}
editor.putBoolean("EnableReactionsPreview", notify_settings.show_previews);
getNotificationsController().getNotificationsSettingsFacade().applySoundSettings(notify_settings.sound, editor, 0, 0, TYPE_REACTIONS_MESSAGES, false);
editor.apply();
}
if (loadingNotificationSettings == 0) {
getUserConfig().notificationsSettingsLoaded = true;
getUserConfig().saveConfig(false);
}
}));
}
if (!getUserConfig().notificationsSignUpSettingsLoaded) {
loadSignUpNotificationsSettings();
}
}
public void reloadReactionsNotifySettings() {
getConnectionsManager().sendRequest(new TLRPC.TL_account_getReactionsNotifySettings(), (res, err) -> AndroidUtilities.runOnUIThread(() -> {
if (res instanceof TLRPC.TL_reactionsNotifySettings) {
TLRPC.TL_reactionsNotifySettings notify_settings = (TLRPC.TL_reactionsNotifySettings) res;
SharedPreferences.Editor editor = notificationsPreferences.edit();
editor.putBoolean("EnableReactionsMessages", notify_settings.messages_notify_from != null);
if (notify_settings.messages_notify_from != null) {
editor.putBoolean("EnableReactionsMessagesContacts", notify_settings.messages_notify_from instanceof TLRPC.TL_reactionNotificationsFromContacts);
}
editor.putBoolean("EnableReactionsStories", notify_settings.stories_notify_from != null);
if (notify_settings.stories_notify_from != null) {
editor.putBoolean("EnableReactionsStoriesContacts", notify_settings.stories_notify_from instanceof TLRPC.TL_reactionNotificationsFromContacts);
}
editor.putBoolean("EnableReactionsPreview", notify_settings.show_previews);
getNotificationsController().getNotificationsSettingsFacade().applySoundSettings(notify_settings.sound, editor, 0, 0, TYPE_REACTIONS_MESSAGES, false);
editor.apply();
getNotificationCenter().postNotificationName(NotificationCenter.notificationsSettingsUpdated);
}
}));
}
public void loadSignUpNotificationsSettings() {
if (!loadingNotificationSignUpSettings) {
loadingNotificationSignUpSettings = true;
@ -13581,6 +13759,10 @@ public class MessagesController extends BaseController implements NotificationCe
}
public void deleteParticipantFromChat(long chatId, TLRPC.InputPeer peer, boolean forceDelete, boolean revoke) {
deleteParticipantFromChat(chatId, peer, forceDelete, revoke, null);
}
public void deleteParticipantFromChat(long chatId, TLRPC.InputPeer peer, boolean forceDelete, boolean revoke, Runnable whenDone) {
if (peer == null) {
return;
}
@ -13623,7 +13805,6 @@ public class MessagesController extends BaseController implements NotificationCe
TLRPC.TL_messages_deleteChat req = new TLRPC.TL_messages_deleteChat();
req.chat_id = chatId;
getConnectionsManager().sendRequest(req, (response, error) -> {
});
return;
}
@ -13645,6 +13826,9 @@ public class MessagesController extends BaseController implements NotificationCe
if (isChannel && !self) {
AndroidUtilities.runOnUIThread(() -> loadFullChat(chatId, 0, true), 1000);
}
if (whenDone != null) {
AndroidUtilities.runOnUIThread(whenDone);
}
}, ConnectionsManager.RequestFlagInvokeAfter);
}
@ -14431,6 +14615,7 @@ public class MessagesController extends BaseController implements NotificationCe
long[] ids = corrected.valueAt(a);
getSendMessagesHelper().processSentMessage((int) ids[1]);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, (int) ids[1], newId, null, ids[0], 0L, -1, false);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, (int) ids[1], newId, null, ids[0], 0L, -1, false);
}
});
}
@ -14687,6 +14872,7 @@ public class MessagesController extends BaseController implements NotificationCe
long[] ids = corrected.valueAt(a);
getSendMessagesHelper().processSentMessage((int) ids[1]);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, (int) ids[1], newId, null, ids[0], 0L, -1, false);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, (int) ids[1], newId, null, ids[0], 0L, -1, false);
}
});
}
@ -17486,6 +17672,41 @@ public class MessagesController extends BaseController implements NotificationCe
if (UserObject.isUserSelf(currentUser)) {
getNotificationCenter().postNotificationName(NotificationCenter.mainUserInfoChanged);
}
} else if (baseUpdate instanceof TLRPC.TL_updateNewStoryReaction) {
TLRPC.TL_updateNewStoryReaction update = (TLRPC.TL_updateNewStoryReaction) baseUpdate;
long dialogId = DialogObject.getPeerDialogId(update.peer);
int story_id = update.story_id;
TLRPC.Message msg = new TLRPC.Message();
msg.id = -story_id;
msg.dialog_id = dialogId;
msg.peer_id = getPeer(dialogId);
msg.date = getConnectionsManager().getCurrentTime();
TLRPC.User user = getMessagesController().getUser(msg.dialog_id);
if (user != null && getNotificationsSettings(currentAccount).getBoolean("EnableReactionsPreview", true)) {
ReactionsLayoutInBubble.VisibleReaction reaction = ReactionsLayoutInBubble.VisibleReaction.fromTLReaction(update.reaction).flatten();
if (reaction.emojicon != null) {
msg.message = LocaleController.formatString(R.string.PushReactStory, UserObject.getFirstName(user), reaction.emojicon);
} else {
msg.message = LocaleController.formatString(R.string.PushReactStoryHidden);
}
} else {
msg.message = LocaleController.formatString(R.string.PushReactStoryHidden);
}
ArrayList<MessageObject> messageObjects = new ArrayList<MessageObject>();
MessageObject message = new MessageObject(currentAccount, msg, false, false);
message.isStoryReactionPush = true;
message.localType = 1;
if (user != null) {
message.localUserName = UserObject.getFirstName(user);
}
messageObjects.add(message);
getNotificationsController().processNewMessages(messageObjects, true, false, null);
} else if (baseUpdate instanceof TLRPC.TL_updateBroadcastRevenueTransactions) {
TLRPC.TL_updateBroadcastRevenueTransactions update = (TLRPC.TL_updateBroadcastRevenueTransactions) baseUpdate;
if (ChannelMonetizationLayout.instance != null) {
ChannelMonetizationLayout.instance.setupBalances(update.balances);
ChannelMonetizationLayout.instance.reloadTransactions();
}
} else if (baseUpdate instanceof TLRPC.TL_updateUser) {
TLRPC.TL_updateUser update = (TLRPC.TL_updateUser) baseUpdate;
TLRPC.User currentUser = getUser(update.user_id);
@ -17525,7 +17746,7 @@ public class MessagesController extends BaseController implements NotificationCe
toDbUser.id = update.user_id;
toDbUser.phone = update.phone;
dbUsers.add(toDbUser);
} else if (baseUpdate instanceof TLRPC.TL_updateNotifySettings) {
} else if (baseUpdate instanceof TLRPC.TL_updateNotifySettings) {
TLRPC.TL_updateNotifySettings update = (TLRPC.TL_updateNotifySettings) baseUpdate;
if (update.notify_settings instanceof TLRPC.TL_peerNotifySettings) {
updateDialogFiltersFlags |= DIALOG_FILTER_FLAG_EXCLUDE_MUTED;
@ -18673,7 +18894,7 @@ public class MessagesController extends BaseController implements NotificationCe
if (topicId != 0) {
return isDialogMuted(dialogId, 0, chat);
} else {
return !getNotificationsController().isGlobalNotificationsEnabled(dialogId, forceChannel);
return !getNotificationsController().isGlobalNotificationsEnabled(dialogId, forceChannel, false, false);
}
}
if (mute_type == 2) {
@ -18764,24 +18985,20 @@ public class MessagesController extends BaseController implements NotificationCe
message.flags |= 128;
}
message.peer_id = getPeer(dialogId);
message.from_id = sponsoredMessage.from_id;
message.flags |= 256;
message.date = getConnectionsManager().getCurrentTime();
message.id = messageId--;
MessageObject messageObject = new MessageObject(currentAccount, message, usersDict, chatsDict, true, true);
messageObject.sponsoredId = sponsoredMessage.random_id;
messageObject.botStartParam = sponsoredMessage.start_param;
messageObject.sponsoredChannelPost = sponsoredMessage.channel_post;
messageObject.sponsoredChatInvite = sponsoredMessage.chat_invite;
messageObject.sponsoredChatInviteHash = sponsoredMessage.chat_invite_hash;
messageObject.sponsoredTitle = sponsoredMessage.title;
messageObject.sponsoredUrl = sponsoredMessage.url;
messageObject.sponsoredRecommended = sponsoredMessage.recommended;
messageObject.sponsoredShowPeerPhoto = sponsoredMessage.show_peer_photo;
messageObject.sponsoredPhoto = sponsoredMessage.photo;
messageObject.sponsoredInfo = sponsoredMessage.sponsor_info;
messageObject.sponsoredAdditionalInfo = sponsoredMessage.additional_info;
messageObject.sponsoredWebPage = sponsoredMessage.webpage;
messageObject.sponsoredBotApp = sponsoredMessage.app;
messageObject.sponsoredButtonText = sponsoredMessage.button_text;
messageObject.sponsoredCanReport = sponsoredMessage.can_report;
messageObject.sponsoredColor = sponsoredMessage.color;
result.add(messageObject);
}
}
@ -19831,7 +20048,7 @@ public class MessagesController extends BaseController implements NotificationCe
});
}
public void setCustomChatReactions(long chatId, int type, List<TLRPC.Reaction> reactions, Utilities.Callback<TLRPC.TL_error> onError, Runnable onSuccess) {
public void setCustomChatReactions(long chatId, int type, List<TLRPC.Reaction> reactions, int reactionsCount, Utilities.Callback<TLRPC.TL_error> onError, Runnable onSuccess) {
TLRPC.TL_messages_setChatAvailableReactions req = new TLRPC.TL_messages_setChatAvailableReactions();
req.peer = getInputPeer(-chatId);
if (type == ChatReactionsEditActivity.SELECT_TYPE_NONE || reactions.isEmpty()) {
@ -19843,6 +20060,8 @@ public class MessagesController extends BaseController implements NotificationCe
req.available_reactions = someReactions;
someReactions.reactions.addAll(reactions);
}
req.flags |= 1;
req.reactions_limit = reactionsCount;
getConnectionsManager().sendRequest(req, (response, error) -> {
if (response != null) {
processUpdates((TLRPC.Updates) response, false);
@ -19871,6 +20090,17 @@ public class MessagesController extends BaseController implements NotificationCe
});
}
});
TLRPC.ChatFull chatFull = getChatFull(chatId);
if (chatFull != null) {
if (chatFull instanceof TLRPC.TL_channelFull) {
chatFull.flags2 |= 8192;
} else {
chatFull.flags |= 1048576;
}
chatFull.reactions_limit = reactionsCount;
getMessagesStorage().updateChatInfo(chatFull, false);
}
}
public void setChatReactions(long chatId, int type, List<String> reactions) {
@ -19975,6 +20205,24 @@ public class MessagesController extends BaseController implements NotificationCe
return false;
}
public void getChannelParticipant(TLRPC.Chat chat, TLRPC.User user, Utilities.Callback<TLRPC.ChannelParticipant> callback) {
if (chat == null || user == null) {
if (callback != null) {
callback.run(null);
}
return;
}
TLRPC.TL_channels_getParticipant req = new TLRPC.TL_channels_getParticipant();
req.channel = getInputChannel(chat.id);
req.participant = getInputPeer(user);
getConnectionsManager().sendRequest(req, (res, err) -> {
if (callback != null) {
TLRPC.ChannelParticipant participant = res instanceof TLRPC.TL_channels_channelParticipant ? ((TLRPC.TL_channels_channelParticipant) res).participant : null;
callback.run(participant);
}
});
}
public void checkIsInChat(boolean tryCacheFirst, TLRPC.Chat chat, TLRPC.User user, IsInChatCheckedCallback callback) {
if (chat == null || user == null) {
if (callback != null) {
@ -20397,9 +20645,16 @@ public class MessagesController extends BaseController implements NotificationCe
}
private HashMap<Long, ChannelRecommendations> cachedChannelRecommendations;
public ChannelRecommendations getCachedChannelRecommendations(long chatId) {
if (cachedChannelRecommendations == null) {
return null;
}
return cachedChannelRecommendations.get(chatId);
}
public ChannelRecommendations getChannelRecommendations(long chatId) {
TLRPC.InputChannel inputChannel = getInputChannel(chatId);
if (inputChannel == null) {
if (inputChannel == null && chatId != 0) {
return null;
}
if (cachedChannelRecommendations == null) {
@ -20415,7 +20670,10 @@ public class MessagesController extends BaseController implements NotificationCe
}
cachedChannelRecommendations.put(chatId, null);
TLRPC.TL_channels_getChannelRecommendations req = new TLRPC.TL_channels_getChannelRecommendations();
req.channel = inputChannel;
if (chatId != 0) {
req.flags |= 1;
req.channel = inputChannel;
}
getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> {
if (res instanceof TLRPC.messages_Chats) {
ArrayList<TLRPC.Chat> chats = ((TLRPC.messages_Chats) res).chats;
@ -20907,4 +21165,22 @@ public class MessagesController extends BaseController implements NotificationCe
}
}));
}
public void disableAds(boolean send) {
TLRPC.UserFull userFull = getUserFull(getUserConfig().getClientUserId());
if (userFull == null) return;
userFull.sponsored_enabled = false;
getMessagesStorage().updateUserInfo(userFull, false);
if (send) {
TLRPC.TL_account_toggleSponsoredMessages req = new TLRPC.TL_account_toggleSponsoredMessages();
req.enabled = false;
getConnectionsManager().sendRequest(req, null);
}
}
public boolean isSponsoredDisabled() {
TLRPC.UserFull userFull = getUserFull(getUserConfig().getClientUserId());
if (userFull == null) return false;
return !userFull.sponsored_enabled;
}
}

View file

@ -104,7 +104,7 @@ public class MessagesStorage extends BaseController {
}
}
public final static int LAST_DB_VERSION = 152;
public final static int LAST_DB_VERSION = 153;
private boolean databaseMigrationInProgress;
public boolean showClearDatabaseAlert;
private LongSparseIntArray dialogIsForum = new LongSparseIntArray();
@ -698,7 +698,7 @@ public class MessagesStorage extends BaseController {
database.executeFast("CREATE TABLE stories (dialog_id INTEGER, story_id INTEGER, data BLOB, custom_params BLOB, PRIMARY KEY (dialog_id, story_id));").stepThis().dispose();
database.executeFast("CREATE TABLE stories_counter (dialog_id INTEGER PRIMARY KEY, count INTEGER, max_read INTEGER);").stepThis().dispose();
database.executeFast("CREATE TABLE profile_stories (dialog_id INTEGER, story_id INTEGER, data BLOB, type INTEGER, seen INTEGER, PRIMARY KEY(dialog_id, story_id));").stepThis().dispose();
database.executeFast("CREATE TABLE profile_stories (dialog_id INTEGER, story_id INTEGER, data BLOB, type INTEGER, seen INTEGER, pin INTEGER, PRIMARY KEY(dialog_id, story_id));").stepThis().dispose();
database.executeFast("CREATE TABLE story_drafts (id INTEGER PRIMARY KEY, date INTEGER, data BLOB, type INTEGER);").stepThis().dispose();
@ -1312,6 +1312,16 @@ public class MessagesStorage extends BaseController {
});
}
public void deleteAllStoryReactionPushMessages() {
storageQueue.postRunnable(() -> {
try {
database.executeFast("DELETE FROM unread_push_messages WHERE is_reaction = 2").stepThis().dispose();
} catch (Exception e) {
checkSQLException(e);
}
});
}
public void putPushMessage(MessageObject message) {
storageQueue.postRunnable(() -> {
try {
@ -1350,7 +1360,7 @@ public class MessagesStorage extends BaseController {
}
state.bindInteger(9, flags);
state.bindLong(10, MessageObject.getTopicId(currentAccount, message.messageOwner, false));
state.bindInteger(11, message.isReactionPush ? 1 : 0);
state.bindInteger(11, (message.isReactionPush ? 1 : 0) + (message.isStoryReactionPush ? 1 : 0));
state.step();
data.reuse();
@ -3717,7 +3727,9 @@ public class MessagesStorage extends BaseController {
}
MessageObject messageObject = new MessageObject(currentAccount, message, messageText, name, userName, (flags & 1) != 0, (flags & 2) != 0, (message.flags & 0x80000000) != 0, false);
messageObject.isReactionPush = cursor.intValue(10) != 0;
final int is_reaction = cursor.intValue(10);
messageObject.isReactionPush = is_reaction == 1;
messageObject.isStoryReactionPush = is_reaction == 2;
pushMessages.add(messageObject);
addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null);
}
@ -5175,7 +5187,7 @@ public class MessagesStorage extends BaseController {
TLRPC.Message message = new TLRPC.TL_message();
SQLiteCursor cursor = null;
try {
cursor = database.queryFinalized("SELECT custom_params FROM messages_v2 WHERE mid = " + messageId + " AND uid = " + dialogId);
cursor = database.queryFinalized("SELECT custom_params FROM messages_v2 WHERE mid = ? AND uid = ?", messageId, dialogId);
boolean read = false;
if (cursor.next()) {
MessageCustomParamsHelper.readLocalParams(message, cursor.byteBufferValue(0));
@ -5184,7 +5196,7 @@ public class MessagesStorage extends BaseController {
cursor.dispose();
cursor = null;
if (!read) {
cursor = database.queryFinalized("SELECT custom_params FROM messages_topics WHERE mid = " + messageId + " AND uid = " + dialogId);
cursor = database.queryFinalized("SELECT custom_params FROM messages_topics WHERE mid = ? AND uid = ?", messageId, dialogId);
if (cursor.next()) {
MessageCustomParamsHelper.readLocalParams(message, cursor.byteBufferValue(0));
read = true;

View file

@ -706,6 +706,9 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
}
} else if (id == NotificationCenter.messagePlayingDidSeek) {
MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject();
if (messageObject == null) {
return;
}
long progress = Math.round(messageObject.audioPlayerDuration * (float) args[1]) * 1000L;
updatePlaybackState(progress);
if (remoteControlClient != null && Build.VERSION.SDK_INT >= 18) {

View file

@ -44,6 +44,7 @@ public class NotificationCenter {
public static final int loadingMessagesFailed = totalEvents++;
public static final int messageReceivedByAck = totalEvents++;
public static final int messageReceivedByServer = totalEvents++;
public static final int messageReceivedByServer2 = totalEvents++;
public static final int messageSendError = totalEvents++;
public static final int forceImportContactsStart = totalEvents++;
public static final int contactsDidLoad = totalEvents++;

View file

@ -27,6 +27,8 @@ public class NotificationDismissReceiver extends BroadcastReceiver {
int date = intent.getIntExtra("messageDate", 0);
if (intent.hasExtra("story") && intent.getBooleanExtra("story", false)) {
NotificationsController.getInstance(currentAccount).processIgnoreStories();
} else if (intent.hasExtra("storyReaction") && intent.getBooleanExtra("storyReaction", false)) {
NotificationsController.getInstance(currentAccount).processIgnoreStoryReactions();
} else if (dialogId == 0) {
MessagesController.getNotificationsSettings(currentAccount).edit().putInt("dismissDate", date).commit();
} else {

View file

@ -253,7 +253,11 @@ public class NotificationsController extends BaseController {
}
NotificationChannel notificationChannel = systemNotificationManager.getNotificationChannel(OTHER_NOTIFICATIONS_CHANNEL);
if (notificationChannel != null && notificationChannel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
systemNotificationManager.deleteNotificationChannel(OTHER_NOTIFICATIONS_CHANNEL);
try {
systemNotificationManager.deleteNotificationChannel(OTHER_NOTIFICATIONS_CHANNEL);
} catch (Exception e) {
FileLog.e(e);
}
OTHER_NOTIFICATIONS_CHANNEL = null;
notificationChannel = null;
}
@ -319,7 +323,7 @@ public class NotificationsController extends BaseController {
SharedPreferences.Editor editor = preferences.edit();
long flags;
boolean override = topicId != 0;
boolean defaultEnabled = NotificationsController.getInstance(currentAccount).isGlobalNotificationsEnabled(did);
boolean defaultEnabled = NotificationsController.getInstance(currentAccount).isGlobalNotificationsEnabled(did, false, false);
String sharedPrefKey = NotificationsController.getSharedPrefKey(did, topicId);
if (selectedTimeInSeconds == Integer.MAX_VALUE) {
@ -511,6 +515,8 @@ public class NotificationsController extends BaseController {
int mid = mids.get(b);
MessageObject messageObject = sparseArray.get(mid);
if (messageObject != null) {
if (messageObject.isStoryReactionPush)
continue;
if (isReactions && !messageObject.isReactionPush) {
continue;
}
@ -664,6 +670,31 @@ public class NotificationsController extends BaseController {
});
}
public void processSeenStoryReactions(long dialogId, int storyId) {
if (dialogId != getUserConfig().getClientUserId())
return;
notificationsQueue.postRunnable(() -> {
boolean changed = false;
for (int i = 0; i < pushMessages.size(); ++i) {
MessageObject msgObject = pushMessages.get(i);
if (msgObject.isStoryReactionPush && Math.abs(msgObject.getId()) == storyId) {
pushMessages.remove(i);
SparseArray<MessageObject> msgs = pushMessagesDict.get(msgObject.getDialogId());
if (msgs != null) msgs.remove(msgObject.getId());
if (msgs != null && msgs.size() <= 0) pushMessagesDict.remove(msgObject.getDialogId());
ArrayList<Integer> ids = new ArrayList<>();
ids.add(msgObject.getId());
getMessagesStorage().deletePushMessages(msgObject.getDialogId(), ids);
i--;
changed = true;
}
}
if (changed) {
showOrUpdateNotification(false);
}
});
}
public void processDeleteStory(long dialogId, int storyId) {
notificationsQueue.postRunnable(() -> {
boolean changed = false;
@ -723,6 +754,27 @@ public class NotificationsController extends BaseController {
});
}
public void processIgnoreStoryReactions() {
notificationsQueue.postRunnable(() -> {
boolean changed = false;
for (int i = 0; i < pushMessages.size(); ++i) {
MessageObject msg = pushMessages.get(i);
if (msg != null && msg.isStoryReactionPush) {
pushMessages.remove(i);
i--;
SparseArray<MessageObject> arr = pushMessagesDict.get(msg.getDialogId());
if (arr != null) arr.remove(msg.getId());
if (arr != null && arr.size() <= 0) pushMessagesDict.remove(msg.getDialogId());
changed = true;
}
}
getMessagesStorage().deleteAllStoryReactionPushMessages();
if (changed) {
showOrUpdateNotification(false);
}
});
}
public void processIgnoreStories(long dialogId) {
notificationsQueue.postRunnable(() -> {
boolean changed = !storyPushMessages.isEmpty();
@ -735,6 +787,10 @@ public class NotificationsController extends BaseController {
});
}
public void processReadStories() {
}
public void processReadMessages(LongSparseIntArray inbox, long dialogId, int maxDate, int maxId, boolean isPopup) {
ArrayList<MessageObject> popupArrayRemove = new ArrayList<>(0);
notificationsQueue.postRunnable(() -> {
@ -744,13 +800,15 @@ public class NotificationsController extends BaseController {
int messageId = inbox.get(key);
for (int a = 0; a < pushMessages.size(); a++) {
MessageObject messageObject = pushMessages.get(a);
if (!messageObject.messageOwner.from_scheduled && messageObject.getDialogId() == key && messageObject.getId() <= messageId) {
if (!messageObject.messageOwner.from_scheduled && messageObject.getDialogId() == key && messageObject.getId() <= messageId && !messageObject.isStoryReactionPush) {
if (isPersonalMessage(messageObject)) {
personalCount--;
}
popupArrayRemove.add(messageObject);
long did;
if (messageObject.messageOwner.peer_id.channel_id != 0) {
if (messageObject.isStoryReactionPush) {
did = messageObject.getDialogId();
} else if (messageObject.messageOwner.peer_id.channel_id != 0) {
did = -messageObject.messageOwner.peer_id.channel_id;
} else {
did = 0;
@ -772,7 +830,7 @@ public class NotificationsController extends BaseController {
if (dialogId != 0 && (maxId != 0 || maxDate != 0)) {
for (int a = 0; a < pushMessages.size(); a++) {
MessageObject messageObject = pushMessages.get(a);
if (messageObject.getDialogId() == dialogId) {
if (messageObject.getDialogId() == dialogId && !messageObject.isStoryReactionPush) {
boolean remove = false;
if (maxDate != 0) {
if (messageObject.messageOwner.date <= maxDate) {
@ -794,7 +852,9 @@ public class NotificationsController extends BaseController {
personalCount--;
}
long did;
if (messageObject.messageOwner.peer_id.channel_id != 0) {
if (messageObject.isStoryReactionPush) {
did = messageObject.getDialogId();
} else if (messageObject.messageOwner.peer_id.channel_id != 0) {
did = -messageObject.messageOwner.peer_id.channel_id;
} else {
did = 0;
@ -826,6 +886,7 @@ public class NotificationsController extends BaseController {
}
private int addToPopupMessages(ArrayList<MessageObject> popupArrayAdd, MessageObject messageObject, long dialogId, boolean isChannel, SharedPreferences preferences) {
if (messageObject.isStoryReactionPush) return 0;
int popup = 0;
if (!DialogObject.isEncryptedDialog(dialogId)) {
if (preferences.getBoolean("custom_" + dialogId, false)) {
@ -865,7 +926,9 @@ public class NotificationsController extends BaseController {
for (int b = 0, N2 = messages.size(); b < N2; b++) {
MessageObject messageObject = messages.get(b);
long did;
if (messageObject.messageOwner.peer_id.channel_id != 0) {
if (messageObject.isStoryReactionPush) {
did = messageObject.getDialogId();
} else if (messageObject.messageOwner.peer_id.channel_id != 0) {
did = -messageObject.messageOwner.peer_id.channel_id;
} else {
did = 0;
@ -875,7 +938,7 @@ public class NotificationsController extends BaseController {
break;
}
MessageObject oldMessage = sparseArray.get(messageObject.getId());
if (oldMessage != null && oldMessage.isReactionPush) {
if (oldMessage != null && (oldMessage.isReactionPush || oldMessage.isStoryReactionPush)) {
oldMessage = null;
}
if (oldMessage != null) {
@ -967,7 +1030,9 @@ public class NotificationsController extends BaseController {
isChannel = false;
}
long did;
if (messageObject.messageOwner.peer_id.channel_id != 0) {
if (messageObject.isStoryReactionPush) {
did = messageObject.getDialogId();
} else if (messageObject.messageOwner.peer_id.channel_id != 0) {
did = -messageObject.messageOwner.peer_id.channel_id;
} else {
did = 0;
@ -1007,7 +1072,7 @@ public class NotificationsController extends BaseController {
long originalDialogId = dialogId;
long topicId = MessageObject.getTopicId(currentAccount, messageObject.messageOwner, getMessagesController().isForum(messageObject));
if (dialogId == openedDialogId && ApplicationLoader.isScreenOn) {
if (dialogId == openedDialogId && ApplicationLoader.isScreenOn && !messageObject.isStoryReactionPush) {
if (!isFcm) {
playInChatSound();
}
@ -1032,7 +1097,7 @@ public class NotificationsController extends BaseController {
} else {
int notifyOverride = getNotifyOverride(preferences, dialogId, topicId);
if (notifyOverride == -1) {
value = isGlobalNotificationsEnabled(dialogId, isChannel);
value = isGlobalNotificationsEnabled(dialogId, isChannel, messageObject.isReactionPush, messageObject.isStoryReactionPush);
/*if (BuildVars.DEBUG_PRIVATE_VERSION && BuildVars.LOGS_ENABLED) {
FileLog.d("global notify settings for " + dialog_id + " = " + value);
}*/
@ -1113,7 +1178,7 @@ public class NotificationsController extends BaseController {
int notifyOverride = getNotifyOverride(preferences, dialog_id, topicId);
boolean canAddValue;
if (notifyOverride == -1) {
canAddValue = isGlobalNotificationsEnabled(dialog_id, isChannel);
canAddValue = isGlobalNotificationsEnabled(dialog_id, isChannel, messageObject.isReactionPush, messageObject.isStoryReactionPush);
} else {
canAddValue = notifyOverride != 2;
}
@ -1208,7 +1273,7 @@ public class NotificationsController extends BaseController {
if (!forum) {
int notifyOverride = getNotifyOverride(preferences, dialogId, 0);
if (notifyOverride == -1) {
canAddValue = isGlobalNotificationsEnabled(dialogId);
canAddValue = isGlobalNotificationsEnabled(dialogId, false, false);
} else {
canAddValue = notifyOverride != 2;
}
@ -1248,7 +1313,7 @@ public class NotificationsController extends BaseController {
pushDialogsOverrideMention.remove(dialogId);
for (int a = 0; a < pushMessages.size(); a++) {
MessageObject messageObject = pushMessages.get(a);
if (!messageObject.messageOwner.from_scheduled && messageObject.getDialogId() == dialogId) {
if (!messageObject.messageOwner.from_scheduled && messageObject.getDialogId() == dialogId && !messageObject.isStoryReactionPush) {
if (isPersonalMessage(messageObject)) {
personalCount--;
}
@ -1362,7 +1427,7 @@ public class NotificationsController extends BaseController {
} else {
int notifyOverride = getNotifyOverride(preferences, dialog_id, topicId);
if (notifyOverride == -1) {
value = isGlobalNotificationsEnabled(dialog_id);
value = isGlobalNotificationsEnabled(dialog_id, messageObject.isReactionPush, messageObject.isStoryReactionPush);
} else {
value = notifyOverride != 2;
}
@ -1392,7 +1457,7 @@ public class NotificationsController extends BaseController {
} else {
int notifyOverride = getNotifyOverride(preferences, dialog_id, 0);
if (notifyOverride == -1) {
value = isGlobalNotificationsEnabled(dialog_id);
value = isGlobalNotificationsEnabled(dialog_id, false, false);
} else {
value = notifyOverride != 2;
}
@ -1435,7 +1500,7 @@ public class NotificationsController extends BaseController {
} else {
int notifyOverride = getNotifyOverride(preferences, dialogId, topicId);
if (notifyOverride == -1) {
value = isGlobalNotificationsEnabled(dialogId);
value = isGlobalNotificationsEnabled(dialogId, messageObject.isReactionPush, messageObject.isStoryReactionPush);
} else {
value = notifyOverride != 2;
}
@ -1446,7 +1511,9 @@ public class NotificationsController extends BaseController {
}
if (mid != 0) {
long did;
if (messageObject.messageOwner.peer_id.channel_id != 0) {
if (messageObject.isStoryReactionPush) {
did = messageObject.getDialogId();
} else if (messageObject.messageOwner.peer_id.channel_id != 0) {
did = -messageObject.messageOwner.peer_id.channel_id;
} else {
did = 0;
@ -1893,9 +1960,9 @@ public class NotificationsController extends BaseController {
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) object.messageOwner.media;
if (mediaPoll.poll.quiz) {
return LocaleController.formatString("NotificationActionPinnedQuiz2", R.string.NotificationActionPinnedQuiz2, name, chat.title, mediaPoll.poll.question);
return LocaleController.formatString("NotificationActionPinnedQuiz2", R.string.NotificationActionPinnedQuiz2, name, chat.title, mediaPoll.poll.question.text);
} else {
return LocaleController.formatString("NotificationActionPinnedPoll2", R.string.NotificationActionPinnedPoll2, name, chat.title, mediaPoll.poll.question);
return LocaleController.formatString("NotificationActionPinnedPoll2", R.string.NotificationActionPinnedPoll2, name, chat.title, mediaPoll.poll.question.text);
}
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) {
@ -1965,9 +2032,9 @@ public class NotificationsController extends BaseController {
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) object.messageOwner.media;
if (mediaPoll.poll.quiz) {
return LocaleController.formatString("NotificationActionPinnedQuizChannel2", R.string.NotificationActionPinnedQuizChannel2, chat.title, mediaPoll.poll.question);
return LocaleController.formatString("NotificationActionPinnedQuizChannel2", R.string.NotificationActionPinnedQuizChannel2, chat.title, mediaPoll.poll.question.text);
} else {
return LocaleController.formatString("NotificationActionPinnedPollChannel2", R.string.NotificationActionPinnedPollChannel2, chat.title, mediaPoll.poll.question);
return LocaleController.formatString("NotificationActionPinnedPollChannel2", R.string.NotificationActionPinnedPollChannel2, chat.title, mediaPoll.poll.question.text);
}
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) {
@ -2037,9 +2104,9 @@ public class NotificationsController extends BaseController {
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) object.messageOwner.media;
if (mediaPoll.poll.quiz) {
return LocaleController.formatString("NotificationActionPinnedQuizUser", R.string.NotificationActionPinnedQuizUser, name, mediaPoll.poll.question);
return LocaleController.formatString("NotificationActionPinnedQuizUser", R.string.NotificationActionPinnedQuizUser, name, mediaPoll.poll.question.text);
} else {
return LocaleController.formatString("NotificationActionPinnedPollUser", R.string.NotificationActionPinnedPollUser, name, mediaPoll.poll.question);
return LocaleController.formatString("NotificationActionPinnedPollUser", R.string.NotificationActionPinnedPollUser, name, mediaPoll.poll.question.text);
}
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) {
@ -2377,9 +2444,9 @@ public class NotificationsController extends BaseController {
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) messageObject.messageOwner.media;
if (mediaPoll.poll.quiz) {
msg = LocaleController.formatString("NotificationMessageQuiz2", R.string.NotificationMessageQuiz2, name, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationMessageQuiz2", R.string.NotificationMessageQuiz2, name, mediaPoll.poll.question.text);
} else {
msg = LocaleController.formatString("NotificationMessagePoll2", R.string.NotificationMessagePoll2, name, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationMessagePoll2", R.string.NotificationMessagePoll2, name, mediaPoll.poll.question.text);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
msg = LocaleController.formatString("NotificationMessageMap", R.string.NotificationMessageMap, name);
@ -2600,9 +2667,9 @@ public class NotificationsController extends BaseController {
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) object.messageOwner.media;
if (mediaPoll.poll.quiz) {
msg = LocaleController.formatString("NotificationActionPinnedQuiz2", R.string.NotificationActionPinnedQuiz2, name, chat.title, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationActionPinnedQuiz2", R.string.NotificationActionPinnedQuiz2, name, chat.title, mediaPoll.poll.question.text);
} else {
msg = LocaleController.formatString("NotificationActionPinnedPoll2", R.string.NotificationActionPinnedPoll2, name, chat.title, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationActionPinnedPoll2", R.string.NotificationActionPinnedPoll2, name, chat.title, mediaPoll.poll.question.text);
}
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) {
@ -2672,9 +2739,9 @@ public class NotificationsController extends BaseController {
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) object.messageOwner.media;
if (mediaPoll.poll.quiz) {
msg = LocaleController.formatString("NotificationActionPinnedQuizChannel2", R.string.NotificationActionPinnedQuizChannel2, chat.title, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationActionPinnedQuizChannel2", R.string.NotificationActionPinnedQuizChannel2, chat.title, mediaPoll.poll.question.text);
} else {
msg = LocaleController.formatString("NotificationActionPinnedPollChannel2", R.string.NotificationActionPinnedPollChannel2, chat.title, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationActionPinnedPollChannel2", R.string.NotificationActionPinnedPollChannel2, chat.title, mediaPoll.poll.question.text);
}
} else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) {
@ -2746,9 +2813,9 @@ public class NotificationsController extends BaseController {
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) messageObject.messageOwner.media;
if (mediaPoll.poll.quiz) {
msg = LocaleController.formatString("ChannelMessageQuiz2", R.string.ChannelMessageQuiz2, name, mediaPoll.poll.question);
msg = LocaleController.formatString("ChannelMessageQuiz2", R.string.ChannelMessageQuiz2, name, mediaPoll.poll.question.text);
} else {
msg = LocaleController.formatString("ChannelMessagePoll2", R.string.ChannelMessagePoll2, name, mediaPoll.poll.question);
msg = LocaleController.formatString("ChannelMessagePoll2", R.string.ChannelMessagePoll2, name, mediaPoll.poll.question.text);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) messageObject.messageOwner.media;
@ -2819,9 +2886,9 @@ public class NotificationsController extends BaseController {
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) messageObject.messageOwner.media;
if (mediaPoll.poll.quiz) {
msg = LocaleController.formatString("NotificationMessageGroupQuiz2", R.string.NotificationMessageGroupQuiz2, name, chat.title, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationMessageGroupQuiz2", R.string.NotificationMessageGroupQuiz2, name, chat.title, mediaPoll.poll.question.text);
} else {
msg = LocaleController.formatString("NotificationMessageGroupPoll2", R.string.NotificationMessageGroupPoll2, name, chat.title, mediaPoll.poll.question);
msg = LocaleController.formatString("NotificationMessageGroupPoll2", R.string.NotificationMessageGroupPoll2, name, chat.title, mediaPoll.poll.question.text);
}
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
msg = LocaleController.formatString("NotificationMessageGroupGame", R.string.NotificationMessageGroupGame, name, chat.title, messageObject.messageOwner.media.game.title);
@ -2897,7 +2964,7 @@ public class NotificationsController extends BaseController {
private boolean isPersonalMessage(MessageObject messageObject) {
return messageObject.messageOwner.peer_id != null && messageObject.messageOwner.peer_id.chat_id == 0 && messageObject.messageOwner.peer_id.channel_id == 0
&& (messageObject.messageOwner.action == null || messageObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty);
&& (messageObject.messageOwner.action == null || messageObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty) || messageObject.isStoryReactionPush;
}
private int getNotifyOverride(SharedPreferences preferences, long dialog_id, long topicId) {
@ -3118,6 +3185,8 @@ public class NotificationsController extends BaseController {
key = "groups";
} else if (type == TYPE_STORIES) {
key = "stories";
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
key = "reactions";
} else {
key = "private";
}
@ -3143,6 +3212,8 @@ public class NotificationsController extends BaseController {
key = "groups_ia";
} else if (type == TYPE_STORIES) {
key = "stories_ia";
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
key = "reactions_ia";
} else {
key = "private_ia";
}
@ -3166,6 +3237,8 @@ public class NotificationsController extends BaseController {
overwriteKey = "overwrite_group";
} else if (type == TYPE_STORIES) {
overwriteKey = "overwrite_stories";
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
overwriteKey = "overwrite_reactions";
} else {
overwriteKey = "overwrite_private";
}
@ -3291,7 +3364,7 @@ public class NotificationsController extends BaseController {
protected void ensureGroupsCreated() {
SharedPreferences preferences = getAccountInstance().getNotificationsSettings();
if (groupsCreated == null) {
groupsCreated = preferences.getBoolean("groupsCreated4", false);
groupsCreated = preferences.getBoolean("groupsCreated5", false);
}
if (!groupsCreated) {
try {
@ -3312,7 +3385,12 @@ public class NotificationsController extends BaseController {
editor = getAccountInstance().getNotificationsSettings().edit();
}
editor.remove("priority_channel").remove("vibrate_channel").remove("ChannelSoundPath").remove("ChannelSound");
} else if (id.contains("_groups_")) {
} else if (id.contains("_reactions_")) {
if (editor == null) {
editor = getAccountInstance().getNotificationsSettings().edit();
}
editor.remove("priority_react").remove("vibrate_react").remove("ReactionSoundPath").remove("ReactionSound");
} else if (id.contains("_groups_")) {
if (editor == null) {
editor = getAccountInstance().getNotificationsSettings().edit();
}
@ -3342,7 +3420,7 @@ public class NotificationsController extends BaseController {
} catch (Exception e) {
FileLog.e(e);
}
preferences.edit().putBoolean("groupsCreated4", true).commit();
preferences.edit().putBoolean("groupsCreated5", true).commit();
groupsCreated = true;
}
if (!channelGroupsCreated) {
@ -3351,6 +3429,7 @@ public class NotificationsController extends BaseController {
String groupsId = "groups" + currentAccount;
String privateId = "private" + currentAccount;
String storiesId = "stories" + currentAccount;
String reactionsId = "reactions" + currentAccount;
String otherId = "other" + currentAccount;
for (int a = 0, N = list.size(); a < N; a++) {
String id = list.get(a).getId();
@ -3360,17 +3439,19 @@ public class NotificationsController extends BaseController {
groupsId = null;
} else if (storiesId != null && storiesId.equals(id)) {
storiesId = null;
} else if (reactionsId != null && reactionsId.equals(id)) {
reactionsId = null;
} else if (privateId != null && privateId.equals(id)) {
privateId = null;
} else if (otherId != null && otherId.equals(id)) {
otherId = null;
}
if (channelsId == null && storiesId == null && groupsId == null && privateId == null && otherId == null) {
if (channelsId == null && storiesId == null && reactionsId == null && groupsId == null && privateId == null && otherId == null) {
break;
}
}
if (channelsId != null || groupsId != null || storiesId != null || privateId != null || otherId != null) {
if (channelsId != null || groupsId != null || reactionsId != null || storiesId != null || privateId != null || otherId != null) {
TLRPC.User user = getMessagesController().getUser(getUserConfig().getClientUserId());
if (user == null) {
getUserConfig().getCurrentUser();
@ -3390,7 +3471,10 @@ public class NotificationsController extends BaseController {
channelGroups.add(new NotificationChannelGroup(groupsId, LocaleController.getString("NotificationsGroups", R.string.NotificationsGroups) + userName));
}
if (storiesId != null) {
channelGroups.add(new NotificationChannelGroup(storiesId, LocaleController.getString("NotificationsStories", R.string.NotificationsStories) + userName));
channelGroups.add(new NotificationChannelGroup(storiesId, LocaleController.getString(R.string.NotificationsStories) + userName));
}
if (reactionsId != null) {
channelGroups.add(new NotificationChannelGroup(reactionsId, LocaleController.getString(R.string.NotificationsReactions) + userName));
}
if (privateId != null) {
channelGroups.add(new NotificationChannelGroup(privateId, LocaleController.getString("NotificationsPrivateChats", R.string.NotificationsPrivateChats) + userName));
@ -3428,6 +3512,9 @@ public class NotificationsController extends BaseController {
} else if (type == TYPE_STORIES) {
groupId = "stories" + currentAccount;
overwriteKey = "overwrite_stories";
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
groupId = "reactions" + currentAccount;
overwriteKey = "overwrite_reactions";
} else {
groupId = "private" + currentAccount;
overwriteKey = "overwrite_private";
@ -3453,6 +3540,8 @@ public class NotificationsController extends BaseController {
key = isInApp ? "groups_ia" : "groups";
} else if (type == TYPE_STORIES) {
key = isInApp ? "stories_ia" : "stories";
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
key = isInApp ? "reactions_ia" : "reactions";
} else {
key = isInApp ? "private_ia" : "private";
}
@ -3511,6 +3600,9 @@ public class NotificationsController extends BaseController {
if (!isInApp) {
if (type == TYPE_STORIES) {
editor.putBoolean("EnableAllStories", false);
} else if (type == TYPE_REACTIONS_MESSAGES) {
editor.putBoolean("EnableReactionsMessages", true);
editor.putBoolean("EnableReactionsStories", true);
} else {
editor.putInt(getGlobalNotificationsKey(type), Integer.MAX_VALUE);
}
@ -3541,6 +3633,9 @@ public class NotificationsController extends BaseController {
if (isDefault) {
if (type == TYPE_STORIES) {
editor.putBoolean("EnableAllStories", true);
} else if (type == TYPE_REACTIONS_MESSAGES) {
editor.putBoolean("EnableReactionsMessages", true);
editor.putBoolean("EnableReactionsStories", true);
} else {
editor.putInt(getGlobalNotificationsKey(type), 0);
}
@ -3550,6 +3645,8 @@ public class NotificationsController extends BaseController {
editor.putInt("priority_group", priority);
} else if (type == TYPE_STORIES) {
editor.putInt("priority_stories", priority);
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
editor.putInt("priority_react", priority);
} else {
editor.putInt("priority_messages", priority);
}
@ -3578,6 +3675,8 @@ public class NotificationsController extends BaseController {
editor.putInt("vibrate_group", vibrate ? 0 : 2);
} else if (type == TYPE_STORIES) {
editor.putInt("vibrate_stories", vibrate ? 0 : 2);
} else if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
editor.putInt("vibrate_react", vibrate ? 0 : 2);
} else {
editor.putInt("vibrate_messages", vibrate ? 0 : 2);
}
@ -3600,6 +3699,8 @@ public class NotificationsController extends BaseController {
editor.putInt("GroupLed", channelLedColor);
} else if (type == TYPE_STORIES) {
editor.putInt("StoriesLed", channelLedColor);
} else if (type == TYPE_REACTIONS_STORIES || type == TYPE_REACTIONS_MESSAGES) {
editor.putInt("ReactionsLed", channelLedColor);
} else {
editor.putInt("MessagesLed", channelLedColor);
}
@ -3816,7 +3917,7 @@ public class NotificationsController extends BaseController {
int notifyOverride = getNotifyOverride(preferences, override_dialog_id, topicId);
boolean value;
if (notifyOverride == -1) {
value = isGlobalNotificationsEnabled(dialog_id, isChannel);
value = isGlobalNotificationsEnabled(dialog_id, isChannel, lastMessageObject.isReactionPush, lastMessageObject.isReactionPush);
} else {
value = notifyOverride != 2;
}
@ -3846,6 +3947,9 @@ public class NotificationsController extends BaseController {
} else {
name = chatName;
}
if (lastMessageObject != null && (lastMessageObject.isReactionPush || lastMessageObject.isStoryReactionPush) && !preferences.getBoolean("EnableReactionsPreview", true)) {
name = LocaleController.getString("NotificationHiddenName", R.string.NotificationHiddenName);
}
String detailText;
if (UserConfig.getActivatedAccountsCount() > 1) {
@ -4001,7 +4105,19 @@ public class NotificationsController extends BaseController {
}
boolean vibrateOnlyIfSilent = false;
if (chatId != 0) {
if (lastMessageObject != null && (lastMessageObject.isReactionPush || lastMessageObject.isStoryReactionPush)) {
long soundDocumentId = preferences.getLong("ReactionSoundDocId", 0);
if (soundDocumentId != 0) {
isInternalSoundFile = true;
soundPath = getMediaDataController().ringtoneDataStore.getSoundPath(soundDocumentId);
} else {
soundPath = preferences.getString("ReactionSoundPath", defaultPath);
}
vibrate = preferences.getInt("vibrate_react", 0);
importance = preferences.getInt("priority_react", 1);
ledColor = preferences.getInt("ReactionsLed", 0xff0000ff);
chatType = lastMessageObject.isStoryReactionPush ? TYPE_REACTIONS_STORIES : TYPE_REACTIONS_MESSAGES;
} else if (chatId != 0) {
if (isChannel) {
long soundDocumentId = preferences.getLong("ChannelSoundDocId", 0);
if (soundDocumentId != 0) {
@ -4096,7 +4212,9 @@ public class NotificationsController extends BaseController {
intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
if (lastMessageObject.isStoryPush) {
if (lastMessageObject.isStoryReactionPush) {
intent.putExtra("storyId", Math.abs(lastMessageObject.getId()));
} else if (lastMessageObject.isStoryPush) {
long[] peerIds = new long[storyPushMessages.size()];
for (int i = 0; i < storyPushMessages.size(); ++i) {
peerIds[i] = storyPushMessages.get(i).dialogId;
@ -4159,6 +4277,9 @@ public class NotificationsController extends BaseController {
if (lastMessageObject.isStoryPush) {
dismissIntent.putExtra("story", true);
}
if (lastMessageObject.isStoryReactionPush) {
dismissIntent.putExtra("storyReaction", true);
}
mBuilder.setDeleteIntent(PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 1, dismissIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT));
} catch (Throwable e) {
FileLog.e(e);
@ -4342,6 +4463,8 @@ public class NotificationsController extends BaseController {
editor.putString("GlobalSound", ringtoneName);
} else if (chatType == TYPE_STORIES) {
editor.putString("StoriesSound", ringtoneName);
} else if (chatType == TYPE_REACTIONS_MESSAGES || chatType == TYPE_REACTIONS_STORIES) {
editor.putString("ReactionSound", ringtoneName);
}
if (chatType == TYPE_CHANNEL) {
editor.putString("ChannelSoundPath", newSound);
@ -4351,6 +4474,8 @@ public class NotificationsController extends BaseController {
editor.putString("GlobalSoundPath", newSound);
} else if (chatType == TYPE_STORIES) {
editor.putString("StoriesSoundPath", newSound);
} else if (chatType == TYPE_REACTIONS_MESSAGES || chatType == TYPE_REACTIONS_STORIES) {
editor.putString("ReactionSound", newSound);
}
getNotificationsController().deleteNotificationChannelGlobalInternal(chatType, -1);
} else {
@ -4527,7 +4652,7 @@ public class NotificationsController extends BaseController {
photoPath = user.photo.photo_small;
}
} else if (!DialogObject.isEncryptedDialog(dialogId)) {
canReply = (lastMessageObject != null && !lastMessageObject.isReactionPush) && dialogId != 777000;
canReply = (lastMessageObject != null && !lastMessageObject.isReactionPush && !lastMessageObject.isStoryReactionPush) && dialogId != 777000;
if (DialogObject.isUserDialog(dialogId)) {
user = getMessagesController().getUser(dialogId);
if (user == null) {
@ -4605,6 +4730,11 @@ public class NotificationsController extends BaseController {
name = LocaleController.getString("SecretChatName", R.string.SecretChatName);
photoPath = null;
}
if (lastMessageObject != null && lastMessageObject.isStoryReactionPush && !preferences.getBoolean("EnableReactionsPreview", true)) {
canReply = false;
name = LocaleController.getString("NotificationHiddenChatName", R.string.NotificationHiddenChatName);
photoPath = null;
}
if (waitingForPasscode) {
if (DialogObject.isChatDialog(dialogId)) {
@ -4964,7 +5094,9 @@ public class NotificationsController extends BaseController {
intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
if (dialogKey.story) {
if (lastMessageObject != null && lastMessageObject.isStoryReactionPush) {
intent.putExtra("storyId", Math.abs(lastMessageObject.getId()));
} else if (dialogKey.story) {
long[] peerIds = new long[storyPushMessages.size()];
for (int i = 0; i < storyPushMessages.size(); ++i) {
peerIds[i] = storyPushMessages.get(i).dialogId;
@ -5068,7 +5200,7 @@ public class NotificationsController extends BaseController {
if (wearReplyAction != null) {
builder.addAction(wearReplyAction);
}
if (!waitingForPasscode && !dialogKey.story) {
if (!waitingForPasscode && !dialogKey.story && (lastMessageObject == null || !lastMessageObject.isStoryReactionPush)) {
builder.addAction(readAction);
}
if (sortedDialogs.size() == 1 && !TextUtils.isEmpty(summary) && !dialogKey.story) {
@ -5395,7 +5527,7 @@ public class NotificationsController extends BaseController {
SharedPreferences.Editor editor = preferences.edit();
TLRPC.Dialog dialog = MessagesController.getInstance(UserConfig.selectedAccount).dialogs_dict.get(dialog_id);
if (setting == SETTING_MUTE_UNMUTE) {
boolean defaultEnabled = isGlobalNotificationsEnabled(dialog_id);
boolean defaultEnabled = isGlobalNotificationsEnabled(dialog_id, false, false);
if (defaultEnabled) {
editor.remove("notify2_" + NotificationsController.getSharedPrefKey(dialog_id, topicId));
} else {
@ -5513,9 +5645,36 @@ public class NotificationsController extends BaseController {
public final static int TYPE_PRIVATE = 1;
public final static int TYPE_CHANNEL = 2;
public final static int TYPE_STORIES = 3;
public final static int TYPE_REACTIONS_MESSAGES = 4;
public final static int TYPE_REACTIONS_STORIES = 5;
public void updateServerNotificationsSettings(int type) {
SharedPreferences preferences = getAccountInstance().getNotificationsSettings();
if (type == TYPE_REACTIONS_MESSAGES || type == TYPE_REACTIONS_STORIES) {
TLRPC.TL_account_setReactionsNotifySettings req = new TLRPC.TL_account_setReactionsNotifySettings();
req.settings = new TLRPC.TL_reactionsNotifySettings();
if (preferences.getBoolean("EnableReactionsMessages", true)) {
req.settings.flags |= 1;
if (preferences.getBoolean("EnableReactionsMessagesContacts", false)) {
req.settings.messages_notify_from = new TLRPC.TL_reactionNotificationsFromContacts();
} else {
req.settings.messages_notify_from = new TLRPC.TL_reactionNotificationsFromAll();
}
}
if (preferences.getBoolean("EnableReactionsStories", true)) {
req.settings.flags |= 2;
if (preferences.getBoolean("EnableReactionsStoriesContacts", false)) {
req.settings.stories_notify_from = new TLRPC.TL_reactionNotificationsFromContacts();
} else {
req.settings.stories_notify_from = new TLRPC.TL_reactionNotificationsFromAll();
}
}
req.settings.show_previews = preferences.getBoolean("EnableReactionsPreview", true);
req.settings.sound = getInputSound(preferences, "ReactionSound", "ReactionSoundDocId", "ReactionSoundPath");
getConnectionsManager().sendRequest(req, (response, error) -> { });
return;
}
TLRPC.TL_account_updateNotifySettings req = new TLRPC.TL_account_updateNotifySettings();
req.settings = new TLRPC.TL_inputPeerNotifySettings();
req.settings.flags = 5;
@ -5576,13 +5735,17 @@ public class NotificationsController extends BaseController {
}
}
public boolean isGlobalNotificationsEnabled(long dialogId) {
return isGlobalNotificationsEnabled(dialogId, null);
public boolean isGlobalNotificationsEnabled(long dialogId, boolean isReaction, boolean isStoryReaction) {
return isGlobalNotificationsEnabled(dialogId, null, isReaction, isStoryReaction);
}
public boolean isGlobalNotificationsEnabled(long dialogId, Boolean forceChannel) {
public boolean isGlobalNotificationsEnabled(long dialogId, Boolean forceChannel, boolean isReaction, boolean isStoryReaction) {
int type;
if (DialogObject.isChatDialog(dialogId)) {
if (isReaction) {
type = TYPE_REACTIONS_MESSAGES;
} else if (isStoryReaction) {
type = TYPE_REACTIONS_STORIES;
} else if (DialogObject.isChatDialog(dialogId)) {
if (forceChannel != null) {
if (forceChannel) {
type = TYPE_CHANNEL;
@ -5604,6 +5767,12 @@ public class NotificationsController extends BaseController {
}
public boolean isGlobalNotificationsEnabled(int type) {
if (type == TYPE_REACTIONS_MESSAGES) {
return getAccountInstance().getNotificationsSettings().getBoolean("EnableReactionsMessages", true);
}
if (type == TYPE_REACTIONS_STORIES) {
return getAccountInstance().getNotificationsSettings().getBoolean("EnableReactionsStories", true);
}
if (type == TYPE_STORIES) {
return getAccountInstance().getNotificationsSettings().getBoolean("EnableAllStories", true);
}
@ -5631,7 +5800,7 @@ public class NotificationsController extends BaseController {
if (mute) {
NotificationsController.getInstance(currentAccount).muteUntil(dialog_id, topicId, Integer.MAX_VALUE);
} else {
boolean defaultEnabled = NotificationsController.getInstance(currentAccount).isGlobalNotificationsEnabled(dialog_id);
boolean defaultEnabled = NotificationsController.getInstance(currentAccount).isGlobalNotificationsEnabled(dialog_id, false, false);
boolean override = topicId != 0;
SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount);
SharedPreferences.Editor editor = preferences.edit();

View file

@ -1,6 +1,8 @@
package org.telegram.messenger;
import static org.telegram.messenger.NotificationsController.TYPE_PRIVATE;
import static org.telegram.messenger.NotificationsController.TYPE_REACTIONS_MESSAGES;
import static org.telegram.messenger.NotificationsController.TYPE_REACTIONS_STORIES;
import android.content.SharedPreferences;
@ -208,6 +210,10 @@ public class NotificationsSettingsFacade {
soundPref = "GlobalSound";
soundDocPref = "GlobalSoundDocId";
soundPathPref = "GlobalSoundPath";
} else if (globalType == TYPE_REACTIONS_MESSAGES || globalType == TYPE_REACTIONS_STORIES) {
soundPref = "ReactionSound";
soundDocPref = "ReactionSoundDocId";
soundPathPref = "ReactionSoundPath";
} else {
soundPref = "ChannelSound";
soundDocPref = "ChannelSoundDocId";

View file

@ -373,6 +373,8 @@ public class PushListenerController {
int msg_id;
if (custom.has("msg_id")) {
msg_id = custom.getInt("msg_id");
} else if (custom.has("story_id")) {
msg_id = custom.getInt("story_id");
} else {
msg_id = 0;
}
@ -1199,6 +1201,9 @@ public class PushListenerController {
}
if (messageText != null) {
TLRPC.TL_message messageOwner = new TLRPC.TL_message();
if (loc_key.startsWith("REACT_STORY") && msg_id > 0) {
msg_id = -msg_id;
}
messageOwner.id = msg_id;
messageOwner.random_id = random_id;
messageOwner.message = message1 != null ? message1 : messageText;
@ -1243,7 +1248,8 @@ public class PushListenerController {
messageObject.messageOwner.reply_to.forum_topic = true;
messageObject.messageOwner.reply_to.reply_to_top_id = topicId;
}
messageObject.isReactionPush = loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_");
messageObject.isStoryReactionPush = loc_key.startsWith("REACT_STORY");
messageObject.isReactionPush = !messageObject.isStoryReactionPush && (loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_"));
messageObject.isStoryPush = loc_key.equals("STORY_NOTEXT") || loc_key.equals("STORY_HIDDEN_AUTHOR");
messageObject.isStoryMentionPush = loc_key.equals("MESSAGE_STORY_MENTION");
messageObject.isStoryPushHidden = loc_key.equals("STORY_HIDDEN_AUTHOR");
@ -1288,107 +1294,117 @@ public class PushListenerController {
private static String getReactedText(String loc_key, Object[] args) {
switch (loc_key) {
case "REACT_HIDDEN": {
return LocaleController.formatString(R.string.PushReactHidden, args);
}
case "REACT_TEXT": {
return LocaleController.formatString("PushReactText", R.string.PushReactText, args);
return LocaleController.formatString(R.string.PushReactText, args);
}
case "REACT_NOTEXT": {
return LocaleController.formatString("PushReactNoText", R.string.PushReactNoText, args);
return LocaleController.formatString(R.string.PushReactNoText, args);
}
case "REACT_PHOTO": {
return LocaleController.formatString("PushReactPhoto", R.string.PushReactPhoto, args);
return LocaleController.formatString(R.string.PushReactPhoto, args);
}
case "REACT_VIDEO": {
return LocaleController.formatString("PushReactVideo", R.string.PushReactVideo, args);
return LocaleController.formatString(R.string.PushReactVideo, args);
}
case "REACT_ROUND": {
return LocaleController.formatString("PushReactRound", R.string.PushReactRound, args);
return LocaleController.formatString(R.string.PushReactRound, args);
}
case "REACT_DOC": {
return LocaleController.formatString("PushReactDoc", R.string.PushReactDoc, args);
return LocaleController.formatString(R.string.PushReactDoc, args);
}
case "REACT_STICKER": {
return LocaleController.formatString("PushReactSticker", R.string.PushReactSticker, args);
return LocaleController.formatString(R.string.PushReactSticker, args);
}
case "REACT_AUDIO": {
return LocaleController.formatString("PushReactAudio", R.string.PushReactAudio, args);
return LocaleController.formatString(R.string.PushReactAudio, args);
}
case "REACT_CONTACT": {
return LocaleController.formatString("PushReactContect", R.string.PushReactContect, args);
return LocaleController.formatString(R.string.PushReactContect, args);
}
case "REACT_GEO": {
return LocaleController.formatString("PushReactGeo", R.string.PushReactGeo, args);
return LocaleController.formatString(R.string.PushReactGeo, args);
}
case "REACT_GEOLIVE": {
return LocaleController.formatString("PushReactGeoLocation", R.string.PushReactGeoLocation, args);
return LocaleController.formatString(R.string.PushReactGeoLocation, args);
}
case "REACT_POLL": {
return LocaleController.formatString("PushReactPoll", R.string.PushReactPoll, args);
return LocaleController.formatString(R.string.PushReactPoll, args);
}
case "REACT_QUIZ": {
return LocaleController.formatString("PushReactQuiz", R.string.PushReactQuiz, args);
return LocaleController.formatString(R.string.PushReactQuiz, args);
}
case "REACT_GAME": {
return LocaleController.formatString("PushReactGame", R.string.PushReactGame, args);
return LocaleController.formatString(R.string.PushReactGame, args);
}
case "REACT_INVOICE": {
return LocaleController.formatString("PushReactInvoice", R.string.PushReactInvoice, args);
return LocaleController.formatString(R.string.PushReactInvoice, args);
}
case "REACT_GIF": {
return LocaleController.formatString("PushReactGif", R.string.PushReactGif, args);
return LocaleController.formatString(R.string.PushReactGif, args);
}
case "REACT_GIVEAWAY": {
return LocaleController.formatString("NotificationReactGiveaway", R.string.NotificationReactGiveaway, args);
return LocaleController.formatString(R.string.NotificationReactGiveaway, args);
}
case "CHAT_REACT_GIVEAWAY": {
return LocaleController.formatString("NotificationChatReactGiveaway", R.string.NotificationChatReactGiveaway, args);
return LocaleController.formatString(R.string.NotificationChatReactGiveaway, args);
}
case "CHAT_REACT_TEXT": {
return LocaleController.formatString("PushChatReactText", R.string.PushChatReactText, args);
return LocaleController.formatString(R.string.PushChatReactText, args);
}
case "CHAT_REACT_NOTEXT": {
return LocaleController.formatString("PushChatReactNotext", R.string.PushChatReactNotext, args);
return LocaleController.formatString(R.string.PushChatReactNotext, args);
}
case "CHAT_REACT_PHOTO": {
return LocaleController.formatString("PushChatReactPhoto", R.string.PushChatReactPhoto, args);
return LocaleController.formatString(R.string.PushChatReactPhoto, args);
}
case "CHAT_REACT_VIDEO": {
return LocaleController.formatString("PushChatReactVideo", R.string.PushChatReactVideo, args);
return LocaleController.formatString(R.string.PushChatReactVideo, args);
}
case "CHAT_REACT_ROUND": {
return LocaleController.formatString("PushChatReactRound", R.string.PushChatReactRound, args);
return LocaleController.formatString(R.string.PushChatReactRound, args);
}
case "CHAT_REACT_DOC": {
return LocaleController.formatString("PushChatReactDoc", R.string.PushChatReactDoc, args);
return LocaleController.formatString(R.string.PushChatReactDoc, args);
}
case "CHAT_REACT_STICKER": {
return LocaleController.formatString("PushChatReactSticker", R.string.PushChatReactSticker, args);
return LocaleController.formatString(R.string.PushChatReactSticker, args);
}
case "CHAT_REACT_AUDIO": {
return LocaleController.formatString("PushChatReactAudio", R.string.PushChatReactAudio, args);
return LocaleController.formatString(R.string.PushChatReactAudio, args);
}
case "CHAT_REACT_CONTACT": {
return LocaleController.formatString("PushChatReactContact", R.string.PushChatReactContact, args);
return LocaleController.formatString(R.string.PushChatReactContact, args);
}
case "CHAT_REACT_GEO": {
return LocaleController.formatString("PushChatReactGeo", R.string.PushChatReactGeo, args);
return LocaleController.formatString(R.string.PushChatReactGeo, args);
}
case "CHAT_REACT_GEOLIVE": {
return LocaleController.formatString("PushChatReactGeoLive", R.string.PushChatReactGeoLive, args);
return LocaleController.formatString(R.string.PushChatReactGeoLive, args);
}
case "CHAT_REACT_POLL": {
return LocaleController.formatString("PushChatReactPoll", R.string.PushChatReactPoll, args);
return LocaleController.formatString(R.string.PushChatReactPoll, args);
}
case "CHAT_REACT_QUIZ": {
return LocaleController.formatString("PushChatReactQuiz", R.string.PushChatReactQuiz, args);
return LocaleController.formatString(R.string.PushChatReactQuiz, args);
}
case "CHAT_REACT_GAME": {
return LocaleController.formatString("PushChatReactGame", R.string.PushChatReactGame, args);
return LocaleController.formatString(R.string.PushChatReactGame, args);
}
case "CHAT_REACT_INVOICE": {
return LocaleController.formatString("PushChatReactInvoice", R.string.PushChatReactInvoice, args);
return LocaleController.formatString(R.string.PushChatReactInvoice, args);
}
case "CHAT_REACT_GIF": {
return LocaleController.formatString("PushChatReactGif", R.string.PushChatReactGif, args);
return LocaleController.formatString(R.string.PushChatReactGif, args);
}
/* stories */
case "REACT_STORY": {
return LocaleController.formatString(R.string.PushReactStory, args);
}
case "REACT_STORY_HIDDEN": {
return LocaleController.formatString(R.string.PushReactStoryHidden, args);
}
}
return null;

View file

@ -760,6 +760,7 @@ public class SecretChatHelper extends BaseController {
AndroidUtilities.runOnUIThread(() -> {
newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, newMsgObj.id, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, 0L, existFlags, false);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, newMsgObj.id, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, 0L, existFlags, false);
getSendMessagesHelper().processSentMessage(newMsgObj.id);
getSendMessagesHelper().removeFromSendingMessages(newMsgObj.id, false);
});

View file

@ -961,7 +961,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
} else if (message.type == 1) {
if (media.file == null) {
media.file = file;
if (media.thumb == null && message.photoSize != null && message.photoSize.location != null) {
if (media.thumb == null && message.photoSize != null && message.photoSize.location != null && (message.obj == null || message.obj.videoEditedInfo == null || !message.obj.videoEditedInfo.isSticker)) {
performSendDelayedMessage(message);
} else {
performSendMessageRequest(message.sendRequest, message.obj, message.originalPath, null, message.parentObject, null, message.scheduled);
@ -2322,6 +2322,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
newMsgObj1.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
getMediaDataController().increasePeerRaiting(peer);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, message.id, message, peer, 0L, existFlags, scheduleDate != 0);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, oldId, message.id, message, peer, 0L, existFlags, scheduleDate != 0);
processSentMessage(oldId);
removeFromSendingMessages(oldId, scheduleDate != 0);
});
@ -2748,7 +2749,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
delayedMessage.originalPath = originalPath;
delayedMessage.type = 2;
delayedMessage.obj = messageObject;
if (!document.thumbs.isEmpty()) {
if (!document.thumbs.isEmpty() && (videoEditedInfo == null || !videoEditedInfo.isSticker)) {
TLRPC.PhotoSize photoSize = document.thumbs.get(0);
if (!(photoSize instanceof TLRPC.TL_photoStrippedSize)) {
delayedMessage.photoSize = photoSize;
@ -2966,7 +2967,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
return waitingForVote.get(key);
}
public int sendVote(final MessageObject messageObject, final ArrayList<TLRPC.TL_pollAnswer> answers, final Runnable finishRunnable) {
public int sendVote(final MessageObject messageObject, final ArrayList<TLRPC.PollAnswer> answers, final Runnable finishRunnable) {
if (messageObject == null) {
return 0;
}
@ -2981,7 +2982,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
if (answers != null) {
options = new byte[answers.size()];
for (int a = 0; a < answers.size(); a++) {
TLRPC.TL_pollAnswer answer = answers.get(a);
TLRPC.PollAnswer answer = answers.get(a);
req.options.add(answer.option);
options[a] = answer.option[0];
}
@ -5172,7 +5173,11 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
}
putToUploadingMessages(message.obj);
} else {
String location = FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.photoSize.location.volume_id + "_" + message.photoSize.location.local_id + ".jpg";
String ext = "jpg";
if (message.obj != null && message.obj.videoEditedInfo != null && message.obj.videoEditedInfo.isSticker) {
ext = "webp";
}
String location = FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.photoSize.location.volume_id + "_" + message.photoSize.location.local_id + "." + ext;
putToDelayedMessages(location, message);
getFileLoader().uploadFile(location, false, true, ConnectionsManager.FileTypePhoto);
putToUploadingMessages(message.obj);
@ -5860,6 +5865,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
getStatsController().incrementSentItemsCount(ApplicationLoader.getCurrentNetworkType(), StatsController.TYPE_MESSAGES, 1);
newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, grouped_id, existFlags, scheduled);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, grouped_id, existFlags, scheduled);
getMessagesStorage().getStorageQueue().postRunnable(() -> {
int mode = scheduled ? ChatActivity.MODE_SCHEDULED : 0;
if (newMsgObj.quick_reply_shortcut_id != 0 || newMsgObj.quick_reply_shortcut != null) {
@ -5870,6 +5876,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
AndroidUtilities.runOnUIThread(() -> {
getMediaDataController().increasePeerRaiting(newMsgObj.dialog_id);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, grouped_id, existFlags, scheduled);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, grouped_id, existFlags, scheduled);
processSentMessage(oldId);
removeFromSendingMessages(oldId, scheduled);
});
@ -6197,6 +6204,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
});
} else {
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, 0L, existFlags, scheduled);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, 0L, existFlags, scheduled);
getMessagesStorage().getStorageQueue().postRunnable(() -> {
int mode = scheduled ? ChatActivity.MODE_SCHEDULED : 0;
if (newMsgObj.quick_reply_shortcut_id != 0 || newMsgObj.quick_reply_shortcut != null) {
@ -6207,6 +6215,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
AndroidUtilities.runOnUIThread(() -> {
getMediaDataController().increasePeerRaiting(newMsgObj.dialog_id);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, 0L, existFlags, scheduled);
getNotificationCenter().postNotificationName(NotificationCenter.messageReceivedByServer2, oldId, newMsgObj.id, newMsgObj, newMsgObj.dialog_id, 0L, existFlags, scheduled);
processSentMessage(oldId);
removeFromSendingMessages(oldId, scheduled);
});
@ -6419,7 +6428,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
newMsg.media.document.size = sentMessage.media.document.size;
newMsg.media.document.mime_type = sentMessage.media.document.mime_type;
if ((sentMessage.flags & TLRPC.MESSAGE_FLAG_FWD) == 0 && MessageObject.isOut(sentMessage) && !MessageObject.isQuickReply(sentMessage)) {
if ((sentMessage.flags & TLRPC.MESSAGE_FLAG_FWD) == 0 && (MessageObject.isOut(sentMessage) || sentMessage.dialog_id == getUserConfig().getClientUserId()) && !MessageObject.isQuickReply(sentMessage)) {
if (MessageObject.isNewGifDocument(sentMessage.media.document)) {
boolean save;
if (MessageObject.isDocumentHasAttachedStickers(sentMessage.media.document)) {
@ -8162,7 +8171,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe
TLRPC.PhotoSize size = null;
if (thumb != null) {
int side = isEncrypted || info.ttl != 0 ? 90 : Math.max(thumb.getWidth(), thumb.getHeight());
size = ImageLoader.scaleAndSaveImage(thumb, side, side, side > 90 ? 80 : 55, isEncrypted);
size = ImageLoader.scaleAndSaveImage(null, thumb, videoEditedInfo != null && videoEditedInfo.isSticker ? Bitmap.CompressFormat.WEBP : Bitmap.CompressFormat.JPEG, false, side, side, side > 90 ? 80 : 55, isEncrypted, 0, 0, false);
if (size != null && size.location != null) {
thumbKey = getKeyForPhotoSize(accountInstance, size, null, true, false);
}

View file

@ -254,7 +254,7 @@ public class SharedConfig {
public static boolean forceDisableTabletMode;
public static boolean updateStickersOrderOnSend = true;
public static boolean bigCameraForRound;
public static boolean useCamera2;
public static Boolean useCamera2Force;
public static boolean useSurfaceInStories;
public static boolean photoViewerBlur = true;
public static boolean payByInvoice;
@ -643,7 +643,7 @@ public class SharedConfig {
updateStickersOrderOnSend = preferences.getBoolean("updateStickersOrderOnSend", true);
dayNightWallpaperSwitchHint = preferences.getInt("dayNightWallpaperSwitchHint", 0);
bigCameraForRound = preferences.getBoolean("bigCameraForRound", false);
useCamera2 = preferences.getBoolean("useCamera2", BuildVars.DEBUG_VERSION);
useCamera2Force = !preferences.contains("useCamera2Force") ? null : preferences.getBoolean("useCamera2Force", false);
useSurfaceInStories = preferences.getBoolean("useSurfaceInStories", Build.VERSION.SDK_INT >= 30);
payByInvoice = preferences.getBoolean("payByInvoice", false);
photoViewerBlur = preferences.getBoolean("photoViewerBlur", true);
@ -1739,10 +1739,14 @@ public class SharedConfig {
.apply();
}
public static void toggleUseCamera2() {
public static boolean isUsingCamera2(int currentAccount) {
return useCamera2Force == null ? !MessagesController.getInstance(currentAccount).androidDisableRoundCamera2 : useCamera2Force;
}
public static void toggleUseCamera2(int currentAccount) {
ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE)
.edit()
.putBoolean("useCamera2", useCamera2 = !useCamera2)
.putBoolean("useCamera2", useCamera2Force = !isUsingCamera2(currentAccount))
.apply();
}

View file

@ -98,6 +98,7 @@ public class TranslateController extends BaseController {
messageObject != null && messageObject.messageOwner != null &&
!messageObject.isOutOwner() &&
!messageObject.isRestrictedMessage &&
!messageObject.isSponsored() &&
(
messageObject.type == MessageObject.TYPE_TEXT ||
messageObject.type == MessageObject.TYPE_VIDEO ||
@ -509,7 +510,10 @@ public class TranslateController extends BaseController {
final MessageObject finalMessageObject = messageObject;
if (finalMessageObject.messageOwner.translatedText == null || !language.equals(finalMessageObject.messageOwner.translatedToLanguage)) {
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.messageTranslating, finalMessageObject);
pushToTranslate(finalMessageObject, language, (text, lang) -> {
pushToTranslate(finalMessageObject, language, (id, text, lang) -> {
if (finalMessageObject.getId() != id) {
FileLog.e("wtf, asked to translate " + finalMessageObject.getId() + " but got " + id + "!");
}
finalMessageObject.messageOwner.translatedToLanguage = lang;
finalMessageObject.messageOwner.translatedText = text;
if (keepReply) {
@ -715,7 +719,7 @@ public class TranslateController extends BaseController {
Runnable runnable;
ArrayList<Integer> messageIds = new ArrayList<>();
ArrayList<TLRPC.TL_textWithEntities> messageTexts = new ArrayList<>();
ArrayList<Utilities.Callback2<TLRPC.TL_textWithEntities, String>> callbacks = new ArrayList<>();
ArrayList<Utilities.Callback3<Integer, TLRPC.TL_textWithEntities, String>> callbacks = new ArrayList<>();
String language;
int delay = GROUPING_TRANSLATIONS_TIMEOUT;
@ -727,9 +731,9 @@ public class TranslateController extends BaseController {
private void pushToTranslate(
MessageObject message,
String language,
Utilities.Callback2<TLRPC.TL_textWithEntities, String> callback
Utilities.Callback3<Integer, TLRPC.TL_textWithEntities, String> callback
) {
if (message == null || callback == null) {
if (message == null || message.getId() < 0 || callback == null) {
return;
}
@ -779,6 +783,7 @@ public class TranslateController extends BaseController {
source.text = message.messageOwner.message;
source.entities = message.messageOwner.entities;
}
FileLog.d("pending translation +" + message.getId() + " message");
pendingTranslation.messageTexts.add(source);
pendingTranslation.callbacks.add(callback);
pendingTranslation.language = language;
@ -803,7 +808,7 @@ public class TranslateController extends BaseController {
final int reqId = getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> {
final ArrayList<Integer> ids;
final ArrayList<Utilities.Callback2<TLRPC.TL_textWithEntities, String>> callbacks;
final ArrayList<Utilities.Callback3<Integer, TLRPC.TL_textWithEntities, String>> callbacks;
final ArrayList<TLRPC.TL_textWithEntities> texts;
synchronized (TranslateController.this) {
ids = pendingTranslation1.messageIds;
@ -814,14 +819,14 @@ public class TranslateController extends BaseController {
ArrayList<TLRPC.TL_textWithEntities> translated = ((TLRPC.TL_messages_translateResult) res).result;
final int count = Math.min(callbacks.size(), translated.size());
for (int i = 0; i < count; ++i) {
callbacks.get(i).run(TranslateAlert2.preprocess(texts.get(i), translated.get(i)), pendingTranslation1.language);
callbacks.get(i).run(ids.get(i), TranslateAlert2.preprocess(texts.get(i), translated.get(i)), pendingTranslation1.language);
}
} else if (err != null && "TO_LANG_INVALID".equals(err.text)) {
toggleTranslatingDialog(dialogId, false);
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.showBulletin, Bulletin.TYPE_ERROR, LocaleController.getString("TranslationFailedAlert2", R.string.TranslationFailedAlert2));
} else {
for (int i = 0; i < callbacks.size(); ++i) {
callbacks.get(i).run(null, pendingTranslation1.language);
callbacks.get(i).run(ids.get(i), null, pendingTranslation1.language);
}
}
synchronized (TranslateController.this) {

View file

@ -159,7 +159,7 @@ public class UserConfig extends BaseController {
editor.putBoolean("syncContacts", syncContacts);
editor.putBoolean("suggestContacts", suggestContacts);
editor.putBoolean("hasSecureData", hasSecureData);
editor.putBoolean("notificationsSettingsLoaded3", notificationsSettingsLoaded);
editor.putBoolean("notificationsSettingsLoaded4", notificationsSettingsLoaded);
editor.putBoolean("notificationsSignUpSettingsLoaded", notificationsSignUpSettingsLoaded);
editor.putLong("autoDownloadConfigLoadTime", autoDownloadConfigLoadTime);
editor.putBoolean("hasValidDialogLoadIds", hasValidDialogLoadIds);
@ -302,7 +302,7 @@ public class UserConfig extends BaseController {
syncContacts = preferences.getBoolean("syncContacts", true);
suggestContacts = preferences.getBoolean("suggestContacts", true);
hasSecureData = preferences.getBoolean("hasSecureData", false);
notificationsSettingsLoaded = preferences.getBoolean("notificationsSettingsLoaded3", false);
notificationsSettingsLoaded = preferences.getBoolean("notificationsSettingsLoaded4", false);
notificationsSignUpSettingsLoaded = preferences.getBoolean("notificationsSignUpSettingsLoaded", false);
autoDownloadConfigLoadTime = preferences.getLong("autoDownloadConfigLoadTime", 0);
hasValidDialogLoadIds = preferences.contains("2dialogsLoadOffsetId") || preferences.getBoolean("hasValidDialogLoadIds", false);

View file

@ -581,6 +581,10 @@ public class Utilities {
public ReturnType run(T arg, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
}
public static interface IndexedConsumer<T> {
void accept(T t, int index);
}
public static <Key, Value> Value getOrDefault(HashMap<Key, Value> map, Key key, Value defaultValue) {
Value v = map.get(key);
if (v == null) {

View file

@ -153,6 +153,7 @@ public class VideoEditedInfo {
public float textViewHeight;
public float textViewX;
public float textViewY;
public boolean customTextView;
public TLRPC.Document document;
public Object parentObject;

View file

@ -317,7 +317,7 @@ public class Browser {
String token = "autologin_token=" + URLEncoder.encode(AccountInstance.getInstance(UserConfig.selectedAccount).getMessagesController().autologinToken, "UTF-8");
String url = uri.toString();
int idx = url.indexOf("://");
String path = idx >= 0 ? url.substring(idx + 3) : url;
String path = idx >= 0 && idx <= 5 && !url.substring(0, idx).contains(".") ? url.substring(idx + 3) : url;
String fragment = uri.getEncodedFragment();
String finalPath = fragment == null ? path : path.substring(0, path.indexOf("#" + fragment));
if (finalPath.indexOf('?') >= 0) {

View file

@ -21,6 +21,7 @@ import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.util.Range;
import android.util.Size;
import android.util.SizeF;
import android.view.Surface;
@ -475,6 +476,11 @@ public class Camera2Session {
captureRequestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, isFront ? CameraMetadata.CONTROL_SCENE_MODE_NIGHT_PORTRAIT : CameraMetadata.CONTROL_SCENE_MODE_NIGHT);
}
if (recordingVideo) {
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(30, 60));
captureRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
}
if (sensorSize != null && Math.abs(currentZoom - 1f) >= 0.01f) {
final int centerX = sensorSize.width() / 2;
final int centerY = sensorSize.height() / 2;

View file

@ -42,8 +42,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.Surface;
@ -55,9 +53,6 @@ import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.core.graphics.ColorUtils;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import com.google.zxing.common.detector.MathUtils;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
@ -66,9 +61,9 @@ import org.telegram.messenger.DispatchQueue;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.SharedConfig;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
import org.telegram.messenger.video.MP4Builder;
import org.telegram.messenger.video.MediaCodecVideoConvertor;
@ -121,7 +116,7 @@ public class CameraView extends FrameLayout implements TextureView.SurfaceTextur
private int focusAreaSize;
private Drawable thumbDrawable;
private final boolean useCamera2 = false && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && SharedConfig.useCamera2;
private final boolean useCamera2 = false && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && SharedConfig.isUsingCamera2(UserConfig.selectedAccount);
private final CameraSessionWrapper[] cameraSession = new CameraSessionWrapper[2];
private CameraSessionWrapper cameraSessionRecording;

View file

@ -292,9 +292,12 @@ public final class ExtendedDefaultDataSource implements DataSource {
return encryptedFileDataSource;
}
private FileStreamLoadOperation streamLoadOperation;
private DataSource getStreamDataSource() {
FileStreamLoadOperation streamLoadOperation = new FileStreamLoadOperation();
addListenersToDataSource(streamLoadOperation);
if (streamLoadOperation == null) {
streamLoadOperation = new FileStreamLoadOperation();
addListenersToDataSource(streamLoadOperation);
}
return streamLoadOperation;
}

View file

@ -53,7 +53,7 @@ public class MediaCodecVideoConvertor {
public boolean convertVideo(ConvertVideoParams convertVideoParams) {
if (convertVideoParams.isSticker) {
return WebmEncoder.convert(convertVideoParams);
return WebmEncoder.convert(convertVideoParams, 0);
}
this.callback = convertVideoParams.callback;
return convertVideoInternal(convertVideoParams, false, 0);

View file

@ -15,6 +15,7 @@ import android.opengl.GLES20;
import android.opengl.GLUtils;
import android.os.Build;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@ -70,10 +71,12 @@ public class WebmEncoder {
public static native void stop(long ptr);
public static boolean convert(MediaCodecVideoConvertor.ConvertVideoParams params) {
public static boolean convert(MediaCodecVideoConvertor.ConvertVideoParams params, int triesLeft) {
final int W = params.resultWidth;
final int H = params.resultHeight;
final long maxFileSize = 255 * 1024;
final long ptr = createEncoder(params.cacheFile.getAbsolutePath(), W, H, params.framerate, params.bitrate);
if (ptr == 0) {
return true;
@ -102,7 +105,7 @@ public class WebmEncoder {
}
if (params.callback != null) {
params.callback.didWriteData(params.cacheFile.length(), (float) frame / framesCount);
params.callback.didWriteData(Math.min(maxFileSize, params.cacheFile.length()), (float) frame / framesCount);
}
if (frame % 3 == 0 && params.callback != null) {
@ -119,11 +122,20 @@ public class WebmEncoder {
}
}
if (params.callback != null) {
params.callback.didWriteData(params.cacheFile.length(), 1f);
long fileSize = params.cacheFile.length();
if (triesLeft > 0 && fileSize > maxFileSize) {
int oldBitrate = params.bitrate;
params.bitrate *= ((float) maxFileSize / fileSize) * .9f;
params.cacheFile.delete();
FileLog.d("webm encoded too much, got " + fileSize + ", old bitrate = " + oldBitrate + " new bitrate = " + params.bitrate);
return convert(params, triesLeft - 1);
}
FileLog.d("webm encoded to " + params.cacheFile + " with size=" + params.cacheFile.length());
if (params.callback != null) {
params.callback.didWriteData(fileSize, 1f);
}
FileLog.d("webm encoded to " + params.cacheFile + " with size=" + fileSize + " triesLeft=" + triesLeft);
return error;
}
@ -139,11 +151,17 @@ public class WebmEncoder {
private final Paint clearPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private final Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
private final Path clipPath;
public FrameDrawer(MediaCodecVideoConvertor.ConvertVideoParams params) {
this.W = params.resultWidth;
this.H = params.resultHeight;
this.fps = params.framerate;
clipPath = new Path();
RectF bounds = new RectF(0, 0, W, H);
clipPath.addRoundRect(bounds, W * .125f, H * .125f, Path.Direction.CW);
photo = BitmapFactory.decodeFile(params.videoPath);
mediaEntities.addAll(params.mediaEntities);
@ -165,6 +183,8 @@ public class WebmEncoder {
public void draw(Canvas canvas, int frame) {
canvas.drawPaint(clearPaint);
canvas.save();
canvas.clipPath(clipPath);
if (photo != null) {
canvas.drawBitmap(photo, 0, 0, null);
}
@ -173,6 +193,7 @@ public class WebmEncoder {
VideoEditedInfo.MediaEntity entity = mediaEntities.get(a);
drawEntity(canvas, entity, entity.color, time);
}
canvas.restore();
}
private void drawEntity(Canvas canvas, VideoEditedInfo.MediaEntity entity, int textColor, long time) {
@ -231,7 +252,7 @@ public class WebmEncoder {
editText.setTypeface(typeface);
}
editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, entity.fontSize);
SpannableString text = new SpannableString(entity.text);
CharSequence text = new SpannableString(entity.text);
for (VideoEditedInfo.EmojiEntity e : entity.entities) {
if (e.documentAbsolutePath == null) {
continue;
@ -267,17 +288,19 @@ public class WebmEncoder {
initStickerEntity(e.entity);
}
};
text.setSpan(span, e.offset, e.offset + e.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) text).setSpan(span, e.offset, e.offset + e.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
editText.setText(Emoji.replaceEmoji(text, editText.getPaint().getFontMetricsInt(), (int) (editText.getTextSize() * .8f), false));
editText.setTextColor(entity.color);
CharSequence text2 = editText.getText();
if (text2 instanceof Spanned) {
Emoji.EmojiSpan[] spans = ((Spanned) text2).getSpans(0, text2.length(), Emoji.EmojiSpan.class);
for (int i = 0; i < spans.length; ++i) {
spans[i].scale = .85f;
text = Emoji.replaceEmoji(text, editText.getPaint().getFontMetricsInt(), (int) (editText.getTextSize() * .8f), false);
if (text instanceof Spanned) {
Emoji.EmojiSpan[] spans = ((Spanned) text).getSpans(0, text.length(), Emoji.EmojiSpan.class);
if (spans != null) {
for (int i = 0; i < spans.length; ++i) {
spans[i].scale = .85f;
}
}
}
editText.setText(text);
editText.setTextColor(entity.color);
int gravity;
@ -365,11 +388,11 @@ public class WebmEncoder {
entity.bitmap = Bitmap.createBitmap(entity.W, entity.H, Bitmap.Config.ARGB_8888);
entity.metadata = new int[3];
entity.ptr = RLottieDrawable.create(entity.text, null, entity.W, entity.H, entity.metadata, false, null, false, 0);
entity.framesPerDraw = entity.metadata[1] / fps;
entity.framesPerDraw = (float) entity.metadata[1] / fps;
} else if ((entity.subType & 4) != 0) {
entity.looped = false;
entity.animatedFileDrawable = new AnimatedFileDrawable(new File(entity.text), true, 0, 0, null, null, null, 0, UserConfig.selectedAccount, true, 512, 512, null);
entity.framesPerDraw = entity.animatedFileDrawable.getFps() / fps;
entity.framesPerDraw = (float) entity.animatedFileDrawable.getFps() / fps;
entity.currentFrame = 1;
entity.animatedFileDrawable.getNextFrame(true);
if (entity.type == VideoEditedInfo.MediaEntity.TYPE_ROUND) {
@ -445,12 +468,12 @@ public class WebmEncoder {
if (bitmap != null) {
entity.matrix.postScale(1f / bitmap.getWidth(), 1f / bitmap.getHeight());
}
if ((entity.subType & 2) != 0) {
if (entity.type != VideoEditedInfo.MediaEntity.TYPE_TEXT && (entity.subType & 2) != 0) {
entity.matrix.postScale(-1, 1, .5f, .5f);
}
entity.matrix.postScale(entity.width * W, entity.height * H);
entity.matrix.postTranslate(entity.x * W, entity.y * H);
entity.matrix.postRotate((float) (-entity.rotation / Math.PI * 180), (entity.x + entity.width) * W, (entity.x + entity.height) * H);
entity.matrix.postRotate((float) (-entity.rotation / Math.PI * 180), (entity.x + entity.width / 2f) * W, (entity.y + entity.height / 2f) * H);
}
Path path;

File diff suppressed because it is too large Load diff

View file

@ -780,13 +780,11 @@ public class TL_stats {
}
public static class TL_broadcastRevenueStats extends TLObject {
public static final int constructor = 0xd07b4bad;
public static final int constructor = 0x5407e297;
public StatsGraph top_hours_graph;
public StatsGraph revenue_graph;
public long current_balance;
public long available_balance;
public long overall_revenue;
public TLRPC.TL_broadcastRevenueBalances balances;
public double usd_rate;
public static TL_broadcastRevenueStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
@ -807,9 +805,7 @@ public class TL_stats {
public void readParams(AbstractSerializedData stream, boolean exception) {
top_hours_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception);
revenue_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception);
current_balance = stream.readInt64(exception);
available_balance = stream.readInt64(exception);
overall_revenue = stream.readInt64(exception);
balances = TLRPC.TL_broadcastRevenueBalances.TLdeserialize(stream, stream.readInt32(exception), exception);
usd_rate = stream.readDouble(exception);
}
@ -818,9 +814,7 @@ public class TL_stats {
stream.writeInt32(constructor);
top_hours_graph.serializeToStream(stream);
revenue_graph.serializeToStream(stream);
stream.writeInt64(current_balance);
stream.writeInt64(available_balance);
stream.writeInt64(overall_revenue);
balances.serializeToStream(stream);
stream.writeDouble(usd_rate);
}
}

View file

@ -736,10 +736,12 @@ public class TL_stories {
}
public static class TL_stories_stories extends TLObject {
public static final int constructor = 0x5dd8c3c8;
public static final int constructor = 0x63c3dd0a;
public int flags;
public int count;
public ArrayList<StoryItem> stories = new ArrayList<>();
public ArrayList<Integer> pinned_to_top = new ArrayList<>();
public ArrayList<TLRPC.Chat> chats = new ArrayList<>();
public ArrayList<TLRPC.User> users = new ArrayList<>();
@ -757,6 +759,7 @@ public class TL_stories {
}
public void readParams(AbstractSerializedData stream, boolean exception) {
flags = stream.readInt32(exception);
count = stream.readInt32(exception);
int magic = stream.readInt32(exception);
if (magic != 0x1cb5c415) {
@ -773,6 +776,19 @@ public class TL_stories {
}
stories.add(object);
}
if ((flags & 1) != 0) {
magic = stream.readInt32(exception);
if (magic != 0x1cb5c415) {
if (exception) {
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
}
return;
}
count = stream.readInt32(exception);
for (int a = 0; a < count; a++) {
pinned_to_top.add(stream.readInt32(exception));
}
}
magic = stream.readInt32(exception);
if (magic != 0x1cb5c415) {
if (exception) {
@ -807,6 +823,7 @@ public class TL_stories {
public void serializeToStream(AbstractSerializedData stream) {
stream.writeInt32(constructor);
stream.writeInt32(flags);
stream.writeInt32(count);
stream.writeInt32(0x1cb5c415);
int count = stories.size();
@ -814,6 +831,14 @@ public class TL_stories {
for (int a = 0; a < count; a++) {
stories.get(a).serializeToStream(stream);
}
if ((flags & 1) != 0) {
stream.writeInt32(0x1cb5c415);
count = pinned_to_top.size();
stream.writeInt32(count);
for (int a = 0; a < count; a++) {
stream.writeInt32(pinned_to_top.get(a));
}
}
stream.writeInt32(0x1cb5c415);
count = chats.size();
stream.writeInt32(count);
@ -3345,4 +3370,26 @@ public class TL_stories {
stream.writeInt32(limit);
}
}
public static class TL_togglePinnedToTop extends TLObject {
public static final int constructor = 0xb297e9b;
public TLRPC.InputPeer peer;
public ArrayList<Integer> id = new ArrayList<>();
public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
return TLRPC.Bool.TLdeserialize(stream, constructor, exception);
}
public void serializeToStream(AbstractSerializedData stream) {
stream.writeInt32(constructor);
peer.serializeToStream(stream);
stream.writeInt32(0x1cb5c415);
int count = id.size();
stream.writeInt32(count);
for (int a = 0; a < count; a++) {
stream.writeInt32(id.get(a));
}
}
}
}

View file

@ -54,6 +54,7 @@ import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.R;
import org.telegram.messenger.SharedConfig;
import org.telegram.messenger.Utilities;
import org.telegram.ui.Components.BackButtonMenu;
import org.telegram.ui.bots.BotWebViewSheet;
import org.telegram.ui.Components.Bulletin;
@ -1622,6 +1623,10 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
}
onFragmentStackChanged("addFragmentToStack " + position);
} else {
if (position == INavigationLayout.FORCE_ATTACH_VIEW_AS_FIRST) {
position = 0;
attachViewTo(fragment, position);
}
fragmentsStack.add(position, fragment);
onFragmentStackChanged("addFragmentToStack");
}
@ -1663,6 +1668,35 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
fragment.attachStoryViewer(containerView);
}
private void attachViewTo(BaseFragment fragment, int position) {
View fragmentView = fragment.fragmentView;
if (fragmentView == null) {
fragmentView = fragment.createView(parentActivity);
} else {
ViewGroup parent = (ViewGroup) fragmentView.getParent();
if (parent != null) {
fragment.onRemoveFromParent();
parent.removeView(fragmentView);
}
}
if (!fragment.hasOwnBackground && fragmentView.getBackground() == null) {
fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
}
containerView.addView(fragmentView, Utilities.clamp(position, containerView.getChildCount(), 0), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
if (fragment.actionBar != null && fragment.actionBar.shouldAddToContainer()) {
if (removeActionBarExtraHeight) {
fragment.actionBar.setOccupyStatusBar(false);
}
ViewGroup parent = (ViewGroup) fragment.actionBar.getParent();
if (parent != null) {
parent.removeView(fragment.actionBar);
}
containerView.addView(fragment.actionBar);
fragment.actionBar.setTitleOverlayText(titleOverlayText, titleOverlayTextId, overlayAction);
}
fragment.attachStoryViewer(containerView);
}
private void closeLastFragmentInternalRemoveOld(BaseFragment fragment) {
fragment.finishing = true;
fragment.onPause();

View file

@ -1928,6 +1928,9 @@ public class ActionBarMenuItem extends FrameLayout {
showSubItem(id, false);
}
public View getSubItem(int id) {
return popupLayout.findViewWithTag(id);
}
public void showSubItem(int id, boolean animated) {
Item lazyItem = findLazyItem(id);
if (lazyItem != null) {

View file

@ -73,7 +73,7 @@ public class BottomSheet extends Dialog {
protected int currentAccount = UserConfig.selectedAccount;
protected ViewGroup containerView;
protected ContainerView container;
public ContainerView container;
protected boolean keyboardVisible;
protected int keyboardHeight;
private WindowInsets lastInsets;
@ -584,25 +584,29 @@ public class BottomSheet extends Dialog {
if (lastInsets != null && Build.VERSION.SDK_INT >= 21) {
l += getLeftInset();
}
if (smoothKeyboardAnimationEnabled && startAnimationRunnable == null && keyboardChanged && !dismissed && containerView.getTop() != t) {
if (smoothKeyboardAnimationEnabled && startAnimationRunnable == null && keyboardChanged && !dismissed && containerView.getTop() != t || smoothContainerViewLayoutUntil > 0 && System.currentTimeMillis() < smoothContainerViewLayoutUntil) {
containerView.setTranslationY(containerView.getTop() - t);
onSmoothContainerViewLayout(containerView.getTranslationY());
if (keyboardContentAnimator != null) {
keyboardContentAnimator.cancel();
}
keyboardContentAnimator = ValueAnimator.ofFloat(containerView.getTranslationY(), 0);
keyboardContentAnimator.addUpdateListener(valueAnimator -> {
containerView.setTranslationY((Float) valueAnimator.getAnimatedValue());
onSmoothContainerViewLayout(containerView.getTranslationY());
invalidate();
});
keyboardContentAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
containerView.setTranslationY(0);
onSmoothContainerViewLayout(containerView.getTranslationY());
invalidate();
}
});
keyboardContentAnimator.setDuration(AdjustPanLayoutHelper.keyboardDuration).setInterpolator(AdjustPanLayoutHelper.keyboardInterpolator);
keyboardContentAnimator.start();
smoothContainerViewLayoutUntil = -1;
}
containerView.layout(l, t, l + containerView.getMeasuredWidth(), t + containerView.getMeasuredHeight());
}
@ -2093,4 +2097,13 @@ public class BottomSheet extends Dialog {
this.playingImagesLayerNum = playingImages;
this.openedLayerNum = onShowing;
}
private long smoothContainerViewLayoutUntil = -1;
public void smoothContainerViewLayout() {
smoothContainerViewLayoutUntil = System.currentTimeMillis() + 80;
}
protected void onSmoothContainerViewLayout(float ty) {
}
}

View file

@ -23,6 +23,7 @@ public interface INavigationLayout {
int REBUILD_FLAG_REBUILD_LAST = 1, REBUILD_FLAG_REBUILD_ONLY_LAST = 2;
int FORCE_NOT_ATTACH_VIEW = -2;
int FORCE_ATTACH_VIEW_AS_FIRST = -3;
boolean presentFragment(NavigationParams params);
boolean checkTransitionAnimation();

View file

@ -4125,8 +4125,10 @@ public class Theme {
public static final int key_premiumGradientBackground4 = colorsCount++;
public static final int key_premiumGradientBackgroundOverlay = colorsCount++;
public static final int key_premiumStartSmallStarsColor = colorsCount++;
public static final int key_premiumStartGradient1 = colorsCount++;
public static final int key_premiumStartGradient2 = colorsCount++;
public static final int key_premiumStarGradient1 = colorsCount++;
public static final int key_premiumStarGradient2 = colorsCount++;
public static final int key_premiumCoinGradient1 = colorsCount++;
public static final int key_premiumCoinGradient2 = colorsCount++;
public static final int key_premiumStartSmallStarsColor2 = colorsCount++;
public static final int key_premiumGradientBottomSheet1 = colorsCount++;
public static final int key_premiumGradientBottomSheet2 = colorsCount++;
@ -4503,8 +4505,8 @@ public class Theme {
themeAccentExclusionKeys.add(key_premiumGradientBackground3);
themeAccentExclusionKeys.add(key_premiumGradientBackground4);
themeAccentExclusionKeys.add(key_premiumStartSmallStarsColor);
themeAccentExclusionKeys.add(key_premiumStartGradient1);
themeAccentExclusionKeys.add(key_premiumStartGradient2);
themeAccentExclusionKeys.add(key_premiumStarGradient1);
themeAccentExclusionKeys.add(key_premiumStarGradient2);
themeAccentExclusionKeys.add(key_stories_circle1);
themeAccentExclusionKeys.add(key_stories_circle2);
themeAccentExclusionKeys.add(key_stories_circle_dialog1);
@ -8545,7 +8547,7 @@ public class Theme {
chat_radialProgress2Paint.setStyle(Paint.Style.STROKE);
chat_audioTimePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
chat_livePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
chat_livePaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
chat_livePaint.setTypeface(Typeface.DEFAULT_BOLD);
chat_audioTitlePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
chat_audioTitlePaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
chat_audioPerformerPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
@ -8876,7 +8878,7 @@ public class Theme {
chat_contextResult_titleTextPaint.setTextSize(dp(15));
chat_contextResult_descriptionTextPaint.setTextSize(dp(13));
chat_radialProgressPaint.setStrokeWidth(dp(3));
chat_radialProgress2Paint.setStrokeWidth(dp(2));
chat_radialProgress2Paint.setStrokeWidth(dp(2.33f));
chat_commentTextPaint.setTextSize(dp(14));
chat_commentTextPaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
}

View file

@ -3,7 +3,6 @@ package org.telegram.ui.ActionBar;
import static org.telegram.ui.ActionBar.Theme.*;
import android.graphics.Color;
import android.util.Log;
import android.util.SparseArray;
import androidx.core.graphics.ColorUtils;
@ -758,8 +757,10 @@ public class ThemeColors {
defaultColors[key_premiumGradientBackground3] = 0xffDB5C9D;
defaultColors[key_premiumGradientBackground4] = 0xffF38926;
defaultColors[key_premiumGradientBackgroundOverlay] = Color.WHITE;
defaultColors[key_premiumStartGradient1] = 0xffFFFFFF;
defaultColors[key_premiumStartGradient2] = 0xffE3ECFA;
defaultColors[key_premiumStarGradient1] = 0xffFFFFFF;
defaultColors[key_premiumStarGradient2] = 0xffE3ECFA;
defaultColors[key_premiumCoinGradient1] = -15436801;
defaultColors[key_premiumCoinGradient2] = -4167942;
defaultColors[key_premiumStartSmallStarsColor] = ColorUtils.setAlphaComponent(Color.WHITE, 90);
defaultColors[key_premiumStartSmallStarsColor2] = ColorUtils.setAlphaComponent(Color.WHITE, 90);
defaultColors[key_premiumGradientBottomSheet1] = 0xff5B9DE7;
@ -1505,8 +1506,10 @@ public class ThemeColors {
colorKeysMap.put(key_premiumGradientBackground4, "premiumGradientBackground4");
colorKeysMap.put(key_premiumGradientBackgroundOverlay, "premiumGradientBackgroundOverlay");
colorKeysMap.put(key_premiumStartSmallStarsColor, "premiumStartSmallStarsColor");
colorKeysMap.put(key_premiumStartGradient1, "premiumStarGradient1");
colorKeysMap.put(key_premiumStartGradient2, "premiumStarGradient2");
colorKeysMap.put(key_premiumStarGradient1, "premiumStarGradient1");
colorKeysMap.put(key_premiumStarGradient2, "premiumStarGradient2");
colorKeysMap.put(key_premiumCoinGradient1, "premiumCoinGradient1");
colorKeysMap.put(key_premiumCoinGradient2, "premiumCoinGradient2");
colorKeysMap.put(key_premiumStartSmallStarsColor2, "premiumStartSmallStarsColor2");
colorKeysMap.put(key_premiumGradientBottomSheet1, "premiumGradientBottomSheet1");
colorKeysMap.put(key_premiumGradientBottomSheet2, "premiumGradientBottomSheet2");

View file

@ -63,15 +63,15 @@ import java.util.concurrent.ConcurrentHashMap;
public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter {
private final int VIEW_TYPE_PROFILE_CELL = 0;
private final int VIEW_TYPE_GRAY_SECTION = 1;
private final int VIEW_TYPE_DIALOG_CELL = 2;
private final int VIEW_TYPE_TOPIC_CELL = 3;
private final int VIEW_TYPE_LOADING = 4;
private final int VIEW_TYPE_HASHTAG_CELL = 5;
private final int VIEW_TYPE_CATEGORY_LIST = 6;
private final int VIEW_TYPE_ADD_BY_PHONE = 7;
private final int VIEW_TYPE_INVITE_CONTACT_CELL = 8;
public final static int VIEW_TYPE_PROFILE_CELL = 0;
public final static int VIEW_TYPE_GRAY_SECTION = 1;
public final int VIEW_TYPE_DIALOG_CELL = 2;
public final int VIEW_TYPE_TOPIC_CELL = 3;
public final int VIEW_TYPE_LOADING = 4;
public final int VIEW_TYPE_HASHTAG_CELL = 5;
public final int VIEW_TYPE_CATEGORY_LIST = 6;
public final int VIEW_TYPE_ADD_BY_PHONE = 7;
public final int VIEW_TYPE_INVITE_CONTACT_CELL = 8;
private Context mContext;
private Runnable searchRunnable;
private Runnable searchRunnable2;
@ -1336,6 +1336,12 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter {
}
i -= contactsCount + 1;
}
if (localCount + localServerCount > 0 && (getRecentItemsCount() > 0 || !searchTopics.isEmpty())) {
if (i == 0) {
return false;
}
i--;
}
if (i >= 0 && i < localCount) {
return false;
}
@ -1483,12 +1489,23 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter {
CharSequence username = null;
CharSequence name = null;
boolean isRecent = false;
boolean isGlobal = isGlobalSearch(position);
String un = null;
Object obj = getItem(position);
if (obj instanceof TLRPC.User) {
user = (TLRPC.User) obj;
un = UserObject.getPublicUsername(user);
if (un != null && lastSearchText != null && !un.toLowerCase().contains(lastSearchText.toLowerCase())) {
if (user.usernames != null) {
for (int i = 0; i < user.usernames.size(); ++i) {
TLRPC.TL_username u = user.usernames.get(i);
if (u != null && u.active && u.username.toLowerCase().contains(lastSearchText.toLowerCase())) {
un = u.username;
}
}
}
}
} else if (obj instanceof TLRPC.Chat) {
chat = MessagesController.getInstance(currentAccount).getChat(((TLRPC.Chat) obj).id);
if (chat == null) {
@ -1557,7 +1574,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter {
spannableStringBuilder.setSpan(new ForegroundColorSpanThemable(Theme.key_windowBackgroundWhiteBlueText4), index, index + foundUserName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
name = spannableStringBuilder;
}
if (un != null && user == null) {
if (un != null && (user == null || isGlobal)) {
if (foundUserName.startsWith("@")) {
foundUserName = foundUserName.substring(1);
}

View file

@ -311,6 +311,7 @@ public class DrawerLayoutAdapter extends RecyclerListView.SelectionAdapter {
}
UserConfig me = UserConfig.getInstance(UserConfig.selectedAccount);
boolean showDivider = false;
items.add(new Item(16, LocaleController.getString(R.string.MyProfile), R.drawable.left_status_profile));
if (me != null && me.isPremium()) {
if (me.getEmojiStatus() != null) {
items.add(new Item(15, LocaleController.getString("ChangeEmojiStatus", R.string.ChangeEmojiStatus), R.drawable.msg_status_edit));
@ -319,10 +320,11 @@ public class DrawerLayoutAdapter extends RecyclerListView.SelectionAdapter {
}
showDivider = true;
}
if (MessagesController.getInstance(UserConfig.selectedAccount).storiesEnabled()) {
items.add(new Item(16, LocaleController.getString("ProfileMyStories", R.string.ProfileMyStories), R.drawable.msg_menu_stories));
showDivider = true;
}
// if (MessagesController.getInstance(UserConfig.selectedAccount).storiesEnabled()) {
// items.add(new Item(17, LocaleController.getString(R.string.ProfileStories), R.drawable.msg_menu_stories));
// showDivider = true;
// }
showDivider = true;
if (ApplicationLoader.applicationLoaderInstance != null) {
if (ApplicationLoader.applicationLoaderInstance.extendDrawer(items)) {
showDivider = true;

View file

@ -321,8 +321,9 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
return 2;
} else if (currentMessageObject != null) {
return 2 + (currentLiveLocations.isEmpty() ? 1 : currentLiveLocations.size() + 3);
} else if (locationType == 2) {
return 2 + currentLiveLocations.size();
} else if (locationType == LocationActivity.LOCATION_TYPE_LIVE) {
LocationController.SharingLocationInfo currentInfo = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
return 2 + currentLiveLocations.size() + (currentInfo != null && currentInfo.period != 0x7FFFFFFF ? 1 : 0);
} else {
if (searching || !searched || places.isEmpty()) {
int count = 6;
@ -368,7 +369,7 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
emptyCell.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, overScrollHeight));
break;
case VIEW_TYPE_SEND_LOCATION:
view = new SendLocationCell(mContext, false, resourcesProvider);
view = new SendLocationCell(mContext, false, false, resourcesProvider);
break;
case VIEW_TYPE_HEADER:
view = new HeaderCell(mContext, resourcesProvider);
@ -384,7 +385,13 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
view = new LocationPoweredCell(mContext, resourcesProvider);
break;
case VIEW_TYPE_LIVE_LOCATION: {
SendLocationCell cell = new SendLocationCell(mContext, true, resourcesProvider);
SendLocationCell cell = new SendLocationCell(mContext, true, false, resourcesProvider);
cell.setDialogId(dialogId);
view = cell;
break;
}
case VIEW_TYPE_DELETE_LIVE_LOCATION: {
SendLocationCell cell = new SendLocationCell(mContext, true, true, resourcesProvider);
cell.setDialogId(dialogId);
view = cell;
break;
@ -428,11 +435,12 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
public static final int VIEW_TYPE_LOADING = 4;
public static final int VIEW_TYPE_FOOTER = 5;
public static final int VIEW_TYPE_LIVE_LOCATION = 6;
public static final int VIEW_TYPE_SHARING = 7;
public static final int VIEW_TYPE_DIRECTION = 8;
public static final int VIEW_TYPE_SHADOW = 9;
public static final int VIEW_TYPE_EMPTY = 10;
public static final int VIEW_TYPE_STORY_LOCATION = 11;
public static final int VIEW_TYPE_DELETE_LIVE_LOCATION = 7;
public static final int VIEW_TYPE_SHARING = 8;
public static final int VIEW_TYPE_DIRECTION = 9;
public static final int VIEW_TYPE_SHADOW = 10;
public static final int VIEW_TYPE_EMPTY = 11;
public static final int VIEW_TYPE_STORY_LOCATION = 12;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
@ -493,6 +501,12 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
((LocationLoadingCell) holder.itemView).setLoading(searching);
break;
case VIEW_TYPE_LIVE_LOCATION:
SendLocationCell cell2 = (SendLocationCell) holder.itemView;
cell2.setHasLocation(gpsLocation != null);
cell2.useDivider = position + 1 < getItemCount() && getItemViewType(position + 1) == VIEW_TYPE_DELETE_LIVE_LOCATION;
cell2.invalidate();
break;
case VIEW_TYPE_DELETE_LIVE_LOCATION:
((SendLocationCell) holder.itemView).setHasLocation(gpsLocation != null);
break;
case VIEW_TYPE_SHARING:
@ -504,7 +518,14 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
} else if (currentMessageObject != null && position == 1) {
locationCell.setDialog(currentMessageObject, gpsLocation, myLocationDenied);
} else {
locationCell.setDialog(currentLiveLocations.get(position - (currentMessageObject != null ? 5 : 2)), gpsLocation);
int index = position - (currentMessageObject != null ? 5 : 2);
LocationController.SharingLocationInfo currentInfo = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
if (currentInfo != null && currentInfo.period != 0x7FFFFFFF) {
index--;
}
if (index < 0 || index >= currentLiveLocations.size())
return;
locationCell.setDialog(currentLiveLocations.get(index), gpsLocation);
}
break;
case VIEW_TYPE_EMPTY:
@ -549,9 +570,14 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
} else if (i > 4 && i < places.size() + 4) {
return currentLiveLocations.get(i - 5);
}
} else if (locationType == 2) {
if (i >= 2) {
return currentLiveLocations.get(i - 2);
} else if (locationType == LocationActivity.LOCATION_TYPE_LIVE) {
int start = 2;
LocationController.SharingLocationInfo currentInfo = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
if (currentInfo != null && currentInfo.period != 0x7FFFFFFF) {
start++;
}
if (i >= start) {
return currentLiveLocations.get(i - start);
}
return null;
} else if (locationType == LocationActivity.LOCATION_TYPE_SEND_WITH_LIVE) {
@ -592,6 +618,10 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
if (locationType == LocationActivity.LOCATION_TYPE_GROUP) {
return VIEW_TYPE_SEND_LOCATION;
}
LocationController.SharingLocationInfo currentInfo = null;
if (locationType == LocationActivity.LOCATION_TYPE_LIVE || locationType == LocationActivity.LOCATION_TYPE_SEND_WITH_LIVE) {
currentInfo = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
}
if (currentMessageObject != null) {
if (currentLiveLocations.isEmpty()) {
if (position == 2) {
@ -609,8 +639,14 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
}
return VIEW_TYPE_SHARING;
}
if (locationType == 2) {
if (locationType == LocationActivity.LOCATION_TYPE_LIVE) {
if (position == 2 && currentInfo != null && currentInfo.period != 0x7FFFFFFF) {
return VIEW_TYPE_DELETE_LIVE_LOCATION;
}
if (position == 1) {
if (currentInfo != null && currentInfo.period == 0x7FFFFFFF) {
return VIEW_TYPE_DELETE_LIVE_LOCATION;
}
shareLiveLocationPotistion = position;
return VIEW_TYPE_LIVE_LOCATION;
} else {
@ -620,9 +656,14 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
if (locationType == LocationActivity.LOCATION_TYPE_SEND_WITH_LIVE) {
if (position == 1) {
return VIEW_TYPE_SEND_LOCATION;
} else if (position == 2) {
shareLiveLocationPotistion = position;
return VIEW_TYPE_LIVE_LOCATION;
} else if (position == LocationActivity.LOCATION_TYPE_LIVE) {
if (currentInfo != null) {
shareLiveLocationPotistion = -1;
return VIEW_TYPE_DELETE_LIVE_LOCATION;
} else {
shareLiveLocationPotistion = position;
return VIEW_TYPE_LIVE_LOCATION;
}
} else if (position == 3) {
return VIEW_TYPE_SHADOW;
} else if (position == 4) {
@ -642,7 +683,7 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
return VIEW_TYPE_STORY_LOCATION;
}
if (this.street != null) {
if (position == 2) {
if (position == LocationActivity.LOCATION_TYPE_LIVE) {
return VIEW_TYPE_STORY_LOCATION;
}
position--;
@ -672,7 +713,7 @@ public class LocationActivityAdapter extends BaseLocationAdapter implements Loca
if (viewType == VIEW_TYPE_LIVE_LOCATION) {
return !(LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId) == null && gpsLocation == null);
}
return viewType == VIEW_TYPE_SEND_LOCATION || viewType == VIEW_TYPE_LOCATION || viewType == VIEW_TYPE_SHARING || viewType == VIEW_TYPE_STORY_LOCATION;
return viewType == VIEW_TYPE_SEND_LOCATION || viewType == VIEW_TYPE_LOCATION || viewType == VIEW_TYPE_SHARING || viewType == VIEW_TYPE_STORY_LOCATION || viewType == VIEW_TYPE_DELETE_LIVE_LOCATION;
}
private int getThemedColor(int key) {

View file

@ -65,6 +65,7 @@ public class SearchAdapter extends RecyclerListView.SelectionAdapter {
private int searchPointer;
private ArrayList<ContactEntry> allUnregistredContacts;
private ArrayList<ContactsController.Contact> unregistredContacts = new ArrayList<>();
private String lastQuery;
public SearchAdapter(Context context, LongSparseArray<TLRPC.User> arg1, LongSparseArray<TLRPC.User> selected, boolean usernameSearch, boolean mutual, boolean chats, boolean bots, boolean self, boolean phones, int searchChannelId) {
@ -133,6 +134,7 @@ public class SearchAdapter extends RecyclerListView.SelectionAdapter {
private void processSearch(final String query) {
AndroidUtilities.runOnUIThread(() -> {
lastQuery = query;
if (allowUsernameSearch) {
searchAdapterHelper.queryServerSearch(query, true, allowChats, allowBots, allowSelf, false, channelId, allowPhoneNumbers, -1, 1);
}
@ -260,8 +262,8 @@ public class SearchAdapter extends RecyclerListView.SelectionAdapter {
public int getItemCount() {
unregistredContactsHeaderRow = -1;
int count = searchResult.size();
unregistredContactsHeaderRow = count;
if (!unregistredContacts.isEmpty()) {
unregistredContactsHeaderRow = count;
count += unregistredContacts.size() + 1;
}
@ -359,7 +361,18 @@ public class SearchAdapter extends RecyclerListView.SelectionAdapter {
String un = null;
boolean self = false;
if (object instanceof TLRPC.User) {
un = ((TLRPC.User) object).username;
TLRPC.User user = (TLRPC.User) object;
un = UserObject.getPublicUsername((TLRPC.User) object);
if (un != null && lastQuery != null && !un.toLowerCase().contains(lastQuery.toLowerCase())) {
if (user.usernames != null) {
for (int i = 0; i < user.usernames.size(); ++i) {
TLRPC.TL_username u = user.usernames.get(i);
if (u != null && u.active && u.username.toLowerCase().contains(lastQuery.toLowerCase())) {
un = u.username;
}
}
}
}
id = ((TLRPC.User) object).id;
self = ((TLRPC.User) object).self;
} else if (object instanceof TLRPC.Chat) {

View file

@ -13,6 +13,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.telegram.messenger.ImageReceiver;
import org.telegram.messenger.MessagesController;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.Components.AvatarDrawable;
@ -21,17 +22,20 @@ public class AvatarSpan extends ReplacementSpan {
private final Paint shadowPaint;
private final ImageReceiver imageReceiver;
private final AvatarDrawable avatarDrawable;
private final int sz;
private float sz;
private final int currentAccount;
private View parent;
public AvatarSpan(View parent, int currentAccount, int sz) {
public AvatarSpan(View parent, int currentAccount) {
this(parent, currentAccount, 18);
}
public AvatarSpan(View parent, int currentAccount, float sz) {
this.currentAccount = currentAccount;
this.imageReceiver = new ImageReceiver(parent);
this.avatarDrawable = new AvatarDrawable();
imageReceiver.setRoundRadius(dp(sz));
this.sz = sz;
setSize(sz);
this.shadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
shadowPaint.setShadowLayer(dp(1), 0, dp(.66f), 0x33000000);
@ -39,6 +43,11 @@ public class AvatarSpan extends ReplacementSpan {
setParent(parent);
}
public void setSize(float sz) {
imageReceiver.setRoundRadius(dp(sz));
this.sz = sz;
}
public void setParent(View parent) {
if (this.parent == parent) return;
if (this.parent != null) {
@ -88,6 +97,11 @@ public class AvatarSpan extends ReplacementSpan {
imageReceiver.setForUserOrChat(user, avatarDrawable);
}
public void setName(String name) {
avatarDrawable.setInfo(0, name, null, null, null, null);
imageReceiver.setForUserOrChat(null, avatarDrawable);
}
@Override
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
return dp(sz);

View file

@ -9,16 +9,9 @@ import android.graphics.Matrix;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
@ -29,10 +22,8 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.BotWebViewVibrationEffect;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MediaDataController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.Utilities;
@ -40,26 +31,21 @@ import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.ActionBarMenuItem;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.EditTextCell;
import org.telegram.ui.Cells.TextCell;
import org.telegram.ui.Components.AnimatedColor;
import org.telegram.ui.Components.AnimatedFloat;
import org.telegram.ui.Components.AnimatedTextView;
import org.telegram.ui.Components.BulletinFactory;
import org.telegram.ui.Components.ChatAttachAlert;
import org.telegram.ui.Components.ChatGreetingsView;
import org.telegram.ui.Components.CircularProgressDrawable;
import org.telegram.ui.Components.CrossfadeDrawable;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.EditTextBoldCursor;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.SizeNotifierFrameLayout;
import org.telegram.ui.Components.Text;
import org.telegram.ui.Components.UItem;
import org.telegram.ui.Components.UniversalAdapter;
import org.telegram.ui.Components.UniversalFragment;
import org.telegram.ui.Stories.StoryViewer;
import org.telegram.ui.ContentPreviewViewer;
import org.telegram.ui.Stories.recorder.EmojiBottomSheet;
import org.telegram.ui.Stories.recorder.KeyboardNotifier;
import org.telegram.ui.Stories.recorder.PreviewView;
@ -113,6 +99,9 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
private boolean stickerRandom = true;
private TLRPC.Document sticker = getMediaDataController().getGreetingsSticker();
private String inputStickerPath;
private TLRPC.InputDocument inputSticker;
private boolean keyboardVisible;
@Override
@ -303,8 +292,10 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
items.add(UItem.asCustom(messageEdit));
if (stickerRandom) {
items.add(UItem.asButton(BUTTON_STICKER, getString(R.string.BusinessIntroSticker), getString(R.string.BusinessIntroStickerRandom)));
} else if (inputStickerPath != null) {
items.add(UItem.asStickerButton(BUTTON_STICKER, getString(R.string.BusinessIntroSticker), inputStickerPath));
} else {
items.add(UItem.asButton(BUTTON_STICKER, getString(R.string.BusinessIntroSticker), sticker));
items.add(UItem.asStickerButton(BUTTON_STICKER, getString(R.string.BusinessIntroSticker), sticker));
}
items.add(UItem.asShadow(getString(R.string.BusinessIntroInfo)));
if (clearVisible = !isEmpty()) {
@ -319,13 +310,6 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
return TextUtils.isEmpty(titleEdit.getText()) && TextUtils.isEmpty(messageEdit.getText()) && stickerRandom;
}
@Override
public void didReceivedNotification(int id, int account, Object... args) {
if (id == NotificationCenter.userInfoDidLoad) {
setValue();
}
}
private String currentTitle, currentMessage;
private long currentSticker;
@ -347,6 +331,7 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
} else {
titleEdit.setText(currentTitle = "");
messageEdit.setText(currentMessage = "");
inputSticker = null;
sticker = null;
}
currentSticker = sticker == null ? 0 : sticker.id;
@ -371,14 +356,16 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
@Override
protected void onClick(UItem item, View view, int position, float x, float y) {
if (item.id == BUTTON_STICKER) {
EmojiBottomSheet sheet = new EmojiBottomSheet(getContext(), true, getResourceProvider());
EmojiBottomSheet sheet = new EmojiBottomSheet(getContext(), true, getResourceProvider(), true);
sheet.whenDocumentSelected((parentObject, document, a) -> {
stickerRandom = false;
AndroidUtilities.cancelRunOnUIThread(updateRandomStickerRunnable);
greetingsView.setSticker(sticker = document);
((TextCell) view).setValueSticker(document);
checkDone(true, false);
return true;
});
sheet.whenPlusSelected(this::openCustomStickerEditor);
showDialog(sheet);
} else if (item.id == BUTTON_REMOVE) {
titleEdit.setText("");
@ -405,7 +392,7 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
return (
!TextUtils.equals(titleEdit.getText().toString(), currentTitle == null ? "" : currentTitle) ||
!TextUtils.equals(messageEdit.getText().toString(), currentMessage == null ? "" : currentMessage) ||
(stickerRandom || sticker == null ? 0 : sticker.id) != currentSticker
(stickerRandom || sticker == null ? 0 : sticker.id) != currentSticker || (!stickerRandom && inputSticker != null)
);
}
@ -452,9 +439,13 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
req.intro = new TLRPC.TL_inputBusinessIntro();
req.intro.title = titleEdit.getText().toString();
req.intro.description = messageEdit.getText().toString();
if (!stickerRandom && sticker != null) {
if (!stickerRandom && (sticker != null || inputSticker != null)) {
req.intro.flags |= 1;
req.intro.sticker = getMessagesController().getInputDocument(sticker);
if (inputSticker != null) {
req.intro.sticker = inputSticker;
} else {
req.intro.sticker = getMessagesController().getInputDocument(sticker);
}
}
if (userFull != null) {
@ -482,6 +473,9 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
doneButtonDrawable.animateToProgress(0f);
BulletinFactory.of(this).createErrorBulletin(LocaleController.getString(R.string.UnknownError)).show();
} else {
if (inputSticker != null) {
getMessagesController().loadFullUser(getUserConfig().getCurrentUser(), 0, true);
}
finishFragment();
}
}));
@ -503,4 +497,83 @@ public class BusinessIntroActivity extends UniversalFragment implements Notifica
}
private void openCustomStickerEditor() {
ContentPreviewViewer.getInstance().setStickerSetForCustomSticker(null);
if (getParentActivity() == null) {
return;
}
createChatAttachView();
chatAttachAlert.getPhotoLayout().loadGalleryPhotos();
chatAttachAlert.setMaxSelectedPhotos(1, false);
chatAttachAlert.setOpenWithFrontFaceCamera(true);
chatAttachAlert.enableStickerMode(this::setCustomSticker);
chatAttachAlert.init();
chatAttachAlert.parentThemeDelegate = null;
if (visibleDialog != null) {
chatAttachAlert.show();
} else {
showDialog(chatAttachAlert);
}
}
private ChatAttachAlert chatAttachAlert;
private void createChatAttachView() {
if (getParentActivity() == null || getContext() == null) {
return;
}
if (chatAttachAlert == null) {
chatAttachAlert = new ChatAttachAlert(getParentActivity(), this, false, false, true, resourceProvider) {
@Override
public void dismissInternal() {
if (chatAttachAlert != null && chatAttachAlert.isShowing()) {
AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid);
}
super.dismissInternal();
}
@Override
public void onDismissAnimationStart() {
if (chatAttachAlert != null) {
chatAttachAlert.setFocusable(false);
}
if (chatAttachAlert != null && chatAttachAlert.isShowing()) {
AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid);
}
}
};
chatAttachAlert.setDelegate(new ChatAttachAlert.ChatAttachViewDelegate() {
@Override
public void didPressedButton(int button, boolean arg, boolean notify, int scheduleDate, boolean forceDocument) {
}
@Override
public void doOnIdle(Runnable runnable) {
NotificationCenter.getInstance(currentAccount).doOnIdle(runnable);
}
});
}
}
private void setCustomSticker(String localPath, TLRPC.InputDocument inputDocument) {
chatAttachAlert.dismiss();
inputStickerPath = localPath;
inputSticker = inputDocument;
stickerRandom = false;
AndroidUtilities.cancelRunOnUIThread(updateRandomStickerRunnable);
greetingsView.setSticker(inputStickerPath);
checkDone(true, false);
if (listView != null && listView.adapter != null) {
listView.adapter.update(true);
}
}
@Override
public void didReceivedNotification(int id, int account, Object... args) {
if (id == NotificationCenter.userInfoDidLoad) {
setValue();
}
}
}

View file

@ -370,7 +370,7 @@ public class ChatbotsActivity extends BaseFragment {
}
}
private void clear() {
private void clear(View view) {
selectedBot = null;
listView.adapter.update(true);
checkDone(true);

View file

@ -1,6 +1,7 @@
package org.telegram.ui.Business;
import static org.telegram.messenger.AndroidUtilities.dp;
import static org.telegram.messenger.LocaleController.formatString;
import static org.telegram.messenger.LocaleController.getString;
import android.content.Context;
@ -20,6 +21,7 @@ import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.UserObject;
import org.telegram.messenger.Utilities;
import org.telegram.tgnet.AbstractSerializedData;
import org.telegram.tgnet.TLObject;
@ -298,8 +300,15 @@ public class OpeningHoursActivity extends BaseFragment implements NotificationCe
if (!days[prevDay].isEmpty() && days[prevDay].get(days[prevDay].size() - 1).end >= 24 * 60) {
days[prevDay].get(days[prevDay].size() - 1).end = 24 * 60 - 1;
}
int periodEnd = Math.min(m - start - 1, 24 * 60 * 2 - 1);
ArrayList<Period> nextDay = days[(7 + i + 1) % 7];
if (periodEnd >= 24 * 60 && !nextDay.isEmpty() && nextDay.get(0).start < periodEnd - 24 * 60) {
periodEnd = 24 * 60 + nextDay.get(0).start - 1;
}
days[i].clear();
days[i].add(new Period(0, 24 * 60 - 1));
days[i].add(new Period(0, periodEnd));
} else {
int nextDay = (i + 1) % 7;
if (!days[i].isEmpty() && !days[nextDay].isEmpty()) {
@ -333,6 +342,44 @@ public class OpeningHoursActivity extends BaseFragment implements NotificationCe
return hours;
}
public static String toString(int currentAccount, TLRPC.User user, TLRPC.TL_businessWorkHours business_work_hours) {
if (business_work_hours == null) return null;
ArrayList<OpeningHoursActivity.Period>[] days = OpeningHoursActivity.getDaysHours(business_work_hours.weekly_open);
StringBuilder sb = new StringBuilder();
if (user != null) {
sb.append(formatString(R.string.BusinessHoursCopyHeader, UserObject.getUserName(user))).append("\n");
}
for (int i = 0; i < days.length; ++i) {
ArrayList<OpeningHoursActivity.Period> periods = days[i];
String day = DayOfWeek.values()[i].getDisplayName(TextStyle.FULL, LocaleController.getInstance().getCurrentLocale());
day = day.substring(0, 1).toUpperCase() + day.substring(1);
sb.append(day).append(": ");
if (OpeningHoursActivity.isFull(periods)) {
sb.append(LocaleController.getString(R.string.BusinessHoursProfileOpen));
} else if (periods.isEmpty()) {
sb.append(LocaleController.getString(R.string.BusinessHoursProfileClose));
} else {
for (int j = 0; j < periods.size(); ++j) {
if (j > 0) sb.append(", ");
OpeningHoursActivity.Period p = periods.get(j);
sb.append(OpeningHoursActivity.Period.timeToString(p.start));
sb.append(" - ");
sb.append(OpeningHoursActivity.Period.timeToString(p.end));
}
}
sb.append("\n");
}
TLRPC.TL_timezone timezone = TimezonesController.getInstance(currentAccount).findTimezone(business_work_hours.timezone_id);
Calendar calendar = Calendar.getInstance();
int currentUtcOffset = calendar.getTimeZone().getRawOffset() / 1000;
int valueUtcOffset = timezone == null ? 0 : timezone.utc_offset;
int utcOffset = (currentUtcOffset - valueUtcOffset) / 60;
if (utcOffset != 0 && timezone != null) {
sb.append(formatString(R.string.BusinessHoursCopyFooter, TimezonesController.getInstance(currentAccount).getTimezoneName(timezone, true)));
}
return sb.toString();
}
private void processDone() {
if (doneButtonDrawable.getProgress() > 0f) return;

View file

@ -132,7 +132,7 @@ public class OpeningHoursDayActivity extends BaseFragment {
if (periods.size() >= maxPeriodsCount) {
return false;
}
return periods.isEmpty() || is24() || periods.get(periods.size() - 1).end < max - 2;
return periods.isEmpty() || is24() || periods.get(periods.size() - 1).end < Math.min(24 * 60 - 2, max - 2);
}
private void onClick(UItem item, View view, int position, float x, float y) {

View file

@ -204,7 +204,7 @@ public class ProfileHoursCell extends LinearLayout {
TLRPC.TL_timezone timezone = timezonesController.findTimezone(value.timezone_id);
Calendar calendar = Calendar.getInstance();
int currentUtcOffset = calendar.getTimeZone().getRawOffset() / 1000;
int currentUtcOffset = calendar.getTimeZone().getOffset(System.currentTimeMillis()) / 1000;
int valueUtcOffset = timezone == null ? 0 : timezone.utc_offset;
int utcOffset = (currentUtcOffset - valueUtcOffset) / 60;
switchText.setVisibility(utcOffset != 0 && !is24x7 ? View.VISIBLE : View.GONE);
@ -287,15 +287,15 @@ public class ProfileHoursCell extends LinearLayout {
TextView textView = k == 0 ? timeText[i][a] : labelTimeText[a];
if (i == 0 && !open_now && k == 1) {
int opensPeriodTime = -1;
for (int j = 0; j < weekly_open.size(); ++j) {
TLRPC.TL_businessWeeklyOpen weekly = weekly_open.get(j);
for (int j = 0; j < adapted_weekly_open.size(); ++j) {
TLRPC.TL_businessWeeklyOpen weekly = adapted_weekly_open.get(j);
if (nowPeriodTime < weekly.start_minute) {
opensPeriodTime = weekly.start_minute;
break;
}
}
if (opensPeriodTime == -1 && !weekly_open.isEmpty()) {
opensPeriodTime = weekly_open.get(0).start_minute;
if (opensPeriodTime == -1 && !adapted_weekly_open.isEmpty()) {
opensPeriodTime = adapted_weekly_open.get(0).start_minute;
}
if (opensPeriodTime == -1) {
textView.setText(getString(R.string.BusinessHoursProfileClose));

View file

@ -148,7 +148,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
private LinearLayoutManager layoutManager;
AlertDialog progressDialog;
private boolean[] selected = new boolean[] { true, true, true, true, true, true, true, true, true, true };
private boolean[] selected = new boolean[] { true, true, true, true, true, true, true, true, true, true, true };
private long databaseSize = -1;
private long cacheSize = -1, cacheEmojiSize = -1, cacheTempSize = -1;
private long documentsSize = -1;
@ -157,6 +157,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
private long musicSize = -1;
private long photoSize = -1;
private long videoSize = -1;
private long logsSize = -1;
private long stickersCacheSize = -1;
private long totalSize = -1;
private long totalDeviceSize = -1;
@ -247,7 +248,11 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
stickersCacheSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), 3);
long audioSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_AUDIO), 0);
long storiesSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_STORIES), 0);
final long totalSize = lastTotalSizeCalculated = cacheSize + cacheTempSize + videoSize + audioSize + photoSize + documentsSize + musicSize + stickersCacheSize + storiesSize;
long logsSize = getDirectorySize(AndroidUtilities.getLogsDir(), 1);
if (!BuildVars.DEBUG_VERSION && logsSize < 1024 * 1024 * 256) {
logsSize = 0;
}
final long totalSize = lastTotalSizeCalculated = cacheSize + cacheTempSize + videoSize + audioSize + photoSize + documentsSize + musicSize + stickersCacheSize + storiesSize + logsSize;
lastTotalSizeCalculatedTime = System.currentTimeMillis();
if (!canceled) {
AndroidUtilities.runOnUIThread(() -> {
@ -349,6 +354,13 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
if (canceled) {
return;
}
logsSize = getDirectorySize(AndroidUtilities.getLogsDir(), 1);
if (!BuildVars.DEBUG_VERSION && logsSize < 1024 * 1024 * 256) {
logsSize = 0;
}
if (canceled) {
return;
}
documentsSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_DOCUMENT), 1);
documentsSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES), 1);
if (canceled) {
@ -373,7 +385,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
if (canceled) {
return;
}
totalSize = lastTotalSizeCalculated = cacheSize + cacheTempSize + videoSize + audioSize + photoSize + documentsSize + musicSize + storiesSize + stickersCacheSize;
totalSize = lastTotalSizeCalculated = cacheSize + cacheTempSize + videoSize + logsSize + audioSize + photoSize + documentsSize + musicSize + storiesSize + stickersCacheSize;
lastTotalSizeCalculatedTime = System.currentTimeMillis();
File path;
@ -440,13 +452,13 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
private void updateChart() {
if (cacheChart != null) {
if (!calculating && totalSize > 0) {
CacheChart.SegmentSize[] segments = new CacheChart.SegmentSize[10];
CacheChart.SegmentSize[] segments = new CacheChart.SegmentSize[11];
for (int i = 0; i < itemInners.size(); ++i) {
ItemInner item = itemInners.get(i);
if (item.viewType == VIEW_TYPE_SECTION) {
if (item.index < 0) {
if (collapsed) {
segments[9] = CacheChart.SegmentSize.of(item.size, selected[9]);
segments[10] = CacheChart.SegmentSize.of(item.size, selected[10]);
}
} else {
segments[item.index] = CacheChart.SegmentSize.of(item.size, selected[item.index]);
@ -732,19 +744,22 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
if (cacheTempSize > 0) {
sections.add(ItemInner.asCheckBox(LocaleController.getString(R.string.LocalMiscellaneousCache), 8, cacheTempSize, Theme.key_statisticChartLine_purple));
}
if (logsSize > 0) {
sections.add(ItemInner.asCheckBox(LocaleController.getString(R.string.LocalLogsCache), 9, logsSize, Theme.key_statisticChartLine_golden));
}
if (!sections.isEmpty()) {
Collections.sort(sections, (a, b) -> Long.compare(b.size, a.size));
sections.get(sections.size() - 1).last = true;
hasCache = true;
if (tempSizes == null) {
tempSizes = new float[10];
tempSizes = new float[11];
}
for (int i = 0; i < tempSizes.length; ++i) {
tempSizes[i] = (float) size(i);
}
if (percents == null) {
percents = new int[10];
percents = new int[11];
}
AndroidUtilities.roundPercents(tempSizes, percents);
@ -758,7 +773,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
sum += sections.get(i).size;
sumPercents += percents[sections.get(i).index];
}
percents[9] = sumPercents;
percents[10] = sumPercents;
itemInners.add(ItemInner.asCheckBox(LocaleController.getString(R.string.LocalOther), -1, sum, Theme.key_statisticChartLine_golden));
if (!collapsed) {
itemInners.addAll(sections.subList(MAX_NOT_COLLAPSED, sections.size()));
@ -964,7 +979,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
long clearedSize = 0;
boolean allItemsClear = true;
final int[] clearDirI = new int[] { 0 };
int clearDirCount = (selected[0] ? 2 : 0) + (selected[1] ? 2 : 0) + (selected[2] ? 2 : 0) + (selected[3] ? 2 : 0) + (selected[4] ? 1 : 0) + (selected[5] ? 2 : 0) + (selected[6] ? 1 : 0) + (selected[7] ? 1 : 0) + (selected[8] ? 1 : 0);
int clearDirCount = (selected[0] ? 2 : 0) + (selected[1] ? 2 : 0) + (selected[2] ? 2 : 0) + (selected[3] ? 2 : 0) + (selected[4] ? 1 : 0) + (selected[5] ? 2 : 0) + (selected[6] ? 1 : 0) + (selected[7] ? 1 : 0) + (selected[8] ? 1 : 0) + (selected[9] ? 1 : 0);
long time = System.currentTimeMillis();
Utilities.Callback<Float> updateProgress = t -> {
onProgress.run(clearDirI[0] / (float) clearDirCount + (1f / clearDirCount) * MathUtils.clamp(t, 0, 1), false);
@ -973,7 +988,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
final long now = System.currentTimeMillis();
onProgress.run(clearDirI[0] / (float) clearDirCount, now - time > 250);
};
for (int a = 0; a < 9; a++) {
for (int a = 0; a < 10; a++) {
if (!selected[a]) {
allItemsClear = false;
continue;
@ -1011,12 +1026,18 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
clearedSize += cacheTempSize;
documentsMusicType = 4;
type = FileLoader.MEDIA_DIR_CACHE;
} else if (a == 9) {
clearedSize += logsSize;
documentsMusicType = 1;
type = 0;
}
if (type == -1) {
continue;
}
File file;
if (type == 100) {
if (a == 9) {
file = AndroidUtilities.getLogsDir();
} else if (type == 100) {
file = new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache");
} else {
file = FileLoader.checkDirectory(type);
@ -1058,7 +1079,9 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
next.run();
}
if (type == FileLoader.MEDIA_DIR_CACHE) {
if (a == 9) {
logsSize = getDirectorySize(AndroidUtilities.getLogsDir(), 1);
} else if (type == FileLoader.MEDIA_DIR_CACHE) {
cacheSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), 5);
cacheTempSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), 4);
imagesCleared = true;
@ -1089,7 +1112,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
}
}
final boolean imagesClearedFinal = imagesCleared;
totalSize = lastTotalSizeCalculated = cacheSize + cacheTempSize + videoSize + audioSize + photoSize + documentsSize + musicSize + stickersCacheSize + storiesSize;
totalSize = lastTotalSizeCalculated = cacheSize + cacheTempSize + logsSize + videoSize + audioSize + photoSize + documentsSize + musicSize + stickersCacheSize + storiesSize;
lastTotalSizeCalculatedTime = System.currentTimeMillis();
Arrays.fill(selected, true);
@ -1181,13 +1204,14 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
case 6: return stickersCacheSize;
case 7: return cacheSize;
case 8: return cacheTempSize;
case 9: return logsSize;
default: return 0;
}
}
private int sectionsSelected() {
int count = 0;
for (int i = 0; i < 9; ++i) {
for (int i = 0; i < 10; ++i) {
if (selected[i] && size(i) > 0) {
count++;
}
@ -2068,7 +2092,8 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
(selected[5] ? storiesSize : 0) +
(selected[6] ? stickersCacheSize : 0) +
(selected[7] ? cacheSize : 0) +
(selected[8] ? cacheTempSize : 0)
(selected[8] ? cacheTempSize : 0) +
(selected[9] ? logsSize : 0)
);
setSize(
isAllSectionsSelected(),
@ -2581,7 +2606,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
final ItemInner item = itemInners.get(position);
switch (holder.getItemViewType()) {
case VIEW_TYPE_CHART:
// updateChart();
updateChart();
break;
case VIEW_TYPE_CHART_HEADER:
if (cacheChartHeader != null && !calculating) {
@ -2668,7 +2693,6 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe
headerCell.setTopMargin(itemInners.get(position).headerTopMargin);
headerCell.setBottomMargin(itemInners.get(position).headerBottomMargin);
break;
}
}

View file

@ -113,7 +113,7 @@ public class AccountSelectCell extends FrameLayout {
} else {
TLRPC.Chat chat = (TLRPC.Chat) object;
avatarDrawable.setInfo(chat);
infoTextView.setText(chat.title);
infoTextView.setText(chat == null ? "" : chat.title);
imageView.setForUserOrChat(chat, avatarDrawable);
}
}

View file

@ -76,6 +76,7 @@ import org.telegram.tgnet.tl.TL_stories;
import org.telegram.ui.ActionBar.ActionBar;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ChannelAdminLogActivity;
import org.telegram.ui.ChatBackgroundDrawable;
import org.telegram.ui.Components.AnimatedEmojiDrawable;
import org.telegram.ui.Components.AnimatedEmojiSpan;
@ -89,16 +90,19 @@ import org.telegram.ui.Components.Premium.StarParticlesView;
import org.telegram.ui.Components.RLottieDrawable;
import org.telegram.ui.Components.RadialProgress2;
import org.telegram.ui.Components.RadialProgressView;
import org.telegram.ui.Components.ScaleStateListAnimator;
import org.telegram.ui.Components.TypefaceSpan;
import org.telegram.ui.Components.URLSpanNoUnderline;
import org.telegram.ui.Components.spoilers.SpoilerEffect;
import org.telegram.ui.LaunchActivity;
import org.telegram.ui.PhotoViewer;
import org.telegram.ui.ProfileActivity;
import org.telegram.ui.Stories.StoriesUtilities;
import org.telegram.ui.Stories.UploadingDotsSpannable;
import org.telegram.ui.Stories.recorder.HintView2;
import org.telegram.ui.Stories.recorder.PreviewView;
import java.nio.channels.Channel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -459,6 +463,17 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
if (messageObject.type != MessageObject.TYPE_ACTION_WALLPAPER) {
wallpaperPreviewDrawable = null;
}
if (messageObject.actionDeleteGroupEventId != -1) {
ScaleStateListAnimator.apply(this, .02f, 1.2f);
overriddenMaxWidth = Math.max(dp(250), HintView2.cutInFancyHalf(messageObject.messageText, (TextPaint) getThemedPaint(Theme.key_paint_chatActionText)));
ProfileActivity.ShowDrawable showDrawable = ChannelAdminLogActivity.findDrawable(messageObject.messageText);
if (showDrawable != null) {
showDrawable.setView(this);
}
} else {
ScaleStateListAnimator.reset(this);
overriddenMaxWidth = 0;
}
if (messageObject.isStoryMention()) {
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(messageObject.messageOwner.media.user_id);
avatarDrawable.setInfo(currentAccount, user);
@ -1804,7 +1819,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
int lineWidth = (int) Math.ceil(textLayout.getLineWidth(a));
if (a != 0) {
int diff = prevLineWidth - lineWidth;
if (diff > 0 && diff <= corner + cornerIn) {
if (diff > 0 && diff <= 1.5f * corner + cornerIn) {
lineWidth = prevLineWidth;
}
}
@ -1814,7 +1829,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
for (int a = count - 2; a >= 0; a--) {
int lineWidth = lineWidths.get(a);
int diff = prevLineWidth - lineWidth;
if (diff > 0 && diff <= corner + cornerIn) {
if (diff > 0 && diff <= 1.5f * corner + cornerIn) {
lineWidth = prevLineWidth;
}
lineWidths.set(a, lineWidth);

View file

@ -128,6 +128,7 @@ import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.tgnet.tl.TL_stories;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.AvatarSpan;
import org.telegram.ui.ChatActivity;
import org.telegram.ui.Components.AnimatedEmojiDrawable;
import org.telegram.ui.Components.AnimatedEmojiSpan;
@ -145,6 +146,7 @@ import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.EmptyStubSpan;
import org.telegram.ui.Components.FloatSeekBarAccessibilityDelegate;
import org.telegram.ui.Components.Forum.MessageTopicButton;
import org.telegram.ui.Components.ForwardBackground;
import org.telegram.ui.Components.InfiniteProgress;
import org.telegram.ui.Components.LinkPath;
import org.telegram.ui.Components.LinkSpanDrawable;
@ -169,6 +171,7 @@ import org.telegram.ui.Components.SeekBarAccessibilityDelegate;
import org.telegram.ui.Components.SeekBarWaveform;
import org.telegram.ui.Components.SlotsDrawable;
import org.telegram.ui.Components.StaticLayoutEx;
import org.telegram.ui.Components.StickerSetLinkIcon;
import org.telegram.ui.Components.TextStyleSpan;
import org.telegram.ui.Components.TimerParticles;
import org.telegram.ui.Components.TranscribeButton;
@ -292,23 +295,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
avatarDrawable.setInfo(currentAccount, currentChat);
avatarImage.setForUserOrChat(currentChat, avatarDrawable);
} else if (messageObject.isSponsored()) {
if (messageObject.sponsoredWebPage != null) {
avatarDrawable.setInfo(messageObject.sponsoredId[0], messageObject.sponsoredWebPage.site_name, null, null);
TLRPC.Photo photo = messageObject.sponsoredWebPage.photo;
if (photo != null) {
avatarImage.setImage(ImageLocation.getForPhoto(FileLoader.getClosestPhotoSizeWithSize(photo.sizes, AndroidUtilities.dp(50), false, null, true), photo), "50_50", avatarDrawable, null, null, 0);
}
} else if (messageObject.sponsoredChatInvite != null && messageObject.sponsoredChatInvite.chat != null) {
avatarDrawable.setInfo(currentAccount, messageObject.sponsoredChatInvite.chat);
avatarImage.setForUserOrChat(messageObject.sponsoredChatInvite.chat, avatarDrawable);
} else {
avatarDrawable.setInfo(currentAccount, messageObject.sponsoredChatInvite);
if (messageObject.sponsoredChatInvite != null) {
TLRPC.Photo photo = messageObject.sponsoredChatInvite.photo;
if (photo != null) {
avatarImage.setImage(ImageLocation.getForPhoto(FileLoader.getClosestPhotoSizeWithSize(photo.sizes, AndroidUtilities.dp(50), false, null, true), photo), "50_50", avatarDrawable, null, null, 0);
}
}
if (messageObject.sponsoredPhoto != null) {
avatarImage.setImage(ImageLocation.getForPhoto(FileLoader.getClosestPhotoSizeWithSize(messageObject.sponsoredPhoto.sizes, AndroidUtilities.dp(50), false, null, true), messageObject.sponsoredPhoto), "50_50", avatarDrawable, null, null, 0);
}
} else {
currentPhoto = null;
@ -541,7 +529,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
default void didPressOther(ChatMessageCell cell, float otherX, float otherY) {
}
default void didPressSponsoredClose() {
default void didPressSponsoredClose(ChatMessageCell cell) {
}
default void didPressSponsoredInfo(ChatMessageCell cell, float x, float y) {
@ -559,7 +547,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
default void didPressReaction(ChatMessageCell cell, TLRPC.ReactionCount reaction, boolean longpress) {
}
default void didPressVoteButtons(ChatMessageCell cell, ArrayList<TLRPC.TL_pollAnswer> buttons, int showCount, int x, int y) {
default void didPressVoteButtons(ChatMessageCell cell, ArrayList<TLRPC.PollAnswer> buttons, int showCount, int x, int y) {
}
default void didPressInstantButton(ChatMessageCell cell, int type) {
@ -765,12 +753,15 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private boolean prevChosen;
private boolean correct;
private StaticLayout title;
private TLRPC.TL_pollAnswer answer;
public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmoji;
private TLRPC.PollAnswer answer;
}
public static final int INSTANT_BUTTON_TYPE_CONTACT_VIEW = 5;
public static final int INSTANT_BUTTON_TYPE_CONTACT_SEND_MESSAGE = 30;
public static final int INSTANT_BUTTON_TYPE_CONTACT_ADD = 31;
public static final int INSTANT_BUTTON_TYPE_STICKER_SET = 23;
public static final int INSTANT_BUTTON_TYPE_EMOJI_SET = 24;
private static class InstantViewButton {
private int type;
@ -847,6 +838,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private Paint onceRadialStrokePaint;
private int onceRadialPaintColor;
private StickerSetLinkIcon stickerSetIcons;
private boolean disallowLongPress;
private float lastTouchX;
private float lastTouchY;
@ -861,6 +854,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private long lastCheckBoxAnimationTime;
public int checkBoxTranslation;
private AvatarSpan forwardAvatar;
private ForwardBackground forwardBg;
public boolean linkPreviewAbove;
private boolean isSmallImage;
private boolean drawImageButton;
@ -1024,6 +1019,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private BitmapDrawable currentPhotoObjectThumbStripped;
private String currentPhotoFilter;
private String currentPhotoFilterThumb;
private Drawable foreverDrawable;
private int foreverDrawableColor = 0xFFFFFFFF;
private boolean timePressed;
@ -1367,6 +1364,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiStack;
public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiReplyStack;
public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiDescriptionStack;
public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiPollQuestion;
public ButtonBounce replyBounce, contactBounce;
public float replyBounceX, replyBounceY;
public Drawable replySelector;
@ -2268,7 +2266,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
final float left = descriptionLayout.getLineLeft(line);
if (left <= checkX && left + descriptionLayout.getLineWidth(line) >= checkX) {
Spannable buffer = (Spannable) currentMessageObject.linkDescription;
Spannable buffer = (Spannable) (currentMessageObject.isSponsored() ? currentMessageObject.messageText : currentMessageObject.linkDescription);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
boolean ignore = false;
if (link.length == 0 || link[0] instanceof URLSpanBotCommand && !URLSpanBotCommand.enabled) {
@ -2537,9 +2535,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
Toast.makeText(getContext(), LocaleController.getString("MessageScheduledVote", R.string.MessageScheduledVote), Toast.LENGTH_LONG).show();
} else {
PollButton button = pollButtons.get(pressedVoteButton);
TLRPC.TL_pollAnswer answer = button.answer;
TLRPC.PollAnswer answer = button.answer;
if (pollVoted || pollClosed) {
ArrayList<TLRPC.TL_pollAnswer> answers = new ArrayList<>();
ArrayList<TLRPC.PollAnswer> answers = new ArrayList<>();
answers.add(answer);
delegate.didPressVoteButtons(this, answers, button.count, button.x + AndroidUtilities.dp(50), button.y + namesOffset);
} else {
@ -2559,7 +2557,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
firstCircleLength = true;
voteCurrentCircleLength = 360;
voteRisingCircleLength = false;
ArrayList<TLRPC.TL_pollAnswer> answers = new ArrayList<>();
ArrayList<TLRPC.PollAnswer> answers = new ArrayList<>();
answers.add(answer);
delegate.didPressVoteButtons(this, answers, -1, 0, 0);
}
@ -2829,7 +2827,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (closeSponsoredBounce != null && closeSponsoredBounce.isPressed()) {
if (delegate != null) {
delegate.didPressSponsoredClose();
delegate.didPressSponsoredClose(this);
}
}
if (closeSponsoredBounce != null) {
@ -3380,7 +3378,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
private boolean checkBotButtonMotionEvent(MotionEvent event) {
if (botButtons.isEmpty() || currentMessageObject.eventId != 0) {
if (botButtons.isEmpty()) {
return false;
}
@ -3669,6 +3667,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (viaWidth != 0 && x >= forwardNameX + viaNameWidth + AndroidUtilities.dp(4)) {
forwardBotPressed = true;
} else {
if (forwardBg != null) {
forwardBg.setPressed(true, x - forwardNameX, y - forwardNameY);
}
forwardNamePressed = true;
}
result = true;
@ -3760,7 +3761,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
id = 0;
}
delegate.didPressChannelAvatar(this, chat != null ? chat : currentChat, id, lastTouchX, lastTouchY);
} else if (currentMessageObject != null && currentMessageObject.sponsoredChatInvite != null) {
} else if (currentMessageObject != null) {
delegate.didPressInstantButton(this, drawInstantViewType);
}
}
@ -3784,6 +3785,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} else if (forwardNamePressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
forwardNamePressed = false;
if (forwardBg != null) {
forwardBg.setPressed(false);
}
playSoundEffect(SoundEffectConstants.CLICK);
if (delegate != null) {
if (currentForwardChannel != null) {
@ -3800,9 +3804,15 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
forwardNamePressed = false;
if (forwardBg != null) {
forwardBg.setPressed(false);
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (!(x >= forwardNameX && x <= forwardNameX + forwardedNameWidth && y >= forwardNameY && y <= forwardNameY + forwardHeight)) {
forwardNamePressed = false;
if (forwardBg != null) {
forwardBg.setPressed(false);
}
}
}
} else if (forwardBotPressed) {
@ -3902,7 +3912,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
playSoundEffect(SoundEffectConstants.CLICK);
if (delegate != null) {
if (pressedSideButton == SIDE_BUTTON_SPONSORED_CLOSE) {
delegate.didPressSponsoredClose();
delegate.didPressSponsoredClose(this);
} else if (pressedSideButton == SIDE_BUTTON_SPONSORED_MORE) {
delegate.didPressSponsoredInfo(this, x, y);
} else if (pressedSideButton == 3) {
@ -4697,6 +4707,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
ImageLoader.getInstance().removeTestWebFile(currentUrl);
addedForTest = false;
}
if (stickerSetIcons != null) {
stickerSetIcons.detach(this);
}
DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this);
if (getDelegate() != null && getDelegate().getTextSelectionHelper() != null) {
@ -4823,6 +4836,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (channelRecommendationsCell != null) {
channelRecommendationsCell.onAttachedToWindow();
}
if (stickerSetIcons != null) {
stickerSetIcons.attach(this);
}
}
public void copySpoilerEffect2AttachIndexFrom(ChatMessageCell cell) {
@ -5057,6 +5073,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
groupChanged = newPosition != currentPosition;
}
if (messageChanged || dataChanged || groupChanged || pollChanged || widthChanged && messageObject.isPoll() || isPhotoDataChanged(messageObject) || pinnedBottom != bottomNear || pinnedTop != topNear) {
if (stickerSetIcons != null) {
stickerSetIcons.readyToDie();
}
wasPinned = isPinned;
pinnedBottom = bottomNear;
pinnedTop = topNear;
@ -5519,6 +5538,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
TLRPC.Document androidThemeDocument = null;
TL_stories.StoryItem storyItem = null;
TLRPC.ThemeSettings androidThemeSettings = null;
ArrayList<TLRPC.Document> stickers = null;
boolean stickersTextColor = false;
if (messageObject.isGiveawayOrGiveawayResults()) {
hasLinkPreview = true;
}
@ -5531,22 +5552,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
drawInstantView = true;
hasLinkPreview = true;
instantViewButtonText = messageObject.sponsoredButtonText;
if (messageObject.sponsoredBotApp != null) {
drawInstantViewType = 15;
} else if (messageObject.sponsoredWebPage != null) {
drawInstantViewType = 16;
} else if (messageObject.sponsoredChannelPost != 0) {
drawInstantViewType = 12;
} else {
drawInstantViewType = 1;
long id = MessageObject.getPeerId(messageObject.messageOwner.from_id);
if (id > 0) {
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(id);
if (user != null && user.bot) {
drawInstantViewType = 10;
}
}
}
drawInstantViewType = 1;
} else if (messageObject.isGiveawayOrGiveawayResults()) {
drawInstantView = true;
drawInstantViewType = 19;
@ -5698,6 +5704,25 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} catch (Exception ignore) {
}
} else if ("telegram_stickerset".equals(webpageType)) {
TLRPC.TL_webPageAttributeStickerSet attr = null;
for (int i = 0; i < webpage.attributes.size(); ++i) {
if (webpage.attributes.get(i) instanceof TLRPC.TL_webPageAttributeStickerSet) {
attr = (TLRPC.TL_webPageAttributeStickerSet) webpage.attributes.get(i);
break;
}
}
drawInstantView = true;
if (attr != null && attr.emojis) {
drawInstantViewType = 24;
} else {
drawInstantViewType = 23;
}
isSmallImage = true;
if (attr != null) {
stickers = attr.stickers;
stickersTextColor = attr.text_color;
}
}
} else if (siteName != null) {
siteName = siteName.toLowerCase();
@ -5840,27 +5865,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
photo = null;
author = null;
document = null;
if (messageObject.sponsoredBotApp != null) {
photo = messageObject.sponsoredBotApp.photo;
} else if (messageObject.sponsoredWebPage != null) {
photo = messageObject.sponsoredWebPage.photo;
} else if (messageObject.sponsoredChatInvite != null && messageObject.sponsoredChatInvite.chat != null) {
peerPhoto = messageObject.sponsoredChatInvite.chat;
currentPhotoLocation = ImageLocation.getForChat(messageObject.sponsoredChatInvite.chat, ImageLocation.TYPE_BIG);
currentPhotoThumbLocation = ImageLocation.getForChat(messageObject.sponsoredChatInvite.chat, ImageLocation.TYPE_SMALL);
} else if (messageObject.sponsoredShowPeerPhoto) {
peerPhoto = messageObject.getFromPeerObject();
if (peerPhoto instanceof TLRPC.User) {
currentPhotoLocation = ImageLocation.getForUser((TLRPC.User) peerPhoto, ImageLocation.TYPE_BIG);
currentPhotoThumbLocation = ImageLocation.getForUser((TLRPC.User) peerPhoto, ImageLocation.TYPE_SMALL);
} else if (peerPhoto instanceof TLRPC.Chat) {
currentPhotoLocation = ImageLocation.getForChat((TLRPC.Chat) peerPhoto, ImageLocation.TYPE_BIG);
currentPhotoThumbLocation = ImageLocation.getForChat((TLRPC.Chat) peerPhoto, ImageLocation.TYPE_SMALL);
}
}
if (photo == null && messageObject.sponsoredChatInvite != null) {
photo = messageObject.sponsoredChatInvite.photo;
}
photo = messageObject.sponsoredPhoto;
duration = 0;
type = null;
isSmallImage = photo != null || peerPhoto != null;
@ -5928,9 +5933,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
"telegram_user".equals(type) || "telegram_channel".equals(type) ||
"telegram_megagroup".equals(type) || "telegram_voicechat".equals(type) ||
"telegram_livestream".equals(type) || "telegram_channel_boost".equals(type) || "telegram_group_boost".equals(type);
smallImage = !slideshow && (!drawInstantView || drawInstantViewType == 1 || drawInstantViewType == 2 || drawInstantViewType == 9 || drawInstantViewType == 11 || drawInstantViewType == 13 || drawInstantViewType == 18 || drawInstantViewType == 20 || drawInstantViewType == 22) && document == null && isSmallImageType;
smallImage = !slideshow && (!drawInstantView || drawInstantViewType == 1 || drawInstantViewType == 2 || drawInstantViewType == 9 || drawInstantViewType == 11 || drawInstantViewType == 13 || drawInstantViewType == 18 || drawInstantViewType == 20 || drawInstantViewType == 22) && document == null && isSmallImageType || (drawInstantViewType == 23 || drawInstantViewType == 24) && stickers != null && !stickers.isEmpty();
TLRPC.MessageMedia media = MessageObject.getMedia(messageObject.messageOwner);
if (media != null) {
if (media != null && !(drawInstantViewType == 23 || drawInstantViewType == 24)) {
if (media.force_large_media) {
smallImage = false;
}
@ -5939,7 +5944,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
linkPreviewAbove = currentMessageObject.messageOwner != null && currentMessageObject.messageOwner.invert_media;
isSmallImage = smallImage && type != null && currentMessageObject.photoThumbs != null;
isSmallImage = smallImage && type != null && currentMessageObject.photoThumbs != null || (drawInstantViewType == 23 || drawInstantViewType == 24) && stickers != null && !stickers.isEmpty();
} else if (hasInvoicePreview) {
TLRPC.TL_messageMediaInvoice invoice = (TLRPC.TL_messageMediaInvoice) MessageObject.getMedia(messageObject.messageOwner);
site_name = MessageObject.getMedia(messageObject.messageOwner).title;
@ -6476,7 +6481,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
if (documentAttachType != DOCUMENT_ATTACH_TYPE_MUSIC && documentAttachType != DOCUMENT_ATTACH_TYPE_AUDIO && documentAttachType != DOCUMENT_ATTACH_TYPE_DOCUMENT) {
if (currentPhotoObject != null || currentPhotoLocation != null || webDocument != null || documentAttachType == DOCUMENT_ATTACH_TYPE_WALLPAPER || documentAttachType == DOCUMENT_ATTACH_TYPE_THEME) {
if (currentPhotoObject != null || currentPhotoLocation != null || webDocument != null || documentAttachType == DOCUMENT_ATTACH_TYPE_WALLPAPER || documentAttachType == DOCUMENT_ATTACH_TYPE_THEME || (drawInstantViewType == 23 || drawInstantViewType == 24) && stickers != null && !stickers.isEmpty()) {
drawImageButton = photo != null && !smallImage || type != null && (type.equals("photo") || type.equals("document") && documentAttachType != DOCUMENT_ATTACH_TYPE_STICKER || type.equals("gif") || documentAttachType == DOCUMENT_ATTACH_TYPE_VIDEO || documentAttachType == DOCUMENT_ATTACH_TYPE_WALLPAPER);
if (isSmallImage) {
drawImageButton = false;
@ -6599,7 +6604,21 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
currentPhotoFilter = String.format(Locale.US, "%d_%d", w, h);
currentPhotoFilterThumb = String.format(Locale.US, "%d_%d_b", w, h);
if (webDocument != null) {
if ((drawInstantViewType == 23 || drawInstantViewType == 24) && stickers != null && !stickers.isEmpty()) {
if (stickerSetIcons == null || !stickerSetIcons.equals(stickers)) {
if (stickerSetIcons != null) {
stickerSetIcons.detach(this);
}
stickerSetIcons = new StickerSetLinkIcon(currentAccount, currentMessageObject.isOutOwner(), stickers, stickersTextColor);
if (attachedToWindow) {
stickerSetIcons.attach(this);
}
}
if (stickerSetIcons != null) {
stickerSetIcons.keepAlive();
}
photoImage.setImageBitmap(stickerSetIcons);
} else if (webDocument != null) {
/*TODO*/
photoImage.setImage(ImageLocation.getForWebFile(webDocument), currentPhotoFilter, null, null, webDocument.size, null, messageObject, 1);
} else if (documentAttachType == DOCUMENT_ATTACH_TYPE_WALLPAPER) {
@ -7086,7 +7105,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (pollVoted) {
messageObject.checkedVotes.clear();
}
titleLayout = new StaticLayout(Emoji.replaceEmoji(media.poll.question, Theme.chat_audioTitlePaint.getFontMetricsInt(), AndroidUtilities.dp(16), false), Theme.chat_audioTitlePaint, maxWidth + AndroidUtilities.dp(2) - getExtraTextX() * 2, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
CharSequence questionText = new SpannableStringBuilder(media.poll.question.text);
questionText = Emoji.replaceEmoji(questionText, Theme.chat_audioTitlePaint.getFontMetricsInt(), AndroidUtilities.dp(16), false);
if (media.poll.question.entities != null) {
questionText = MessageObject.replaceAnimatedEmoji(questionText, media.poll.question.entities, Theme.chat_audioTitlePaint.getFontMetricsInt(), true);
MessageObject.addEntitiesToText(questionText, media.poll.question.entities, currentMessageObject.isOutOwner(), false, false, false);
}
titleLayout = new StaticLayout(questionText, Theme.chat_audioTitlePaint, maxWidth + AndroidUtilities.dp(2) - getExtraTextX() * 2, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
animatedEmojiPollQuestion = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, false, animatedEmojiPollQuestion, titleLayout);
boolean titleRtl = false;
if (titleLayout != null) {
for (int a = 0, N = titleLayout.getLineCount(); a < N; a++) {
@ -7226,9 +7252,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
boolean hasDifferent = false;
int previousPercent = 0;
for (int a = 0, N = media.poll.answers.size(); a < N; a++) {
TLRPC.PollAnswer pollAnswer = media.poll.answers.get(a);
CharSequence answerText = new SpannableStringBuilder(pollAnswer.text.text);
answerText = Emoji.replaceEmoji(answerText, Theme.chat_audioTitlePaint.getFontMetricsInt(), AndroidUtilities.dp(16), false);
if (pollAnswer.text.entities != null) {
answerText = MessageObject.replaceAnimatedEmoji(answerText, pollAnswer.text.entities, Theme.chat_audioPerformerPaint.getFontMetricsInt(), true);
MessageObject.addEntitiesToText(answerText, pollAnswer.text.entities, currentMessageObject.isOutOwner(), false, false, false);
}
PollButton button = new PollButton();
button.answer = media.poll.answers.get(a);
button.title = new StaticLayout(Emoji.replaceEmoji(button.answer.text, Theme.chat_audioPerformerPaint.getFontMetricsInt(), AndroidUtilities.dp(15), false), Theme.chat_audioPerformerPaint, maxWidth - AndroidUtilities.dp(33), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
button.answer = pollAnswer;
button.title = new StaticLayout(answerText, Theme.chat_audioPerformerPaint, maxWidth - AndroidUtilities.dp(33), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
button.animatedEmoji = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, false, button.animatedEmoji, button.title);
button.y = height + AndroidUtilities.dp(52);
button.height = button.title.getHeight();
pollButtons.add(button);
@ -8937,7 +8972,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (!mediaBackground && !currentMessageObject.isOutOwner()) {
bl = nearRad;
}
if (currentMessageObject.type == MessageObject.TYPE_GEO && MessageObject.getMedia(currentMessageObject) instanceof TLRPC.TL_messageMediaVenue) {
if (currentMessageObject.type == MessageObject.TYPE_GEO && (MessageObject.getMedia(currentMessageObject) instanceof TLRPC.TL_messageMediaVenue || !locationExpired && MessageObject.getMedia(currentMessageObject) instanceof TLRPC.TL_messageMediaGeoLive)) {
br = bl = nearRad;
}
if (documentAttachType == DOCUMENT_ATTACH_TYPE_STORY) {
@ -8946,6 +8981,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
photoImage.setRoundRadius(tl, tr, br, bl);
}
updateAnimatedEmojis();
if (stickerSetIcons != null && stickerSetIcons.die()) {
stickerSetIcons.detach(this);
stickerSetIcons = null;
}
}
if (messageIdChanged) {
currentUrl = null;
@ -9155,6 +9194,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (topicButton != null) {
topicButton.resetClick();
}
forwardNamePressed = false;
if (forwardBg != null) {
forwardBg.setPressed(false);
}
if (pressedEmoji != null) {
// hadLongPress = true;
// if (delegate.didPressAnimatedEmoji(this, pressedEmoji)) {
@ -10056,10 +10099,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
private boolean isCurrentLocationTimeExpired(MessageObject messageObject) {
if (MessageObject.getMedia(currentMessageObject.messageOwner).period % 60 == 0) {
return Math.abs(ConnectionsManager.getInstance(currentAccount).getCurrentTime() - messageObject.messageOwner.date) > MessageObject.getMedia(messageObject.messageOwner).period;
final int period = MessageObject.getMedia(currentMessageObject.messageOwner).period;
final int currentTime = ConnectionsManager.getInstance(currentAccount).getCurrentTime();
if (period == 0x7fffffff) {
return false;
} else if (period % 60 == 0) {
return Math.abs(currentTime - messageObject.messageOwner.date) > period;
} else {
return Math.abs(ConnectionsManager.getInstance(currentAccount).getCurrentTime() - messageObject.messageOwner.date) > MessageObject.getMedia(messageObject.messageOwner).period - 5;
return Math.abs(currentTime - messageObject.messageOwner.date) > period - 5;
}
}
@ -10232,52 +10279,56 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (instantViewButtonText != null) {
str = instantViewButtonText;
} else if (drawInstantViewType == 12) {
str = LocaleController.getString("OpenChannelPost", R.string.OpenChannelPost);
str = LocaleController.getString(R.string.OpenChannelPost);
} else if (drawInstantViewType == 1) {
str = LocaleController.getString("OpenChannel", R.string.OpenChannel);
str = LocaleController.getString(R.string.OpenChannel);
} else if (drawInstantViewType == 13) {
str = LocaleController.getString("SendMessage", R.string.SendMessage).toUpperCase();
str = LocaleController.getString(R.string.SendMessage).toUpperCase();
} else if (drawInstantViewType == 10) {
str = LocaleController.getString("OpenBot", R.string.OpenBot);
str = LocaleController.getString(R.string.OpenBot);
} else if (drawInstantViewType == 2) {
str = LocaleController.getString("OpenGroup", R.string.OpenGroup);
str = LocaleController.getString(R.string.OpenGroup);
} else if (drawInstantViewType == 3) {
str = LocaleController.getString("OpenMessage", R.string.OpenMessage);
str = LocaleController.getString(R.string.OpenMessage);
} else if (drawInstantViewType == 5) {
str = LocaleController.getString("ViewContact", R.string.ViewContact);
str = LocaleController.getString(R.string.ViewContact);
} else if (drawInstantViewType == 6) {
str = LocaleController.getString("OpenBackground", R.string.OpenBackground);
str = LocaleController.getString(R.string.OpenBackground);
} else if (drawInstantViewType == 7) {
str = LocaleController.getString("OpenTheme", R.string.OpenTheme);
str = LocaleController.getString(R.string.OpenTheme);
} else if (drawInstantViewType == 8) {
if (pollVoted || pollClosed) {
str = LocaleController.getString("PollViewResults", R.string.PollViewResults);
str = LocaleController.getString(R.string.PollViewResults);
} else {
str = LocaleController.getString("PollSubmitVotes", R.string.PollSubmitVotes);
str = LocaleController.getString(R.string.PollSubmitVotes);
}
} else if (drawInstantViewType == 9 || drawInstantViewType == 11) {
TLRPC.TL_webPage webPage = (TLRPC.TL_webPage) MessageObject.getMedia(currentMessageObject.messageOwner).webpage;
if (webPage != null && webPage.url.contains("voicechat=")) {
str = LocaleController.getString("VoipGroupJoinAsSpeaker", R.string.VoipGroupJoinAsSpeaker);
str = LocaleController.getString(R.string.VoipGroupJoinAsSpeaker);
} else {
str = LocaleController.getString("VoipGroupJoinAsLinstener", R.string.VoipGroupJoinAsLinstener);
str = LocaleController.getString(R.string.VoipGroupJoinAsLinstener);
}
} else if (drawInstantViewType == 14) {
str = LocaleController.getString("ViewChatList", R.string.ViewChatList).toUpperCase();
str = LocaleController.getString(R.string.ViewChatList).toUpperCase();
} else if (drawInstantViewType == 15) {
str = LocaleController.getString(R.string.BotWebAppInstantViewOpen).toUpperCase();
} else if (drawInstantViewType == 16) {
str = LocaleController.getString("OpenLink").toUpperCase();
str = LocaleController.getString(R.string.OpenLink).toUpperCase();
} else if (drawInstantViewType == 17) {
str = LocaleController.getString("ViewStory").toUpperCase();
str = LocaleController.getString(R.string.ViewStory).toUpperCase();
} else if (drawInstantViewType == 18 || drawInstantViewType == 22) {
str = LocaleController.getString("BoostLinkButton", R.string.BoostLinkButton);
str = LocaleController.getString(R.string.BoostLinkButton);
} else if (drawInstantViewType == 19) {
str = LocaleController.getString("BoostingHowItWork", R.string.BoostingHowItWork);
str = LocaleController.getString(R.string.BoostingHowItWork);
} else if (drawInstantViewType == 20) {
str = LocaleController.getString(R.string.OpenGift);
} else if (drawInstantViewType == 21) {
str = LocaleController.getString(R.string.AppUpdate);
} else if (drawInstantViewType == 23) {
str = LocaleController.getString(R.string.OpenStickerSet);
} else if (drawInstantViewType == 24) {
str = LocaleController.getString(R.string.OpenEmojiSet);
} else {
str = LocaleController.getString(R.string.InstantView);
}
@ -11990,6 +12041,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
linkLine = new ReplyMessageLine(this);
}
Theme.chat_replyNamePaint.setColor(linkLine.check(currentMessageObject, currentUser, currentChat, resourcesProvider, ReplyMessageLine.TYPE_LINK));
linkLine.setEmojiAlpha(drawInstantViewType == 23 || drawInstantViewType == 24 ? 0.5f : 1f);
final boolean drawPhotoImageBefore = drawInstantView && (drawInstantViewType != 9 && drawInstantViewType != 2 && drawInstantViewType != 13 && drawInstantViewType != 11 && drawInstantViewType != 1 && drawInstantViewType != 18 && drawInstantViewType != 22) || drawInstantViewType == 6 && imageBackgroundColor != 0;
final boolean drawPhotoImageAfter = !drawInstantView || drawInstantViewType == 9 || drawInstantViewType == 2 || drawInstantViewType == 11 || drawInstantViewType == 13 || drawInstantViewType == 1 || drawInstantViewType == 18 || drawInstantViewType == 22 || isSmallImage;
@ -14884,33 +14936,50 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (messageObject.type == MessageObject.TYPE_STORY || currentForwardUser != null || currentForwardChannel != null || currentForwardName != null) {
String forwardedString;
CharSequence lastLine;
if (forwardAvatar == null) {
forwardAvatar = new AvatarSpan(this, currentAccount);
forwardAvatar.translate(0, dp(-.33f));
}
forwardAvatar.setSize((1.23f * ((int) Theme.chat_forwardNamePaint.getTextSize())) / AndroidUtilities.density);
if (messageObject.type == MessageObject.TYPE_STORY) {
currentForwardNameString = forwardedString = LocaleController.getString("ForwardedStory", R.string.ForwardedStory);
currentForwardNameString = forwardedString = LocaleController.getString(R.string.ForwardedStory);
long storyDialogId = DialogObject.getPeerDialogId(messageObject.messageOwner.media.peer);
if (storyDialogId > 0) {
currentForwardUser = MessagesController.getInstance(currentAccount).getUser(storyDialogId);
forwardAvatar.setUser(currentForwardUser = MessagesController.getInstance(currentAccount).getUser(storyDialogId));
} else {
currentForwardChannel = MessagesController.getInstance(currentAccount).getChat(-storyDialogId);
forwardAvatar.setChat(currentForwardChannel = MessagesController.getInstance(currentAccount).getChat(-storyDialogId));
}
boolean includeAvatar = true;
String name = getNameFromDialogId(storyDialogId);
if (storyDialogId < 0 && currentForwardChannel == null) {
name = LocaleController.getString("ChannelPrivate", R.string.ChannelPrivate);
includeAvatar = false;
}
lastLine = new SpannableStringBuilder((includeAvatar ? "A " : "") + name);
((SpannableStringBuilder) lastLine).setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, lastLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
if (includeAvatar) {
((SpannableStringBuilder) lastLine).setSpan(forwardAvatar, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
lastLine = AndroidUtilities.replaceTags(LocaleController.formatString("ForwardedStoryFrom", R.string.ForwardedStoryFrom, name));
forwardedNameWidth = getMaxNameWidth();
} else {
boolean includeAvatar = true;
if (currentForwardChannel != null) {
if (currentForwardUser != null) {
currentForwardNameString = String.format("%s (%s)", currentForwardChannel.title, UserObject.getUserName(currentForwardUser));
forwardAvatar.setUser(currentForwardUser);
} else if (!TextUtils.isEmpty(messageObject.messageOwner.fwd_from.post_author)) {
currentForwardNameString = String.format("%s (%s)", currentForwardChannel.title, messageObject.messageOwner.fwd_from.post_author);
forwardAvatar.setChat(currentForwardChannel);
} else {
currentForwardNameString = currentForwardChannel.title;
forwardAvatar.setChat(currentForwardChannel);
}
} else if (currentForwardUser != null) {
currentForwardNameString = UserObject.getUserName(currentForwardUser);
forwardAvatar.setUser(currentForwardUser);
} else {
currentForwardNameString = currentForwardName;
includeAvatar = false;
}
forwardedNameWidth = getMaxNameWidth();
@ -14918,17 +14987,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (hasPsaHint) {
forwardedNameWidth -= AndroidUtilities.dp(36);
}
String from = LocaleController.getString("From", R.string.From);
String fromFormattedString = LocaleController.getString("FromFormatted", R.string.FromFormatted);
int idx = fromFormattedString.indexOf("%1$s");
int fromWidth = (int) Math.ceil(Theme.chat_forwardNamePaint.measureText(from + " "));
CharSequence name = TextUtils.ellipsize(currentForwardNameString.replace('\n', ' '), Theme.chat_replyNamePaint, forwardedNameWidth - fromWidth - viaWidth, TextUtils.TruncateAt.END);
String fromString;
try {
fromString = String.format(fromFormattedString, name);
} catch (Exception e) {
fromString = name.toString();
}
CharSequence name = TextUtils.ellipsize((includeAvatar ? "A " : "") + currentForwardNameString.replace('\n', ' '), Theme.chat_replyNamePaint, forwardedNameWidth - viaWidth - dp(includeAvatar ? 17.33f : 0), TextUtils.TruncateAt.END);
String fromString = name.toString();
SpannableStringBuilder stringBuilder;
if (viaString != null) {
@ -14936,11 +14996,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
viaNameWidth = (int) Math.ceil(Theme.chat_forwardNamePaint.measureText(fromString));
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), stringBuilder.length() - viaUsername.length() - 1, stringBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
stringBuilder = new SpannableStringBuilder(String.format(fromFormattedString, name));
stringBuilder = new SpannableStringBuilder(fromString);
}
forwardNameCenterX = fromWidth + (int) Math.ceil(Theme.chat_forwardNamePaint.measureText(name, 0, name.length())) / 2;
if (idx >= 0 && (currentForwardName == null || messageObject.messageOwner.fwd_from.from_id != null)) {
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), idx, idx + name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (includeAvatar && stringBuilder.length() > 1) {
stringBuilder.setSpan(forwardAvatar, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
forwardNameCenterX = (int) Math.ceil(Theme.chat_forwardNamePaint.measureText(name, 0, name.length())) / 2;
if (currentForwardName == null || messageObject.messageOwner.fwd_from.from_id != null) {
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
lastLine = stringBuilder;
}
@ -14953,6 +15016,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
forwardedNameLayout[1] = new StaticLayout(lastLine, Theme.chat_forwardNamePaint, forwardedNameWidth + AndroidUtilities.dp(2), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
lastLine = TextUtils.ellipsize(AndroidUtilities.replaceTags(forwardedString), Theme.chat_forwardNamePaint, forwardedNameWidth, TextUtils.TruncateAt.END);
forwardedNameLayout[0] = new StaticLayout(lastLine, Theme.chat_forwardNamePaint, forwardedNameWidth + AndroidUtilities.dp(2), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
if (forwardBg == null) {
forwardBg = new ForwardBackground(this);
}
forwardBg.set(forwardedNameLayout, !currentMessageObject.isOutOwner() && !(drawNameLayout && nameLayout != null) && pinnedTop);
forwardedNameWidth = Math.max((int) Math.ceil(forwardedNameLayout[0].getLineWidth(0)), (int) Math.ceil(forwardedNameLayout[1].getLineWidth(0)));
if (hasPsaHint) {
forwardedNameWidth += AndroidUtilities.dp(36);
@ -15249,30 +15316,39 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
if (currentForwardUser != null || currentForwardChannel != null || currentForwardName != null) {
if (forwardAvatar == null) {
forwardAvatar = new AvatarSpan(this, currentAccount);
forwardAvatar.translate(0, dp(-.33f));
}
forwardAvatar.setSize((1.23f * ((int) Theme.chat_forwardNamePaint.getTextSize())) / AndroidUtilities.density);
boolean includeAvatar = true;
if (currentForwardChannel != null) {
if (currentForwardUser != null) {
currentForwardNameString = String.format("%s (%s)", currentForwardChannel.title, UserObject.getUserName(currentForwardUser));
forwardAvatar.setUser(currentForwardUser);
} else {
currentForwardNameString = currentForwardChannel.title;
forwardAvatar.setChat(currentForwardChannel);
}
} else if (currentForwardUser != null) {
currentForwardNameString = UserObject.getUserName(currentForwardUser);
forwardAvatar.setUser(currentForwardUser);
} else {
currentForwardNameString = currentForwardName;
includeAvatar = false;
}
name = getForwardedMessageText(messageObject);
String from = LocaleController.getString("From", R.string.From);
String fromFormattedString = LocaleController.getString("FromFormatted", R.string.FromFormatted);
int idx = fromFormattedString.indexOf("%1$s");
int fromWidth = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(from + " "));
CharSequence text = currentForwardNameString == null ? "" : currentForwardNameString.replace('\n', ' ');
CharSequence ellipsizedText = TextUtils.ellipsize(text, Theme.chat_replyNamePaint, maxWidth - fromWidth, TextUtils.TruncateAt.END);
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format(fromFormattedString, ellipsizedText));
if (idx >= 0 && (currentForwardName == null || messageObject.messageOwner.fwd_from.from_id != null)) {
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), idx, idx + ellipsizedText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
CharSequence ellipsizedText = TextUtils.ellipsize((includeAvatar ? "A " : "") + text, Theme.chat_replyNamePaint, maxWidth - dp(includeAvatar ? 17.33f : 0), TextUtils.TruncateAt.END);
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(ellipsizedText);
if (includeAvatar && stringBuilder.length() > 1) {
stringBuilder.setSpan(forwardAvatar, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (currentForwardName == null || messageObject.messageOwner.fwd_from.from_id != null) {
stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, ellipsizedText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
stringFinalText = TextUtils.ellipsize(stringBuilder, textPaint, maxWidth, TextUtils.TruncateAt.END);
forwardNameCenterX = fromWidth + (int) Math.ceil(Theme.chat_replyNamePaint.measureText(ellipsizedText, 0, ellipsizedText.length())) / 2;
forwardNameCenterX = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(ellipsizedText, 0, ellipsizedText.length())) / 2;
}
}
CharSequence stringFinalName = name;
@ -15442,19 +15518,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} else if (currentChat != null) {
return currentChat.title;
} else if (currentMessageObject != null && currentMessageObject.isSponsored()) {
if (currentMessageObject.sponsoredBotApp != null) {
return currentMessageObject.sponsoredBotApp.title;
}
if (currentMessageObject.sponsoredWebPage != null) {
return currentMessageObject.sponsoredWebPage.site_name;
}
if (currentMessageObject.sponsoredChatInvite != null && currentMessageObject.sponsoredChatInvite.title != null) {
return currentMessageObject.sponsoredChatInvite.title;
}
if (currentMessageObject.sponsoredChatInvite != null && currentMessageObject.sponsoredChatInvite.chat != null && currentMessageObject.sponsoredChatInvite.chat.title != null) {
return currentMessageObject.sponsoredChatInvite.chat.title;
}
return "";
return currentMessageObject.sponsoredTitle;
}
return "DELETED";
}
@ -15479,7 +15543,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
return forwardedString;
} else {
return LocaleController.getString("ForwardedMessage", R.string.ForwardedMessage);
return LocaleController.getString(R.string.ForwardedFrom);
}
}
@ -15619,12 +15683,43 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
@Override
public int getBoundsLeft() {
return Math.max(0, getBackgroundDrawableLeft() - (needDrawAvatar() ? dp(currentPosition != null ? 73 : (currentMessageObject != null && currentMessageObject.isRepostPreview ? 42 : 63)) : 0) - (currentMessageObject != null && currentMessageObject.isOutOwner() && (checkNeedDrawShareButton(currentMessageObject) || useTranscribeButton) ? dp(48) : 0));
boolean isOut = currentMessageObject != null && currentMessageObject.isOutOwner();
int avatarWidth = needDrawAvatar() ? dp(currentPosition != null ? 73 : (currentMessageObject != null && currentMessageObject.isRepostPreview ? 42 : 63)) : 0;
int shareButtonWidth = (isOut && (checkNeedDrawShareButton(currentMessageObject) || useTranscribeButton) ? dp(48) : 0);
int buttonMostLeft = Integer.MAX_VALUE;
if (botButtons != null) {
int addX;
if (currentMessageObject != null && currentMessageObject.isOutOwner()) {
addX = getMeasuredWidth() - widthForButtons - AndroidUtilities.dp(10);
} else {
addX = backgroundDrawableLeft + AndroidUtilities.dp(mediaBackground || drawPinnedBottom ? 1 : 7);
}
for (int i = 0; i < botButtons.size(); ++i) {
BotButton btn = botButtons.get(i);
buttonMostLeft = Math.max(buttonMostLeft, addX + btn.x);
}
}
return Math.max(0, Math.min(buttonMostLeft, getBackgroundDrawableLeft() - avatarWidth - shareButtonWidth));
}
@Override
public int getBoundsRight() {
return getBackgroundDrawableRight() + (currentMessageObject != null && !currentMessageObject.isOutOwner() && (checkNeedDrawShareButton(currentMessageObject) || useTranscribeButton) ? dp(48) : 0);
boolean isIn = currentMessageObject != null && !currentMessageObject.isOutOwner();
int shareButtonWidth = (isIn && (checkNeedDrawShareButton(currentMessageObject) || useTranscribeButton) ? dp(48) : 0);
int buttonMostRight = 0;
if (botButtons != null) {
int addX;
if (currentMessageObject != null && currentMessageObject.isOutOwner()) {
addX = getMeasuredWidth() - widthForButtons - AndroidUtilities.dp(10);
} else {
addX = backgroundDrawableLeft + AndroidUtilities.dp(mediaBackground || drawPinnedBottom ? 1 : 7);
}
for (int i = 0; i < botButtons.size(); ++i) {
BotButton btn = botButtons.get(i);
buttonMostRight = Math.max(buttonMostRight, addX + btn.x + btn.width);
}
}
return Math.max(getBackgroundDrawableRight() + shareButtonWidth, buttonMostRight);
}
@SuppressLint("WrongCall")
@ -16469,16 +16564,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
currentMessageObject.overrideLinkColor >= 0 ||
currentMessageObject.isFromUser() && currentUser != null ||
currentMessageObject.isFromChannel() && currentChat != null ||
currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite instanceof TLRPC.TL_chatInvite ||
currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite != null && currentMessageObject.sponsoredChatInvite.chat != null
currentMessageObject.sponsoredColor != null && currentMessageObject.sponsoredColor.color != -1
) {
int colorId;
if (currentMessageObject.overrideLinkColor >= 0) {
colorId = currentMessageObject.overrideLinkColor;
} else if (currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite instanceof TLRPC.TL_chatInvite) {
colorId = currentMessageObject.sponsoredChatInvite.color;
} else if (currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite != null && currentMessageObject.sponsoredChatInvite.chat != null) {
colorId = ChatObject.getColorId(currentMessageObject.sponsoredChatInvite.chat);
} else if (currentMessageObject.sponsoredColor != null) {
colorId = currentMessageObject.sponsoredColor.color;
} else if (currentMessageObject.isFromUser() && currentUser != null) {
colorId = UserObject.getColorId(currentUser);
} else {
@ -17063,17 +17155,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} else if (
currentMessageObject.overrideLinkColor >= 0 ||
currentMessageObject.isFromUser() && currentUser != null ||
currentMessageObject.isFromChannel() && currentChat != null ||
currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite instanceof TLRPC.TL_chatInvite ||
currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite != null && currentMessageObject.sponsoredChatInvite.chat != null
currentMessageObject.isFromChannel() && currentChat != null
) {
int colorId;
if (currentMessageObject.overrideLinkColor >= 0) {
colorId = currentMessageObject.overrideLinkColor;
} else if (currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite instanceof TLRPC.TL_chatInvite) {
colorId = currentMessageObject.sponsoredChatInvite.color;
} else if (currentMessageObject.isSponsored() && currentMessageObject.sponsoredChatInvite != null && currentMessageObject.sponsoredChatInvite.chat != null) {
colorId = ChatObject.getColorId(currentMessageObject.sponsoredChatInvite.chat);
} else if (currentMessageObject.isFromUser() && currentUser != null) {
colorId = UserObject.getColorId(currentUser);
} else {
@ -17298,19 +17384,40 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
} else {
rect.set((int) forwardNameXLocal - AndroidUtilities.dp(7), forwardNameY - AndroidUtilities.dp(6), (int) forwardNameXLocal - AndroidUtilities.dp(7) + backWidth, forwardNameY + forwardHeight + AndroidUtilities.dp(6));
}
applyServiceShaderMatrix();
int oldAlpha1 = -1, oldAlpha2 = -1;
if (animatingAlpha != 1f || replyForwardAlpha != 1f) {
oldAlpha1 = getThemedPaint(Theme.key_paint_chatActionBackground).getAlpha();
getThemedPaint(Theme.key_paint_chatActionBackground).setAlpha((int) (oldAlpha1 * animatingAlpha * replyForwardAlpha));
}
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), getThemedPaint(Theme.key_paint_chatActionBackground));
if (hasGradientService()) {
if (hasReply || forwardBg == null) {
applyServiceShaderMatrix(getMeasuredWidth(), backgroundHeight, getX(), viewTop);
if (animatingAlpha != 1f || replyForwardAlpha != 1f) {
oldAlpha2 = Theme.chat_actionBackgroundGradientDarkenPaint.getAlpha();
Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha((int) (oldAlpha2 * animatingAlpha * replyForwardAlpha));
oldAlpha1 = getThemedPaint(Theme.key_paint_chatActionBackground).getAlpha();
getThemedPaint(Theme.key_paint_chatActionBackground).setAlpha((int) (oldAlpha1 * animatingAlpha * replyForwardAlpha));
}
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), Theme.chat_actionBackgroundGradientDarkenPaint);
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), getThemedPaint(Theme.key_paint_chatActionBackground));
if (hasGradientService()) {
if (animatingAlpha != 1f || replyForwardAlpha != 1f) {
oldAlpha2 = Theme.chat_actionBackgroundGradientDarkenPaint.getAlpha();
Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha((int) (oldAlpha2 * animatingAlpha * replyForwardAlpha));
}
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), Theme.chat_actionBackgroundGradientDarkenPaint);
}
} else {
applyServiceShaderMatrix(getMeasuredWidth(), backgroundHeight, getX() + forwardNameXLocal, viewTop + forwardNameY);
canvas.save();
canvas.translate(forwardNameXLocal, forwardNameY);
final float s = forwardBg.bounce.getScale(.02f);
canvas.scale(s, s, forwardBg.cx, forwardBg.cy);
if (animatingAlpha != 1f || replyForwardAlpha != 1f) {
oldAlpha1 = getThemedPaint(Theme.key_paint_chatActionBackground).getAlpha();
getThemedPaint(Theme.key_paint_chatActionBackground).setAlpha((int) (oldAlpha1 * animatingAlpha * replyForwardAlpha));
}
canvas.drawPath(forwardBg.path, getThemedPaint(Theme.key_paint_chatActionBackground));
if (hasGradientService()) {
if (animatingAlpha != 1f || replyForwardAlpha != 1f) {
oldAlpha2 = Theme.chat_actionBackgroundGradientDarkenPaint.getAlpha();
Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha((int) (oldAlpha2 * animatingAlpha * replyForwardAlpha));
}
canvas.drawPath(forwardBg.path, Theme.chat_actionBackgroundGradientDarkenPaint);
}
canvas.restore();
}
if (oldAlpha1 >= 0) {
getThemedPaint(Theme.key_paint_chatActionBackground).setAlpha(oldAlpha1);
@ -17319,7 +17426,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha(oldAlpha2);
}
} else {
forwardNameY = AndroidUtilities.dp(10) + (drawNameLayout ? AndroidUtilities.dp(5) + (int) Theme.chat_namePaint.getTextSize() : 0) + (drawTopic && topicButton != null ? topicButton.height() + AndroidUtilities.dp(7 + (currentMessageObject.type != MessageObject.TYPE_TEXT ? 3 : 0)) : 0);
forwardNameY = AndroidUtilities.dp(7) + (drawNameLayout ? AndroidUtilities.dp(6) + (int) Theme.chat_namePaint.getTextSize() : 0) + (drawTopic && topicButton != null ? topicButton.height() + AndroidUtilities.dp(7 + (currentMessageObject.type != MessageObject.TYPE_TEXT ? 3 : 0)) : 0);
if (!drawNameLayout && (currentMessageObject.type == MessageObject.TYPE_GIF || currentMessageObject.type == MessageObject.TYPE_PHOTO || currentMessageObject.type == MessageObject.TYPE_VIDEO || currentMessageObject.type == MessageObject.TYPE_STORY)) {
forwardNameY += dp(2);
}
if (!drawNameLayout && currentMessageObject.type == MessageObject.TYPE_TEXT && !drawPinnedTop) {
forwardNameY += dp(2);
}
forwardHeight = AndroidUtilities.dp(4) + (int) Theme.chat_forwardNamePaint.getTextSize() * 2;
Theme.chat_forwardNamePaint.setColor(getThemedColor(hasPsaHint ? Theme.key_chat_inPsaNameText : Theme.key_chat_inForwardedNameText));
if (currentMessageObject.isOutOwner()) {
@ -17355,14 +17468,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
if (currentMessageObject.isOutOwner()) {
if (currentMessageObject.needDrawForwarded()) {
forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(11) + getExtraTextX();
forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(10) + getExtraTextX();
forwardNameXLocal += transitionParams.deltaLeft;
} else {
forwardNameXLocal = transitionParams.animateForwardNameX;
}
} else {
if (currentMessageObject.needDrawForwarded()) {
forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(mediaBackground || drawPinnedBottom ? 11 : 17) + getExtraTextX();
forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(mediaBackground || drawPinnedBottom ? 10 : 16) + getExtraTextX();
} else {
forwardNameXLocal = transitionParams.animateForwardNameX;
}
@ -17388,9 +17501,21 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
canvas.save();
canvas.translate(forwardNameXLocal, forwardNameY);
if (forwardBg != null) {
final float s = forwardBg.bounce.getScale(.02f);
canvas.scale(s, s, forwardBg.cx, forwardBg.cy);
if (currentMessageObject.type == MessageObject.TYPE_ROUND_VIDEO || currentMessageObject.isAnyKindOfSticker()) {
forwardBg.setColor(Theme.multAlpha(Theme.getColor(Theme.key_listSelector, resourcesProvider), 1.35f));
} else {
forwardBg.setColor(Theme.multAlpha(Theme.chat_forwardNamePaint.getColor(), .15f));
}
forwardBg.draw(canvas);
}
for (int a = 0; a < 2; a++) {
canvas.save();
canvas.translate(forwardNameXLocal - forwardNameOffsetX[a], forwardNameY + (forwardHeight / 2f + 2) * a);
canvas.translate(-forwardNameOffsetX[a], (forwardHeight / 2f + dp(1.33f)) * a);
if (animatingAlpha != 1f || replyForwardAlpha != 1f) {
int oldAlpha = forwardedNameLayoutLocal[a].getPaint().getAlpha();
forwardedNameLayoutLocal[a].getPaint().setAlpha((int) (oldAlpha * animatingAlpha * replyForwardAlpha));
@ -17401,6 +17526,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
canvas.restore();
}
canvas.restore();
if (clipContent) {
canvas.restore();
}
@ -17569,9 +17695,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
forwardNameX = replyStartX - replyTextOffset + offset + (needReplyImage ? offset + AndroidUtilities.dp(25) : 0);
if ((currentPosition == null || currentPosition.minY == 0 && currentPosition.minX == 0) && !(enterTransitionInProgress && !currentMessageObject.isVoice())) {
int restoreToCount = -1;
if (getAlpha() * replyForwardAlpha != 1f) {
float _alpha = (transitionParams.ignoreAlpha ? 1f : getAlpha()) * replyForwardAlpha;
if (_alpha != 1f) {
AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight());
restoreToCount = canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (0xFF * getAlpha() * replyForwardAlpha), Canvas.ALL_SAVE_FLAG);
restoreToCount = canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (0xFF * _alpha), Canvas.ALL_SAVE_FLAG);
}
float leftRad, rightRad, bottomRad = Math.min(4f, SharedConfig.bubbleRadius);
@ -19685,12 +19812,17 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
StaticLayout docTitleLayout = this.docTitleLayout;
StaticLayout infoLayout = this.infoLayout;
float alpha = 1f;
boolean forever = false;
if (transitionParams.animateLocationIsExpired) {
progress = transitionParams.lastDrawLocationExpireProgress;
text = transitionParams.lastDrawLocationExpireText;
docTitleLayout = transitionParams.lastDrawDocTitleLayout;
infoLayout = transitionParams.lastDrawInfoLayout;
alpha = 1f - transitionParams.animateChangeProgress;
} else if (MessageObject.getMedia(currentMessageObject.messageOwner).period == 0x7fffffff) {
forever = true;
progress = 1.0f;
text = "";
} else {
progress = 1.0f - Math.abs(ConnectionsManager.getInstance(currentAccount).getCurrentTime() - currentMessageObject.messageOwner.date) / (float) MessageObject.getMedia(currentMessageObject.messageOwner).period;
text = LocaleController.formatLocationLeftTime(Math.abs(MessageObject.getMedia(currentMessageObject.messageOwner).period - (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - currentMessageObject.messageOwner.date)));
@ -19721,8 +19853,29 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
Theme.chat_radialProgress2Paint.setAlpha((int) (255 * alpha));
canvas.drawArc(rect, -90, -360 * progress, false, Theme.chat_radialProgress2Paint);
float w = Theme.chat_livePaint.measureText(text);
canvas.drawText(text, rect.centerX() - w / 2, cy + AndroidUtilities.dp(4), Theme.chat_livePaint);
if (forever) {
if (foreverDrawable == null) {
foreverDrawable = getContext().getResources().getDrawable(R.drawable.filled_location_forever).mutate();
}
if (Theme.chat_livePaint.getColor() != foreverDrawableColor) {
foreverDrawable.setColorFilter(new PorterDuffColorFilter(foreverDrawableColor = Theme.chat_livePaint.getColor(), PorterDuff.Mode.SRC_IN));
}
foreverDrawable.setBounds(
(int) rect.centerX() - foreverDrawable.getIntrinsicWidth() / 2,
(int) rect.centerY() - foreverDrawable.getIntrinsicHeight() / 2,
(int) rect.centerX() + foreverDrawable.getIntrinsicWidth() / 2,
(int) rect.centerY() + foreverDrawable.getIntrinsicHeight() / 2
);
foreverDrawable.draw(canvas);
} else {
float w = Theme.chat_livePaint.measureText(text);
int len = text.length();
final float s2 = (len > 4 ? .75f : (len > 3 ? .85f : 1f));
canvas.save();
canvas.scale(s2, s2, rect.centerX(), rect.centerY());
canvas.drawText(text, rect.centerX() - w / 2, cy + AndroidUtilities.dp(4), Theme.chat_livePaint);
canvas.restore();
}
if (docTitleLayout != null && infoLayout != null) {
canvas.save();
@ -19895,6 +20048,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
canvas.save();
canvas.translate(x + getExtraTextX(), AndroidUtilities.dp(15) + namesOffset);
titleLayout.draw(canvas);
AnimatedEmojiSpan.drawAnimatedEmojis(canvas, titleLayout, animatedEmojiPollQuestion, 0, null, 0, 0, 0, 1f, getAdaptiveEmojiColorFilter(1, titleLayout.getPaint().getColor()));
canvas.restore();
}
int y = (titleLayout != null ? titleLayout.getHeight() : 0) + AndroidUtilities.dp(20) + namesOffset;
@ -20025,6 +20179,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
canvas.save();
canvas.translate(x + AndroidUtilities.dp(35), button.y + namesOffset);
button.title.draw(canvas);
AnimatedEmojiSpan.drawAnimatedEmojis(canvas, button.title, button.animatedEmoji, 0, null, 0, 0, 0, 1f, getAdaptiveEmojiColorFilter(1, button.title.getPaint().getColor()));
int alpha = (int) (animatePollAnswerAlpha ? 255 * Math.min((pollUnvoteInProgress ? 1.0f - pollAnimationProgress : pollAnimationProgress) / 0.3f, 1.0f) : 255);
if (pollVoted || pollClosed || animatePollAnswerAlpha) {
if (lastPoll.quiz && pollVoted && button.chosen) {
@ -20930,7 +21085,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
if (lastPoll != null) {
sb.append(", ");
sb.append(lastPoll.question);
sb.append(lastPoll.question.text);
sb.append(", ");
String title;
if (pollClosed) {
@ -21585,7 +21740,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
PollButton button = pollButtons.get(buttonIndex);
if (delegate != null) {
ArrayList<TLRPC.TL_pollAnswer> answers = new ArrayList<>();
ArrayList<TLRPC.PollAnswer> answers = new ArrayList<>();
answers.add(button.answer);
delegate.didPressVoteButtons(ChatMessageCell.this, answers, -1, 0, 0);
}

View file

@ -8,6 +8,9 @@
package org.telegram.ui.Cells;
import static org.telegram.messenger.AndroidUtilities.dp;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
@ -19,14 +22,28 @@ import android.view.Gravity;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ContactsController;
import org.telegram.messenger.Emoji;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.UserObject;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedTextView;
import org.telegram.ui.Components.AvatarDrawable;
import org.telegram.ui.Components.BackupImageView;
import org.telegram.ui.Components.CheckBox2;
import org.telegram.ui.Components.CheckBoxSquare;
import org.telegram.ui.Components.CubicBezierInterpolator;
@ -40,20 +57,31 @@ public class CheckBoxCell extends FrameLayout {
TYPE_CHECK_BOX_ENTER_PHONE = 2,
TYPE_CHECK_BOX_UNKNOWN = 3,
TYPE_CHECK_BOX_ROUND = 4,
TYPE_CHECK_BOX_URL = 5;
TYPE_CHECK_BOX_URL = 5,
TYPE_CHECK_BOX_USER_GROUP = 6,
TYPE_CHECK_BOX_USER = 7,
TYPE_CHECK_BOX_ROUND_GROUP = 8;
public int itemId;
private final Theme.ResourcesProvider resourcesProvider;
private final LinkSpanDrawable.LinksTextView textView;
private LinkSpanDrawable.LinksTextView linksTextView;
private AnimatedTextView animatedTextView;
private View textView;
private final TextView valueTextView;
private final View checkBox;
private CheckBoxSquare checkBoxSquare;
private CheckBox2 checkBoxRound;
private View collapsedArrow;
private CollapseButton collapseButton;
private BackupImageView avatarImageView;
private AvatarDrawable avatarDrawable;
private final int currentType;
private final int checkBoxSize;
private boolean needDivider;
private boolean isMultiline;
private boolean textAnimated;
public CheckBoxCell(Context context, int type) {
this(context, type, 17, null);
@ -64,42 +92,91 @@ public class CheckBoxCell extends FrameLayout {
}
public CheckBoxCell(Context context, int type, int padding, Theme.ResourcesProvider resourcesProvider) {
this(context, type, padding, false, resourcesProvider);
}
public CheckBoxCell(Context context, int type, int padding, boolean textAnimated, Theme.ResourcesProvider resourcesProvider) {
super(context);
this.resourcesProvider = resourcesProvider;
this.currentType = type;
this.textAnimated = textAnimated;
textView = new LinkSpanDrawable.LinksTextView(context) {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
updateCollapseArrowTranslation();
if (textAnimated) {
animatedTextView = new AnimatedTextView(context) {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
updateCollapseArrowTranslation();
}
};
NotificationCenter.listenEmojiLoading(animatedTextView);
animatedTextView.setEllipsizeByGradient(true);
animatedTextView.setRightPadding(dp(8));
animatedTextView.getDrawable().setHacks(true, true, false);
animatedTextView.setTag(getThemedColor(type == TYPE_CHECK_BOX_DEFAULT || type == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText));
animatedTextView.setTextSize(dp(16));
if (type == TYPE_CHECK_BOX_USER) {
animatedTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
}
@Override
public void setText(CharSequence text, BufferType type) {
text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), false);
super.setText(text, type);
}
};
NotificationCenter.listenEmojiLoading(textView);
textView.setTag(getThemedColor(type == TYPE_CHECK_BOX_DEFAULT || type == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
textView.setLines(1);
textView.setMaxLines(1);
textView.setSingleLine(true);
textView.setEllipsize(TextUtils.TruncateAt.END);
if (type == TYPE_CHECK_BOX_UNKNOWN) {
textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.CENTER_VERTICAL, 29, 0, 0, 0));
textView.setPadding(0, 0, 0, AndroidUtilities.dp(3));
} else {
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
if (type == TYPE_CHECK_BOX_ENTER_PHONE) {
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? 8 : 29), 0, (LocaleController.isRTL ? 29 : 8), 0));
if (type == TYPE_CHECK_BOX_UNKNOWN) {
animatedTextView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
addView(animatedTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.CENTER_VERTICAL, 29, 0, 0, 0));
animatedTextView.setPadding(0, 0, 0, dp(3));
} else {
int offset = type == TYPE_CHECK_BOX_ROUND ? 56 : 46;
addView(textView, LayoutHelper.createFrame(type == TYPE_CHECK_BOX_ROUND ? LayoutHelper.WRAP_CONTENT : LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? padding : offset + (padding - 17)), 0, (LocaleController.isRTL ? offset + (padding - 17) : padding), 0));
animatedTextView.setRightPadding(dp(padding));
animatedTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
if (type == TYPE_CHECK_BOX_ENTER_PHONE) {
addView(animatedTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? 8 : 29), 0, (LocaleController.isRTL ? 29 : 8), 0));
} else {
int offset = isCheckboxRound() ? 56 : 46;
if (type == TYPE_CHECK_BOX_USER) {
offset += 39;
}
addView(animatedTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? padding : offset + (padding - 17)), 0, (LocaleController.isRTL ? offset + (padding - 17) : padding), 0));
}
}
textView = animatedTextView;
} else {
linksTextView = new LinkSpanDrawable.LinksTextView(context) {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
updateCollapseArrowTranslation();
}
@Override
public void setText(CharSequence text, BufferType type) {
text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), false);
super.setText(text, type);
}
};
NotificationCenter.listenEmojiLoading(linksTextView);
linksTextView.setTag(getThemedColor(type == TYPE_CHECK_BOX_DEFAULT || type == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText));
linksTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
linksTextView.setLines(1);
linksTextView.setMaxLines(1);
linksTextView.setSingleLine(true);
linksTextView.setEllipsize(TextUtils.TruncateAt.END);
if (type == TYPE_CHECK_BOX_USER) {
linksTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
}
if (type == TYPE_CHECK_BOX_UNKNOWN) {
linksTextView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
addView(linksTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.CENTER_VERTICAL, 29, 0, 0, 0));
linksTextView.setPadding(0, 0, 0, dp(3));
} else {
linksTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
if (type == TYPE_CHECK_BOX_ENTER_PHONE) {
addView(linksTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? 8 : 29), 0, (LocaleController.isRTL ? 29 : 8), 0));
} else {
int offset = isCheckboxRound() ? 56 : 46;
if (type == TYPE_CHECK_BOX_USER) {
offset += 39;
}
addView(linksTextView, LayoutHelper.createFrame(isCheckboxRound() ? LayoutHelper.WRAP_CONTENT : LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? padding : offset + (padding - 17)), 0, (LocaleController.isRTL ? offset + (padding - 17) : padding), 0));
}
}
textView = linksTextView;
}
valueTextView = new TextView(context);
@ -112,7 +189,7 @@ public class CheckBoxCell extends FrameLayout {
valueTextView.setGravity((LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL);
addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP, padding, 0, padding, 0));
if (type == TYPE_CHECK_BOX_ROUND) {
if (isCheckboxRound()) {
checkBox = checkBoxRound = new CheckBox2(context, 21, resourcesProvider);
checkBoxRound.setDrawUnchecked(true);
checkBoxRound.setChecked(true, false);
@ -132,18 +209,43 @@ public class CheckBoxCell extends FrameLayout {
addView(checkBox, LayoutHelper.createFrame(checkBoxSize, checkBoxSize, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : padding), 16, (LocaleController.isRTL ? padding : 0), 0));
}
}
if (type == TYPE_CHECK_BOX_USER_GROUP) {
collapseButton = new CollapseButton(context, R.drawable.msg_folders_groups);
addView(collapseButton, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.END | Gravity.CENTER_VERTICAL, padding, 0, padding - 11, 0));
} else if (type == TYPE_CHECK_BOX_ROUND_GROUP) {
collapseButton = new CollapseButton(context, 0);
addView(collapseButton, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.END | Gravity.CENTER_VERTICAL, padding, 0, padding - 11, 0));
} else if (type == TYPE_CHECK_BOX_USER) {
avatarDrawable = new AvatarDrawable();
avatarImageView = new BackupImageView(context);
avatarImageView.setRoundRadius(dp(17));
addView(avatarImageView, LayoutHelper.createFrameRelatively(34, 34, Gravity.START | Gravity.CENTER_VERTICAL, 56, 0, 0, 0));
}
updateTextColor();
}
public boolean isCheckboxRound() {
return currentType == TYPE_CHECK_BOX_ROUND || currentType == TYPE_CHECK_BOX_ROUND_GROUP || currentType == TYPE_CHECK_BOX_USER_GROUP || currentType == TYPE_CHECK_BOX_USER;
}
public void allowMultiline() {
textView.setLines(3);
textView.setMaxLines(3);
textView.setSingleLine(false);
if (textAnimated) {
return;
}
linksTextView.setLines(3);
linksTextView.setMaxLines(3);
linksTextView.setSingleLine(false);
}
public void updateTextColor() {
textView.setTextColor(getThemedColor(currentType == TYPE_CHECK_BOX_DEFAULT || currentType == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText));
textView.setLinkTextColor(getThemedColor(currentType == TYPE_CHECK_BOX_DEFAULT || currentType == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextLink : Theme.key_windowBackgroundWhiteLinkText));
if (textAnimated) {
animatedTextView.setTextColor(getThemedColor(currentType == TYPE_CHECK_BOX_DEFAULT || currentType == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText));
} else {
linksTextView.setTextColor(getThemedColor(currentType == TYPE_CHECK_BOX_DEFAULT || currentType == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText));
linksTextView.setLinkTextColor(getThemedColor(currentType == TYPE_CHECK_BOX_DEFAULT || currentType == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextLink : Theme.key_windowBackgroundWhiteLinkText));
}
valueTextView.setTextColor(getThemedColor(currentType == TYPE_CHECK_BOX_DEFAULT || currentType == TYPE_CHECK_BOX_URL ? Theme.key_dialogTextBlue : Theme.key_windowBackgroundWhiteValueText));
}
@ -210,9 +312,9 @@ public class CheckBoxCell extends FrameLayout {
float translateX;
if (LocaleController.isRTL) {
translateX = textView.getRight() - textWidth - AndroidUtilities.dp(20);
translateX = textView.getRight() - textWidth - dp(20);
} else {
translateX = textView.getLeft() + textWidth + AndroidUtilities.dp(4);
translateX = textView.getLeft() + textWidth + dp(4);
}
collapsedArrow.setTranslationX(translateX);
}
@ -221,47 +323,66 @@ public class CheckBoxCell extends FrameLayout {
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
if (currentType == TYPE_CHECK_BOX_UNKNOWN) {
valueTextView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(10), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.EXACTLY));
textView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(34), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.AT_MOST));
checkBox.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(checkBoxSize), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(checkBoxSize), MeasureSpec.EXACTLY));
valueTextView.measure(MeasureSpec.makeMeasureSpec(dp(10), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(50), MeasureSpec.EXACTLY));
textView.measure(MeasureSpec.makeMeasureSpec(width - dp(34), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(50), MeasureSpec.AT_MOST));
checkBox.measure(MeasureSpec.makeMeasureSpec(dp(checkBoxSize), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(checkBoxSize), MeasureSpec.EXACTLY));
setMeasuredDimension(textView.getMeasuredWidth() + AndroidUtilities.dp(29), AndroidUtilities.dp(50));
setMeasuredDimension(textView.getMeasuredWidth() + dp(29), dp(50));
} else if (isMultiline) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
} else {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(50) + (needDivider ? 1 : 0));
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), dp(50) + (needDivider ? 1 : 0));
int availableWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - AndroidUtilities.dp(currentType == TYPE_CHECK_BOX_ROUND ? 60 : 34);
int availableWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - dp(isCheckboxRound() ? 60 : 34);
if (textAnimated) {
availableWidth += (int) animatedTextView.getRightPadding();
}
if (currentType == TYPE_CHECK_BOX_USER) {
availableWidth -= dp(34);
}
if (valueTextView.getLayoutParams() instanceof MarginLayoutParams) {
availableWidth -= ((MarginLayoutParams) valueTextView.getLayoutParams()).rightMargin;
}
int takenSpace = 0;
valueTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth / 2, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY));
if (textView.getLayoutParams().width == LayoutHelper.MATCH_PARENT) {
textView.measure(MeasureSpec.makeMeasureSpec(availableWidth - (int) Math.abs(textView.getTranslationX()) - valueTextView.getMeasuredWidth() - AndroidUtilities.dp(8), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST));
} else {
textView.measure(MeasureSpec.makeMeasureSpec(availableWidth - (int) Math.abs(textView.getTranslationX()) - valueTextView.getMeasuredWidth() - AndroidUtilities.dp(8), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST));
takenSpace += valueTextView.getMeasuredWidth();
if (collapseButton != null) {
collapseButton.measure(MeasureSpec.makeMeasureSpec(availableWidth / 2, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY));
takenSpace += collapseButton.getMeasuredWidth() - dp(11);
}
checkBox.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(checkBoxSize), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(checkBoxSize), MeasureSpec.EXACTLY));
if (textView.getLayoutParams().width == LayoutHelper.MATCH_PARENT) {
textView.measure(MeasureSpec.makeMeasureSpec(availableWidth - (int) Math.abs(textView.getTranslationX()) - takenSpace - dp(8), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST));
} else {
textView.measure(MeasureSpec.makeMeasureSpec(availableWidth - (int) Math.abs(textView.getTranslationX()) - takenSpace - dp(8), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST));
}
if (avatarImageView != null) {
avatarImageView.measure(MeasureSpec.makeMeasureSpec(dp(34), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(34), MeasureSpec.EXACTLY));
}
checkBox.measure(MeasureSpec.makeMeasureSpec(dp(checkBoxSize), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(checkBoxSize), MeasureSpec.EXACTLY));
}
if (click1Container != null) {
MarginLayoutParams margin = (MarginLayoutParams) click1Container.getLayoutParams();
click1Container.measure(MeasureSpec.makeMeasureSpec(width - margin.leftMargin - margin.rightMargin, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.EXACTLY));
click1Container.measure(MeasureSpec.makeMeasureSpec(width - margin.leftMargin - margin.rightMargin, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(50), MeasureSpec.EXACTLY));
}
if (click2Container != null) {
click2Container.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(56), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.EXACTLY));
click2Container.measure(MeasureSpec.makeMeasureSpec(dp(56), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(50), MeasureSpec.EXACTLY));
}
if (collapsedArrow != null) {
collapsedArrow.measure(
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(16), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(16), MeasureSpec.EXACTLY)
MeasureSpec.makeMeasureSpec(dp(16), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(dp(16), MeasureSpec.EXACTLY)
);
}
}
public void setTextColor(int color) {
textView.setTextColor(color);
if (textAnimated) {
animatedTextView.setTextColor(color);
} else {
linksTextView.setTextColor(color);
}
}
public void setText(CharSequence text, String value, boolean checked, boolean divider) {
@ -269,7 +390,12 @@ public class CheckBoxCell extends FrameLayout {
}
public void setText(CharSequence text, String value, boolean checked, boolean divider, boolean animated) {
textView.setText(text);
if (textAnimated) {
text = Emoji.replaceEmoji(text, animatedTextView.getPaint().getFontMetricsInt(), false);
animatedTextView.setText(text, animated);
} else {
linksTextView.setText(text);
}
if (checkBoxRound != null) {
checkBoxRound.setChecked(checked, animated);
} else {
@ -280,12 +406,35 @@ public class CheckBoxCell extends FrameLayout {
setWillNotDraw(!divider);
}
public void setUserOrChat(TLObject userOrChat) {
avatarDrawable.setInfo(userOrChat);
avatarImageView.setForUserOrChat(userOrChat, avatarDrawable);
CharSequence name;
if (userOrChat instanceof TLRPC.User) {
name = UserObject.getUserName((TLRPC.User) userOrChat);
} else {
name = ContactsController.formatName(userOrChat);
}
if (userOrChat instanceof TLRPC.User && ((TLRPC.User) userOrChat).id == MessagesController.getInstance(UserConfig.selectedAccount).telegramAntispamUserId) {
name = LocaleController.getString(R.string.ChannelAntiSpamUser);
}
if (textAnimated) {
name = Emoji.replaceEmoji(name, animatedTextView.getPaint().getFontMetricsInt(), false);
animatedTextView.setText(name);
} else {
linksTextView.setText(name);
}
}
public void setPad(int pad) {
int offset = AndroidUtilities.dp(pad * 40 * (LocaleController.isRTL ? -1 : 1));
int offset = dp(pad * 40 * (LocaleController.isRTL ? -1 : 1));
if (checkBox != null) {
checkBox.setTranslationX(offset);
}
textView.setTranslationX(offset);
if (avatarImageView != null) {
avatarImageView.setTranslationX(offset);
}
if (click1Container != null) {
click1Container.setTranslationX(offset);
}
@ -299,30 +448,33 @@ public class CheckBoxCell extends FrameLayout {
}
public void setMultiline(boolean value) {
if (textAnimated) {
return;
}
isMultiline = value;
LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams();
LayoutParams layoutParams1 = (LayoutParams) checkBox.getLayoutParams();
if (isMultiline) {
textView.setLines(0);
textView.setMaxLines(0);
textView.setSingleLine(false);
textView.setEllipsize(null);
linksTextView.setLines(0);
linksTextView.setMaxLines(0);
linksTextView.setSingleLine(false);
linksTextView.setEllipsize(null);
if (currentType != TYPE_CHECK_BOX_URL) {
layoutParams.height = LayoutParams.WRAP_CONTENT;
layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP;
layoutParams.topMargin = AndroidUtilities.dp(14);
layoutParams.bottomMargin = AndroidUtilities.dp(10);
layoutParams.topMargin = dp(14);
layoutParams.bottomMargin = dp(10);
}
} else {
textView.setLines(1);
textView.setMaxLines(1);
textView.setSingleLine(true);
textView.setEllipsize(TextUtils.TruncateAt.END);
linksTextView.setLines(1);
linksTextView.setMaxLines(1);
linksTextView.setSingleLine(true);
linksTextView.setEllipsize(TextUtils.TruncateAt.END);
textView.setPadding(0, 0, 0, 0);
layoutParams.height = LayoutParams.MATCH_PARENT;
layoutParams.topMargin = 0;
layoutParams1.topMargin = AndroidUtilities.dp(15);
layoutParams1.topMargin = dp(15);
}
textView.setLayoutParams(layoutParams);
checkBox.setLayoutParams(layoutParams1);
@ -353,7 +505,11 @@ public class CheckBoxCell extends FrameLayout {
}
public TextView getTextView() {
return textView;
return linksTextView;
}
public AnimatedTextView getAnimatedTextView() {
return animatedTextView;
}
public TextView getValueTextView() {
@ -383,7 +539,10 @@ public class CheckBoxCell extends FrameLayout {
@Override
protected void onDraw(Canvas canvas) {
if (needDivider) {
int offset = AndroidUtilities.dp(currentType == TYPE_CHECK_BOX_ROUND ? 60 : 20) + (int) Math.abs(textView.getTranslationX());
int offset = dp(isCheckboxRound() ? 60 : 20) + (int) Math.abs(textView.getTranslationX());
if (currentType == TYPE_CHECK_BOX_USER) {
offset += dp(39);
}
canvas.drawLine(LocaleController.isRTL ? 0 : offset, getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? offset : 0), getMeasuredHeight() - 1, Theme.dividerPaint);
}
}
@ -407,4 +566,74 @@ public class CheckBoxCell extends FrameLayout {
public boolean hasIcon() {
return checkBoxRound.hasIcon();
}
public void setCollapseButton(boolean collapsed, CharSequence text, View.OnClickListener onClick) {
if (collapseButton != null) {
collapseButton.set(collapsed, text);
if (onClick != null) {
collapseButton.setOnClickListener(onClick);
}
}
}
public class CollapseButton extends LinearLayout {
@Nullable
private ImageView iconView;
private final AnimatedTextView textView;
private final View collapsedArrow;
@SuppressLint("UseCompatLoadingForDrawables")
public CollapseButton(@NonNull Context context, int iconResId) {
super(context);
final int color = getThemedColor(Theme.key_windowBackgroundWhiteBlackText);
if (iconResId != 0) {
iconView = new ImageView(context);
iconView.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
iconView.setImageResource(iconResId);
}
textView = new AnimatedTextView(context, false, true, false);
textView.setTextSize(dp(13));
textView.setTextColor(color);
textView.setIncludeFontPadding(false);
textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
collapsedArrow = new View(context);
Drawable drawable = getContext().getResources().getDrawable(R.drawable.arrow_more).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
collapsedArrow.setBackground(drawable);
if (LocaleController.isRTL) {
addView(collapsedArrow, LayoutHelper.createLinear(16, 16, Gravity.CENTER_VERTICAL, 11, 0, 3, 0));
addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 16, Gravity.CENTER_VERTICAL, 0, 0, iconView == null ? 11 : 3, 0));
if (iconView != null) {
addView(iconView, LayoutHelper.createLinear(16, 16, Gravity.CENTER_VERTICAL, 0, 0, 11, 0));
}
} else {
if (iconView != null) {
addView(iconView, LayoutHelper.createLinear(16, 16, Gravity.CENTER_VERTICAL, 11, 0, 3, 0));
}
addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 16, Gravity.CENTER_VERTICAL, iconView == null ? 11 : 0, 0, 3, 0));
addView(collapsedArrow, LayoutHelper.createLinear(16, 16, Gravity.CENTER_VERTICAL, 0, 0, 11, 0));
}
setBackground(Theme.createRadSelectorDrawable(getThemedColor(Theme.key_listSelector), 16, 16));
setClickable(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(dp(32), MeasureSpec.EXACTLY));
}
public void set(boolean collapsed, CharSequence text) {
textView.cancelAnimation();
textView.setText(text);
collapsedArrow.animate().cancel();
collapsedArrow.animate().rotation(collapsed ? 0 : 180).setDuration(340).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start();
}
}
}

View file

@ -0,0 +1,76 @@
package org.telegram.ui.Cells;
import static org.telegram.messenger.AndroidUtilities.dp;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedTextView;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.LayoutHelper;
@SuppressLint("ViewConstructor")
public class CollapseTextCell extends FrameLayout {
public final AnimatedTextView textView;
private View collapsedArrow;
private Theme.ResourcesProvider resourcesProvider;
@SuppressLint("UseCompatLoadingForDrawables")
public CollapseTextCell(Context context, Theme.ResourcesProvider resourcesProvider) {
super(context);
this.resourcesProvider = resourcesProvider;
textView = new AnimatedTextView(context);
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider));
textView.setTextSize(dp(14));
textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
textView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
textView.setOnWidthUpdatedListener(this::updateCollapseArrowTranslation);
addView(textView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 21, 0, 38, 3));
collapsedArrow = new View(context);
Drawable drawable = getContext().getResources().getDrawable(R.drawable.arrow_more).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider), PorterDuff.Mode.MULTIPLY));
collapsedArrow.setBackground(drawable);
addView(collapsedArrow, LayoutHelper.createFrameRelatively(14, 14, Gravity.START | Gravity.CENTER_VERTICAL, 21, 1, 0, 3));
}
public void set(CharSequence text, boolean collapsed) {
textView.setText(text);
collapsedArrow.animate().cancel();
collapsedArrow.animate().rotation(collapsed ? 0 : 180).setDuration(340).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start();
}
public void setColor(int colorKey) {
int color = Theme.getColor(colorKey, resourcesProvider);
textView.setTextColor(color);
collapsedArrow.getBackground().setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(46), MeasureSpec.EXACTLY));
updateCollapseArrowTranslation();
}
private void updateCollapseArrowTranslation() {
float textWidth = textView.getDrawable().getCurrentWidth();
float translateX = textWidth + dp(1);
if (LocaleController.isRTL) {
collapsedArrow.setTranslationX(-translateX);
} else {
collapsedArrow.setTranslationX(translateX);
}
}
}

View file

@ -1619,7 +1619,14 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
messageString = LocaleController.getString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media;
messageString = "\uD83D\uDCCA " + mediaPoll.poll.question;
if (mediaPoll.poll.question != null && mediaPoll.poll.question.entities != null) {
SpannableStringBuilder questionText = new SpannableStringBuilder(mediaPoll.poll.question.text);
MediaDataController.addTextStyleRuns(mediaPoll.poll.question.entities, mediaPoll.poll.question.text, questionText);
MediaDataController.addAnimatedEmojiSpans(mediaPoll.poll.question.entities, questionText, Theme.dialogs_messagePaint[paintIndex].getFontMetricsInt());
messageString = new SpannableStringBuilder("\uD83D\uDCCA ").append(questionText);
} else {
messageString = "\uD83D\uDCCA " + mediaPoll.poll.question.text;
}
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
messageString = "\uD83C\uDFAE " + message.messageOwner.media.game.title;
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaInvoice) {
@ -5064,14 +5071,28 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
}
} else if (message.messageOwner.media != null && !message.isMediaEmpty()) {
currentMessagePaint = Theme.dialogs_messagePrintingPaint[paintIndex];
String innerMessage;
CharSequence innerMessage;
int colorKey = Theme.key_chats_attachMessage;
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media;
if (Build.VERSION.SDK_INT >= 18) {
innerMessage = String.format("\uD83D\uDCCA \u2068%s\u2069", mediaPoll.poll.question);
if (mediaPoll.poll.question != null && mediaPoll.poll.question.entities != null) {
SpannableStringBuilder questionText = new SpannableStringBuilder(mediaPoll.poll.question.text.replace('\n', ' '));
MediaDataController.addTextStyleRuns(mediaPoll.poll.question.entities, mediaPoll.poll.question.text, questionText);
MediaDataController.addAnimatedEmojiSpans(mediaPoll.poll.question.entities, questionText, Theme.dialogs_messagePaint[paintIndex].getFontMetricsInt());
innerMessage = new SpannableStringBuilder("\uD83D\uDCCA \u2068").append(questionText).append("\u2069");
} else {
innerMessage = String.format("\uD83D\uDCCA \u2068%s\u2069", mediaPoll.poll.question.text);
}
} else {
innerMessage = String.format("\uD83D\uDCCA %s", mediaPoll.poll.question);
if (mediaPoll.poll.question != null && mediaPoll.poll.question.entities != null) {
SpannableStringBuilder questionText = new SpannableStringBuilder(mediaPoll.poll.question.text.replace('\n', ' '));
MediaDataController.addTextStyleRuns(mediaPoll.poll.question.entities, mediaPoll.poll.question.text, questionText);
MediaDataController.addAnimatedEmojiSpans(mediaPoll.poll.question.entities, questionText, Theme.dialogs_messagePaint[paintIndex].getFontMetricsInt());
innerMessage = new SpannableStringBuilder("\uD83D\uDCCA ").append(questionText);
} else {
innerMessage = String.format("\uD83D\uDCCA %s", mediaPoll.poll.question.text);
}
}
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGame) {
if (Build.VERSION.SDK_INT >= 18) {
@ -5098,7 +5119,9 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
innerMessage = msgText.toString();
colorKey = Theme.key_chats_actionMessage;
}
innerMessage = innerMessage.replace('\n', ' ');
if (innerMessage instanceof String) {
innerMessage = ((String) innerMessage).replace('\n', ' ');
}
CharSequence message = innerMessage;
if (applyThumbs) {
message = applyThumbs(innerMessage);

View file

@ -148,8 +148,8 @@ public class EditTextCell extends FrameLayout {
}
editText.setPadding(dp(21), dp(15), dp((maxLength > 0 ? 42 : 0) + 21), dp(15));
editText.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_CLASS_TEXT | (multiline ? InputType.TYPE_TEXT_FLAG_MULTI_LINE : 0) | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
editText.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_CLASS_TEXT | (multiline ? InputType.TYPE_TEXT_FLAG_MULTI_LINE : 0) | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setHint(hint);
editText.setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
editText.setCursorSize(dp(19));

View file

@ -98,7 +98,7 @@ public class GraySectionCell extends FrameLayout {
rightTextView.setOnClickListener(null);
}
public void setText(String left, String right, OnClickListener onClickListener) {
public void setText(CharSequence left, CharSequence right, OnClickListener onClickListener) {
textView.setText(left);
rightTextView.setText(right, false);
rightTextView.setOnClickListener(onClickListener);

View file

@ -26,19 +26,24 @@ import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.ui.ActionBar.SimpleTextView;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedTextView;
import org.telegram.ui.Components.LayoutHelper;
import java.util.ArrayList;
public class HeaderCell extends FrameLayout {
public int id;
protected int padding;
protected int bottomMargin;
private TextView textView;
private AnimatedTextView animatedTextView;
private SimpleTextView textView2;
private int height = 40;
private final Theme.ResourcesProvider resourcesProvider;
private boolean animated;
public HeaderCell(Context context) {
this(context, Theme.key_windowBackgroundWhiteBlueHeader, 21, 15, false, null);
@ -65,20 +70,36 @@ public class HeaderCell extends FrameLayout {
}
public HeaderCell(Context context, int textColorKey, int padding, int topMargin, int bottomMargin, boolean text2, Theme.ResourcesProvider resourcesProvider) {
this(context, textColorKey, padding, topMargin, bottomMargin, text2, false, resourcesProvider);
}
public HeaderCell(Context context, int textColorKey, int padding, int topMargin, int bottomMargin, boolean text2, boolean animated, Theme.ResourcesProvider resourcesProvider) {
super(context);
this.resourcesProvider = resourcesProvider;
this.padding = padding;
this.bottomMargin = bottomMargin;
this.animated = animated;
textView = new TextView(getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
textView.setMinHeight(AndroidUtilities.dp(height - topMargin));
textView.setTextColor(getThemedColor(textColorKey));
textView.setTag(textColorKey);
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, padding, topMargin, padding, text2 ? 0 : bottomMargin));
if (animated) {
animatedTextView = new AnimatedTextView(getContext());
animatedTextView.setTextSize(AndroidUtilities.dp(15));
animatedTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
animatedTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
animatedTextView.setTextColor(getThemedColor(textColorKey));
animatedTextView.setTag(textColorKey);
animatedTextView.getDrawable().setHacks(true, true, false);
addView(animatedTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, height - topMargin, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, padding, topMargin, padding, text2 ? 0 : bottomMargin));
} else {
textView = new TextView(getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
textView.setMinHeight(AndroidUtilities.dp(height - topMargin));
textView.setTextColor(getThemedColor(textColorKey));
textView.setTag(textColorKey);
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, padding, topMargin, padding, text2 ? 0 : bottomMargin));
}
if (text2) {
textView2 = new SimpleTextView(getContext());
@ -120,7 +141,11 @@ public class HeaderCell extends FrameLayout {
}
public void setTextSize(float dip) {
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, dip);
if (animated) {
animatedTextView.setTextSize(AndroidUtilities.dp(dip));
} else {
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, dip);
}
}
public void setTextColor(int color) {
@ -128,8 +153,17 @@ public class HeaderCell extends FrameLayout {
}
public void setText(CharSequence text) {
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
textView.setText(text);
setText(text, false);
}
public void setText(CharSequence text, boolean animate) {
if (this.animated) {
animatedTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
animatedTextView.setText(text, animate);
} else {
textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
textView.setText(text);
}
}
public void setText2(CharSequence text) {

View file

@ -8,6 +8,8 @@
package org.telegram.ui.Cells;
import static org.telegram.messenger.AndroidUtilities.dp;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
@ -15,6 +17,7 @@ import android.graphics.PorterDuffColorFilter;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
@ -25,13 +28,16 @@ import org.telegram.messenger.LocaleController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedTextView;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.Switch;
public class NotificationsCheckCell extends FrameLayout {
private TextView textView;
private TextView valueTextView;
private AnimatedTextView valueTextView;
private TextView multilineValueTextView;
@SuppressWarnings("FieldCanBeLocal")
private ImageView imageView;
private Switch checkBox;
@ -78,16 +84,26 @@ public class NotificationsCheckCell extends FrameLayout {
textView.setEllipsize(TextUtils.TruncateAt.END);
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 80 : (withImage ? 64 : padding), 13 + (currentHeight - 70) / 2, LocaleController.isRTL ? (withImage ? 64 : padding) : 80, 0));
valueTextView = new TextView(context);
valueTextView = new AnimatedTextView(context);
valueTextView.setAnimationProperties(.55f, 0, 320, CubicBezierInterpolator.EASE_OUT_QUINT);
valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider));
valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
valueTextView.setTextSize(dp(13));
valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
valueTextView.setLines(1);
valueTextView.setMaxLines(1);
valueTextView.setSingleLine(true);
valueTextView.setPadding(0, 0, 0, 0);
valueTextView.setEllipsize(TextUtils.TruncateAt.END);
addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 80 : (withImage ? 64 : padding), 38 - (withImage ? 2 : 0) + (currentHeight - 70) / 2, LocaleController.isRTL ? (withImage ? 64 : padding) : 80, 0));
valueTextView.setEllipsizeByGradient(true);
addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 80 : (withImage ? 64 : padding), 38 - 9 - (withImage ? 2 : 0) + (currentHeight - 70) / 2, LocaleController.isRTL ? (withImage ? 64 : padding) : 80, 0));
multilineValueTextView = new TextView(context);
multilineValueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider));
multilineValueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
multilineValueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
multilineValueTextView.setLines(0);
multilineValueTextView.setMaxLines(0);
multilineValueTextView.setSingleLine(false);
multilineValueTextView.setEllipsize(null);
multilineValueTextView.setPadding(0, 0, 0, 0);
multilineValueTextView.setVisibility(View.GONE);
addView(multilineValueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 80 : (withImage ? 64 : padding), 38 - (withImage ? 2 : 0) + (currentHeight - 70) / 2, LocaleController.isRTL ? (withImage ? 64 : padding) : 80, 0));
checkBox = new Switch(context, resourcesProvider) {
@Override
@ -113,7 +129,7 @@ public class NotificationsCheckCell extends FrameLayout {
if (isMultiline) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
} else {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(currentHeight), MeasureSpec.EXACTLY));
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(currentHeight), MeasureSpec.EXACTLY));
}
}
@ -130,38 +146,46 @@ public class NotificationsCheckCell extends FrameLayout {
}
public void setTextAndValueAndIconAndCheck(CharSequence text, CharSequence value, int iconResId, boolean checked, int iconType, boolean multiline, boolean divider) {
setTextAndValueAndIconAndCheck(text, value, iconResId, checked, iconType, multiline, divider, false);
}
public void setTextAndValueAndIconAndCheck(CharSequence text, CharSequence value, int iconResId, boolean checked, int iconType, boolean multiline, boolean divider, boolean animated) {
textView.setText(text);
valueTextView.setText(value);
if (imageView != null) {
imageView.setImageResource(iconResId);
imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogIcon), PorterDuff.Mode.MULTIPLY));
}
checkBox.setChecked(checked, iconType, animationsEnabled);
valueTextView.setVisibility(VISIBLE);
needDivider = divider;
setMultiline(multiline);
if (isMultiline) {
multilineValueTextView.setText(value);
} else {
valueTextView.setText(value, animated);
}
(isMultiline ? multilineValueTextView : valueTextView).setVisibility(VISIBLE);
checkBox.setContentDescription(text);
needDivider = divider;
}
public void setMultiline(boolean multiline) {
isMultiline = multiline;
if (multiline) {
valueTextView.setLines(0);
valueTextView.setMaxLines(0);
valueTextView.setSingleLine(false);
valueTextView.setEllipsize(null);
valueTextView.setPadding(0, 0, 0, AndroidUtilities.dp(14));
multilineValueTextView.setVisibility(View.VISIBLE);
valueTextView.setVisibility(View.GONE);
multilineValueTextView.setPadding(0, 0, 0, dp(14));
} else {
valueTextView.setLines(1);
valueTextView.setMaxLines(1);
valueTextView.setSingleLine(true);
valueTextView.setEllipsize(TextUtils.TruncateAt.END);
multilineValueTextView.setVisibility(View.GONE);
valueTextView.setVisibility(View.VISIBLE);
valueTextView.setPadding(0, 0, 0, 0);
}
}
public void setValue(CharSequence value) {
valueTextView.setText(value);
if (isMultiline) {
multilineValueTextView.setText(value);
} else {
valueTextView.setText(value, true);
}
}
public void setDrawLine(boolean value) {
@ -184,17 +208,17 @@ public class NotificationsCheckCell extends FrameLayout {
protected void onDraw(Canvas canvas) {
if (needDivider) {
canvas.drawLine(
LocaleController.isRTL ? 0 : AndroidUtilities.dp(imageView != null ? 64 : 20),
LocaleController.isRTL ? 0 : dp(imageView != null ? 64 : 20),
getMeasuredHeight() - 1,
getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(imageView != null ? 64 : 20) : 0),
getMeasuredWidth() - (LocaleController.isRTL ? dp(imageView != null ? 64 : 20) : 0),
getMeasuredHeight() - 1,
Theme.dividerPaint
);
}
if (drawLine) {
int x = LocaleController.isRTL ? AndroidUtilities.dp(76) : getMeasuredWidth() - AndroidUtilities.dp(76) - 1;
int y = (getMeasuredHeight() - AndroidUtilities.dp(22)) / 2;
canvas.drawRect(x, y, x + 2, y + AndroidUtilities.dp(22), Theme.dividerPaint);
int x = LocaleController.isRTL ? dp(76) : getMeasuredWidth() - dp(76) - 1;
int y = (getMeasuredHeight() - dp(22)) / 2;
canvas.drawRect(x, y, x + 2, y + dp(22), Theme.dividerPaint);
}
}
@ -208,9 +232,16 @@ public class NotificationsCheckCell extends FrameLayout {
info.setClassName("android.widget.Switch");
StringBuilder sb = new StringBuilder();
sb.append(textView.getText());
if (valueTextView != null && !TextUtils.isEmpty(valueTextView.getText())) {
sb.append("\n");
sb.append(valueTextView.getText());
if (isMultiline) {
if (multilineValueTextView != null && !TextUtils.isEmpty(multilineValueTextView.getText())) {
sb.append("\n");
sb.append(multilineValueTextView.getText());
}
} else {
if (valueTextView != null && !TextUtils.isEmpty(valueTextView.getText())) {
sb.append("\n");
sb.append(valueTextView.getText());
}
}
info.setContentDescription(sb);
info.setCheckable(true);

View file

@ -13,6 +13,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@ -23,10 +24,12 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Size;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
@ -44,6 +47,7 @@ import androidx.core.math.MathUtils;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.ImageReceiver;
import org.telegram.messenger.LocaleController;
@ -60,6 +64,8 @@ import org.telegram.ui.Components.spoilers.SpoilerEffect;
import org.telegram.ui.Components.spoilers.SpoilerEffect2;
import org.telegram.ui.PhotoViewer;
import java.io.IOException;
public class PhotoAttachPhotoCell extends FrameLayout {
private BackupImageView imageView;

View file

@ -8,13 +8,19 @@
package org.telegram.ui.Cells;
import static org.telegram.messenger.AndroidUtilities.dp;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.os.Build;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
@ -27,19 +33,28 @@ import android.view.inputmethod.InputConnection;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.SimpleTextView;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedEmojiDrawable;
import org.telegram.ui.Components.ChatActivityEnterViewAnimatedIconView;
import org.telegram.ui.Components.CheckBox2;
import org.telegram.ui.Components.EditTextBoldCursor;
import org.telegram.ui.Components.EditTextCaption;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.SuggestEmojiView;
import java.util.ArrayList;
public class PollEditTextCell extends FrameLayout {
public class PollEditTextCell extends FrameLayout implements SuggestEmojiView.AnchorViewDelegate {
public static final int TYPE_DEFAULT = 0;
public static final int TYPE_EMOJI = 1;
private EditTextBoldCursor textView;
private ImageView deleteImageView;
@ -50,89 +65,79 @@ public class PollEditTextCell extends FrameLayout {
private boolean needDivider;
private AnimatorSet checkBoxAnimation;
private boolean alwaysShowText2;
private ChatActivityEnterViewAnimatedIconView emojiButton;
private ValueAnimator valueAnimator;
public PollEditTextCell(Context context, OnClickListener onDelete) {
this(context, false, onDelete);
this(context, false, TYPE_DEFAULT, onDelete);
}
public PollEditTextCell(Context context, boolean caption, OnClickListener onDelete) {
public PollEditTextCell(Context context, boolean caption, int type, OnClickListener onDelete) {
super(context);
if (caption) {
textView = new EditTextCaption(context, null) {
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs);
if (showNextButton) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return conn;
}
textView = new EditTextCaption(context, null) {
@Override
protected int emojiCacheType() {
return AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
onEditTextDraw(this, canvas);
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs);
if (showNextButton) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return conn;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
onFieldTouchUp(this);
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
onEditTextDraw(this, canvas);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type) {
ActionMode actionMode = super.startActionMode(callback, type);
onActionModeStart(this, actionMode);
return actionMode;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
onFieldTouchUp(this);
}
return super.onTouchEvent(event);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
ActionMode actionMode = super.startActionMode(callback);
onActionModeStart(this, actionMode);
return actionMode;
}
};
((EditTextCaption) textView).setAllowTextEntitiesIntersection(true);
} else {
textView = new EditTextBoldCursor(context) {
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs);
if (showNextButton) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (type == TYPE_EMOJI) {
if (focused && emojiButton.getVisibility() == View.GONE) {
setEmojiButtonVisibility(true);
} else if (!focused && emojiButton.getVisibility() == View.VISIBLE) {
setEmojiButtonVisibility(false);
}
return conn;
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
onEditTextDraw(this, canvas);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type) {
ActionMode actionMode = super.startActionMode(callback, type);
onActionModeStart(this, actionMode);
return actionMode;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
onFieldTouchUp(this);
}
return super.onTouchEvent(event);
}
};
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
ActionMode actionMode = super.startActionMode(callback);
onActionModeStart(this, actionMode);
return actionMode;
}
};
((EditTextCaption) textView).setAllowTextEntitiesIntersection(true);
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
textView.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
textView.setMaxLines(type == TYPE_EMOJI ? 4 : Integer.MAX_VALUE);
// textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
textView.setBackgroundDrawable(null);
textView.setImeOptions(textView.getImeOptions() | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
@ -140,7 +145,8 @@ public class PollEditTextCell extends FrameLayout {
textView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(10), AndroidUtilities.dp(4), AndroidUtilities.dp(11));
if (onDelete != null) {
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? 58 : 64, 0, !LocaleController.isRTL ? 58 : 64, 0));
int endMargin = type == TYPE_EMOJI ? 102: 58;
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? endMargin : 64, 0, !LocaleController.isRTL ? endMargin : 64, 0));
moveImageView = new ImageView(context);
moveImageView.setFocusable(false);
@ -179,7 +185,27 @@ public class PollEditTextCell extends FrameLayout {
onCheckBoxClick(PollEditTextCell.this, !checkBox.isChecked());
});
} else {
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, 19, 0, 19, 0));
int endMargin = type == TYPE_EMOJI ? 80: 19;
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? endMargin : 19, 0, LocaleController.isRTL ? 19 : endMargin, 0));
}
if (type == TYPE_EMOJI) {
emojiButton = new ChatActivityEnterViewAnimatedIconView(context);
emojiButton.setAlpha(0.80f);
emojiButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.SRC_IN));
emojiButton.setState(ChatActivityEnterViewAnimatedIconView.State.SMILE, false);
int padding = dp(9.5f);
emojiButton.setPadding(padding, padding, padding, padding);
emojiButton.setVisibility(View.GONE);
int endMargin = deleteImageView == null ? 3 : 48;
addView(emojiButton, LayoutHelper.createFrame(48, 48, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT), LocaleController.isRTL ? endMargin : 0, 0, LocaleController.isRTL ? 0 : endMargin, 0));
if (Build.VERSION.SDK_INT >= 21) {
emojiButton.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_stickers_menuSelector)));
}
emojiButton.setOnClickListener(view -> {
onEmojiButtonClicked(this);
});
emojiButton.setContentDescription(LocaleController.getString("Emoji", R.string.Emoji));
}
}
@ -197,6 +223,9 @@ public class PollEditTextCell extends FrameLayout {
if (deleteImageView != null) {
deleteImageView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY));
}
if (emojiButton != null) {
emojiButton.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY));
}
if (moveImageView != null) {
moveImageView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY));
}
@ -212,7 +241,11 @@ public class PollEditTextCell extends FrameLayout {
} else if (deleteImageView == null) {
right = 70;
} else {
right = 122;
if (emojiButton != null) {
right = 174;
} else {
right = 122;
}
}
textView.measure(MeasureSpec.makeMeasureSpec(width - getPaddingLeft() - getPaddingRight() - AndroidUtilities.dp(right), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = textView.getMeasuredHeight();
@ -335,6 +368,10 @@ public class PollEditTextCell extends FrameLayout {
setWillNotDraw(!divider);
}
public ChatActivityEnterViewAnimatedIconView getEmojiButton() {
return emojiButton;
}
public void setEnabled(boolean value, ArrayList<Animator> animators) {
setEnabled(value);
}
@ -343,6 +380,10 @@ public class PollEditTextCell extends FrameLayout {
}
protected void onEmojiButtonClicked(PollEditTextCell cell) {
}
public void setText2(String text) {
if (textView2 == null) {
return;
@ -354,10 +395,94 @@ public class PollEditTextCell extends FrameLayout {
return textView2;
}
private void setEmojiButtonVisibility(boolean visible) {
if (valueAnimator != null) {
valueAnimator.cancel();
}
if (visible) {
emojiButton.setVisibility(View.VISIBLE);
emojiButton.setScaleX(0f);
emojiButton.setScaleY(0f);
emojiButton.setAlpha(0f);
}
valueAnimator = ValueAnimator.ofFloat(visible ? 0 : 1, visible ? 1 : 0);
valueAnimator.addUpdateListener(animation -> {
float value = (Float) animation.getAnimatedValue();
emojiButton.setScaleX(value);
emojiButton.setScaleY(value);
emojiButton.setAlpha(Math.max(value, 0.80f));
if (textView2 != null && deleteImageView == null && textView2.getVisibility() == View.VISIBLE) {
textView2.setTranslationY(AndroidUtilities.dp(26) * value);
}
});
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(@NonNull Animator animation) {
}
@Override
public void onAnimationEnd(@NonNull Animator animation) {
if (!visible) {
emojiButton.setVisibility(View.GONE);
} else {
emojiButton.setScaleX(1f);
emojiButton.setScaleY(1f);
emojiButton.setAlpha(0.80f);
}
}
@Override
public void onAnimationCancel(@NonNull Animator animation) {
}
@Override
public void onAnimationRepeat(@NonNull Animator animation) {
}
});
valueAnimator.setDuration(200L);
valueAnimator.start();
}
@Override
protected void onDraw(Canvas canvas) {
if (needDivider && drawDivider()) {
canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(moveImageView != null ? 63 : 20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(moveImageView != null ? 63 : 20) : 0), getMeasuredHeight() - 1, Theme.dividerPaint);
}
}
@Override
public BaseFragment getParentFragment() {
return null;
}
@Override
public void setFieldText(CharSequence text) {
textView.setText(text);
}
@Override
public void addTextChangedListener(TextWatcher watcher) {
textView.addTextChangedListener(watcher);
}
@Override
public EditTextBoldCursor getEditField() {
return textView;
}
@Override
public CharSequence getFieldText() {
if (textView.length() > 0) {
return textView.getText();
}
return null;
}
@Override
public Editable getEditText() {
return textView.getText();
}
}

View file

@ -25,6 +25,7 @@ import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.NativeByteBuffer;
@ -53,7 +54,7 @@ public class ProfileChannelCell extends FrameLayout {
private final TextView headerView;
private final AnimatedTextView subscribersView;
private final DialogCell dialogCell;
public final DialogCell dialogCell;
public ProfileChannelCell(BaseFragment fragment) {
super(fragment.getContext());
@ -67,7 +68,7 @@ public class ProfileChannelCell extends FrameLayout {
headerView = new TextView(context);
headerView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
headerView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
headerView.setText("Channel");
headerView.setText(LocaleController.getString(R.string.ProfileChannel));
headerLayout.addView(headerView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
subscribersView = new ClickableAnimatedTextView(context);
@ -80,6 +81,7 @@ public class ProfileChannelCell extends FrameLayout {
headerLayout.addView(subscribersView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 17, Gravity.LEFT | Gravity.TOP, 4, 2, 4, 0));
dialogCell = new DialogCell(null, context, false, true, UserConfig.selectedAccount, resourcesProvider);
dialogCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
dialogCell.setDialogCellDelegate(new DialogCell.DialogCellDelegate() {
@Override
public void onButtonClicked(DialogCell dialogCell) {
@ -149,8 +151,8 @@ public class ProfileChannelCell extends FrameLayout {
private final LoadingDrawable loadingDrawable;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
float loading = loadingAlpha.set(this.loading);
if (loading > 0) {

View file

@ -29,6 +29,8 @@ public class RadioColorCell extends FrameLayout {
private RadioButton radioButton;
private final Theme.ResourcesProvider resourcesProvider;
public int heightDp = 50;
public RadioColorCell(Context context) {
this(context, null);
}
@ -69,7 +71,7 @@ public class RadioColorCell extends FrameLayout {
}
super.onMeasure(
MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50) + (text2View.getVisibility() == View.VISIBLE ? AndroidUtilities.dp(4) + text2View.getMeasuredHeight() : 0), MeasureSpec.EXACTLY)
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(heightDp) + (text2View.getVisibility() == View.VISIBLE ? AndroidUtilities.dp(4) + text2View.getMeasuredHeight() : 0), MeasureSpec.EXACTLY)
);
}

View file

@ -185,7 +185,7 @@ public class ReactedUserHolderView extends FrameLayout {
dialogId = user.id;
titleView.setText(UserObject.getUserName(user));
} else {
dialogId = chat.id;
dialogId = -chat.id;
titleView.setText(chat.title);
}

View file

@ -8,16 +8,23 @@
package org.telegram.ui.Cells;
import static org.telegram.messenger.AndroidUtilities.dp;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import org.checkerframework.checker.units.qual.A;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.LocationController;
@ -25,7 +32,10 @@ import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedFloat;
import org.telegram.ui.Components.AnimatedTextView;
import org.telegram.ui.Components.CombinedDrawable;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.ActionBar.SimpleTextView;
import org.telegram.ui.Components.ShareLocationDrawable;
@ -39,7 +49,9 @@ public class SendLocationCell extends FrameLayout {
private long dialogId;
private RectF rect;
private boolean live;
private boolean liveDisable;
private final Theme.ResourcesProvider resourcesProvider;
public boolean useDivider;
private Runnable invalidateRunnable = new Runnable() {
@Override
@ -50,49 +62,56 @@ public class SendLocationCell extends FrameLayout {
}
};
public SendLocationCell(Context context, boolean live, Theme.ResourcesProvider resourcesProvider) {
public SendLocationCell(Context context, boolean live, boolean liveDisable, Theme.ResourcesProvider resourcesProvider) {
super(context);
this.resourcesProvider = resourcesProvider;
this.live = live;
this.liveDisable = liveDisable;
imageView = new ImageView(context);
setBackground(Theme.AdaptiveRipple.rect());
imageView.setTag(live ? Theme.key_location_sendLiveLocationBackground + Theme.key_location_sendLiveLocationIcon : Theme.key_location_sendLocationBackground + Theme.key_location_sendLocationIcon);
Drawable circle = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(42), getThemedColor(live ? Theme.key_location_sendLiveLocationBackground : Theme.key_location_sendLocationBackground), getThemedColor(live ? Theme.key_location_sendLiveLocationBackground : Theme.key_location_sendLocationBackground));
if (live) {
rect = new RectF();
Drawable drawable = new ShareLocationDrawable(context, 4);
drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_sendLiveLocationIcon), PorterDuff.Mode.MULTIPLY));
CombinedDrawable combinedDrawable = new CombinedDrawable(circle, drawable);
combinedDrawable.setCustomSize(AndroidUtilities.dp(42), AndroidUtilities.dp(42));
imageView.setBackgroundDrawable(combinedDrawable);
AndroidUtilities.runOnUIThread(invalidateRunnable, 1000);
setWillNotDraw(false);
} else {
Drawable drawable = getResources().getDrawable(R.drawable.pin).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_sendLocationIcon), PorterDuff.Mode.MULTIPLY));
CombinedDrawable combinedDrawable = new CombinedDrawable(circle, drawable);
combinedDrawable.setCustomSize(AndroidUtilities.dp(42), AndroidUtilities.dp(42));
combinedDrawable.setIconSize(AndroidUtilities.dp(24), AndroidUtilities.dp(24));
imageView.setBackgroundDrawable(combinedDrawable);
}
addView(imageView, LayoutHelper.createFrame(42, 42, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 15, 12, LocaleController.isRTL ? 15 : 0, 0));
addView(imageView, LayoutHelper.createFrame(46, 46, Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 13, 0, LocaleController.isRTL ? 13 : 0, 0));
titleTextView = new SimpleTextView(context);
titleTextView.setTextSize(16);
titleTextView.setTag(live ? Theme.key_location_sendLiveLocationText : Theme.key_location_sendLocationText);
titleTextView.setTextColor(getThemedColor(live ? Theme.key_location_sendLiveLocationText : Theme.key_location_sendLocationText));
titleTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 16 : 73, 12, LocaleController.isRTL ? 73 : 16, 0));
addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 16 : 73, 9.33f, LocaleController.isRTL ? 73 : 16, 0));
accurateTextView = new SimpleTextView(context);
accurateTextView.setTextSize(14);
accurateTextView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText3));
accurateTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
addView(accurateTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 16 : 73, 37, LocaleController.isRTL ? 73 : 16, 0));
addView(accurateTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 16 : 73, 33, LocaleController.isRTL ? 73 : 16, 0));
updateImage();
setWillNotDraw(false);
}
private void updateImage() {
titleTextView.setTag(live ? liveDisable ? Theme.key_text_RedBold : Theme.key_location_sendLiveLocationText : Theme.key_location_sendLocationText);
titleTextView.setTextColor(getThemedColor(live ? liveDisable ? Theme.key_text_RedBold : Theme.key_location_sendLiveLocationText : Theme.key_location_sendLocationText));
imageView.setTag(live ? liveDisable ? Theme.key_color_red : Theme.key_location_sendLiveLocationBackground + Theme.key_location_sendLiveLocationIcon : Theme.key_location_sendLocationBackground + Theme.key_location_sendLocationIcon);
Drawable circle = Theme.createSimpleSelectorCircleDrawable(dp(46), getThemedColor(live ? liveDisable ? Theme.key_color_red : Theme.key_location_sendLiveLocationBackground : Theme.key_location_sendLocationBackground), getThemedColor(live ? liveDisable ? Theme.key_color_red : Theme.key_location_sendLiveLocationBackground : Theme.key_location_sendLocationBackground));
if (live) {
rect = new RectF();
Drawable drawable = new ShareLocationDrawable(getContext(), liveDisable ? ShareLocationDrawable.TYPE_DISABLE : ShareLocationDrawable.TYPE_ADD);
drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_sendLiveLocationIcon), PorterDuff.Mode.MULTIPLY));
CombinedDrawable combinedDrawable = new CombinedDrawable(circle, drawable);
combinedDrawable.setCustomSize(dp(46), dp(46));
imageView.setBackgroundDrawable(combinedDrawable);
if (!liveDisable) {
AndroidUtilities.cancelRunOnUIThread(invalidateRunnable);
AndroidUtilities.runOnUIThread(invalidateRunnable, 1000);
}
} else {
Drawable drawable = getResources().getDrawable(R.drawable.pin).mutate();
drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_sendLocationIcon), PorterDuff.Mode.MULTIPLY));
CombinedDrawable combinedDrawable = new CombinedDrawable(circle, drawable);
combinedDrawable.setCustomSize(dp(46), dp(46));
combinedDrawable.setIconSize(dp(24), dp(24));
imageView.setBackgroundDrawable(combinedDrawable);
}
}
private ImageView getImageView() {
@ -113,7 +132,7 @@ public class SendLocationCell extends FrameLayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(66), MeasureSpec.EXACTLY));
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(60), MeasureSpec.EXACTLY));
}
@Override
@ -126,6 +145,7 @@ public class SendLocationCell extends FrameLayout {
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (rect != null) {
AndroidUtilities.cancelRunOnUIThread(invalidateRunnable);
AndroidUtilities.runOnUIThread(invalidateRunnable, 1000);
}
}
@ -145,41 +165,93 @@ public class SendLocationCell extends FrameLayout {
private void checkText() {
LocationController.SharingLocationInfo info = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
if (info != null) {
setText(LocaleController.getString("StopLiveLocation", R.string.StopLiveLocation), LocaleController.formatLocationUpdateDate(info.messageObject.messageOwner.edit_date != 0 ? info.messageObject.messageOwner.edit_date : info.messageObject.messageOwner.date));
if (liveDisable) {
setText(LocaleController.getString(R.string.StopLiveLocation), LocaleController.formatLocationUpdateDate(info.messageObject.messageOwner.edit_date != 0 ? info.messageObject.messageOwner.edit_date : info.messageObject.messageOwner.date));
} else {
setText(LocaleController.getString(R.string.SharingLiveLocation), LocaleController.getString(R.string.SharingLiveLocationAdd));
}
} else {
setText(LocaleController.getString("SendLiveLocation", R.string.SendLiveLocation), LocaleController.getString("SendLiveLocationInfo", R.string.SendLiveLocationInfo));
}
}
private final AnimatedFloat progress = new AnimatedFloat(this, 350, CubicBezierInterpolator.EASE_OUT_QUINT);
private final AnimatedFloat progressAlpha = new AnimatedFloat(this, 350, CubicBezierInterpolator.EASE_OUT_QUINT);
private final AnimatedFloat progressScale = new AnimatedFloat(this, 350, CubicBezierInterpolator.EASE_OUT_QUINT);
private final AnimatedTextView.AnimatedTextDrawable textDrawable = new AnimatedTextView.AnimatedTextDrawable(false, true, false);
{
textDrawable.setAnimationProperties(.3f, 0, 320, CubicBezierInterpolator.EASE_OUT_QUINT);
textDrawable.setTextSize(dp(12));
textDrawable.setTypeface(Typeface.DEFAULT_BOLD);
textDrawable.setGravity(Gravity.CENTER);
textDrawable.setCallback(this);
}
@Override
protected boolean verifyDrawable(@NonNull Drawable who) {
return who == textDrawable || super.verifyDrawable(who);
}
@Override
protected void onDraw(Canvas canvas) {
LocationController.SharingLocationInfo currentInfo = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
if (currentInfo == null) {
if (useDivider) {
Paint dividerPaint = Theme.getThemePaint(Theme.key_paint_divider, resourcesProvider);
if (dividerPaint != null) {
canvas.drawRect(LocaleController.isRTL ? 0 : dp(73), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? dp(73) : 0), getMeasuredHeight(), dividerPaint);
}
}
if (liveDisable) {
return;
}
LocationController.SharingLocationInfo currentInfo = LocationController.getInstance(currentAccount).getSharingLocationInfo(dialogId);
float progress = this.progress.get();
float alpha;
int currentTime = ConnectionsManager.getInstance(currentAccount).getCurrentTime();
if (currentInfo.stopTime < currentTime) {
if (currentInfo != null && currentInfo.stopTime >= currentTime && currentInfo.period != 0x7FFFFFFF) {
progress = Math.abs(currentInfo.stopTime - currentTime) / (float) currentInfo.period;
alpha = this.progressAlpha.set(true);
} else {
alpha = this.progressAlpha.set(false);
}
if (alpha <= 0) {
return;
}
float progress = Math.abs(currentInfo.stopTime - currentTime) / (float) currentInfo.period;
if (LocaleController.isRTL) {
rect.set(AndroidUtilities.dp(13), AndroidUtilities.dp(18), AndroidUtilities.dp(43), AndroidUtilities.dp(48));
rect.set(dp(13), getMeasuredHeight() / 2f - dp(15), dp(43), getMeasuredHeight() / 2f + dp(15));
} else {
rect.set(getMeasuredWidth() - AndroidUtilities.dp(43), AndroidUtilities.dp(18), getMeasuredWidth() - AndroidUtilities.dp(13), AndroidUtilities.dp(48));
rect.set(getMeasuredWidth() - dp(43), getMeasuredHeight() / 2f - dp(15), getMeasuredWidth() - dp(13), getMeasuredHeight() / 2f + dp(15));
}
canvas.save();
final float s = AndroidUtilities.lerp(.6f, 1f, alpha);
canvas.scale(s, s, rect.centerX(), rect.centerY());
int color = getThemedColor(Theme.key_location_liveLocationProgress);
Theme.chat_radialProgress2Paint.setColor(color);
Theme.chat_livePaint.setColor(color);
canvas.drawArc(rect, -90, -360 * progress, false, Theme.chat_radialProgress2Paint);
int a = Theme.chat_radialProgress2Paint.getAlpha();
Theme.chat_radialProgress2Paint.setAlpha((int) (.20f * a * alpha));
canvas.drawArc(rect, -90, 360, false, Theme.chat_radialProgress2Paint);
Theme.chat_radialProgress2Paint.setAlpha((int) (a * alpha));
canvas.drawArc(rect, -90, -360 * this.progress.set(progress), false, Theme.chat_radialProgress2Paint);
Theme.chat_radialProgress2Paint.setAlpha(a);
String text = LocaleController.formatLocationLeftTime(Math.abs(currentInfo.stopTime - currentTime));
if (currentInfo != null) {
textDrawable.setText(LocaleController.formatLocationLeftTime(Math.abs(currentInfo.stopTime - currentTime)));
}
int len = textDrawable.getText().length();
final float s2 = progressScale.set(len > 4 ? .75f : (len > 3 ? .85f : 1f));
canvas.scale(s2, s2, rect.centerX(), rect.centerY());
textDrawable.setTextColor(color);
textDrawable.setAlpha((int) (0xFF * alpha));
textDrawable.setBounds((int) rect.left, (int) (rect.centerY() - dp(12 + 1)), (int) rect.right, (int) (rect.centerY() + dp(12)));
textDrawable.draw(canvas);
float size = Theme.chat_livePaint.measureText(text);
canvas.drawText(text, rect.centerX() - size / 2, AndroidUtilities.dp(37), Theme.chat_livePaint);
canvas.restore();
}
private int getThemedColor(int key) {

View file

@ -6,6 +6,7 @@ import android.text.Spanned;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
@ -19,12 +20,15 @@ import org.telegram.messenger.UserConfig;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.LinkSpanDrawable;
import org.telegram.ui.Components.ScaleStateListAnimator;
import org.telegram.ui.Components.URLSpanNoUnderline;
public class SettingsSuggestionCell extends LinearLayout {
public final static int TYPE_PHONE = 0;
public final static int TYPE_PASSWORD = 1;
public final static int TYPE_GRACE = 2;
private TextView textView;
private TextView detailTextView;
@ -49,22 +53,23 @@ public class SettingsSuggestionCell extends LinearLayout {
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader, resourcesProvider));
addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 15, 21, 0));
detailTextView = new TextView(context);
detailTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider));
detailTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
detailTextView = new LinkSpanDrawable.LinksTextView(context, resourcesProvider);
detailTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider));
detailTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
detailTextView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkText, resourcesProvider));
detailTextView.setHighlightColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkSelection, resourcesProvider));
detailTextView.setMovementMethod(new AndroidUtilities.LinkMovementMethodMy());
detailTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
addView(detailTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 21, 8, 21, 0));
addView(detailTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 21, 14, 21, 0));
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(HORIZONTAL);
addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 40, 21, 17, 21, 20));
addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 44, 21, 16, 21, 15));
for (int a = 0; a < 2; a++) {
TextView textView = new TextView(context);
textView.setBackground(Theme.AdaptiveRipple.filledRectByKey(Theme.key_featuredStickers_addButton, 4));
textView.setBackground(Theme.AdaptiveRipple.filledRectByKey(Theme.key_featuredStickers_addButton, 8));
ScaleStateListAnimator.apply(textView, 0.02f, 1.5f);
textView.setLines(1);
textView.setSingleLine(true);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
@ -72,8 +77,8 @@ public class SettingsSuggestionCell extends LinearLayout {
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText, resourcesProvider));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
linearLayout.addView(textView, LayoutHelper.createLinear(0, 40, 0.5f, a == 0 ? 0 : 4, 0, a == 0 ? 4 : 0, 0));
textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
linearLayout.addView(textView, LayoutHelper.createLinear(0, 44, 0.5f, a == 0 ? 0 : 4, 0, a == 0 ? 4 : 0, 0));
if (a == 0) {
yesButton = textView;
yesButton.setOnClickListener(v -> onYesClick(currentType));
@ -104,12 +109,19 @@ public class SettingsSuggestionCell extends LinearLayout {
}
detailTextView.setText(builder);
yesButton.setText(LocaleController.getString("CheckPhoneNumberYes", R.string.CheckPhoneNumberYes));
noButton.setVisibility(View.VISIBLE);
noButton.setText(LocaleController.getString("CheckPhoneNumberNo", R.string.CheckPhoneNumberNo));
} else if (type == TYPE_PASSWORD) {
textView.setText(LocaleController.getString("YourPasswordHeader", R.string.YourPasswordHeader));
detailTextView.setText(LocaleController.getString("YourPasswordRemember", R.string.YourPasswordRemember));
yesButton.setText(LocaleController.getString("YourPasswordRememberYes", R.string.YourPasswordRememberYes));
noButton.setVisibility(View.VISIBLE);
noButton.setText(LocaleController.getString("YourPasswordRememberNo", R.string.YourPasswordRememberNo));
} else if (type == TYPE_GRACE) {
textView.setText(LocaleController.getString(R.string.GraceSuggestionTitle));
detailTextView.setText(LocaleController.getString(R.string.GraceSuggestionMessage));
yesButton.setText(LocaleController.getString(R.string.GraceSuggestionButton));
noButton.setVisibility(View.GONE);
}
}

View file

@ -8,6 +8,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
@ -58,6 +59,9 @@ import org.telegram.ui.Components.spoilers.SpoilerEffect2;
import org.telegram.ui.PhotoViewer;
import org.telegram.ui.Stories.StoryWidgetsImageDecorator;
import org.telegram.ui.Stories.recorder.DominantColors;
import org.telegram.ui.Stories.recorder.StoryPrivacyBottomSheet;
import java.util.HashMap;
public class SharedPhotoVideoCell2 extends FrameLayout {
@ -77,6 +81,10 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
String videoText;
boolean drawVideoIcon = true;
private int privacyType;
private Bitmap privacyBitmap;
private Paint privacyPaint;
boolean drawViews;
AnimatedFloat viewsAlpha = new AnimatedFloat(this, 0, 350, CubicBezierInterpolator.EASE_OUT_QUINT);
AnimatedTextView.AnimatedTextDrawable viewsText = new AnimatedTextView.AnimatedTextDrawable(false, true, true);
@ -93,6 +101,7 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
private boolean gradientDrawableLoading;
public boolean isStory;
public boolean isStoryPinned;
static long lastUpdateDownloadSettingsTime;
static boolean lastAutoDownload;
@ -169,7 +178,7 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
if (currentMessageObject == null && messageObject == null) {
return;
}
if (currentMessageObject != null && messageObject != null && currentMessageObject.getId() == messageObject.getId() && oldParentColumsCount == parentColumnsCount) {
if (currentMessageObject != null && messageObject != null && currentMessageObject.getId() == messageObject.getId() && oldParentColumsCount == parentColumnsCount && (privacyType == 100) == isStoryPinned) {
return;
}
currentMessageObject = messageObject;
@ -186,6 +195,8 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
showVideoLayout = false;
gradientDrawableLoading = false;
gradientDrawable = null;
privacyType = -1;
privacyBitmap = null;
return;
} else {
if (attached) {
@ -303,6 +314,35 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
imageReceiver.addDecorator(new StoryWidgetsImageDecorator(messageObject.storyItem));
}
if (isStoryPinned) {
setPrivacyType(100, R.drawable.msg_pin_mini);
} else if (isStory && messageObject.storyItem != null) {
if (messageObject.storyItem.parsedPrivacy == null) {
messageObject.storyItem.parsedPrivacy = new StoryPrivacyBottomSheet.StoryPrivacy(currentAccount, messageObject.storyItem.privacy);
}
if (messageObject.storyItem.parsedPrivacy.type == StoryPrivacyBottomSheet.TYPE_CONTACTS) {
setPrivacyType(messageObject.storyItem.parsedPrivacy.type, R.drawable.msg_folders_private);
} else if (messageObject.storyItem.parsedPrivacy.type == StoryPrivacyBottomSheet.TYPE_CLOSE_FRIENDS) {
setPrivacyType(messageObject.storyItem.parsedPrivacy.type, R.drawable.msg_stories_closefriends);
} else if (messageObject.storyItem.parsedPrivacy.type == StoryPrivacyBottomSheet.TYPE_SELECTED_CONTACTS) {
setPrivacyType(messageObject.storyItem.parsedPrivacy.type, R.drawable.msg_folders_groups);
} else {
setPrivacyType(-1, 0);
}
} else {
setPrivacyType(-1, 0);
}
invalidate();
}
private void setPrivacyType(int type, int resId) {
if (privacyType == type) return;
privacyType = type;
privacyBitmap = null;
if (resId != 0) {
privacyBitmap = sharedResources.getPrivacyBitmap(getContext(), resId);
}
invalidate();
}
@ -446,6 +486,7 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
bounds.set(imageReceiver.getImageX(), imageReceiver.getImageY(), imageReceiver.getImageX2(), imageReceiver.getImageY2());
drawDuration(canvas, bounds, 1f);
drawViews(canvas, bounds, 1f);
drawPrivacy(canvas, bounds, 1f);
if (checkBoxBase != null && (style == STYLE_CACHE || checkBoxBase.getProgress() != 0)) {
canvas.save();
@ -474,12 +515,16 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
return;
}
final float fwidth = bounds.width() + dp(20) * checkBoxProgress;
final float scale = bounds.width() / fwidth;
if (alpha < 1) {
alpha = (float) Math.pow(alpha, 8);
}
canvas.save();
canvas.translate(bounds.left, bounds.top);
canvas.scale(scale, scale, 0, bounds.height());
canvas.clipRect(0, 0, bounds.width(), bounds.height());
if (currentParentColumnsCount != 9 && videoInfoLayot == null && videoText != null) {
int textWidth = (int) Math.ceil(sharedResources.textPaint.measureText(videoText));
@ -487,16 +532,9 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
} else if ((currentParentColumnsCount >= 9 || videoText == null) && videoInfoLayot != null) {
videoInfoLayot = null;
}
int width;
if (videoInfoLayot == null) {
width = dp(8);
} else {
width = dp(4) + videoInfoLayot.getWidth() + dp(4);
}
if (drawVideoIcon) {
width += dp(10);
}
canvas.translate(dp(5), dp(1) + bounds.height() - dp(17) - dp(4));
final boolean up = viewsOnLeft(fwidth);
int width = dp(8) + (videoInfoLayot != null ? videoInfoLayot.getWidth() : 0) + (drawVideoIcon ? dp(10) : 0);
canvas.translate(dp(5), dp(1) + bounds.height() - dp(17) - dp(4) - (up ? dp(17 + 5) : 0));
AndroidUtilities.rectTmp.set(0, 0, width, dp(17));
int oldAlpha = Theme.chat_timeBackgroundPaint.getAlpha();
Theme.chat_timeBackgroundPaint.setAlpha((int) (oldAlpha * alpha));
@ -529,11 +567,46 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
}
}
public boolean viewsOnLeft(float width) {
if (!isStory || currentParentColumnsCount >= 5) {
return false;
}
final int viewsWidth = dp(18 + 8) + (int) viewsText.getCurrentWidth();
final int durationWidth = showVideoLayout ? dp(8) + (videoInfoLayot != null ? videoInfoLayot.getWidth() : 0) + (drawVideoIcon ? dp(10) : 0) : 0;
final int padding = viewsWidth > 0 && durationWidth > 0 ? dp(8) : 0;
final int totalWidth = viewsWidth + padding + durationWidth;
return totalWidth > width;
}
public void drawPrivacy(Canvas canvas, RectF bounds, float alpha) {
if (!isStory || privacyBitmap == null || privacyBitmap.isRecycled()) {
return;
}
final float fwidth = bounds.width() + dp(20) * checkBoxProgress;
final float scale = bounds.width() / fwidth;
final int sz = dp(17.33f * scale);
canvas.save();
canvas.translate(bounds.right - sz - dp(5.66f), bounds.top + dp(5.66f));
if (privacyPaint == null) {
privacyPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
}
privacyPaint.setAlpha((int) (0xFF * alpha));
AndroidUtilities.rectTmp.set(0, 0, sz, sz);
canvas.drawBitmap(privacyBitmap, null, AndroidUtilities.rectTmp, privacyPaint);
canvas.restore();
}
public void drawViews(Canvas canvas, RectF bounds, float alpha) {
if (!isStory || imageReceiver != null && !imageReceiver.getVisible() || currentParentColumnsCount >= 5) {
return;
}
final float fwidth = bounds.width() + dp(20) * checkBoxProgress;
final float scale = bounds.width() / fwidth;
final boolean left = viewsOnLeft(fwidth);
float a = viewsAlpha.set(drawViews);
alpha *= a;
@ -547,11 +620,12 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
canvas.save();
canvas.translate(bounds.left, bounds.top);
canvas.scale(scale, scale, left ? 0 : bounds.width(), bounds.height());
canvas.clipRect(0, 0, bounds.width(), bounds.height());
float width = dp(18 + 8) + viewsText.getCurrentWidth();
canvas.translate(bounds.width() - dp(5) - width, dp(1) + bounds.height() - dp(17) - dp(4));
canvas.translate(left ? dp(5) : bounds.width() - dp(5) - width, dp(1) + bounds.height() - dp(17) - dp(4));
AndroidUtilities.rectTmp.set(0, 0, width, dp(17));
int oldAlpha = Theme.chat_timeBackgroundPaint.getAlpha();
Theme.chat_timeBackgroundPaint.setAlpha((int) (oldAlpha * alpha));
@ -787,6 +861,7 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
Drawable viewDrawable;
Paint highlightPaint = new Paint();
SparseArray<String> imageFilters = new SparseArray<>();
private final HashMap<Integer, Bitmap> privacyBitmaps = new HashMap<>();
public SharedResources(Context context, Theme.ResourcesProvider resourcesProvider) {
textPaint.setTextSize(dp(12));
@ -807,6 +882,39 @@ public class SharedPhotoVideoCell2 extends FrameLayout {
}
return str;
}
public void recycleAll() {
for (Bitmap bitmap : privacyBitmaps.values()) {
AndroidUtilities.recycleBitmap(bitmap);
}
privacyBitmaps.clear();
}
public Bitmap getPrivacyBitmap(Context context, int resId) {
Bitmap bitmap = privacyBitmaps.get(resId);
if (bitmap != null) {
return bitmap;
}
bitmap = BitmapFactory.decodeResource(context.getResources(), resId);
Bitmap shadowBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(shadowBitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
paint.setColorFilter(new PorterDuffColorFilter(0xFF606060, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, 0, 0, paint);
Utilities.stackBlurBitmap(shadowBitmap, dp(1));
Bitmap resultBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(resultBitmap);
canvas.drawBitmap(shadowBitmap, 0, 0, paint);
canvas.drawBitmap(shadowBitmap, 0, 0, paint);
canvas.drawBitmap(shadowBitmap, 0, 0, paint);
paint.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, 0, 0, paint);
shadowBitmap.recycle();
bitmap.recycle();
bitmap = resultBitmap;
privacyBitmaps.put(resId, bitmap);
return bitmap;
}
}
@Override

View file

@ -114,7 +114,7 @@ public class SharingLiveLocationCell extends FrameLayout {
distanceTextView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText3));
distanceTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
addView(distanceTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? padding : 73, 37, LocaleController.isRTL ? 73 : padding, 0));
addView(distanceTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? padding : 73, 33, LocaleController.isRTL ? 73 : padding, 0));
} else {
addView(avatarImageView, LayoutHelper.createFrame(42, 42, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 15, 6, LocaleController.isRTL ? 15 : 0, 0));
addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? padding : 74, 17, LocaleController.isRTL ? 74 : padding, 0));
@ -385,6 +385,9 @@ public class SharingLiveLocationCell extends FrameLayout {
}
}
private Drawable foreverDrawable;
private int foreverDrawableColor;
@Override
protected void onDraw(Canvas canvas) {
if (currentInfo == null && liveLocation == null) {
@ -399,11 +402,12 @@ public class SharingLiveLocationCell extends FrameLayout {
stopTime = liveLocation.object.date + liveLocation.object.media.period;
period = liveLocation.object.media.period;
}
boolean forever = period == 0x7FFFFFFF;
int currentTime = ConnectionsManager.getInstance(currentAccount).getCurrentTime();
if (stopTime < currentTime) {
if (stopTime < currentTime && !forever) {
return;
}
float progress = Math.abs(stopTime - currentTime) / (float) period;
float progress = forever ? 1 : Math.abs(stopTime - currentTime) / (float) period;
if (LocaleController.isRTL) {
rect.set(dp(13), dp(distanceTextView != null ? 18 : 12), dp(43), dp(distanceTextView != null ? 48 : 42));
} else {
@ -419,13 +423,32 @@ public class SharingLiveLocationCell extends FrameLayout {
Theme.chat_radialProgress2Paint.setColor(color);
Theme.chat_livePaint.setColor(color);
int a = Theme.chat_radialProgress2Paint.getAlpha();
Theme.chat_radialProgress2Paint.setAlpha((int) (.20f * a));
canvas.drawArc(rect, -90, 360, false, Theme.chat_radialProgress2Paint);
Theme.chat_radialProgress2Paint.setAlpha((int) (a));
canvas.drawArc(rect, -90, -360 * progress, false, Theme.chat_radialProgress2Paint);
Theme.chat_radialProgress2Paint.setAlpha(a);
String text = LocaleController.formatLocationLeftTime(stopTime - currentTime);
float size = Theme.chat_livePaint.measureText(text);
canvas.drawText(text, rect.centerX() - size / 2, dp(distanceTextView != null ? 37 : 31), Theme.chat_livePaint);
if (forever) {
if (foreverDrawable == null) {
foreverDrawable = getContext().getResources().getDrawable(R.drawable.filled_location_forever).mutate();
}
if (Theme.chat_livePaint.getColor() != foreverDrawableColor) {
foreverDrawable.setColorFilter(new PorterDuffColorFilter(foreverDrawableColor = Theme.chat_livePaint.getColor(), PorterDuff.Mode.SRC_IN));
}
foreverDrawable.setBounds(
(int) rect.centerX() - foreverDrawable.getIntrinsicWidth() / 2,
(int) rect.centerY() - foreverDrawable.getIntrinsicHeight() / 2,
(int) rect.centerX() + foreverDrawable.getIntrinsicWidth() / 2,
(int) rect.centerY() + foreverDrawable.getIntrinsicHeight() / 2
);
foreverDrawable.draw(canvas);
} else {
String text = LocaleController.formatLocationLeftTime(stopTime - currentTime);
float size = Theme.chat_livePaint.measureText(text);
canvas.drawText(text, rect.centerX() - size / 2, dp(distanceTextView != null ? 37 : 31), Theme.chat_livePaint);
}
}
private int getThemedColor(int key) {

View file

@ -15,6 +15,7 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.os.Build;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
@ -22,6 +23,7 @@ import android.widget.FrameLayout;
import org.checkerframework.checker.units.qual.A;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.Utilities;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ChannelMonetizationLayout;
@ -92,7 +94,7 @@ public class SlideIntChooseView extends FrameLayout {
if (options == null || whenChanged == null) {
return;
}
final int newValue = (int) (options.min + stepsCount * progress);
final int newValue = (int) Math.round(options.min + stepsCount * progress);
if (value != newValue) {
value = newValue;
AndroidUtilities.vibrateCursor(seekBarView);
@ -132,19 +134,26 @@ public class SlideIntChooseView extends FrameLayout {
public void updateTexts(int value, boolean animated) {
minText.cancelAnimation();
minText.setText(processText(options.minStringResId, options.min), animated);
int valueResId;
if (value <= options.min) {
valueResId = options.valueMinStringResId;
} else if (value < options.max) {
valueResId = options.valueStringResId;
} else {
valueResId = options.valueMaxStringResId;
}
valueText.cancelAnimation();
valueText.setText(processText(valueResId, value), animated);
maxText.cancelAnimation();
maxText.setText(processText(options.maxStringResId, options.max), animated);
if (!TextUtils.isEmpty(options.resId)) {
valueText.cancelAnimation();
valueText.setText(LocaleController.formatPluralString(options.resId, value), animated);
minText.setText("" + options.min, animated);
maxText.setText("" + options.max, animated);
} else {
int valueResId;
if (value <= options.min) {
valueResId = options.valueMinStringResId;
} else if (value < options.max) {
valueResId = options.valueStringResId;
} else {
valueResId = options.valueMaxStringResId;
}
valueText.cancelAnimation();
valueText.setText(processText(valueResId, value), animated);
minText.setText(processText(options.minStringResId, options.min), animated);
maxText.setText(processText(options.maxStringResId, options.max), animated);
}
maxText.setTextColor(Theme.getColor(value >= options.max ? Theme.key_windowBackgroundWhiteValueText : Theme.key_windowBackgroundWhiteGrayText, resourcesProvider), animated);
setMaxTextEmojiSaturation(value >= options.max ? 1f : 0f, animated);
}
@ -223,6 +232,8 @@ public class SlideIntChooseView extends FrameLayout {
public int min;
public int max;
public String resId;
public int minStringResId;
public int valueMinStringResId, valueStringResId, valueMaxStringResId;
public int maxStringResId;
@ -244,5 +255,17 @@ public class SlideIntChooseView extends FrameLayout {
o.maxStringResId = maxStringResId;
return o;
}
public static Options make(
int style,
String resId, int min, int max
) {
Options o = new Options();
o.style = style;
o.min = min;
o.resId = resId;
o.max = max;
return o;
}
}
}

View file

@ -35,6 +35,7 @@ import org.telegram.ui.ActionBar.ThemeDescription;
import org.telegram.ui.Components.ColorSpanUnderline;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RecyclerListView;
import org.telegram.ui.Components.ScaleStateListAnimator;
import java.util.List;
@ -90,21 +91,22 @@ public class StickerSetNameCell extends FrameLayout {
lp = LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, emoji ? 5 : 15, 5, emoji ? 15 : 25, 0);
}
addView(layout, lp);
layout.addView(textView);
layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 1, Gravity.CENTER_VERTICAL));
editView = new TextView(context);
editView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName));
editView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11);
editView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
editView.setEllipsize(TextUtils.TruncateAt.END);
editView.setPadding(dp(6.33f), 0, dp(6.33f), 0);
editView.setPadding(dp(6), 0, dp(6.33f), 0);
editView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(9),
Theme.multAlpha(getThemedColor(Theme.key_chat_emojiPanelStickerSetName), .10f),
Theme.multAlpha(getThemedColor(Theme.key_chat_emojiPanelStickerSetName), .24f)
));
editView.setGravity(Gravity.CENTER);
editView.setSingleLine(true);
layout.addView(editView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 5.33f, .66f, 0, 0));
ScaleStateListAnimator.apply(editView);
layout.addView(editView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, Gravity.CENTER_VERTICAL, 5, 1, 0, 0));
editView.setVisibility(View.GONE);
urlTextView = new TextView(context);
@ -200,6 +202,10 @@ public class StickerSetNameCell extends FrameLayout {
editView.setOnClickListener(whenClickedEdit);
}
public void setHeaderOnClick(View.OnClickListener listener) {
textView.setOnClickListener(listener);
}
private void updateTextSearchSpan() {
if (stickerSetName != null && stickerSetNameSearchLength > 0) {
SpannableStringBuilder builder = new SpannableStringBuilder(stickerSetName);

View file

@ -13,7 +13,9 @@ import static org.telegram.messenger.AndroidUtilities.dp;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
@ -25,7 +27,12 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.ImageReceiver;
import org.telegram.messenger.LocaleController;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.SimpleTextView;
@ -49,7 +56,7 @@ public class TextCell extends FrameLayout {
public final RLottieImageView imageView;
private Switch checkBox;
private ImageView valueImageView;
private int leftPadding;
public int leftPadding;
private boolean needDivider;
public int offsetFromImage = 71;
public int heightDp = 50;
@ -644,6 +651,25 @@ public class TextCell extends FrameLayout {
setValueSticker(document);
}
public void setTextAndSticker(CharSequence text, String localPath, boolean divider) {
imageLeft = 21;
offsetFromImage = getOffsetFromImage(false);
textView.setText(text);
textView.setRightDrawable(null);
valueTextView.setText(valueText = null, false);
valueImageView.setVisibility(GONE);
valueTextView.setVisibility(GONE);
valueSpoilersTextView.setVisibility(GONE);
imageView.setVisibility(GONE);
imageView.setPadding(0, dp(7), 0, 0);
needDivider = divider;
setWillNotDraw(!needDivider);
if (checkBox != null) {
checkBox.setVisibility(GONE);
}
setValueSticker(localPath);
}
public void setValueSticker(TLRPC.Document document) {
if (emojiDrawable == null) {
emojiDrawable = new AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable(this, dp(30));
@ -655,6 +681,64 @@ public class TextCell extends FrameLayout {
invalidate();
}
public void setValueSticker(String path) {
if (emojiDrawable == null) {
emojiDrawable = new AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable(this, dp(30));
if (attached) {
emojiDrawable.attach();
}
}
ImageReceiver imageReceiver = new ImageReceiver(this);
if (isAttachedToWindow()) {
imageReceiver.onAttachedToWindow();
}
addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(@NonNull View v) {
imageReceiver.onAttachedToWindow();
}
@Override
public void onViewDetachedFromWindow(@NonNull View v) {
imageReceiver.onDetachedFromWindow();
}
});
imageReceiver.setImage(path, "30_30", null, null, 0);
emojiDrawable.set(new Drawable() {
@Override
public void draw(@NonNull Canvas canvas) {
imageReceiver.setImageCoords(getBounds());
imageReceiver.draw(canvas);
}
@Override
public void setAlpha(int alpha) {
imageReceiver.setAlpha(alpha / (float) 0xFF);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
imageReceiver.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSPARENT;
}
@Override
public int getIntrinsicWidth() {
return dp(30);
}
@Override
public int getIntrinsicHeight() {
return dp(30);
}
}, true);
invalidate();
}
protected int getOffsetFromImage(boolean colourful) {
return colourful ? 65 : 71;
}

View file

@ -33,6 +33,7 @@ import org.telegram.ui.Components.Switch;
public class TextCheckCell2 extends FrameLayout {
public int id;
private TextView textView;
private TextView valueTextView;
private Switch checkBox;

View file

@ -33,7 +33,6 @@ public class TextColorCell extends FrameLayout {
private TextView textView;
private boolean needDivider;
private int currentColor;
private float alpha = 1.0f;
private static Paint colorPaint;
@ -62,19 +61,6 @@ public class TextColorCell extends FrameLayout {
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 21, 0, 21, 0));
}
@Keep
@Override
public void setAlpha(float value) {
alpha = value;
invalidate();
}
@Keep
@Override
public float getAlpha() {
return alpha;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY));
@ -106,7 +92,6 @@ public class TextColorCell extends FrameLayout {
}
if (currentColor != 0) {
colorPaint.setColor(currentColor);
colorPaint.setAlpha((int) (255 * alpha));
canvas.drawCircle(LocaleController.isRTL ? AndroidUtilities.dp(33) : getMeasuredWidth() - AndroidUtilities.dp(33), getMeasuredHeight() / 2, AndroidUtilities.dp(10), colorPaint);
}
}

View file

@ -738,7 +738,7 @@ public class UserCell extends FrameLayout implements NotificationCenter.Notifica
}
}
public void setCloseIcon(Runnable onClick) {
public void setCloseIcon(View.OnClickListener onClick) {
if (onClick == null) {
if (closeView != null) {
removeView(closeView);
@ -754,7 +754,7 @@ public class UserCell extends FrameLayout implements NotificationCenter.Notifica
closeView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector, resourcesProvider), Theme.RIPPLE_MASK_CIRCLE_AUTO));
addView(closeView, LayoutHelper.createFrame(30, 30, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? 14 : 0, 0, LocaleController.isRTL ? 0 : 14, 0));
}
closeView.setOnClickListener(v -> onClick.run());
closeView.setOnClickListener(onClick);
}
}
}

View file

@ -17,8 +17,10 @@ import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
@ -39,6 +41,7 @@ import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
@ -50,16 +53,21 @@ import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.ChatObject;
import org.telegram.messenger.ChatThemeController;
import org.telegram.messenger.DialogObject;
import org.telegram.messenger.DocumentObject;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.ImageReceiver;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.messenger.SvgHelper;
import org.telegram.messenger.Utilities;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.ResultCallback;
import org.telegram.tgnet.TLObject;
import org.telegram.tgnet.TLRPC;
import org.telegram.tgnet.tl.TL_stories;
import org.telegram.ui.ActionBar.ActionBar;
@ -378,6 +386,13 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL, 0, 0, 0, 68));
listView.setOnItemClickListener((view, position) -> {
if (view instanceof EmojiCell) {
if (position == packStickerRow) {
if (chatFull == null) return;
GroupStickersActivity fragment = new GroupStickersActivity(-dialogId);
fragment.setInfo(chatFull);
presentFragment(fragment);
return;
}
long selectedEmojiId = 0;
if (position == replyEmojiRow) {
selectedEmojiId = selectedReplyEmoji;
@ -878,6 +893,9 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
protected int packEmojiRow;
protected int packEmojiHintRow;
protected int packStickerRow;
protected int packStickerHintRow;
protected void updateRows() {
rowsCount = 0;
messagesPreviewRow = rowsCount++;
@ -926,6 +944,14 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
return 0;
}
protected int getStickerPackStrRes() {
return 0;
}
protected int getStickerPackInfoStrRes() {
return 0;
}
protected int getEmojiStatusInfoStrRes() {
return R.string.ChannelEmojiStatusInfo;
}
@ -1097,6 +1123,15 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
} else {
emojiCell.setEmoji(0, false);
}
} else if (position == packStickerRow) {
emojiCell.setText(LocaleController.getString(getStickerPackStrRes()));
emojiCell.setLockLevel(0);
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(-dialogId);
if (chatFull != null && chatFull.stickerset != null) {
emojiCell.setEmoji(getEmojiSetThumb(chatFull.stickerset), false);
} else {
emojiCell.setEmoji(0, false);
}
}
break;
case VIEW_TYPE_SHADOW:
@ -1112,6 +1147,8 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
infoCell.setText(LocaleController.getString(getEmojiStatusInfoStrRes()));
} else if (position == packEmojiHintRow) {
infoCell.setText(LocaleController.getString(getEmojiPackInfoStrRes()));
} else if (position == packStickerHintRow) {
infoCell.setText(LocaleController.getString(getStickerPackInfoStrRes()));
} else if (position == removeProfileColorShadowRow) {
infoCell.setText("");
infoCell.setFixedSize(12);
@ -1165,7 +1202,7 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
return VIEW_TYPE_COLOR_REPLY_GRID;
} else if (position == profileColorGridRow) {
return VIEW_TYPE_COLOR_PROFILE_GRID;
} else if (position == replyEmojiRow || position == profileEmojiRow || position == statusEmojiRow || position == packEmojiRow) {
} else if (position == replyEmojiRow || position == profileEmojiRow || position == statusEmojiRow || position == packEmojiRow || position == packStickerRow) {
return VIEW_TYPE_BUTTON_EMOJI;
} else if (position == wallpaperRow || position == removeProfileColorRow) {
return VIEW_TYPE_BUTTON;
@ -1230,6 +1267,7 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
View emojiPicker = findChildAt(profileEmojiRow);
View emojiStatusPicker = findChildAt(statusEmojiRow);
View packEmojiPicker = findChildAt(packEmojiRow);
View packStatusPicker = findChildAt(packStickerRow);
if (profilePreview instanceof ProfilePreview) {
((ProfilePreview) profilePreview).setColor(selectedProfileColor, animated);
@ -1259,6 +1297,14 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
((EmojiCell) packEmojiPicker).setEmoji(0, false);
}
}
if (packStatusPicker instanceof EmojiCell) {
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(-dialogId);
if (chatFull != null && chatFull.stickerset != null) {
((EmojiCell) packStatusPicker).setEmoji(getEmojiSetThumb(chatFull.stickerset), false);
} else {
((EmojiCell) packStatusPicker).setEmoji(0, false);
}
}
updateRows();
}
@ -1277,6 +1323,20 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
return thumbDocumentId;
}
private TLRPC.Document getEmojiSetThumb(TLRPC.StickerSet emojiSet) {
if (emojiSet == null) {
return null;
}
long thumbDocumentId = emojiSet.thumb_document_id;
if (thumbDocumentId == 0) {
TLRPC.TL_messages_stickerSet stickerSet = getMediaDataController().getGroupStickerSetById(emojiSet);
if (!stickerSet.documents.isEmpty()) {
return stickerSet.documents.get(0);
}
}
return null;
}
public View findChildAt(int position) {
for (int i = 0; i < listView.getChildCount(); ++i) {
View child = listView.getChildAt(i);
@ -1439,6 +1499,18 @@ public class ChannelColorActivity extends BaseFragment implements NotificationCe
}
}
public void setEmoji(TLRPC.Document document, boolean animated) {
if (document == null) {
imageDrawable.set((Drawable) null, animated);
if (offText == null) {
offText = new Text(LocaleController.getString(R.string.ChannelReplyIconOff), 16);
}
} else {
imageDrawable.set(document, animated);
offText = null;
}
}
public void updateColors() {
textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider));
}

View file

@ -92,6 +92,8 @@ import java.util.Locale;
public class ChannelMonetizationLayout extends FrameLayout {
public static ChannelMonetizationLayout instance;
private final BaseFragment fragment;
private final Theme.ResourcesProvider resourcesProvider;
private final int currentAccount;
@ -144,7 +146,7 @@ public class ChannelMonetizationLayout extends FrameLayout {
showLearnSheet();
}, resourcesProvider), true);
balanceInfo = AndroidUtilities.replaceArrows(AndroidUtilities.replaceSingleTag(getString(MessagesController.getInstance(currentAccount).channelRevenueWithdrawalEnabled ? R.string.MonetizationBalanceInfo : R.string.MonetizationBalanceInfoNotAvailable), -1, REPLACING_TAG_TYPE_LINK_NBSP, () -> {
showLearnSheet();
Browser.openUrl(getContext(), getString(R.string.MonetizationBalanceInfoLink));
}), true);
setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray, resourcesProvider));
@ -383,6 +385,7 @@ public class ChannelMonetizationLayout extends FrameLayout {
balanceSubtitle.setText("~" + BillingController.getInstance().formatCurrency(amount, "USD"));
}
private double usd_rate;
private void initLevel() {
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
if (chat != null) {
@ -427,23 +430,8 @@ public class ChannelMonetizationLayout extends FrameLayout {
impressionsChart.useHourFormat = true;
}
availableValue.crypto_amount = stats.available_balance;
availableValue.amount = (long) (availableValue.crypto_amount / 1_000_000_000.0 * stats.usd_rate * 100.0);
setBalance(availableValue.crypto_amount, availableValue.amount);
availableValue.currency = "USD";
lastWithdrawalValue.crypto_amount = stats.current_balance;
lastWithdrawalValue.amount = (long) (lastWithdrawalValue.crypto_amount / 1_000_000_000.0 * stats.usd_rate * 100.0);
lastWithdrawalValue.currency = "USD";
lifetimeValue.crypto_amount = stats.overall_revenue;
lifetimeValue.amount = (long) (lifetimeValue.crypto_amount / 1_000_000_000.0 * stats.usd_rate * 100.0);
lifetimeValue.currency = "USD";
proceedsAvailable = true;
balanceButton.setVisibility(stats.available_balance > 0 || BuildVars.DEBUG_PRIVATE_VERSION ? View.VISIBLE : View.GONE);
if (listView != null && listView.adapter != null) {
listView.adapter.update(true);
}
usd_rate = stats.usd_rate;
setupBalances(stats.balances);
progress.animate().alpha(0).setDuration(380).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).withEndAction(() -> {
progress.setVisibility(View.GONE);
@ -453,13 +441,41 @@ public class ChannelMonetizationLayout extends FrameLayout {
}
}), null, null, 0, stats_dc, ConnectionsManager.ConnectionTypeGeneric, true);
}
public void setupBalances(TLRPC.TL_broadcastRevenueBalances balances) {
if (usd_rate == 0) {
return;
}
availableValue.crypto_amount = balances.available_balance;
availableValue.amount = (long) (availableValue.crypto_amount / 1_000_000_000.0 * usd_rate * 100.0);
setBalance(availableValue.crypto_amount, availableValue.amount);
availableValue.currency = "USD";
lastWithdrawalValue.crypto_amount = balances.current_balance;
lastWithdrawalValue.amount = (long) (lastWithdrawalValue.crypto_amount / 1_000_000_000.0 * usd_rate * 100.0);
lastWithdrawalValue.currency = "USD";
lifetimeValue.crypto_amount = balances.overall_revenue;
lifetimeValue.amount = (long) (lifetimeValue.crypto_amount / 1_000_000_000.0 * usd_rate * 100.0);
lifetimeValue.currency = "USD";
proceedsAvailable = true;
balanceButton.setVisibility(balances.available_balance > 0 || BuildVars.DEBUG_PRIVATE_VERSION ? View.VISIBLE : View.GONE);
if (listView != null && listView.adapter != null) {
listView.adapter.update(true);
}
}
@Override
protected void onAttachedToWindow() {
instance = this;
super.onAttachedToWindow();
checkLearnSheet();
}
@Override
protected void onDetachedFromWindow() {
instance = null;
super.onDetachedFromWindow();
}
private void checkLearnSheet() {
if (isAttachedToWindow() && proceedsAvailable && MessagesController.getGlobalMainSettings().getBoolean("monetizationadshint", true)) {
showLearnSheet();
@ -553,14 +569,22 @@ public class ChannelMonetizationLayout extends FrameLayout {
}
}
public void reloadTransactions() {
if (loadingTransactions) return;
transactions.clear();
transactionsTotalCount = 0;
loadingTransactions = false;
loadTransactions();
}
private boolean loadingTransactions = false;
private void loadTransactions() {
if (loadingTransactions) return;
if (transactions.size() >= transactionsTotalCount && transactionsTotalCount != 0) return;
// TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
// if (chat == null || !chat.creator) {
// return;
// }
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
if (chat == null || !chat.creator) {
return;
}
loadingTransactions = true;
TL_stats.TL_getBroadcastRevenueTransactions req = new TL_stats.TL_getBroadcastRevenueTransactions();
@ -620,7 +644,7 @@ public class ChannelMonetizationLayout extends FrameLayout {
if (ChannelMonetizationLayout.tonString == null) {
ChannelMonetizationLayout.tonString = new HashMap<>();
}
final int key = textPaint.getFontMetricsInt().bottom * (large ? 1 : -1) * (int) (100 * scale);
final int key = textPaint.getFontMetricsInt().bottom * (large ? 1 : -1) * (int) (100 * scale) - (int) (100 * translateY);
SpannableString tonString = ChannelMonetizationLayout.tonString.get(key);
if (tonString == null) {
tonString = new SpannableString("T");
@ -807,13 +831,13 @@ public class ChannelMonetizationLayout extends FrameLayout {
SpannableStringBuilder value = new SpannableStringBuilder();
value.append(type < 0 ? "-" : "+");
value.append("TON ");
value.append(formatter.format((Math.abs(amount) / 1_000_000_000.0)));
value.append(" TON");
int index = TextUtils.indexOf(value, ".");
if (index >= 0) {
value.setSpan(new RelativeSizeSpan(1.15f), 0, index + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
valueText.setText(value);
valueText.setText(replaceTON(value, valueText.getPaint(), 1.1f, dp(.33f), false));
valueText.setTextColor(Theme.getColor(type < 0 ? Theme.key_text_RedBold : Theme.key_avatar_nameInMessageGreen, resourcesProvider));
setWillNotDraw(!(needDivider = divider));

View file

@ -158,6 +158,7 @@ import org.telegram.messenger.MessagesController;
import org.telegram.messenger.MessagesStorage;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.NotificationsController;
import org.telegram.messenger.PushListenerController;
import org.telegram.messenger.R;
import org.telegram.messenger.SecretChatHelper;
import org.telegram.messenger.SendMessagesHelper;
@ -261,6 +262,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@ -905,6 +907,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private boolean openImport;
public float chatListViewPaddingTop;
public float paddingTopHeight;
public int chatListViewPaddingVisibleOffset;
private int contentPaddingTop;
@ -1023,8 +1026,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
NotificationCenter.pinnedInfoDidLoad,
NotificationCenter.didSetNewWallpapper,
NotificationCenter.savedMessagesDialogsUpdate,
NotificationCenter.didApplyNewTheme,
NotificationCenter.messageReceivedByServer
NotificationCenter.didApplyNewTheme
// NotificationCenter.messageReceivedByServer
};
private final DialogInterface.OnCancelListener postponedScrollCancelListener = dialog -> {
@ -4501,7 +4504,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
c.translate(0, getMeasuredHeight() - blurredViewBottomOffset - transitionOffset);
if (pullingDownDrawable == null) {
pullingDownDrawable = new ChatPullingDownDrawable(currentAccount, fragmentView, dialog_id, dialogFolderId, dialogFilterId, themeDelegate);
pullingDownDrawable = new ChatPullingDownDrawable(currentAccount, fragmentView, dialog_id, dialogFolderId, dialogFilterId, getTopicId(), themeDelegate);
if (nextChannels != null && !nextChannels.isEmpty()) {
pullingDownDrawable.updateDialog(nextChannels.get(0));
} else if (isTopic) {
pullingDownDrawable.updateTopic();
} else {
pullingDownDrawable.updateDialog();
}
pullingDownDrawable.onAttach();
}
pullingDownDrawable.setWidth(getMeasuredWidth());
@ -5532,6 +5542,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
chatListView.setAnimateEmptyView(true, RecyclerListView.EMPTY_VIEW_ANIMATION_TYPE_ALPHA_SCALE);
chatListView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
chatListViewPaddingTop = 0;
paddingTopHeight = 0;
invalidateChatListViewTopPadding();
if (MessagesController.getGlobalMainSettings().getBoolean("view_animations", true)) {
chatListItemAnimator = new ChatListItemAnimator(this, chatListView, themeDelegate) {
@ -5762,9 +5773,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (!foundTopView) {
scrolled = super.scrollVerticallyBy(dy, recycler, state);
}
if (dy > 0 && scrolled == 0 && ChatObject.isChannel(currentChat) && chatMode != MODE_SAVED && !currentChat.megagroup && chatListView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING && !chatListView.isFastScrollAnimationRunning() && !chatListView.isMultiselect() && reportType < 0) {
if (dy > 0 && scrolled == 0 && (ChatObject.isChannel(currentChat) && !currentChat.megagroup || isTopic) && chatMode != MODE_SAVED && chatListView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING && !chatListView.isFastScrollAnimationRunning() && !chatListView.isMultiselect() && reportType < 0) {
if (pullingDownOffset == 0 && pullingDownDrawable != null) {
pullingDownDrawable.updateDialog();
if (nextChannels != null && !nextChannels.isEmpty()) {
pullingDownDrawable.updateDialog(nextChannels.get(0));
} else if (isTopic) {
pullingDownDrawable.updateTopic();
} else {
pullingDownDrawable.updateDialog();
}
}
if (pullingDownBackAnimator != null) {
pullingDownBackAnimator.removeAllListeners();
@ -9040,7 +9057,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
tagSelector.setVisibility(View.VISIBLE);
tagSelector.setHint(LocaleController.getString(tagSelector.getSelectedReactions().isEmpty() ? R.string.SavedTagReactionsSelectedAddHint : R.string.SavedTagReactionsSelectedEditHint));
contentView.addView(tagSelector, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 92.5f, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 0, 0, 0));
tagSelector.setMessage(null, null);
tagSelector.setMessage(null, null, true);
tagSelector.setTranslationY(-dp(12));
tagSelector.setScaleY(.4f);
tagSelector.setScaleX(.4f);
@ -9686,25 +9703,42 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (pullingDownDrawable == null) {
return;
}
// if (getParentLayout().fragmentsStack.size() > 1) {
// BaseFragment previousFragment = getParentLayout().fragmentsStack.get(getParentLayout().fragmentsStack.size() - 2);
// if (previousFragment instanceof ChatActivity) {
// getParentLayout().fragmentsStack.remove(getParentLayout().fragmentsStack.size() - 2);
// }
// }
addToPulledDialogsMyself();
addToPulledDialogs(pullingDownDrawable.nextChat, pullingDownDrawable.nextDialogId, pullingDownDrawable.dialogFolderId, pullingDownDrawable.dialogFilterId);
Bundle bundle = new Bundle();
bundle.putLong("chat_id", pullingDownDrawable.getChatId());
bundle.putInt("dialog_folder_id", pullingDownDrawable.dialogFolderId);
bundle.putInt("dialog_filter_id", pullingDownDrawable.dialogFilterId);
bundle.putBoolean("pulled", true);
SharedPreferences sharedPreferences = MessagesController.getNotificationsSettings(currentAccount);
sharedPreferences.edit().remove("diditem" + pullingDownDrawable.nextDialogId).apply();
ChatActivity chatActivity = new ChatActivity(bundle);
chatActivity.setPullingDownTransition(true);
replacingChatActivity = true;
presentFragment(chatActivity, true);
if (isTopic) {
if (pullingDownDrawable.getTopic() != null) {
addToPulledTopicsMyself();
addToPulledDialogs(currentChat, pullingDownDrawable.nextTopic, dialog_id, dialogFolderId, dialogFilterId);
Bundle bundle = new Bundle();
bundle.putInt("dialog_folder_id", pullingDownDrawable.dialogFolderId);
bundle.putInt("dialog_filter_id", pullingDownDrawable.dialogFilterId);
bundle.putBoolean("pulled", true);
ChatActivity chatActivity = ForumUtilities.getChatActivityForTopic(ChatActivity.this, -dialog_id, pullingDownDrawable.getTopic(), 0, bundle);
chatActivity.setPullingDownTransition(true);
replacingChatActivity = true;
presentFragment(chatActivity, true);
}
} else {
addToPulledDialogsMyself();
addToPulledDialogs(pullingDownDrawable.nextChat, null, pullingDownDrawable.nextDialogId, pullingDownDrawable.dialogFolderId, pullingDownDrawable.dialogFilterId);
Bundle bundle = new Bundle();
bundle.putLong("chat_id", pullingDownDrawable.getChatId());
bundle.putInt("dialog_folder_id", pullingDownDrawable.dialogFolderId);
bundle.putInt("dialog_filter_id", pullingDownDrawable.dialogFilterId);
bundle.putBoolean("pulled", true);
SharedPreferences sharedPreferences = MessagesController.getNotificationsSettings(currentAccount);
sharedPreferences.edit().remove("diditem" + pullingDownDrawable.nextDialogId).apply();
ChatActivity chatActivity = new ChatActivity(bundle);
if (nextChannels != null && nextChannels.size() > 1) {
chatActivity.setNextChannels(new ArrayList<>(nextChannels.subList(1, nextChannels.size())));
}
chatActivity.setPullingDownTransition(true);
replacingChatActivity = true;
presentFragment(chatActivity, true);
}
}
private ArrayList<TLRPC.Chat> nextChannels;
public void setNextChannels(ArrayList<TLRPC.Chat> channels) {
nextChannels = channels;
}
private void addToPulledDialogsMyself() {
@ -9712,14 +9746,22 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
return;
}
int stackIndex = getParentLayout().getFragmentStack().indexOf(this);
BackButtonMenu.addToPulledDialogs(this, stackIndex, currentChat, currentUser, dialog_id, dialogFilterId, dialogFolderId);
BackButtonMenu.addToPulledDialogs(this, stackIndex, currentChat, currentUser, null, dialog_id, dialogFilterId, dialogFolderId);
}
private void addToPulledDialogs(TLRPC.Chat chat, long dialogId, int folderId, int filterId) {
private void addToPulledDialogs(TLRPC.Chat chat, TLRPC.TL_forumTopic topic, long dialogId, int folderId, int filterId) {
if (getParentLayout() == null) {
return;
}
int stackIndex = getParentLayout().getFragmentStack().indexOf(this);
BackButtonMenu.addToPulledDialogs(this, stackIndex, chat, null, dialogId, folderId, filterId);
BackButtonMenu.addToPulledDialogs(this, stackIndex, chat, null, topic, dialogId, folderId, filterId);
}
private void addToPulledTopicsMyself() {
if (getParentLayout() == null) {
return;
}
int stackIndex = getParentLayout().getFragmentStack().indexOf(this);
BackButtonMenu.addToPulledDialogs(this, stackIndex, currentChat, currentUser, forumTopic, dialog_id, dialogFilterId, dialogFolderId);
}
private void setPullingDownTransition(boolean fromPullingDownTransition) {
@ -10478,7 +10520,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
pendingViewH = Math.max(0, pendingRequestsView.getHeight() + pendingRequestsDelegate.getViewEnterOffset() - AndroidUtilities.dp(4));
}
float oldPadding = chatListViewPaddingTop;
chatListViewPaddingTop = AndroidUtilities.dp(4) + contentPaddingTop + topPanelViewH + pinnedViewH + pendingViewH;
chatListViewPaddingTop = AndroidUtilities.dp(4) + contentPaddingTop + (paddingTopHeight = topPanelViewH + pinnedViewH + pendingViewH);
chatListViewPaddingTop += blurredViewTopOffset;
chatListViewPaddingVisibleOffset = 0;
chatListViewPaddingTop += contentPanTranslation + bottomPanelTranslationY;
@ -12031,7 +12073,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
chatAttachAlert.setMaxSelectedPhotos(1, false);
chatAttachAlert.setOpenWithFrontFaceCamera(true);
chatAttachAlert.enableStickerMode();
chatAttachAlert.enableStickerMode(null);
chatAttachAlert.init();
chatAttachAlert.parentThemeDelegate = themeDelegate;
if (visibleDialog != null) {
@ -15515,12 +15557,18 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
MessageObject.SendAnimationData data = cell.getMessageObject().sendAnimationData;
if (data != null) {
canvas.save();
final int actionBarBottom = actionBar.getVisibility() == VISIBLE ? (int) actionBar.getTranslationY() + actionBar.getMeasuredHeight() + (actionBarSearchTags != null ? actionBarSearchTags.getCurrentHeight() : 0) + (inPreviewMode && Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0) : 0;
canvas.clipRect(0, actionBarBottom + paddingTopHeight, getWidth(), getHeight());
ImageReceiver imageReceiver = cell.getPhotoImage();
canvas.translate(data.currentX, data.currentY);
cell.getLocationInWindow(AndroidUtilities.pointTmp2);
int finalY = AndroidUtilities.pointTmp2[1];
finalY -= cell.getTranslationY() * (1.0f - data.progress);
finalY += chatActivityEnterView.topViewVisible() * AndroidUtilities.dp(48);
canvas.translate(data.currentX, AndroidUtilities.lerp(data.y, finalY + imageReceiver.getCenterY(), data.progress));
canvas.scale(data.currentScale, data.currentScale);
canvas.translate(-imageReceiver.getCenterX(), -imageReceiver.getCenterY());
cell.setTimeAlpha(data.timeAlpha);
animateSendingViews.get(a).draw(canvas);
cell.draw(canvas);
canvas.restore();
}
}
@ -18989,11 +19037,32 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID();
inputStickerSet.access_hash = set.access_hash;
inputStickerSet.id = set.id;
final boolean replacing = args.length > 4 ? (boolean) args[4] : false;
if (visibleDialog instanceof StickersAlert) {
StickersAlert existingAlert = (StickersAlert) visibleDialog;
if (existingAlert.stickerSet != null && existingAlert.stickerSet.set != null && existingAlert.stickerSet.set.id == set.id) {
existingAlert.updateStickerSet(((TLRPC.TL_messages_stickerSet) args[1]));
if (args.length > 2 && args[2] instanceof TLRPC.Document) {
TLRPC.Document stickerDocument = (TLRPC.Document) args[2];
if (args.length > 3 && args[3] instanceof String) {
stickerDocument.localThumbPath = (String) args[3];
}
BulletinFactory.of(existingAlert.container, resourceProvider).createEmojiBulletin(stickerDocument, LocaleController.formatString(replacing ? R.string.StickersStickerEditedInSetToast : R.string.StickersStickerAddedToSetToast, set.title)).setDuration(Bulletin.DURATION_LONG).show(true);
}
return;
}
}
StickersAlert alert = new StickersAlert(getParentActivity(), ChatActivity.this, inputStickerSet, null, chatActivityEnterView, themeDelegate);
alert.setOnShowListener(dialog -> {
if (args.length > 2 && args[2] instanceof TLRPC.Document) {
TLRPC.Document stickerDocument = (TLRPC.Document) args[2];
BulletinFactory.of((FrameLayout) alert.getContainerView(), resourceProvider).createEmojiBulletin(stickerDocument, LocaleController.formatString(R.string.StickersStickerAddedToSetToast, set.title)).setDuration(Bulletin.DURATION_LONG).show();
if (args.length > 3 && args[3] instanceof String) {
stickerDocument.localThumbPath = (String) args[3];
}
BulletinFactory.of(alert.container, resourceProvider).createEmojiBulletin(stickerDocument, LocaleController.formatString(replacing ? R.string.StickersStickerEditedInSetToast : R.string.StickersStickerAddedToSetToast, set.title)).setDuration(Bulletin.DURATION_LONG).show(true);
}
});
showDialog(alert);
@ -19495,7 +19564,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
getMediaDataController().loadReplyMessagesForMessages(messArr, dialog_id, chatMode, 0, null, classGuid);
}
if (chatAdapter != null) {
chatAdapter.updateRowWithMessageObject(obj, false, false);
ChatMessageCell cell = null;
for (int i = 0; i < chatListView.getChildCount(); ++i) {
View child = chatListView.getChildAt(i);
if (child instanceof ChatMessageCell && ((ChatMessageCell) child).getMessageObject() == obj) {
cell = (ChatMessageCell) child;
break;
}
}
chatAdapter.updateRowWithMessageObject(obj, animateSendingViews.contains(cell), false);
}
if (chatLayoutManager != null) {
if (mediaUpdated && chatLayoutManager.findFirstVisibleItemPosition() == 0) {
@ -21563,8 +21640,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private int sponsoredMessagesPostsBetween;
private boolean sponsoredMessagesAdded;
private Pattern sponsoredUrlPattern;
private void addSponsoredMessages(boolean animated) {
if (sponsoredMessagesAdded || chatMode != 0 || !ChatObject.isChannel(currentChat) || !forwardEndReached[0] || getUserConfig().isPremium()) {
if (sponsoredMessagesAdded || chatMode != 0 || !ChatObject.isChannel(currentChat) || !forwardEndReached[0] || getUserConfig().isPremium() && getMessagesController().isSponsoredDisabled()) {
return;
}
MessagesController.SponsoredMessagesInfo res = getMessagesController().getSponsoredMessages(dialog_id);
@ -21574,12 +21652,36 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
for (int i = 0; i < res.messages.size(); i++) {
MessageObject messageObject = res.messages.get(i);
messageObject.resetLayout();
long dialogId = MessageObject.getPeerId(messageObject.messageOwner.from_id);
int messageId = 0;
if (messageObject.sponsoredChannelPost != 0) {
messageId = messageObject.sponsoredChannelPost;
if (messageObject.sponsoredUrl != null) {
try {
if (sponsoredUrlPattern == null) {
sponsoredUrlPattern = Pattern.compile("https://t\\.me/(\\w+)(?:/(\\d+))?");
}
Matcher matcher = sponsoredUrlPattern.matcher(messageObject.sponsoredUrl);
if (matcher.matches()) {
String username = matcher.group(1);
int postId = 0;
try {
postId = matcher.groupCount() >= 2 ? Integer.parseInt(matcher.group(2)) : 0;
} catch (Exception e2) {
FileLog.e(e2);
}
TLObject obj = getMessagesController().getUserOrChat(username);
long did;
if (obj instanceof TLRPC.User) {
did = ((TLRPC.User) obj).id;
} else if (obj instanceof TLRPC.Chat) {
did = -((TLRPC.Chat) obj).id;
} else {
continue;
}
if (postId < 0) continue;
getMessagesController().ensureMessagesLoaded(did, postId, null);
}
} catch (Exception e) {
FileLog.e(e);
}
}
getMessagesController().ensureMessagesLoaded(dialogId, messageId, null);
}
sponsoredMessagesAdded = true;
sponsoredMessagesPostsBetween = res.posts_between != null ? res.posts_between : 0;
@ -22791,7 +22893,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (editingMessageObject == obj) {
hideFieldPanel(true);
}
int index = chatAdapter.isFiltered && filteredMessagesDict != null ? chatAdapter.filteredMessages.indexOf(filteredMessagesDict.get(mid)) : messages.indexOf(obj);
int index = chatAdapter != null && chatAdapter.isFiltered && filteredMessagesDict != null ? chatAdapter.filteredMessages.indexOf(filteredMessagesDict.get(mid)) : messages.indexOf(obj);
if (index != -1) {
if (obj.scheduled) {
scheduledMessagesCount--;
@ -22801,7 +22903,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
updatedSelected = true;
addToSelectedMessages(obj, false, updatedSelectedLast = (a == size - 1));
}
MessageObject removed = chatAdapter.getMessages().remove(index);
MessageObject removed = chatAdapter != null && chatAdapter.isFiltered && filteredMessagesDict != null ? chatAdapter.filteredMessages.remove(index) : messages.remove(index);
if (chatAdapter != null) {
if (chatAdapter.isFiltered) {
int mindex = messages.indexOf(obj);
@ -22862,7 +22964,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (filteredMessagesByDays != null) {
dayArr = filteredMessagesByDays.get(obj.dateKeyInt);
if (dayArr != null) {
MessageObject mobj = chatAdapter.isFiltered ? filteredMessagesDict.get(obj.getId()) : obj;
MessageObject mobj = chatAdapter != null && chatAdapter.isFiltered ? filteredMessagesDict.get(obj.getId()) : obj;
dayArr.remove(mobj);
if (dayArr.isEmpty()) {
filteredMessagesByDays.remove(obj.dateKeyInt);
@ -22914,7 +23016,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
MessageObject messageObject = groupedMessages.messages.get(groupedMessages.messages.size() - 1);
int index = chatAdapter.getMessages().indexOf(messageObject);
if (index >= 0) {
if (chatAdapter != null) {
if (chatAdapter != null && !chatAdapter.isFrozen) {
chatAdapter.notifyItemRangeChanged(index + chatAdapter.messagesStartRow, newGroupsSizes.get(groupedMessages.groupId));
}
}
@ -22963,7 +23065,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
avatarContainer.setTitle(LocaleController.formatPluralString("PinnedMessagesCount", getPinnedMessagesCount()));
}
}
if (chatAdapter != null) {
if (chatAdapter != null && !chatAdapter.isFrozen) {
int prevHintRow = chatAdapter.hintRow;
int prevLoadingUpRow = chatAdapter.loadingUpRow;
int prevLoadingDownRow = chatAdapter.loadingDownRow;
@ -23300,6 +23402,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
CharSequence text;
if (!results.solution_entities.isEmpty()) {
text = new SpannableStringBuilder(results.solution);
text = Emoji.replaceEmoji(text, Theme.chat_msgBotButtonPaint.getFontMetricsInt(), AndroidUtilities.dp(13), false);
text = MessageObject.replaceAnimatedEmoji(text, results.solution_entities, Theme.chat_msgBotButtonPaint.getFontMetricsInt());
MessageObject.addEntitiesToText(text, results.solution_entities, false, true, true, false);
} else {
text = results.solution;
@ -24884,7 +24988,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
pinnedText = String.format("%s - %s", pinnedMessageObject.getMusicAuthor(), pinnedMessageObject.getMusicTitle());
} else if (pinnedMessageObject.type == MessageObject.TYPE_POLL) {
TLRPC.TL_messageMediaPoll poll = (TLRPC.TL_messageMediaPoll) pinnedMessageObject.messageOwner.media;
String mess = poll.poll.question;
String mess = poll.poll.question.text;
if (mess.length() > 150) {
mess = mess.substring(0, 150);
}
@ -25332,7 +25436,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
getMessagesController().getTranslateController().isDialogTranslatable(getDialogId()) && !getMessagesController().getTranslateController().isTranslateDialogHidden(getDialogId()) :
!getMessagesController().premiumFeaturesBlocked() && preferences.getInt("dialog_show_translate_count" + did, 5) <= 0
);
boolean showBizBot = getUserConfig().isPremium() && preferences.getLong("dialog_botid" + did, 0) != 0;
boolean showBizBot = currentEncryptedChat == null && getUserConfig().isPremium() && preferences.getLong("dialog_botid" + did, 0) != 0;
if (showRestartTopic) {
shownRestartTopic = true;
}
@ -26279,6 +26383,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
CharSequence message = ChatActivityEnterView.applyMessageEntities(entities, resolvedChatLink.message, chatActivityEnterView.getEditField().getPaint().getFontMetricsInt());
if (message != null && message.length() > 0 && message.charAt(0) == '@') {
message = TextUtils.concat(" ", message);
}
chatActivityEnterView.setFieldText(message, true, true);
@ -26635,19 +26742,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages selectedGroup) {
createDeleteMessagesAlert(finalSelectedObject, selectedGroup, 1);
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages finalSelectedGroup) {
createDeleteMessagesAlert(finalSelectedObject, finalSelectedGroup, false);
}
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages finalSelectedGroup, int loadParticipant) {
createDeleteMessagesAlert(finalSelectedObject, finalSelectedGroup, loadParticipant, false);
}
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages finalSelectedGroup, int loadParticipant, boolean hideDimAfter) {
private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, final MessageObject.GroupedMessages finalSelectedGroup, boolean hideDimAfter) {
if (finalSelectedObject == null && (selectedMessagesIds[0].size() + selectedMessagesIds[1].size()) == 0) {
return;
}
AlertsCreator.createDeleteMessagesAlert(this, currentUser, currentChat, currentEncryptedChat, chatInfo, mergeDialogId, finalSelectedObject, selectedMessagesIds, finalSelectedGroup, (int) getTopicId(), chatMode, loadParticipant, () -> {
AlertsCreator.createDeleteMessagesAlert(this, currentUser, currentChat, currentEncryptedChat, chatInfo, mergeDialogId, finalSelectedObject, selectedMessagesIds, finalSelectedGroup, (int) getTopicId(), chatMode, null, () -> {
hideActionMode();
updatePinnedMessageView(true);
}, hideDimAfter ? () -> dimBehindView(false) : null, themeDelegate);
@ -26964,9 +27067,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
try {
TLRPC.Poll poll = ((TLRPC.TL_messageMediaPoll) selectedObject.messageOwner.media).poll;
StringBuilder pollText = new StringBuilder();
pollText = new StringBuilder(poll.question).append("\n");
for (TLRPC.TL_pollAnswer answer : poll.answers)
pollText.append("\n\uD83D\uDD18 ").append(answer.text);
pollText = new StringBuilder(poll.question.text).append("\n");
for (TLRPC.PollAnswer answer : poll.answers)
pollText.append("\n\uD83D\uDD18 ").append(answer.text == null ? "" : answer.text.text);
messageTextToTranslate = pollText.toString();
} catch (Exception e) {
}
@ -27251,7 +27354,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
icons.add(R.drawable.msg_sticker);
TLRPC.Document document = selectedObject.getDocument();
if (!getMediaDataController().isStickerInFavorites(document)) {
if (getMediaDataController().canAddStickerToFavorites() && MessageObject.isStickerHasSet(document)) {
if (getMediaDataController().canAddStickerToFavorites()) {
items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites));
options.add(OPTION_ADD_STICKER_TO_FAVORITES);
icons.add(R.drawable.msg_fave);
@ -27286,7 +27389,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
} else if (type == 9) {
TLRPC.Document document = selectedObject.getDocument();
if (!getMediaDataController().isStickerInFavorites(document)) {
if (MessageObject.isStickerHasSet(document)) {
if (getMediaDataController().canAddStickerToFavorites()) {
items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites));
options.add(OPTION_ADD_STICKER_TO_FAVORITES);
icons.add(R.drawable.msg_fave);
@ -27469,7 +27572,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
boolean showMessageSeen = !isReactionsViewAvailable && !isInScheduleMode() && currentChat != null && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < getMessagesController().chatReadMarkExpirePeriod) && (ChatObject.isMegagroup(currentChat) || !ChatObject.isChannel(currentChat)) && chatInfo != null && chatInfo.participants_count <= getMessagesController().chatReadMarkSizeThreshold && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) && (v instanceof ChatMessageCell);
boolean showPrivateMessageSeen = !isReactionsViewAvailable && currentChat == null && currentEncryptedChat == null && (currentUser != null && !UserObject.isUserSelf(currentUser) && !UserObject.isReplyUser(currentUser) && !UserObject.isAnonymous(currentUser) && !currentUser.bot && !UserObject.isService(currentUser.id)) && (userInfo == null || !userInfo.read_dates_private) && !isInScheduleMode() && message.isOutOwner() && message.isSent() && !message.isEditing() && !message.isSending() && !message.isSendError() && !message.isContentUnread() && !message.isUnread() && (ConnectionsManager.getInstance(currentAccount).getCurrentTime() - message.messageOwner.date < getMessagesController().pmReadDateExpirePeriod) && !(message.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) && (v instanceof ChatMessageCell);
boolean showSponsorInfo = selectedObject != null && selectedObject.isSponsored() && (selectedObject.sponsoredInfo != null || selectedObject.sponsoredAdditionalInfo != null || selectedObject.sponsoredWebPage != null || selectedObject.sponsoredBotApp != null);
boolean showSponsorInfo = selectedObject != null && selectedObject.isSponsored() && (selectedObject.sponsoredInfo != null || selectedObject.sponsoredAdditionalInfo != null || selectedObject.sponsoredUrl != null && !selectedObject.sponsoredUrl.startsWith("https://" + getMessagesController().linkPrefix));
if (chatMode == MODE_SAVED) {
showMessageSeen = false;
}
@ -27953,7 +28056,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
if (selectedObject != null && selectedObject.isSponsored()) {
if (selectedObject.sponsoredInfo != null || selectedObject.sponsoredAdditionalInfo != null || selectedObject.sponsoredWebPage != null) {
if (selectedObject.sponsoredInfo != null || selectedObject.sponsoredAdditionalInfo != null || selectedObject.sponsoredUrl != null && !selectedObject.sponsoredUrl.startsWith("https://" + getMessagesController().linkPrefix)) {
LinearLayout linearLayout = new LinearLayout(getParentActivity());
linearLayout.setOrientation(LinearLayout.VERTICAL);
@ -27968,13 +28071,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
ArrayList<View> sections = new ArrayList<>();
if (selectedObject.sponsoredWebPage != null) {
if (selectedObject.sponsoredUrl != null && !selectedObject.sponsoredUrl.startsWith(getMessagesController().linkPrefix)) {
TextView textView = new TextView(getParentActivity());
textView.setTextColor(getThemedColor(Theme.key_chat_messageLinkIn));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setPadding(AndroidUtilities.dp(18), AndroidUtilities.dp(10), AndroidUtilities.dp(18), AndroidUtilities.dp(10));
textView.setMaxWidth(AndroidUtilities.dp(300));
Uri uri = Uri.parse(selectedObject.sponsoredWebPage.url);
Uri uri = Uri.parse(selectedObject.sponsoredUrl);
textView.setText(Browser.replaceHostname(uri, IDN.toUnicode(uri.getHost(), IDN.ALLOW_UNASSIGNED)));
textView.setBackground(Theme.createRadSelectorDrawable(getThemedColor(Theme.key_dialogButtonSelector), 0, selectedObject.sponsoredAdditionalInfo == null ? 6 : 0));
textView.setOnClickListener(e -> {
@ -27982,13 +28085,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
return;
}
logSponsoredClicked(selectedObject);
Browser.openUrl(getContext(), selectedObject.sponsoredWebPage.url, true, false);
Browser.openUrl(getContext(), selectedObject.sponsoredUrl, true, false);
});
textView.setOnLongClickListener(e -> {
if (selectedObject == null) {
return false;
}
if (AndroidUtilities.addToClipboard(selectedObject.sponsoredWebPage.url)) {
if (AndroidUtilities.addToClipboard(selectedObject.sponsoredUrl)) {
BulletinFactory.of(Bulletin.BulletinWindow.make(getParentActivity()), themeDelegate).createCopyLinkBulletin().show();
}
return true;
@ -28325,7 +28428,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (group != null) {
messageWithReactions = group.findPrimaryMessageObject();
}
reactionsLayout.setMessage(messageWithReactions, chatInfo);
reactionsLayout.setMessage(messageWithReactions, chatInfo, true);
reactionsLayout.setTransitionProgress(0);
if (popupLayout.getSwipeBack() != null) {
@ -28349,7 +28452,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
boolean showNoForwards = noforwards && message.messageOwner.action == null && message.isSent() && !message.isEditing() && chatMode != MODE_SCHEDULED && chatMode != MODE_SAVED;
boolean showNoForwards = (getMessagesController().isChatNoForwards(currentChat) || message.messageOwner.noforwards && currentUser != null && currentUser.bot) && message.messageOwner.action == null && message.isSent() && !message.isEditing() && chatMode != MODE_SCHEDULED && chatMode != MODE_SAVED;
scrimPopupContainerLayout.addView(popupLayout, LayoutHelper.createLinearRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT, isReactionsAvailable ? 16 : 0, 0, isReactionsAvailable ? 36 : 0, 0));
scrimPopupContainerLayout.setPopupWindowLayout(popupLayout);
if (showNoForwards) {
@ -29254,7 +29357,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
return;
}
preserveDim = true;
createDeleteMessagesAlert(selectedObject, selectedObjectGroup, 1,true);
createDeleteMessagesAlert(selectedObject, selectedObjectGroup, true);
break;
}
case OPTION_FORWARD: {
@ -29891,8 +29994,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
break;
}
case OPTION_HIDE_SPONSORED_MESSAGE: {
MessageObject message = selectedObject;
showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true));
hideAds();
break;
}
case OPTION_ABOUT_REVENUE_SHARING_ADS: {
@ -29971,6 +30073,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
BulletinFactory.of(ChatActivity.this)
.createAdReportedBulletin(LocaleController.getString(R.string.AdHidden))
.show();
getMessagesController().disableAds(false);
removeFromSponsored(message);
removeMessageWithThanos(message);
}, 200);
@ -29996,7 +30099,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
break;
}
case OPTION_REMOVE_ADS: {
showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true));
hideAds();
break;
}
case OPTION_SPEED_PROMO: {
@ -30015,6 +30118,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
closeMenu(!preserveDim);
}
private void hideAds() {
if (getUserConfig().isPremium()) {
BulletinFactory.of(ChatActivity.this)
.createAdReportedBulletin(LocaleController.getString(R.string.AdHidden))
.show();
getMessagesController().disableAds(true);
removeFromSponsored(selectedObject);
removeMessageWithThanos(selectedObject);
} else {
showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true));
}
}
@Override
public boolean didSelectDialogs(DialogsActivity fragment, ArrayList<MessagesStorage.TopicKey> dids, CharSequence message, boolean param, TopicsFragment topicsFragment) {
if ((messagePreviewParams == null && (!fragment.isQuote || replyingMessageObject == null) || fragment.isQuote && replyingMessageObject == null) && forwardingMessage == null && selectedMessagesIds[0].size() == 0 && selectedMessagesIds[1].size() == 0) {
@ -32642,31 +32758,28 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
return object.currentX;
}
};
Property<MessageObject.SendAnimationData, Float> param3 = new AnimationProperties.FloatProperty<MessageObject.SendAnimationData>("p3") {
@Override
public void setValue(MessageObject.SendAnimationData object, float value) {
object.currentY = value;
if (fragmentView != null) {
fragmentView.invalidate();
}
}
@Override
public Float get(MessageObject.SendAnimationData object) {
return object.currentY;
}
};
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(sendAnimationData, param1, scale, 1.0f),
ObjectAnimator.ofFloat(sendAnimationData, param3, sendAnimationData.y, position[1] + imageReceiver.getCenterY())
ObjectAnimator.ofFloat(sendAnimationData, new AnimationProperties.FloatProperty<MessageObject.SendAnimationData>("progress") {
@Override
public void setValue(MessageObject.SendAnimationData object, float value) {
object.progress = value;
if (fragmentView != null) {
fragmentView.invalidate();
}
}
@Override
public Float get(MessageObject.SendAnimationData object) {
return object.progress;
}
}, 0, 1)
);
animatorSet.setInterpolator(ChatListItemAnimator.DEFAULT_INTERPOLATOR);
ObjectAnimator o = ObjectAnimator.ofFloat(sendAnimationData, param2, sendAnimationData.x, position[0] + imageReceiver.getCenterX());
o.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT);
allAnimators.playTogether(o, animatorSet);
allAnimators.setDuration(ChatListItemAnimator.DEFAULT_DURATION);
allAnimators.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT);
allAnimators.setDuration(460);
allAnimators.addListener(new AnimatorListenerAdapter() {
@Override
@ -32998,6 +33111,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
@Override
public void notifyItemChanged(int position) {
if (BuildVars.LOGS_ENABLED) {
FileLog.d("notify item changed " + position);
}
if (!fragmentBeginToShow) {
chatListView.setItemAnimator(null);
} else if (chatListView.getItemAnimator() != chatListItemAnimator) {
@ -33659,8 +33775,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
@Override
public void didPressSponsoredClose() {
showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true));
public void didPressSponsoredClose(ChatMessageCell cell) {
selectedObject = cell.getMessageObject();
hideAds();
}
@Override
@ -33845,7 +33962,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
private void openProfile(TLRPC.User user, boolean expandPhoto) {
if (user != null && user.id != getUserConfig().getClientUserId()) {
if (user != null) {
if (user.photo == null || user.photo instanceof TLRPC.TL_userProfilePhotoEmpty) {
expandPhoto = false;
}
@ -33887,7 +34004,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
if (avatarContainer != null && postId == 0) {
avatarContainer.openProfile(false);
} else {
scrollToMessageId(postId, cell.getMessageObject().getId(), true, 0, true, 0);
scrollToMessageId(postId, cell.getMessageObject().getId(), true, 0, false, 0);
}
} else if (currentChat == null || chat.id != currentChat.id || isThreadChat()) {
Bundle args = new Bundle();
@ -34247,7 +34364,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
@Override
public void didPressVoteButtons(ChatMessageCell cell, ArrayList<TLRPC.TL_pollAnswer> buttons, int showCount, int x, int y) {
public void didPressVoteButtons(ChatMessageCell cell, ArrayList<TLRPC.PollAnswer> buttons, int showCount, int x, int y) {
if (showCount >= 0 || buttons.isEmpty()) {
if (getParentActivity() == null) {
return;
@ -34920,111 +35037,98 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
args.putBoolean("addContact", true);
presentFragment(new ContactAddActivity(args));
}
} else if (type == ChatMessageCell.INSTANT_BUTTON_TYPE_STICKER_SET || type == ChatMessageCell.INSTANT_BUTTON_TYPE_EMOJI_SET) {
final boolean emoji = type == ChatMessageCell.INSTANT_BUTTON_TYPE_EMOJI_SET;
TLRPC.WebPage webPage = null;
if (webPage == null && messageObject.messageOwner != null && messageObject.messageOwner.media != null) {
webPage = messageObject.messageOwner.media.webpage;
}
if (webPage == null || webPage.url == null) return;
Pattern pattern = Pattern.compile("^https?\\:\\/\\/t\\.me\\/add(?:emoji|stickers)\\/(.+)$");
Matcher m = pattern.matcher(webPage.url);
if (progressDialogCurrent != null) {
progressDialogCurrent.cancel(true);
}
progressDialogCurrent = cell == null || cell.getMessageObject() == null ? null : new Browser.Progress() {
@Override
public void init() {
progressDialogAtMessageId = cell.getMessageObject().getId();
progressDialogAtMessageType = PROGRESS_INSTANT;
progressDialogLinkSpan = null;
cell.invalidate();
}
@Override
public void end(boolean replaced) {
if (!replaced) {
AndroidUtilities.runOnUIThread(ChatActivity.this::resetProgressDialogLoading, 250);
}
}
};
if (m.matches() && m.groupCount() > 1 && m.group(1) != null) {
String setname = m.group(1);
TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(currentAccount).getStickerSetByName(setname);
if (set == null) {
progressDialogCurrent.init();
TLRPC.TL_messages_getStickerSet req = new TLRPC.TL_messages_getStickerSet();
TLRPC.TL_inputStickerSetShortName input = new TLRPC.TL_inputStickerSetShortName();
input.short_name = setname;
req.stickerset = input;
int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> {
progressDialogCurrent.end();
if (res instanceof TLRPC.TL_messages_stickerSet) {
MediaDataController.getInstance(currentAccount).putStickerSet((TLRPC.TL_messages_stickerSet) res, false);
TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID();
inputStickerSet.access_hash = ((TLRPC.TL_messages_stickerSet) res).set.access_hash;
inputStickerSet.id = ((TLRPC.TL_messages_stickerSet) res).set.id;
if (emoji) {
ArrayList<TLRPC.InputStickerSet> inputSets = new ArrayList<>(1);
inputSets.add(inputStickerSet);
EmojiPacksAlert alert = new EmojiPacksAlert(ChatActivity.this, getParentActivity(), themeDelegate, inputSets);
alert.setCalcMandatoryInsets(isKeyboardVisible());
showDialog(alert);
} else {
StickersAlert alert = new StickersAlert(getParentActivity(), ChatActivity.this, inputStickerSet, null, chatActivityEnterView, themeDelegate);
alert.setCalcMandatoryInsets(isKeyboardVisible());
showDialog(alert);
}
} else {
BulletinFactory.of(ChatActivity.this).createSimpleBulletin(R.raw.error, getString(emoji ? R.string.AddEmojiNotFound : R.string.AddStickersNotFound)).show(true);
}
}));
progressDialogCurrent.onCancel(() -> ConnectionsManager.getInstance(currentAccount).cancelRequest(reqId, true));
return;
}
}
Browser.openUrl(getParentActivity(), Uri.parse(webPage.url), true, true, false, progressDialogCurrent);
} else {
if (messageObject.isSponsored()) {
logSponsoredClicked(messageObject);
Bundle args = new Bundle();
if (messageObject.sponsoredBotApp != null) {
TLRPC.TL_messages_getBotApp getBotApp = new TLRPC.TL_messages_getBotApp();
TLRPC.TL_inputBotAppShortName app = new TLRPC.TL_inputBotAppShortName();
if (messageObject.messageOwner == null || messageObject.messageOwner.from_id == null) {
return;
if (messageObject.sponsoredUrl != null) {
if (progressDialogCurrent != null) {
progressDialogCurrent.cancel(true);
}
TLRPC.User bot = MessagesController.getInstance(currentAccount).getUser(messageObject.messageOwner.from_id.user_id);
if (bot == null) {
return;
}
app.bot_id = MessagesController.getInstance(currentAccount).getInputUser(bot);
app.short_name = messageObject.sponsoredBotApp.short_name;
getBotApp.app = app;
ConnectionsManager.getInstance(currentAccount).sendRequest(getBotApp, (response1, error1) -> {
// if (progress != null) {
// progress.end();
// }
if (error1 != null) {
BulletinFactory.of(ChatActivity.this).createErrorBulletin(LocaleController.getString(R.string.UnknownError)).show(true);
} else {
TLRPC.TL_messages_botApp botApp = (TLRPC.TL_messages_botApp) response1;
AndroidUtilities.runOnUIThread(() -> {
// dismissLoading.run();
AtomicBoolean allowWrite = new AtomicBoolean();
Runnable loadBotSheet = () -> {
BotWebViewSheet sheet = new BotWebViewSheet(getContext(), getResourceProvider());
sheet.setParentActivity(getParentActivity());
sheet.requestWebView(currentAccount, bot.id, bot.id, null, null, BotWebViewSheet.TYPE_WEB_VIEW_BOT_APP, 0, false, ChatActivity.this, botApp.app, allowWrite.get(), messageObject.botStartParam, bot);
showDialog(sheet);
if (botApp.inactive) {
sheet.showJustAddedBulletin();
}
};
progressDialogCurrent = cell == null || cell.getMessageObject() == null ? null : new Browser.Progress() {
@Override
public void init() {
progressDialogAtMessageId = cell.getMessageObject().getId();
progressDialogAtMessageType = PROGRESS_INSTANT;
progressDialogLinkSpan = null;
cell.invalidate();
}
if (botApp.request_write_access) {
AlertsCreator.createBotLaunchAlert(ChatActivity.this, allowWrite, bot, loadBotSheet);
} else {
loadBotSheet.run();
}
});
}
});
} else if (messageObject.sponsoredWebPage != null) {
Browser.openUrl(getContext(), messageObject.sponsoredWebPage.url, true, false);
} else if (messageObject.sponsoredChatInvite != null) {
final TLRPC.TL_messages_checkChatInvite req = new TLRPC.TL_messages_checkChatInvite();
req.hash = messageObject.sponsoredChatInviteHash;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
if (error == null) {
TLRPC.ChatInvite invite = (TLRPC.ChatInvite) response;
if (invite.chat != null && (!ChatObject.isLeftFromChat(invite.chat) || !invite.chat.kicked && (ChatObject.isPublic(invite.chat) || invite instanceof TLRPC.TL_chatInvitePeek || invite.chat.has_geo))) {
MessagesController.getInstance(currentAccount).putChat(invite.chat, false);
ArrayList<TLRPC.Chat> chats = new ArrayList<>();
chats.add(invite.chat);
MessagesStorage.getInstance(currentAccount).putUsersAndChats(null, chats, false, true);
args.putLong("chat_id", invite.chat.id);
if (MessagesController.getInstance(currentAccount).checkCanOpenChat(args, ChatActivity.this)) {
ChatActivity fragment = new ChatActivity(args);
if (invite instanceof TLRPC.TL_chatInvitePeek) {
fragment.setChatInvite(invite);
}
presentFragment(fragment);
}
} else {
showDialog(new JoinGroupAlert(getContext(), messageObject.sponsoredChatInvite, messageObject.sponsoredChatInviteHash, ChatActivity.this, themeDelegate, JoinGroupAlert.ORIGINATION_SPONSORED_CHAT));
@Override
public void end(boolean replaced) {
if (!replaced) {
AndroidUtilities.runOnUIThread(ChatActivity.this::resetProgressDialogLoading, 250);
}
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), themeDelegate);
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
if (error.text.startsWith("FLOOD_WAIT")) {
builder.setMessage(LocaleController.getString("FloodWait", R.string.FloodWait));
} else if (error.text.startsWith("INVITE_HASH_EXPIRED")) {
builder.setTitle(LocaleController.getString("ExpiredLink", R.string.ExpiredLink));
builder.setMessage(LocaleController.getString("InviteExpired", R.string.InviteExpired));
} else {
builder.setMessage(LocaleController.getString("JoinToGroupErrorNotExist", R.string.JoinToGroupErrorNotExist));
}
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
showDialog(builder.create());
}
}), ConnectionsManager.RequestFlagFailOnServerErrors);
} else {
long peerId = MessageObject.getPeerId(messageObject.messageOwner.from_id);
if (peerId == getDialogId() && messageObject.sponsoredChannelPost != 0) {
scrollToMessageId(messageObject.sponsoredChannelPost, 0, true, 0, false, 0);
} else {
if (peerId < 0) {
args.putLong("chat_id", -peerId);
} else {
args.putLong("user_id", peerId);
}
if (messageObject.sponsoredChannelPost != 0) {
args.putInt("message_id", messageObject.sponsoredChannelPost);
}
if (messageObject.botStartParam != null) {
args.putString("inline_query", messageObject.botStartParam);
}
if (getMessagesController().checkCanOpenChat(args, ChatActivity.this)) {
presentFragment(new ChatActivity(args));
}
}
};
Browser.openUrl(getContext(), Uri.parse(messageObject.sponsoredUrl), true, false, false, progressDialogCurrent);
}
} else {
TLRPC.WebPage webPage = messageObject.getStoryMentionWebpage();

View file

@ -8,6 +8,8 @@
package org.telegram.ui;
import static org.telegram.messenger.LocaleController.getString;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
@ -244,7 +246,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
req.id = new TLRPC.TL_inputPhotoEmpty();
getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
avatarImage.setImageDrawable(avatarDrawable);
setAvatarCell.setTextAndIcon(LocaleController.getString("ChatSetPhotoOrVideo", R.string.ChatSetPhotoOrVideo), R.drawable.msg_addphoto, true);
setAvatarCell.setTextAndIcon(getString("ChatSetPhotoOrVideo", R.string.ChatSetPhotoOrVideo), R.drawable.msg_addphoto, true);
if (currentUser != null) {
currentUser.photo = null;
@ -600,7 +602,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
linearLayout1.setOrientation(LinearLayout.VERTICAL);
actionBar.setTitle(LocaleController.getString("ChannelEdit", R.string.ChannelEdit));
actionBar.setTitle(getString("ChannelEdit", R.string.ChannelEdit));
avatarContainer = new LinearLayout(context);
avatarContainer.setOrientation(LinearLayout.VERTICAL);
@ -691,11 +693,11 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
nameTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT, false);
if (userId != 0) {
nameTextView.setHint(LocaleController.getString(R.string.BotName));
nameTextView.setHint(getString(R.string.BotName));
} else if (isChannel) {
nameTextView.setHint(LocaleController.getString("EnterChannelName", R.string.EnterChannelName));
nameTextView.setHint(getString("EnterChannelName", R.string.EnterChannelName));
} else {
nameTextView.setHint(LocaleController.getString("GroupName", R.string.GroupName));
nameTextView.setHint(getString("GroupName", R.string.GroupName));
}
nameTextView.setEnabled(currentChat != null || ChatObject.canChangeChatInfo(currentChat));
nameTextView.setFocusable(nameTextView.isEnabled());
@ -749,7 +751,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
req.id = new TLRPC.TL_inputPhotoEmpty();
getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
avatarImage.setImageDrawable(avatarDrawable);
setAvatarCell.setTextAndIcon(LocaleController.getString("ChatSetPhotoOrVideo", R.string.ChatSetPhotoOrVideo), R.drawable.msg_addphoto, true);
setAvatarCell.setTextAndIcon(getString("ChatSetPhotoOrVideo", R.string.ChatSetPhotoOrVideo), R.drawable.msg_addphoto, true);
if (currentUser != null) {
currentUser.photo = null;
@ -798,7 +800,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
inputFilters = new InputFilter[1];
inputFilters[0] = new InputFilter.LengthFilter(255);
descriptionTextView.setFilters(inputFilters);
descriptionTextView.setHint(LocaleController.getString("DescriptionOptionalPlaceholder", R.string.DescriptionOptionalPlaceholder));
descriptionTextView.setHint(getString("DescriptionOptionalPlaceholder", R.string.DescriptionOptionalPlaceholder));
descriptionTextView.setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
descriptionTextView.setCursorSize(AndroidUtilities.dp(20));
descriptionTextView.setCursorWidth(1.5f);
@ -914,7 +916,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
HeaderCell headerCell = new HeaderCell(context, Theme.key_dialogTextBlue2, 23, 15, false);
headerCell.setHeight(47);
headerCell.setText(LocaleController.getString("ChatHistory", R.string.ChatHistory));
headerCell.setText(getString("ChatHistory", R.string.ChatHistory));
linearLayout.addView(headerCell);
LinearLayout linearLayoutInviteContainer = new LinearLayout(context);
@ -928,12 +930,12 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
buttons[a].setTag(a);
buttons[a].setBackgroundDrawable(Theme.getSelectorDrawable(false));
if (a == 0) {
buttons[a].setTextAndValue(LocaleController.getString("ChatHistoryVisible", R.string.ChatHistoryVisible), LocaleController.getString("ChatHistoryVisibleInfo", R.string.ChatHistoryVisibleInfo), true, !historyHidden);
buttons[a].setTextAndValue(getString("ChatHistoryVisible", R.string.ChatHistoryVisible), getString("ChatHistoryVisibleInfo", R.string.ChatHistoryVisibleInfo), true, !historyHidden);
} else {
if (ChatObject.isChannel(currentChat)) {
buttons[a].setTextAndValue(LocaleController.getString("ChatHistoryHidden", R.string.ChatHistoryHidden), LocaleController.getString("ChatHistoryHiddenInfo", R.string.ChatHistoryHiddenInfo), false, historyHidden);
buttons[a].setTextAndValue(getString("ChatHistoryHidden", R.string.ChatHistoryHidden), getString("ChatHistoryHiddenInfo", R.string.ChatHistoryHiddenInfo), false, historyHidden);
} else {
buttons[a].setTextAndValue(LocaleController.getString("ChatHistoryHidden", R.string.ChatHistoryHidden), LocaleController.getString("ChatHistoryHiddenInfo2", R.string.ChatHistoryHiddenInfo2), false, historyHidden);
buttons[a].setTextAndValue(getString("ChatHistoryHidden", R.string.ChatHistoryHidden), getString("ChatHistoryHiddenInfo2", R.string.ChatHistoryHiddenInfo2), false, historyHidden);
}
}
linearLayoutInviteContainer.addView(buttons[a], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
@ -968,7 +970,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
if (isChannel) {
signCell = new TextCell(context, 23, false, true, null);
signCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
signCell.setTextAndCheckAndIcon(LocaleController.getString("ChannelSignMessages", R.string.ChannelSignMessages), signMessages, R.drawable.msg_signed, false);
signCell.setTextAndCheckAndIcon(getString("ChannelSignMessages", R.string.ChannelSignMessages), signMessages, R.drawable.msg_signed, false);
typeEditContainer.addView(signCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
signCell.setOnClickListener(v -> {
signMessages = !signMessages;
@ -977,14 +979,14 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
} else if (currentChat.creator) {
forumsCell = new TextCell(context, 23, false, true, null);
forumsCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
forumsCell.setTextAndCheckAndIcon(LocaleController.getString("ChannelTopics", R.string.ChannelTopics), forum, R.drawable.msg_topics, false);
forumsCell.setTextAndCheckAndIcon(getString("ChannelTopics", R.string.ChannelTopics), forum, R.drawable.msg_topics, false);
forumsCell.getCheckBox().setIcon(canForum ? 0 : R.drawable.permission_locked);
typeEditContainer.addView(forumsCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
forumsCell.setOnClickListener(v -> {
if (!canForum) {
CharSequence text;
if (!(info == null || info.linked_chat_id == 0)) {
text = AndroidUtilities.replaceTags(LocaleController.getString("ChannelTopicsDiscussionForbidden", R.string.ChannelTopicsDiscussionForbidden));
text = AndroidUtilities.replaceTags(getString("ChannelTopicsDiscussionForbidden", R.string.ChannelTopicsDiscussionForbidden));
} else {
text = AndroidUtilities.replaceTags(LocaleController.formatPluralString("ChannelTopicsForbidden", getMessagesController().forumUpgradeParticipantsMin));
}
@ -1005,7 +1007,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
ActionBarMenu menu = actionBar.createMenu();
if (currentUser != null || ChatObject.canChangeChatInfo(currentChat) || signCell != null || historyCell != null) {
doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_ab_done, AndroidUtilities.dp(56));
doneButton.setContentDescription(LocaleController.getString("Done", R.string.Done));
doneButton.setContentDescription(getString("Done", R.string.Done));
}
if (locationCell != null || signCell != null || historyCell != null || typeCell != null || linkedCell != null || forumsCell != null) {
@ -1017,9 +1019,9 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
settingsSectionCell.setBackground(combinedDrawable);
linearLayout1.addView(settingsSectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
if (forumsCell != null) {
settingsSectionCell.setText(LocaleController.getString("ForumToggleDescription", R.string.ForumToggleDescription));
settingsSectionCell.setText(getString("ForumToggleDescription", R.string.ForumToggleDescription));
} else {
settingsSectionCell.setText(LocaleController.getString("ChannelSignMessagesInfo", R.string.ChannelSignMessagesInfo));
settingsSectionCell.setText(getString("ChannelSignMessagesInfo", R.string.ChannelSignMessagesInfo));
}
}
@ -1103,7 +1105,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
if (ChatObject.isBoostSupported(currentChat)) {
statsAndBoosts = new TextCell(context);
statsAndBoosts.setTextAndIcon(LocaleController.getString("StatisticsAndBoosts", R.string.StatisticsAndBoosts), R.drawable.msg_stats, true);
statsAndBoosts.setTextAndIcon(getString(R.string.StatisticsAndBoosts), R.drawable.msg_stats, true);
statsAndBoosts.setBackground(Theme.getSelectorDrawable(false));
statsAndBoosts.setOnClickListener(v -> {
presentFragment(StatisticActivity.create(currentChat, false));
@ -1129,31 +1131,11 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
if (isChannel || currentChat.gigagroup) {
infoContainer.addView(blockCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (!isChannel && info != null && info.can_set_stickers) {
stickersContainer = new FrameLayout(context);
stickersContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
linearLayout1.addView(stickersContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
stickersCell = new TextCell(context);
stickersCell.setBackground(Theme.getSelectorDrawable(false));
stickersCell.setOnClickListener(v -> presentFragment(new ChannelAdminLogActivity(currentChat)));
stickersCell.setPrioritizeTitleOverValue(true);
stickersContainer.addView(stickersCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
stickersCell.setOnClickListener(v -> {
GroupStickersActivity groupStickersActivity = new GroupStickersActivity(currentChat.id);
groupStickersActivity.setInfo(info);
presentFragment(groupStickersActivity);
});
if (statsAndBoosts != null) {
infoContainer.addView(statsAndBoosts, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
} else {
if (statsAndBoosts != null) {
infoContainer.addView(statsAndBoosts, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (logCell != null) {
infoContainer.addView(logCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (statsAndBoosts != null) {
infoContainer.addView(statsAndBoosts, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (logCell != null) {
infoContainer.addView(logCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
}
@ -1172,19 +1154,19 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
editIntroCell = new TextCell(context);
editIntroCell.setBackground(Theme.getSelectorDrawable(false));
editIntroCell.setTextAndIcon(LocaleController.getString(R.string.BotEditIntro), R.drawable.msg_log, true);
editIntroCell.setTextAndIcon(getString(R.string.BotEditIntro), R.drawable.msg_log, true);
infoContainer.addView(editIntroCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
editIntroCell.setOnClickListener(v -> Browser.openUrl(v.getContext(), "https://t.me/BotFather?start=" + getActiveUsername(currentUser) + "-intro"));
editCommandsCell = new TextCell(context);
editCommandsCell.setBackground(Theme.getSelectorDrawable(false));
editCommandsCell.setTextAndIcon(LocaleController.getString(R.string.BotEditCommands), R.drawable.msg_media, true);
editCommandsCell.setTextAndIcon(getString(R.string.BotEditCommands), R.drawable.msg_media, true);
infoContainer.addView(editCommandsCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
editCommandsCell.setOnClickListener(v -> Browser.openUrl(v.getContext(), "https://t.me/BotFather?start=" + getActiveUsername(currentUser) + "-commands"));
changeBotSettingsCell = new TextCell(context);
changeBotSettingsCell.setBackground(Theme.getSelectorDrawable(false));
changeBotSettingsCell.setTextAndIcon(LocaleController.getString(R.string.BotChangeSettings), R.drawable.msg_bot, true);
changeBotSettingsCell.setTextAndIcon(getString(R.string.BotChangeSettings), R.drawable.msg_bot, true);
infoContainer.addView(changeBotSettingsCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
changeBotSettingsCell.setOnClickListener(v -> Browser.openUrl(v.getContext(), "https://t.me/BotFather?start=" + getActiveUsername(currentUser)));
}
@ -1199,15 +1181,9 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
infoSectionCell = new ShadowSectionCell(context);
linearLayout1.addView(infoSectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (!isChannel && info != null && info.can_set_stickers) {
stickersInfoCell = new TextInfoPrivacyCell(context);
stickersInfoCell.setText(LocaleController.getString(R.string.GroupStickersInfo));
linearLayout1.addView(stickersInfoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
} else {
botInfoCell = new TextInfoPrivacyCell(context);
String str = LocaleController.getString(R.string.BotManageInfo);
String str = getString(R.string.BotManageInfo);
SpannableString span = SpannableString.valueOf(str);
int index = str.indexOf("@BotFather");
if (index != -1) {
@ -1238,11 +1214,11 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
deleteCell.setTextColor(Theme.getColor(Theme.key_text_RedRegular));
deleteCell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
if (currentUser != null) {
deleteCell.setText(LocaleController.getString(R.string.DeleteBot), false);
deleteCell.setText(getString(R.string.DeleteBot), false);
} else if (isChannel) {
deleteCell.setText(LocaleController.getString("ChannelDelete", R.string.ChannelDelete), false);
deleteCell.setText(getString("ChannelDelete", R.string.ChannelDelete), false);
} else {
deleteCell.setText(LocaleController.getString("DeleteAndExitButton", R.string.DeleteAndExitButton), false);
deleteCell.setText(getString("DeleteAndExitButton", R.string.DeleteAndExitButton), false);
}
deleteContainer.addView(deleteCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
deleteCell.setOnClickListener(v -> AlertsCreator.createClearOrDeleteDialogAlert(ChatEditActivity.this, false, true, false, currentChat, null, false, true, false, (param) -> {
@ -1296,9 +1272,9 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
}
}
publicLinkCell.setTextAndValueAndIcon(LocaleController.getString(R.string.BotPublicLinks), LocaleController.formatString(R.string.BotPublicLinksCount, usernamesActive, currentUser.usernames.size()), R.drawable.msg_link2, true);
publicLinkCell.setTextAndValueAndIcon(getString(R.string.BotPublicLinks), LocaleController.formatString(R.string.BotPublicLinksCount, usernamesActive, currentUser.usernames.size()), R.drawable.msg_link2, true);
} else {
publicLinkCell.setTextAndValueAndIcon(LocaleController.getString(R.string.BotPublicLink), "t.me/" + currentUser.username, R.drawable.msg_link2, true);
publicLinkCell.setTextAndValueAndIcon(getString(R.string.BotPublicLink), "t.me/" + currentUser.username, R.drawable.msg_link2, true);
}
}
@ -1342,9 +1318,9 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
}
if (setAvatarCell != null) {
if (hasPhoto || imageUpdater.isUploadingImage()) {
setAvatarCell.setTextAndIcon(LocaleController.getString("ChatSetNewPhoto", R.string.ChatSetNewPhoto), R.drawable.msg_addphoto, true);
setAvatarCell.setTextAndIcon(getString("ChatSetNewPhoto", R.string.ChatSetNewPhoto), R.drawable.msg_addphoto, true);
} else {
setAvatarCell.setTextAndIcon(LocaleController.getString("ChatSetPhotoOrVideo", R.string.ChatSetPhotoOrVideo), R.drawable.msg_addphoto, true);
setAvatarCell.setTextAndIcon(getString("ChatSetPhotoOrVideo", R.string.ChatSetPhotoOrVideo), R.drawable.msg_addphoto, true);
}
if (cameraDrawable == null) {
cameraDrawable = new RLottieDrawable(R.raw.camera_outline, "" + R.raw.camera_outline, AndroidUtilities.dp(50), AndroidUtilities.dp(50), false, null);
@ -1477,7 +1453,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
showAvatarProgress(false, true);
} else {
avatarImage.setImage(ImageLocation.getForLocal(avatar), "50_50", avatarDrawable, currentUser != null ? currentUser : currentChat);
setAvatarCell.setTextAndIcon(LocaleController.getString("ChatSetNewPhoto", R.string.ChatSetNewPhoto), R.drawable.msg_addphoto, true);
setAvatarCell.setTextAndIcon(getString("ChatSetNewPhoto", R.string.ChatSetNewPhoto), R.drawable.msg_addphoto, true);
if (cameraDrawable == null) {
cameraDrawable = new RLottieDrawable(R.raw.camera_outline, "" + R.raw.camera_outline, AndroidUtilities.dp(50), AndroidUtilities.dp(50), false, null);
}
@ -1503,10 +1479,10 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
if (nameTextView != null && !currentUser.first_name.equals(nameTextView.getText().toString()) ||
descriptionTextView != null && !about.equals(descriptionTextView.getText().toString())) {
showDialog(new AlertDialog.Builder(getParentActivity())
.setTitle(LocaleController.getString("UserRestrictionsApplyChanges", R.string.UserRestrictionsApplyChanges))
.setMessage(LocaleController.getString(R.string.BotSettingsChangedAlert))
.setPositiveButton(LocaleController.getString("ApplyTheme", R.string.ApplyTheme), (dialogInterface, i) -> processDone())
.setNegativeButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment())
.setTitle(getString("UserRestrictionsApplyChanges", R.string.UserRestrictionsApplyChanges))
.setMessage(getString(R.string.BotSettingsChangedAlert))
.setPositiveButton(getString("ApplyTheme", R.string.ApplyTheme), (dialogInterface, i) -> processDone())
.setNegativeButton(getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment())
.create());
return false;
}
@ -1519,14 +1495,14 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
descriptionTextView != null && !about.equals(descriptionTextView.getText().toString()) ||
signMessages != currentChat.signatures || forum != currentChat.forum) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(LocaleController.getString("UserRestrictionsApplyChanges", R.string.UserRestrictionsApplyChanges));
builder.setTitle(getString("UserRestrictionsApplyChanges", R.string.UserRestrictionsApplyChanges));
if (isChannel) {
builder.setMessage(LocaleController.getString("ChannelSettingsChangedAlert", R.string.ChannelSettingsChangedAlert));
builder.setMessage(getString("ChannelSettingsChangedAlert", R.string.ChannelSettingsChangedAlert));
} else {
builder.setMessage(LocaleController.getString("GroupSettingsChangedAlert", R.string.GroupSettingsChangedAlert));
builder.setMessage(getString("GroupSettingsChangedAlert", R.string.GroupSettingsChangedAlert));
}
builder.setPositiveButton(LocaleController.getString("ApplyTheme", R.string.ApplyTheme), (dialogInterface, i) -> processDone());
builder.setNegativeButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment());
builder.setPositiveButton(getString("ApplyTheme", R.string.ApplyTheme), (dialogInterface, i) -> processDone());
builder.setNegativeButton(getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment());
showDialog(builder.create());
return false;
}
@ -1778,7 +1754,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
}
if (logCell != null) {
logCell.setVisibility(!currentChat.megagroup || currentChat.gigagroup || info != null && info.participants_count > 200 ? View.VISIBLE : View.GONE);
logCell.setVisibility(ChatObject.isChannel(currentChat) ? View.VISIBLE : View.GONE);
}
if (linkedCell != null) {
@ -1787,7 +1763,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
} else {
linkedCell.setVisibility(View.VISIBLE);
if (info.linked_chat_id == 0) {
linkedCell.setTextAndValueAndIcon(LocaleController.getString("Discussion", R.string.Discussion), LocaleController.getString("DiscussionInfoShort", R.string.DiscussionInfoShort), R.drawable.msg_discuss, true);
linkedCell.setTextAndValueAndIcon(getString("Discussion", R.string.Discussion), getString("DiscussionInfoShort", R.string.DiscussionInfoShort), R.drawable.msg_discuss, true);
} else {
TLRPC.Chat chat = getMessagesController().getChat(info.linked_chat_id);
if (chat == null) {
@ -1796,15 +1772,15 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
String username;
if (isChannel) {
if (TextUtils.isEmpty(username = ChatObject.getPublicUsername(chat))) {
linkedCell.setTextAndValueAndIcon(LocaleController.getString("Discussion", R.string.Discussion), chat.title, R.drawable.msg_discuss,true);
linkedCell.setTextAndValueAndIcon(getString("Discussion", R.string.Discussion), chat.title, R.drawable.msg_discuss,true);
} else {
linkedCell.setTextAndValueAndIcon(LocaleController.getString("Discussion", R.string.Discussion), "@" + username, R.drawable.msg_discuss,true);
linkedCell.setTextAndValueAndIcon(getString("Discussion", R.string.Discussion), "@" + username, R.drawable.msg_discuss,true);
}
} else {
if (TextUtils.isEmpty(username = ChatObject.getPublicUsername(chat))) {
linkedCell.setTextAndValueAndIcon(LocaleController.getString("LinkedChannel", R.string.LinkedChannel), chat.title, R.drawable.msg_channel, forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
linkedCell.setTextAndValueAndIcon(getString("LinkedChannel", R.string.LinkedChannel), chat.title, R.drawable.msg_channel, forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
} else {
linkedCell.setTextAndValueAndIcon(LocaleController.getString("LinkedChannel", R.string.LinkedChannel), "@" + username, R.drawable.msg_channel, forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
linkedCell.setTextAndValueAndIcon(getString("LinkedChannel", R.string.LinkedChannel), "@" + username, R.drawable.msg_channel, forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
}
}
}
@ -1817,9 +1793,9 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
locationCell.setVisibility(View.VISIBLE);
if (info.location instanceof TLRPC.TL_channelLocation) {
TLRPC.TL_channelLocation location = (TLRPC.TL_channelLocation) info.location;
locationCell.setTextAndValue(LocaleController.getString("AttachLocation", R.string.AttachLocation), location.address, animated, true);
locationCell.setTextAndValue(getString("AttachLocation", R.string.AttachLocation), location.address, animated, true);
} else {
locationCell.setTextAndValue(LocaleController.getString("AttachLocation", R.string.AttachLocation), "Unknown address", animated, true);
locationCell.setTextAndValue(getString("AttachLocation", R.string.AttachLocation), "Unknown address", animated, true);
}
} else {
locationCell.setVisibility(View.GONE);
@ -1830,30 +1806,30 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
if (info != null && info.location instanceof TLRPC.TL_channelLocation) {
String link;
if (isPrivate) {
link = LocaleController.getString("TypeLocationGroupEdit", R.string.TypeLocationGroupEdit);
link = getString("TypeLocationGroupEdit", R.string.TypeLocationGroupEdit);
} else {
link = String.format("https://" + getMessagesController().linkPrefix + "/%s", ChatObject.getPublicUsername(currentChat));
}
typeCell.setTextAndValueAndIcon(LocaleController.getString("TypeLocationGroup", R.string.TypeLocationGroup), link, R.drawable.msg_channel, historyCell != null && historyCell.getVisibility() == View.VISIBLE || linkedCell != null && linkedCell.getVisibility() == View.VISIBLE || forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
typeCell.setTextAndValueAndIcon(getString("TypeLocationGroup", R.string.TypeLocationGroup), link, R.drawable.msg_channel, historyCell != null && historyCell.getVisibility() == View.VISIBLE || linkedCell != null && linkedCell.getVisibility() == View.VISIBLE || forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
} else {
String type;
boolean isRestricted = currentChat.noforwards;
if (isChannel) {
type = isPrivate ? isRestricted ? LocaleController.getString("TypePrivateRestrictedForwards", R.string.TypePrivateRestrictedForwards) : LocaleController.getString("TypePrivate", R.string.TypePrivate) : LocaleController.getString("TypePublic", R.string.TypePublic);
type = isPrivate ? isRestricted ? getString("TypePrivateRestrictedForwards", R.string.TypePrivateRestrictedForwards) : getString("TypePrivate", R.string.TypePrivate) : getString("TypePublic", R.string.TypePublic);
} else {
type = isPrivate ? isRestricted ? LocaleController.getString("TypePrivateGroupRestrictedForwards", R.string.TypePrivateGroupRestrictedForwards) : LocaleController.getString("TypePrivateGroup", R.string.TypePrivateGroup) : LocaleController.getString("TypePublicGroup", R.string.TypePublicGroup);
type = isPrivate ? isRestricted ? getString("TypePrivateGroupRestrictedForwards", R.string.TypePrivateGroupRestrictedForwards) : getString("TypePrivateGroup", R.string.TypePrivateGroup) : getString("TypePublicGroup", R.string.TypePublicGroup);
}
if (isChannel) {
typeCell.setTextAndValueAndIcon(LocaleController.getString("ChannelType", R.string.ChannelType), type, R.drawable.msg_channel, historyCell != null && historyCell.getVisibility() == View.VISIBLE || linkedCell != null && linkedCell.getVisibility() == View.VISIBLE || forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
typeCell.setTextAndValueAndIcon(getString("ChannelType", R.string.ChannelType), type, R.drawable.msg_channel, historyCell != null && historyCell.getVisibility() == View.VISIBLE || linkedCell != null && linkedCell.getVisibility() == View.VISIBLE || forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
} else {
typeCell.setTextAndValueAndIcon(LocaleController.getString("GroupType", R.string.GroupType), type, R.drawable.msg_groups, historyCell != null && historyCell.getVisibility() == View.VISIBLE || linkedCell != null && linkedCell.getVisibility() == View.VISIBLE || forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
typeCell.setTextAndValueAndIcon(getString("GroupType", R.string.GroupType), type, R.drawable.msg_groups, historyCell != null && historyCell.getVisibility() == View.VISIBLE || linkedCell != null && linkedCell.getVisibility() == View.VISIBLE || forumsCell != null && forumsCell.getVisibility() == View.VISIBLE);
}
}
}
if (historyCell != null) {
String type = historyHidden && !forum ? LocaleController.getString("ChatHistoryHidden", R.string.ChatHistoryHidden) : LocaleController.getString("ChatHistoryVisible", R.string.ChatHistoryVisible);
historyCell.setTextAndValueAndIcon(LocaleController.getString("ChatHistoryShort", R.string.ChatHistoryShort), type, animated, R.drawable.msg_discuss, forumsCell != null);
String type = historyHidden && !forum ? getString("ChatHistoryHidden", R.string.ChatHistoryHidden) : getString("ChatHistoryVisible", R.string.ChatHistoryVisible);
historyCell.setTextAndValueAndIcon(getString("ChatHistoryShort", R.string.ChatHistoryShort), type, animated, R.drawable.msg_discuss, forumsCell != null);
historyCell.setEnabled(!forum);
updateHistoryShow(!forum && isPrivate && (info == null || info.linked_chat_id == 0) && !(info != null && info.location instanceof TLRPC.TL_channelLocation), animated);
}
@ -1868,16 +1844,16 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
memberRequestsCell.setVisibility(info.requests_pending > 0 ? View.VISIBLE : View.GONE);
}
if (isChannel) {
membersCell.setTextAndValueAndIcon(LocaleController.getString("ChannelSubscribers", R.string.ChannelSubscribers), String.format("%d", info.participants_count), R.drawable.msg_groups, true);
blockCell.setTextAndValueAndIcon(LocaleController.getString("ChannelBlacklist", R.string.ChannelBlacklist), String.format("%d", Math.max(info.banned_count, info.kicked_count)), R.drawable.msg_user_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
membersCell.setTextAndValueAndIcon(getString("ChannelSubscribers", R.string.ChannelSubscribers), String.format("%d", info.participants_count), R.drawable.msg_groups, true);
blockCell.setTextAndValueAndIcon(getString("ChannelBlacklist", R.string.ChannelBlacklist), String.format("%d", Math.max(info.banned_count, info.kicked_count)), R.drawable.msg_user_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
} else {
if (ChatObject.isChannel(currentChat)) {
membersCell.setTextAndValueAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), String.format("%d", info.participants_count), R.drawable.msg_groups, true);
membersCell.setTextAndValueAndIcon(getString("ChannelMembers", R.string.ChannelMembers), String.format("%d", info.participants_count), R.drawable.msg_groups, true);
} else {
membersCell.setTextAndValueAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), String.format("%d", info.participants.participants.size()), R.drawable.msg_groups, memberRequestsCell.getVisibility() == View.VISIBLE);
membersCell.setTextAndValueAndIcon(getString("ChannelMembers", R.string.ChannelMembers), String.format("%d", info.participants.participants.size()), R.drawable.msg_groups, memberRequestsCell.getVisibility() == View.VISIBLE);
}
if (currentChat.gigagroup) {
blockCell.setTextAndValueAndIcon(LocaleController.getString("ChannelBlacklist", R.string.ChannelBlacklist), String.format("%d", Math.max(info.banned_count, info.kicked_count)), R.drawable.msg_user_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
blockCell.setTextAndValueAndIcon(getString("ChannelBlacklist", R.string.ChannelBlacklist), String.format("%d", Math.max(info.banned_count, info.kicked_count)), R.drawable.msg_user_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
} else {
int count = 0;
if (currentChat.default_banned_rights != null) {
@ -1900,26 +1876,26 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
} else {
count = forum ? 14 : 13;
}
blockCell.setTextAndValueAndIcon(LocaleController.getString("ChannelPermissions", R.string.ChannelPermissions), String.format("%d/%d", count, forum ? 14 : 13), animated, R.drawable.msg_permissions, true);
blockCell.setTextAndValueAndIcon(getString("ChannelPermissions", R.string.ChannelPermissions), String.format("%d/%d", count, forum ? 14 : 13), animated, R.drawable.msg_permissions, true);
}
if (memberRequestsCell != null) {
memberRequestsCell.setTextAndValueAndIcon(LocaleController.getString("MemberRequests", R.string.MemberRequests), String.format("%d", info.requests_pending), R.drawable.msg_requests, logCell != null && logCell.getVisibility() == View.VISIBLE);
memberRequestsCell.setTextAndValueAndIcon(getString("MemberRequests", R.string.MemberRequests), String.format("%d", info.requests_pending), R.drawable.msg_requests, logCell != null && logCell.getVisibility() == View.VISIBLE);
}
}
adminCell.setTextAndValueAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), String.format("%d", ChatObject.isChannel(currentChat) ? info.admins_count : getAdminCount()), R.drawable.msg_admins, true);
adminCell.setTextAndValueAndIcon(getString("ChannelAdministrators", R.string.ChannelAdministrators), String.format("%d", ChatObject.isChannel(currentChat) ? info.admins_count : getAdminCount()), R.drawable.msg_admins, true);
} else {
if (isChannel) {
membersCell.setTextAndIcon(LocaleController.getString("ChannelSubscribers", R.string.ChannelSubscribers), R.drawable.msg_groups, true);
blockCell.setTextAndIcon(LocaleController.getString("ChannelBlacklist", R.string.ChannelBlacklist), R.drawable.msg_chats_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
membersCell.setTextAndIcon(getString("ChannelSubscribers", R.string.ChannelSubscribers), R.drawable.msg_groups, true);
blockCell.setTextAndIcon(getString("ChannelBlacklist", R.string.ChannelBlacklist), R.drawable.msg_chats_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
} else {
membersCell.setTextAndIcon(LocaleController.getString("ChannelMembers", R.string.ChannelMembers), R.drawable.msg_groups, logCell != null && logCell.getVisibility() == View.VISIBLE);
membersCell.setTextAndIcon(getString("ChannelMembers", R.string.ChannelMembers), R.drawable.msg_groups, logCell != null && logCell.getVisibility() == View.VISIBLE);
if (currentChat.gigagroup) {
blockCell.setTextAndIcon(LocaleController.getString("ChannelBlacklist", R.string.ChannelBlacklist), R.drawable.msg_chats_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
blockCell.setTextAndIcon(getString("ChannelBlacklist", R.string.ChannelBlacklist), R.drawable.msg_chats_remove, logCell != null && logCell.getVisibility() == View.VISIBLE);
} else {
blockCell.setTextAndIcon(LocaleController.getString("ChannelPermissions", R.string.ChannelPermissions), R.drawable.msg_permissions, true);
blockCell.setTextAndIcon(getString("ChannelPermissions", R.string.ChannelPermissions), R.drawable.msg_permissions, true);
}
}
adminCell.setTextAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), R.drawable.msg_admins, true);
adminCell.setTextAndIcon(getString("ChannelAdministrators", R.string.ChannelAdministrators), R.drawable.msg_admins, true);
}
reactionsCell.setVisibility(ChatObject.canChangeChatInfo(currentChat) ? View.VISIBLE : View.GONE);
updateReactionsCell(animated);
@ -1927,21 +1903,21 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
inviteLinksCell.setVisibility(View.GONE);
} else {
if (info.invitesCount > 0) {
inviteLinksCell.setTextAndValueAndIcon(LocaleController.getString("InviteLinks", R.string.InviteLinks), Integer.toString(info.invitesCount), R.drawable.msg_link2, true);
inviteLinksCell.setTextAndValueAndIcon(getString("InviteLinks", R.string.InviteLinks), Integer.toString(info.invitesCount), R.drawable.msg_link2, true);
} else {
inviteLinksCell.setTextAndValueAndIcon(LocaleController.getString("InviteLinks", R.string.InviteLinks), "1", R.drawable.msg_link2, true);
inviteLinksCell.setTextAndValueAndIcon(getString("InviteLinks", R.string.InviteLinks), "1", R.drawable.msg_link2, true);
}
}
}
if (stickersCell != null && info != null) {
stickersCell.setTextAndValueAndIcon(LocaleController.getString(R.string.GroupStickers), info.stickerset != null ? info.stickerset.title : LocaleController.getString(R.string.Add), R.drawable.msg_sticker, false);
stickersCell.setTextAndValueAndIcon(getString(R.string.GroupStickers), info.stickerset != null ? info.stickerset.title : getString(R.string.Add), R.drawable.msg_sticker, false);
}
}
public void updateColorCell() {
if (colorCell != null) {
colorCell.set(currentChat, (historyCell != null && historyCell.getVisibility() == View.VISIBLE) || (signCell != null && signCell.getVisibility() == View.VISIBLE) || (forumsCell != null && forumsCell.getVisibility() == View.VISIBLE));
colorCell.set(currentChat, (historyCell != null && historyCell.getVisibility() == View.VISIBLE) || (signCell != null && signCell.getVisibility() == View.VISIBLE) || (forumsCell != null && forumsCell.getVisibility() == View.VISIBLE) || ChatObject.isMegagroup(currentChat) && ChatObject.hasAdminRights(currentChat));
}
}
@ -2022,7 +1998,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
boolean isChannelAndNotMegaGroup = ChatObject.isChannelAndNotMegaGroup(currentChat);
String finalString;
if (availableReactions == null || availableReactions instanceof TLRPC.TL_chatReactionsNone) {
finalString = LocaleController.getString("ReactionsOff", R.string.ReactionsOff);
finalString = getString("ReactionsOff", R.string.ReactionsOff);
} else if (availableReactions instanceof TLRPC.TL_chatReactionsSome) {
TLRPC.TL_chatReactionsSome someReactions = (TLRPC.TL_chatReactionsSome) availableReactions;
int count = 0;
@ -2039,16 +2015,16 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
}
}
if (isChannelAndNotMegaGroup) {
finalString = count == 0 ? LocaleController.getString("ReactionsOff", R.string.ReactionsOff) : String.valueOf(count);
finalString = count == 0 ? getString("ReactionsOff", R.string.ReactionsOff) : String.valueOf(count);
} else {
int reacts = Math.min(getMediaDataController().getEnabledReactionsList().size(), count);
finalString = reacts == 0 ? LocaleController.getString("ReactionsOff", R.string.ReactionsOff) :
finalString = reacts == 0 ? getString("ReactionsOff", R.string.ReactionsOff) :
LocaleController.formatString("ReactionsCount", R.string.ReactionsCount, reacts, getMediaDataController().getEnabledReactionsList().size());
}
} else {
finalString = LocaleController.getString("ReactionsAll", R.string.ReactionsAll);
finalString = getString("ReactionsAll", R.string.ReactionsAll);
}
reactionsCell.setTextAndValueAndIcon(LocaleController.getString("Reactions", R.string.Reactions), finalString, animated, R.drawable.msg_reactions2, true);
reactionsCell.setTextAndValueAndIcon(getString("Reactions", R.string.Reactions), finalString, animated, R.drawable.msg_reactions2, true);
}
@Override

View file

@ -4,15 +4,19 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.View;
@ -29,9 +33,14 @@ import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedEmojiDrawable;
import org.telegram.ui.Components.AvatarDrawable;
import org.telegram.ui.Components.CombinedDrawable;
import org.telegram.ui.Components.CounterView;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.Forum.ForumUtilities;
import org.telegram.ui.Components.LetterDrawable;
import org.telegram.ui.Components.StaticLayoutEx;
import java.util.ArrayList;
@ -56,8 +65,10 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
int layout1Width;
int layout2Width;
ImageReceiver imageReceiver = new ImageReceiver();
private final ImageReceiver imageReceiver;
TLRPC.Chat nextChat;
TLRPC.TL_forumTopic nextTopic;
private long lastWidthTopicId = 0L;
AnimatorSet showReleaseAnimator;
@ -74,26 +85,34 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
private final View fragmentView;
public long lastShowingReleaseTime;
boolean recommendedChannel;
boolean drawFolderBackground;
private final boolean isTopic;
Runnable onAnimationFinishRunnable;
public long nextDialogId;
View parentView;
private boolean visibleCounterDrawable = true;
CounterView.CounterDrawable counterDrawable = new CounterView.CounterDrawable(null, true, null);
int params[] = new int[3];
private final int currentAccount;
private final int folderId;
private final int filterId;
private final long topicId;
private final long currentDialog;
private final Theme.ResourcesProvider resourcesProvider;
private AnimatedEmojiDrawable animatedEmojiDrawable;
public ChatPullingDownDrawable(int currentAccount, View fragmentView, long currentDialog, int folderId, int filterId, Theme.ResourcesProvider resourcesProvider) {
public ChatPullingDownDrawable(int currentAccount, View fragmentView, long currentDialog, int folderId, int filterId, long topicId, Theme.ResourcesProvider resourcesProvider) {
this.fragmentView = fragmentView;
this.currentAccount = currentAccount;
this.currentDialog = currentDialog;
this.folderId = folderId;
this.filterId = filterId;
this.topicId = topicId;
this.isTopic = MessagesController.getInstance(currentAccount).isForum(currentDialog);
this.resourcesProvider = resourcesProvider;
this.imageReceiver = new ImageReceiver(fragmentView);
arrowPaint.setStrokeWidth(AndroidUtilities.dpf2(2.8f));
arrowPaint.setStrokeCap(Paint.Cap.ROUND);
@ -109,11 +128,37 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
xRefPaint.setColor(0xff000000);
xRefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
updateDialog();
public void updateDialog(TLRPC.Chat chat) {
if (chat == null) {
updateDialog();
return;
}
nextDialogId = -chat.id;
drawFolderBackground = params[0] == 1;
dialogFolderId = params[1];
dialogFilterId = params[2];
emptyStub = false;
nextChat = chat;
AvatarDrawable avatarDrawable = new AvatarDrawable();
avatarDrawable.setInfo(currentAccount, nextChat);
imageReceiver.setImage(ImageLocation.getForChat(nextChat, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, null, UserConfig.getInstance(0).getCurrentUser(), 0);
MessagesController.getInstance(currentAccount).ensureMessagesLoaded(-chat.id, 0, null);
TLRPC.Dialog dialog = MessagesController.getInstance(currentAccount).getDialog(-chat.id);
final int count = dialog == null ? 0 : dialog.unread_count;
counterDrawable.setCount(count, false);
visibleCounterDrawable = count > 0;
recommendedChannel = true;
nextTopic = null;
}
public void updateDialog() {
recommendedChannel = false;
nextTopic = null;
TLRPC.Dialog dialog = getNextUnreadDialog(currentDialog, folderId, filterId, true, params);
if (dialog != null) {
nextDialogId = dialog.id;
@ -123,13 +168,15 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
emptyStub = false;
nextChat = MessagesController.getInstance(currentAccount).getChat(-dialog.id);
if (nextChat == null) {
MessagesController.getInstance(currentAccount).getChat(dialog.id);
nextChat = MessagesController.getInstance(currentAccount).getChat(dialog.id);
}
AvatarDrawable avatarDrawable = new AvatarDrawable();
avatarDrawable.setInfo(currentAccount, nextChat);
imageReceiver.setImage(ImageLocation.getForChat(nextChat, ImageLocation.TYPE_SMALL), "50_50", avatarDrawable, null, UserConfig.getInstance(0).getCurrentUser(), 0);
MessagesController.getInstance(currentAccount).ensureMessagesLoaded(dialog.id, 0, null);
counterDrawable.setCount(dialog.unread_count, false);
final int count = dialog.unread_count;
counterDrawable.setCount(count, false);
visibleCounterDrawable = count > 0;
} else {
nextChat = null;
drawFolderBackground = false;
@ -137,28 +184,92 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
}
}
public void updateTopic() {
recommendedChannel = false;
drawFolderBackground = false;
nextChat = null;
nextDialogId = 0;
imageReceiver.clearImage();
TLRPC.TL_forumTopic topic = getNextUnreadTopic(-currentDialog);
if (topic != null) {
emptyStub = false;
nextTopic = topic;
Drawable forumIcon;
if (topic.id == 1) {
if (parentView != null && animatedEmojiDrawable != null) {
animatedEmojiDrawable.removeView(parentView);
}
animatedEmojiDrawable = null;
forumIcon = ForumUtilities.createGeneralTopicDrawable(fragmentView.getContext(), 1f, getThemedColor(Theme.key_chat_inMenu), false);
imageReceiver.setImageBitmap(forumIcon);
} else if (topic.icon_emoji_id != 0) {
if (animatedEmojiDrawable == null || animatedEmojiDrawable.getDocumentId() != topic.icon_emoji_id) {
if (animatedEmojiDrawable != null && parentView != null) {
animatedEmojiDrawable.removeView(parentView);
}
animatedEmojiDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_FORUM_TOPIC_LARGE, currentAccount, topic.icon_emoji_id);
animatedEmojiDrawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_serviceText), PorterDuff.Mode.SRC_IN));
}
if (animatedEmojiDrawable != null && parentView != null) {
animatedEmojiDrawable.addView(parentView);
}
imageReceiver.setImageBitmap((Bitmap) null);
} else {
if (parentView != null && animatedEmojiDrawable != null) {
animatedEmojiDrawable.removeView(parentView);
}
animatedEmojiDrawable = null;
forumIcon = ForumUtilities.createTopicDrawable(topic, false);
imageReceiver.setImageBitmap(forumIcon);
}
final int count = topic.unread_count;
counterDrawable.setCount(count, false);
visibleCounterDrawable = count > 0;
} else {
nextTopic = null;
emptyStub = true;
}
}
public void setWidth(int width) {
if (width != lastWidth) {
if (width != lastWidth || (isTopic && nextTopic != null && lastWidthTopicId != nextTopic.id)) {
circleRadius = AndroidUtilities.dp(56) / 2f;
lastWidth = width;
String nameStr = nextChat != null ? nextChat.title : LocaleController.getString("SwipeToGoNextChannelEnd", R.string.SwipeToGoNextChannelEnd);
chatNameWidth = (int) textPaint.measureText(nameStr);
CharSequence nameStr;
if (nextChat != null) {
nameStr = nextChat.title;
} else if (nextTopic != null) {
nameStr = nextTopic.title;
} else if (isTopic) {
String forumName = MessagesController.getInstance(currentAccount).getChat(-currentDialog).title;
nameStr = LocaleController.formatString(R.string.SwipeToGoNextTopicEnd, forumName);
} else {
nameStr = LocaleController.getString(R.string.SwipeToGoNextChannelEnd);
}
chatNameWidth = (int) textPaint.measureText(nameStr, 0, nameStr.length());
chatNameWidth = Math.min(chatNameWidth, lastWidth - AndroidUtilities.dp(60));
chatNameLayout = new StaticLayout(nameStr, textPaint, chatNameWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
chatNameLayout = StaticLayoutEx.createStaticLayout(nameStr, textPaint, chatNameWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false, TextUtils.TruncateAt.END, chatNameWidth, 1);
String str1 = null;
String str2 = null;
if (drawFolderBackground && dialogFolderId != folderId && dialogFolderId != 0) {
str1 = LocaleController.getString("SwipeToGoNextArchive", R.string.SwipeToGoNextArchive);
str2 = LocaleController.getString("ReleaseToGoNextArchive", R.string.ReleaseToGoNextArchive);
if (recommendedChannel) {
str1 = LocaleController.getString(R.string.SwipeToGoNextRecommendedChannel);
str2 = LocaleController.getString(R.string.ReleaseToGoNextRecommendedChannel);
} else if (isTopic) {
str1 = LocaleController.getString(R.string.SwipeToGoNextUnreadTopic);
str2 = LocaleController.getString(R.string.ReleaseToGoNextUnreadTopic);
} else if (drawFolderBackground && dialogFolderId != folderId && dialogFolderId != 0) {
str1 = LocaleController.getString(R.string.SwipeToGoNextArchive);
str2 = LocaleController.getString(R.string.ReleaseToGoNextArchive);
} else if (drawFolderBackground) {
str1 = LocaleController.getString("SwipeToGoNextFolder", R.string.SwipeToGoNextFolder);
str2 = LocaleController.getString("ReleaseToGoNextFolder", R.string.ReleaseToGoNextFolder);
str1 = LocaleController.getString(R.string.SwipeToGoNextFolder);
str2 = LocaleController.getString(R.string.ReleaseToGoNextFolder);
} else {
str1 = LocaleController.getString("SwipeToGoNextChannel", R.string.SwipeToGoNextChannel);
str2 = LocaleController.getString("ReleaseToGoNextChannel", R.string.ReleaseToGoNextChannel);
str1 = LocaleController.getString(R.string.SwipeToGoNextChannel);
str2 = LocaleController.getString(R.string.ReleaseToGoNextChannel);
}
layout1Width = (int) textPaint2.measureText(str1);
layout1Width = Math.min(layout1Width, lastWidth - AndroidUtilities.dp(60));
@ -176,12 +287,20 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
imageReceiver.setRoundRadius((int) (AndroidUtilities.dp(40) / 2f));
counterDrawable.setSize(AndroidUtilities.dp(28), AndroidUtilities.dp(100));
if (isTopic) {
lastWidthTopicId = nextTopic == null ? 0 : nextTopic.id;
}
}
}
public void draw(Canvas canvas, View parent, float progress, float alpha) {
this.parentView = parent;
if (this.parentView != parent) {
this.parentView = parent;
if (animatedEmojiDrawable != null) {
animatedEmojiDrawable.addView(parent);
}
}
counterDrawable.setParent(parent);
int oldAlpha, oldAlpha1, oldAlpha2, oldAlpha3;
float offset = AndroidUtilities.dp(110) * progress;
@ -287,12 +406,21 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
if (!emptyStub && size > 0) {
float top = (-AndroidUtilities.dp(8) - AndroidUtilities.dp2(8) * progress - size) * (1f - swipeToReleaseProgress) + (-offset + AndroidUtilities.dp(4)) * swipeToReleaseProgress + bounceOffset;
imageReceiver.setRoundRadius((int) (size / 2f));
imageReceiver.setImageCoords(cx - size / 2f, top, size, size);
ImageReceiver finalImageReceiver;
if (animatedEmojiDrawable != null && animatedEmojiDrawable.getImageReceiver() != null) {
finalImageReceiver = animatedEmojiDrawable.getImageReceiver();
} else {
finalImageReceiver = imageReceiver;
}
finalImageReceiver.setRoundRadius((int) (size / 2f));
finalImageReceiver.setImageCoords(cx - size / 2f, top, size, size);
if (isTopic && finalImageReceiver.getDrawable() != null && finalImageReceiver.getDrawable() instanceof CombinedDrawable && ((CombinedDrawable) finalImageReceiver.getDrawable()).getIcon() instanceof LetterDrawable) {
((LetterDrawable) ((CombinedDrawable) finalImageReceiver.getDrawable()).getIcon()).scale = progress;
}
if (swipeToReleaseProgress > 0) {
canvas.saveLayerAlpha(imageReceiver.getImageX(), imageReceiver.getImageY(), imageReceiver.getImageX() + imageReceiver.getImageWidth(), imageReceiver.getImageY() + imageReceiver.getImageHeight(), 255, Canvas.ALL_SAVE_FLAG);
imageReceiver.draw(canvas);
if (swipeToReleaseProgress > 0 && visibleCounterDrawable) {
canvas.saveLayerAlpha(finalImageReceiver.getImageX(), finalImageReceiver.getImageY(), finalImageReceiver.getImageX() + finalImageReceiver.getImageWidth(), finalImageReceiver.getImageY() + finalImageReceiver.getImageHeight(), 255, Canvas.ALL_SAVE_FLAG);
finalImageReceiver.draw(canvas);
canvas.scale(swipeToReleaseProgress, swipeToReleaseProgress, cx + AndroidUtilities.dp(12) + counterDrawable.getCenterX(), top - AndroidUtilities.dp(6) + AndroidUtilities.dp(14));
canvas.translate(cx + AndroidUtilities.dp(12), top - AndroidUtilities.dp(6));
counterDrawable.updateBackgroundRect();
@ -306,8 +434,7 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
counterDrawable.draw(canvas);
canvas.restore();
} else {
imageReceiver.draw(canvas);
finalImageReceiver.draw(canvas);
}
}
@ -476,12 +603,18 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
public void onAttach() {
imageReceiver.onAttachedToWindow();
if (animatedEmojiDrawable != null && parentView != null) {
animatedEmojiDrawable.addView(parentView);
}
NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.updateInterfaces);
}
public void onDetach() {
NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.updateInterfaces);
imageReceiver.onDetachedFromWindow();
if (animatedEmojiDrawable != null && parentView != null) {
animatedEmojiDrawable.removeView(parentView);
}
lastProgress = 0;
lastHapticTime = 0;
}
@ -491,7 +624,9 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
if (nextDialogId != 0) {
TLRPC.Dialog dialog = MessagesController.getInstance(currentAccount).dialogs_dict.get(nextDialogId);
if (dialog != null) {
counterDrawable.setCount(dialog.unread_count, true);
final int count = dialog.unread_count;
counterDrawable.setCount(count, true);
visibleCounterDrawable = count > 0;
if (parentView != null) {
parentView.invalidate();
}
@ -568,10 +703,28 @@ public class ChatPullingDownDrawable implements NotificationCenter.NotificationC
return null;
}
private TLRPC.TL_forumTopic getNextUnreadTopic(long currentDialogId) {
ArrayList<TLRPC.TL_forumTopic> topics = MessagesController.getInstance(currentAccount).getTopicsController().getTopics(currentDialogId);
TLRPC.TL_forumTopic nextUnreadTopic = null;
if (topics != null && topics.size() > 1) {
for (int i = 0; i < topics.size(); i++) {
TLRPC.TL_forumTopic topic = topics.get(i);
if (topic.id != topicId && !topic.hidden && topic.unread_count > 0 && (nextUnreadTopic == null || topic.topMessage.date > nextUnreadTopic.topMessage.date)) {
nextUnreadTopic = topic;
}
}
}
return nextUnreadTopic;
}
public long getChatId() {
return nextChat.id;
}
public TLRPC.TL_forumTopic getTopic() {
return nextTopic;
}
public void drawBottomPanel(Canvas canvas, int top, int bottom, int width) {
if (showBottomPanel && progressToBottomPanel != 1f) {
progressToBottomPanel += 16f / 150f;

View file

@ -111,6 +111,7 @@ public class ChatRightsEditActivity extends BaseFragment {
private TLRPC.TL_chatAdminRights myAdminRights;
private TLRPC.TL_chatBannedRights bannedRights;
private TLRPC.TL_chatBannedRights defaultBannedRights;
public boolean banning;
private String currentBannedRights = "";
private String currentRank;
private String initialRank;
@ -595,6 +596,7 @@ public class ChatRightsEditActivity extends BaseFragment {
}
finishFragment();
} else if (currentType == TYPE_BANNED) {
banning = true;
bannedRights = new TLRPC.TL_chatBannedRights();
bannedRights.view_messages = true;
bannedRights.send_media = true;
@ -2067,6 +2069,9 @@ public class ChatRightsEditActivity extends BaseFragment {
bannedRights.send_photos = !enabled;
bannedRights.send_videos = !enabled;
bannedRights.send_stickers = !enabled;
bannedRights.send_gifs = !enabled;
bannedRights.send_games = !enabled;
bannedRights.send_inline = !enabled;
bannedRights.send_audios = !enabled;
bannedRights.send_docs = !enabled;
bannedRights.send_voices = !enabled;

View file

@ -449,7 +449,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente
}
} else if (type == TYPE_ADMIN) {
if (ChatObject.isChannel(currentChat) && currentChat.megagroup && !currentChat.gigagroup && (info == null || info.participants_count <= 200 || !isChannel && info.can_set_stickers)) {
recentActionsRow = rowCount++;
// recentActionsRow = rowCount++;
if (ChatObject.hasAdminRights(currentChat)) {
antiSpamRow = rowCount++;
antiSpamInfoRow = rowCount++;

View file

@ -0,0 +1,397 @@
package org.telegram.ui.Components;
import static org.telegram.messenger.AndroidUtilities.dp;
import static org.telegram.messenger.LocaleController.getString;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import androidx.collection.LongSparseArray;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.DialogObject;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.R;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.CheckBoxCell;
import org.telegram.ui.Components.Premium.boosts.cells.selector.SelectorBtnCell;
import org.telegram.ui.Stories.recorder.ButtonWithCounterView;
import java.util.ArrayList;
public class AdminLogFilterAlert2 extends BottomSheetWithRecyclerListView {
private UniversalAdapter adapter;
private TLRPC.TL_channelAdminLogEventsFilter currentFilter = new TLRPC.TL_channelAdminLogEventsFilter();
private ArrayList<TLRPC.ChannelParticipant> currentAdmins;
private LongSparseArray<TLRPC.User> selectedAdmins;
private boolean isMegagroup;
private final ButtonWithCounterView actionButton;
private final SelectorBtnCell buttonContainer;
public AdminLogFilterAlert2(BaseFragment fragment, TLRPC.TL_channelAdminLogEventsFilter filter, LongSparseArray<TLRPC.User> admins, boolean megagroup) {
super(fragment, false, false);
topPadding = 0.6f;
fixNavigationBar();
setSlidingActionBar();
setShowHandle(true);
if (filter != null) {
currentFilter.join = filter.join;
currentFilter.leave = filter.leave;
currentFilter.invite = filter.invite;
currentFilter.ban = filter.ban;
currentFilter.unban = filter.unban;
currentFilter.kick = filter.kick;
currentFilter.unkick = filter.unkick;
currentFilter.promote = filter.promote;
currentFilter.demote = filter.demote;
currentFilter.info = filter.info;
currentFilter.settings = filter.settings;
currentFilter.pinned = filter.pinned;
currentFilter.edit = filter.edit;
currentFilter.delete = filter.delete;
currentFilter.group_call = filter.group_call;
currentFilter.invites = filter.invites;
} else {
currentFilter.join = true;
currentFilter.leave = true;
currentFilter.invite = true;
currentFilter.ban = true;
currentFilter.unban = true;
currentFilter.kick = true;
currentFilter.unkick = true;
currentFilter.promote = true;
currentFilter.demote = true;
currentFilter.info = true;
currentFilter.settings = true;
currentFilter.pinned = true;
currentFilter.edit = true;
currentFilter.delete = true;
currentFilter.group_call = true;
currentFilter.invites = true;
}
if (admins != null) {
selectedAdmins = admins.clone();
}
isMegagroup = megagroup;
adapter.update(false);
DefaultItemAnimator itemAnimator = new DefaultItemAnimator();
itemAnimator.setSupportsChangeAnimations(false);
itemAnimator.setDelayAnimations(false);
itemAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT);
itemAnimator.setDurations(350);
recyclerListView.setItemAnimator(itemAnimator);
recyclerListView.setOnItemClickListener((view, position, x, y) -> {
onClick(adapter.getItem(position - 1), view, x);
});
buttonContainer = new SelectorBtnCell(getContext(), resourcesProvider, null);
buttonContainer.setClickable(true);
buttonContainer.setOrientation(LinearLayout.VERTICAL);
buttonContainer.setPadding(dp(10), dp(10), dp(10), dp(10));
buttonContainer.setBackgroundColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider));
actionButton = new ButtonWithCounterView(getContext(), resourcesProvider);
actionButton.setText(getString(R.string.EventLogFilterApply), false);
actionButton.setOnClickListener(v -> {
if (currentFilter.join &&
currentFilter.leave &&
currentFilter.invite &&
currentFilter.ban &&
currentFilter.unban &&
currentFilter.kick &&
currentFilter.unkick &&
currentFilter.promote &&
currentFilter.demote &&
currentFilter.info &&
currentFilter.settings &&
currentFilter.pinned &&
currentFilter.edit &&
currentFilter.delete &&
currentFilter.group_call &&
currentFilter.invites) {
currentFilter = null;
}
if (selectedAdmins != null && currentAdmins != null && selectedAdmins.size() >= currentAdmins.size()) {
selectedAdmins = null;
}
delegate.didSelectRights(currentFilter, selectedAdmins);
dismiss();
});
buttonContainer.addView(actionButton, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL));
containerView.addView(buttonContainer, LayoutHelper.createFrameMarginPx(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, backgroundPaddingLeft, 0, backgroundPaddingLeft, 0));
recyclerListView.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, dp(68));
}
@Override
protected CharSequence getTitle() {
return getString(R.string.EventLog);
}
@Override
protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) {
return adapter = new UniversalAdapter(listView, getContext(), currentAccount, 0, true, this::fillItems, resourcesProvider);
}
private final static int FILTER_SECTION_MEMBERS = 2;
private final static int FILTER_NEW_ADMINS = 3;
private final static int FILTER_RESTRICTIONS = 4;
private final static int FILTER_NEW_MEMBERS = 5;
private final static int FILTER_MEMBERS_LEFT = 6;
private final static int FILTER_SECTION_SETTINGS = 7;
private final static int FILTER_INFO = 8;
private final static int FILTER_INVITES = 9;
private final static int FILTER_CALLS = 10;
private final static int FILTER_SECTION_MESSAGES = 11;
private final static int FILTER_DELETE = 12;
private final static int FILTER_EDIT = 13;
private final static int FILTER_PIN = 14;
private final static int BUTTON_ALL_ADMINS = 15;
private boolean sectionMembersExpanded = false;
private boolean sectionSettingsExpanded = false;
private boolean sectionMessagesExpanded = false;
private String getGroupCount(int a) {
switch (a) {
case 0: return (
(currentFilter.promote || currentFilter.demote ? 1 : 0) +
(isMegagroup && (currentFilter.kick || currentFilter.ban || currentFilter.unkick || currentFilter.unban) ? 1 : 0) +
(currentFilter.invite || currentFilter.join ? 1 : 0) +
(currentFilter.leave ? 1 : 0) +
"/" + (isMegagroup ? 4 : 3)
);
case 1: return (
(currentFilter.info || currentFilter.settings ? 1 : 0) +
(currentFilter.invites ? 1 : 0) +
(currentFilter.group_call ? 1 : 0) +
"/3"
);
case 2:
default: return (
(currentFilter.delete ? 1 : 0) +
(currentFilter.edit ? 1 : 0) +
(currentFilter.pinned ? 1 : 0) +
"/3"
);
}
}
private View.OnClickListener getGroupClick(int a) {
return v -> {
saveScrollPosition();
switch (a) {
case 0:
sectionMembersExpanded = !sectionMembersExpanded;
break;
case 1:
sectionSettingsExpanded = !sectionSettingsExpanded;
break;
case 2:
sectionMessagesExpanded = !sectionMessagesExpanded;
break;
}
adapter.update(true);
applyScrolledPosition();
};
}
public void fillItems(ArrayList<UItem> items, UniversalAdapter adapter) {
if (currentFilter == null) return;
items.add(UItem.asHeader(getString(R.string.EventLogFilterByActions)));
items.add(UItem.asRoundGroupCheckbox(FILTER_SECTION_MEMBERS, getString(R.string.EventLogFilterSectionMembers), getGroupCount(0)).setChecked(
currentFilter.promote || currentFilter.demote ||
isMegagroup && (currentFilter.kick || currentFilter.ban || currentFilter.unkick || currentFilter.unban) ||
currentFilter.invite || currentFilter.join ||
currentFilter.leave
).setCollapsed(!sectionMembersExpanded).setClickCallback(getGroupClick(0)));
if (sectionMembersExpanded) {
items.add(UItem.asRoundCheckbox(FILTER_NEW_ADMINS, getString(R.string.EventLogFilterSectionAdmin)).pad().setChecked(currentFilter.promote || currentFilter.demote));
if (isMegagroup) {
items.add(UItem.asRoundCheckbox(FILTER_RESTRICTIONS, getString(R.string.EventLogFilterNewRestrictions)).pad().setChecked(currentFilter.kick || currentFilter.ban || currentFilter.unkick || currentFilter.unban));
}
items.add(UItem.asRoundCheckbox(FILTER_NEW_MEMBERS, getString(R.string.EventLogFilterNewMembers)).pad().setChecked(currentFilter.invite || currentFilter.join));
items.add(UItem.asRoundCheckbox(FILTER_MEMBERS_LEFT, getString(R.string.EventLogFilterLeavingMembers2)).pad().setChecked(currentFilter.leave));
}
items.add(UItem.asRoundGroupCheckbox(FILTER_SECTION_SETTINGS, getString(isMegagroup ? R.string.EventLogFilterSectionGroupSettings : R.string.EventLogFilterSectionChannelSettings), getGroupCount(1)).setChecked(
currentFilter.info || currentFilter.settings ||
currentFilter.invites ||
currentFilter.group_call
).setCollapsed(!sectionSettingsExpanded).setClickCallback(getGroupClick(1)));
if (sectionSettingsExpanded) {
items.add(UItem.asRoundCheckbox(FILTER_INFO, getString(isMegagroup ? R.string.EventLogFilterGroupInfo : R.string.EventLogFilterChannelInfo)).pad().setChecked(currentFilter.info || currentFilter.settings));
items.add(UItem.asRoundCheckbox(FILTER_INVITES, getString(R.string.EventLogFilterInvites)).pad().setChecked(currentFilter.invites));
items.add(UItem.asRoundCheckbox(FILTER_CALLS, getString(R.string.EventLogFilterCalls)).pad().setChecked(currentFilter.group_call));
}
items.add(UItem.asRoundGroupCheckbox(FILTER_SECTION_MESSAGES, getString(R.string.EventLogFilterSectionMessages), getGroupCount(2)).setChecked(
currentFilter.delete || currentFilter.edit || currentFilter.pinned
).setCollapsed(!sectionMessagesExpanded).setClickCallback(getGroupClick(2)));
if (sectionMessagesExpanded) {
items.add(UItem.asRoundCheckbox(FILTER_DELETE, getString(R.string.EventLogFilterDeletedMessages)).pad().setChecked(currentFilter.delete));
items.add(UItem.asRoundCheckbox(FILTER_EDIT, getString(R.string.EventLogFilterEditedMessages)).pad().setChecked(currentFilter.edit));
items.add(UItem.asRoundCheckbox(FILTER_PIN, getString(R.string.EventLogFilterPinnedMessages)).pad().setChecked(currentFilter.pinned));
}
items.add(UItem.asShadow(null));
items.add(UItem.asHeader(getString(R.string.EventLogFilterByAdmins)));
items.add(UItem.asRoundCheckbox(BUTTON_ALL_ADMINS, getString(R.string.EventLogFilterByAdminsAll)).setChecked((selectedAdmins == null ? 0 : selectedAdmins.size()) >= (currentAdmins == null ? 0 : currentAdmins.size())));
if (currentAdmins != null) {
for (int i = 0; i < currentAdmins.size(); ++i) {
TLRPC.ChannelParticipant admin = currentAdmins.get(i);
final long did = DialogObject.getPeerDialogId(admin.peer);
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(did);
items.add(UItem.asUserCheckbox(-1 - i, user).pad().setChecked(selectedAdmins != null && selectedAdmins.containsKey(did)));
}
}
}
public void onClick(UItem item, View view, float x) {
if (item == null) return;
if (item.viewType == UniversalAdapter.VIEW_TYPE_ROUND_GROUP_CHECKBOX || item.viewType == UniversalAdapter.VIEW_TYPE_ROUND_CHECKBOX) {
saveScrollPosition();
final boolean clickedGroupExpand = item.viewType == UniversalAdapter.VIEW_TYPE_ROUND_GROUP_CHECKBOX && (LocaleController.isRTL ? x < view.getMeasuredWidth() - dp(60) : x > dp(60));
CheckBoxCell cell = (CheckBoxCell) view;
if (!clickedGroupExpand) {
cell.setChecked(!cell.isChecked(), true);
}
switch (item.id) {
case FILTER_SECTION_MEMBERS:
if (clickedGroupExpand) {
sectionMembersExpanded = !sectionMembersExpanded;
} else {
currentFilter.promote = currentFilter.demote = currentFilter.invite = currentFilter.join = currentFilter.leave = cell.isChecked();
if (isMegagroup) {
currentFilter.kick = currentFilter.ban = currentFilter.unkick = currentFilter.unban = cell.isChecked();
}
}
break;
case FILTER_NEW_ADMINS:
currentFilter.promote = currentFilter.demote = cell.isChecked();
break;
case FILTER_RESTRICTIONS:
currentFilter.kick = currentFilter.ban = currentFilter.unkick = currentFilter.unban = cell.isChecked();
break;
case FILTER_NEW_MEMBERS:
currentFilter.invite = currentFilter.join = cell.isChecked();
break;
case FILTER_MEMBERS_LEFT:
currentFilter.leave = cell.isChecked();
break;
case FILTER_SECTION_SETTINGS:
if (clickedGroupExpand) {
sectionSettingsExpanded = !sectionSettingsExpanded;
} else {
currentFilter.info = currentFilter.settings = currentFilter.invites = currentFilter.group_call = cell.isChecked();
}
break;
case FILTER_INFO:
currentFilter.info = currentFilter.settings = cell.isChecked();
break;
case FILTER_INVITES:
currentFilter.invites = cell.isChecked();
break;
case FILTER_CALLS:
currentFilter.group_call = cell.isChecked();
break;
case FILTER_SECTION_MESSAGES:
if (clickedGroupExpand) {
sectionMessagesExpanded = !sectionMessagesExpanded;
} else {
currentFilter.delete = currentFilter.edit = currentFilter.pinned = cell.isChecked();
}
break;
case FILTER_DELETE:
currentFilter.delete = cell.isChecked();
break;
case FILTER_EDIT:
currentFilter.edit = cell.isChecked();
break;
case FILTER_PIN:
currentFilter.pinned = cell.isChecked();
break;
case BUTTON_ALL_ADMINS:
if (selectedAdmins == null) {
selectedAdmins = new LongSparseArray<>();
}
selectedAdmins.clear();
if (cell.isChecked() && currentAdmins != null) {
for (TLRPC.ChannelParticipant admin : currentAdmins) {
final long did = DialogObject.getPeerDialogId(admin.peer);
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(did);
selectedAdmins.put(did, user);
}
}
break;
}
adapter.update(true);
}
if (item.id < 0) {
CheckBoxCell cell = (CheckBoxCell) view;
int index = (-item.id) - 1;
if (index < 0 || index >= currentAdmins.size()) return;
TLRPC.ChannelParticipant admin = currentAdmins.get(index);
final long did = DialogObject.getPeerDialogId(admin.peer);
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(did);
if (selectedAdmins == null) {
selectedAdmins = new LongSparseArray<>();
}
if (selectedAdmins.containsKey(did)) {
selectedAdmins.remove(did);
cell.setChecked(false, true);
} else {
selectedAdmins.put(did, user);
cell.setChecked(true, true);
}
adapter.update(true);
}
}
public void setCurrentAdmins(ArrayList<TLRPC.ChannelParticipant> admins) {
currentAdmins = admins;
if (currentAdmins != null && selectedAdmins == null) {
selectedAdmins = new LongSparseArray<>();
for (TLRPC.ChannelParticipant admin : currentAdmins) {
final long did = DialogObject.getPeerDialogId(admin.peer);
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(did);
selectedAdmins.put(did, user);
}
}
if (adapter != null) {
adapter.update(true);
}
}
private AdminLogFilterAlertDelegate delegate;
public interface AdminLogFilterAlertDelegate {
void didSelectRights(
TLRPC.TL_channelAdminLogEventsFilter filter,
LongSparseArray<TLRPC.User> admins
);
}
public void setAdminLogFilterAlertDelegate(AdminLogFilterAlertDelegate adminLogFilterAlertDelegate) {
delegate = adminLogFilterAlertDelegate;
}
@Override
protected void onSmoothContainerViewLayout(float ty) {
super.onSmoothContainerViewLayout(ty);
buttonContainer.setTranslationY(-ty);
}
@Override
protected boolean canDismissWithSwipe() {
return !recyclerListView.canScrollVertically(-1);
}
}

View file

@ -9,7 +9,6 @@
package org.telegram.ui.Components;
import static org.telegram.messenger.AndroidUtilities.dp;
import static org.telegram.messenger.LocaleController.formatDateOnline;
import static org.telegram.messenger.LocaleController.getString;
import android.Manifest;
@ -47,11 +46,9 @@ import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.URLSpan;
import android.util.Base64;
import android.util.Log;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
@ -136,8 +133,13 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class AlertsCreator {
public final static int PERMISSIONS_REQUEST_TOP_ICON_SIZE = 72;
@ -973,7 +975,7 @@ public class AlertsCreator {
return;
}
boolean enabled;
boolean defaultEnabled = NotificationsController.getInstance(currentAccount).isGlobalNotificationsEnabled(did);
boolean defaultEnabled = NotificationsController.getInstance(currentAccount).isGlobalNotificationsEnabled(did, false, false);
String[] descriptions = new String[]{
LocaleController.getString("NotificationsTurnOn", R.string.NotificationsTurnOn),
@ -3733,6 +3735,7 @@ public class AlertsCreator {
if (addPrivacyText != null) {
FrameLayout frameLayout = new FrameLayout(context);
LinkSpanDrawable.LinksTextView textView = new LinkSpanDrawable.LinksTextView(context);
textView.setPadding(dp(8), 0, dp(8), 0);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
textView.setTextColor(Theme.getColor(Theme.key_dialogTextGray2, resourcesProvider));
textView.setLinkTextColor(Theme.getColor(Theme.key_chat_messageLinkIn, resourcesProvider));
@ -3763,7 +3766,7 @@ public class AlertsCreator {
bottomSheetParams.transitionFromLeft = true;
bottomSheetParams.allowNestedScroll = false;
fragment.showAsSheet(new PrivacyControlActivity(PrivacyControlActivity.PRIVACY_RULES_TYPE_BIRTHDAY), bottomSheetParams);
}), true));
}), true, dp(8f / 3f), dp(.66f)));
};
setText.run();
@ -5182,6 +5185,8 @@ public class AlertsCreator {
currentColor = preferences.getInt("GroupLed", 0xff0000ff);
} else if (globalType == NotificationsController.TYPE_STORIES) {
currentColor = preferences.getInt("StoriesLed", 0xff0000ff);
} else if (globalType == NotificationsController.TYPE_REACTIONS_STORIES || globalType == NotificationsController.TYPE_REACTIONS_MESSAGES) {
currentColor = preferences.getInt("ReactionsLed", 0xff0000ff);
} else {
currentColor = preferences.getInt("ChannelLed", 0xff0000ff);
}
@ -5229,6 +5234,8 @@ public class AlertsCreator {
editor.putInt("GroupLed", selectedColor[0]);
} else if (globalType == NotificationsController.TYPE_STORIES) {
editor.putInt("StoriesLed", selectedColor[0]);
} else if (globalType == NotificationsController.TYPE_REACTIONS_STORIES || globalType == NotificationsController.TYPE_REACTIONS_MESSAGES) {
editor.putInt("ReactionLed", selectedColor[0]);
} else {
editor.putInt("ChannelLed", selectedColor[0]);
}
@ -5250,6 +5257,8 @@ public class AlertsCreator {
editor.putInt("GroupLed", 0);
} else if (globalType == NotificationsController.TYPE_STORIES) {
editor.putInt("StoriesLed", 0);
} else if (globalType == NotificationsController.TYPE_REACTIONS_STORIES || globalType == NotificationsController.TYPE_REACTIONS_MESSAGES) {
editor.putInt("ReactionsLed", 0);
} else {
editor.putInt("ChannelLed", 0);
}
@ -5368,6 +5377,8 @@ public class AlertsCreator {
NotificationsController.getInstance(UserConfig.selectedAccount).deleteNotificationChannelGlobal(NotificationsController.TYPE_CHANNEL);
} else if (prefKeyPrefix.equals("vibrate_group")) {
NotificationsController.getInstance(UserConfig.selectedAccount).deleteNotificationChannelGlobal(NotificationsController.TYPE_GROUP);
} else if (prefKeyPrefix.equals("vibrate_react")) {
NotificationsController.getInstance(UserConfig.selectedAccount).deleteNotificationChannelGlobal(NotificationsController.TYPE_REACTIONS_MESSAGES);
} else {
NotificationsController.getInstance(UserConfig.selectedAccount).deleteNotificationChannelGlobal(NotificationsController.TYPE_PRIVATE);
}
@ -5385,32 +5396,37 @@ public class AlertsCreator {
return builder.create();
}
public static Dialog createLocationUpdateDialog(final Activity parentActivity, TLRPC.User user, final MessagesStorage.IntCallback callback, Theme.ResourcesProvider resourcesProvider) {
public static Dialog createLocationUpdateDialog(final Activity parentActivity, boolean expand, TLRPC.User user, final MessagesStorage.IntCallback callback, Theme.ResourcesProvider resourcesProvider) {
final int[] selected = new int[1];
String[] descriptions = new String[]{
LocaleController.getString("SendLiveLocationFor15m", R.string.SendLiveLocationFor15m),
LocaleController.getString("SendLiveLocationFor1h", R.string.SendLiveLocationFor1h),
LocaleController.getString("SendLiveLocationFor8h", R.string.SendLiveLocationFor8h),
getString(R.string.SendLiveLocationFor15m),
getString(R.string.SendLiveLocationFor1h),
getString(R.string.SendLiveLocationFor8h),
getString(R.string.SendLiveLocationForever)
};
final LinearLayout linearLayout = new LinearLayout(parentActivity);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setPadding(0, 0, 0, dp(4));
TextView titleTextView = new TextView(parentActivity);
if (user != null) {
titleTextView.setText(LocaleController.formatString("LiveLocationAlertPrivate", R.string.LiveLocationAlertPrivate, UserObject.getFirstName(user)));
if (expand) {
titleTextView.setText(LocaleController.getString(R.string.LiveLocationAlertExpandMessage));
} else if (user != null) {
titleTextView.setText(LocaleController.formatString(R.string.LiveLocationAlertPrivate, UserObject.getFirstName(user)));
} else {
titleTextView.setText(LocaleController.getString("LiveLocationAlertGroup", R.string.LiveLocationAlertGroup));
titleTextView.setText(LocaleController.getString(R.string.LiveLocationAlertGroup));
}
int textColor = resourcesProvider != null ? resourcesProvider.getColorOrDefault(Theme.key_dialogTextBlack) : Theme.getColor(Theme.key_dialogTextBlack);
titleTextView.setTextColor(textColor);
titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
titleTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
linearLayout.addView(titleTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 0, 24, 8));
linearLayout.addView(titleTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, (expand ? 4 : 0), 24, 8));
for (int a = 0; a < descriptions.length; a++) {
RadioColorCell cell = new RadioColorCell(parentActivity, resourcesProvider);
cell.heightDp = 42;
cell.setPadding(dp(4), 0, dp(4), 0);
cell.setTag(a);
int color1 = resourcesProvider != null ? resourcesProvider.getColorOrDefault(Theme.key_radioBackground) : Theme.getColor(Theme.key_radioBackground);
@ -5431,8 +5447,12 @@ public class AlertsCreator {
});
}
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity, resourcesProvider);
int topImageColor = resourcesProvider != null ? resourcesProvider.getColorOrDefault(Theme.key_dialogTopBackground) : Theme.getColor(Theme.key_dialogTopBackground);
builder.setTopImage(new ShareLocationDrawable(parentActivity, 0), topImageColor);
if (expand) {
builder.setTitle(getString(R.string.LiveLocationAlertExpandTitle));
} else {
int topImageColor = resourcesProvider != null ? resourcesProvider.getColorOrDefault(Theme.key_dialogTopBackground) : Theme.getColor(Theme.key_dialogTopBackground);
builder.setTopImage(new ShareLocationDrawable(parentActivity, 0), topImageColor);
}
builder.setView(linearLayout);
builder.setPositiveButton(LocaleController.getString("ShareFile", R.string.ShareFile), (dialog, which) -> {
int time;
@ -5440,8 +5460,10 @@ public class AlertsCreator {
time = 15 * 60;
} else if (selected[0] == 1) {
time = 60 * 60;
} else {
} else if (selected[0] == 2) {
time = 8 * 60 * 60;
} else {
time = 0x7FFFFFFF;
}
callback.run(time);
});
@ -5672,6 +5694,8 @@ public class AlertsCreator {
selected[0] = preferences.getInt("priority_channel", 1);
} else if (globalType == NotificationsController.TYPE_STORIES) {
selected[0] = preferences.getInt("priority_stories", 1);
} else if (globalType == NotificationsController.TYPE_REACTIONS_MESSAGES || globalType == NotificationsController.TYPE_REACTIONS_STORIES) {
selected[0] = preferences.getInt("priority_react", 1);
}
if (selected[0] == 4) {
selected[0] = 0;
@ -5744,6 +5768,9 @@ public class AlertsCreator {
} else if (globalType == NotificationsController.TYPE_STORIES) {
editor.putInt("priority_stories", option);
selected[0] = preferences.getInt("priority_stories", 1);
} else if (globalType == NotificationsController.TYPE_REACTIONS_MESSAGES || globalType == NotificationsController.TYPE_REACTIONS_STORIES) {
editor.putInt("priority_react", option);
selected[0] = preferences.getInt("priority_react", 1);
}
NotificationsController.getInstance(UserConfig.selectedAccount).deleteNotificationChannelGlobal(globalType);
}
@ -5945,7 +5972,7 @@ public class AlertsCreator {
void didPressedNewCard();
}
public static void createDeleteMessagesAlert(BaseFragment fragment, TLRPC.User user, TLRPC.Chat chat, TLRPC.EncryptedChat encryptedChat, TLRPC.ChatFull chatInfo, long mergeDialogId, MessageObject selectedMessage, SparseArray<MessageObject>[] selectedMessages, MessageObject.GroupedMessages selectedGroup, int topicId, int mode, int loadParticipant, Runnable onDelete, Runnable hideDim, Theme.ResourcesProvider resourcesProvider) {
public static void createDeleteMessagesAlert(BaseFragment fragment, TLRPC.User user, TLRPC.Chat chat, TLRPC.EncryptedChat encryptedChat, TLRPC.ChatFull chatInfo, long mergeDialogId, MessageObject selectedMessage, SparseArray<MessageObject>[] selectedMessages, MessageObject.GroupedMessages selectedGroup, int topicId, int mode, TLRPC.ChannelParticipant[] channelParticipants, Runnable onDelete, Runnable hideDim, Theme.ResourcesProvider resourcesProvider) {
final boolean scheduled = mode == ChatActivity.MODE_SCHEDULED;
final boolean isSavedMessages = mode == ChatActivity.MODE_SAVED;
final boolean quickReplies = mode == ChatActivity.MODE_QUICK_REPLIES;
@ -5994,10 +6021,7 @@ public class AlertsCreator {
}
}
final boolean[] checks = new boolean[3];
final boolean[] deleteForAll = new boolean[1];
TLRPC.User actionUser = null;
TLRPC.Chat actionChat = null;
boolean canRevokeInbox = user != null && MessagesController.getInstance(currentAccount).canRevokePmInbox;
int revokeTimeLimit;
if (user != null) {
@ -6010,18 +6034,16 @@ public class AlertsCreator {
int myMessagesCount = 0;
boolean canDeleteInbox = encryptedChat == null && user != null && canRevokeInbox && revokeTimeLimit == 0x7fffffff;
if (chat != null && chat.megagroup && !scheduled && !isSavedMessages) {
boolean canBan = ChatObject.canBlockUsers(chat);
ArrayList<MessageObject> messages = new ArrayList<>();
if (selectedMessage != null) {
if (selectedMessage.messageOwner.action == null || selectedMessage.messageOwner.action instanceof TLRPC.TL_messageActionEmpty ||
selectedMessage.messageOwner.action instanceof TLRPC.TL_messageActionChatDeleteUser ||
selectedMessage.messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByLink ||
selectedMessage.messageOwner.action instanceof TLRPC.TL_messageActionChatAddUser) {
if (selectedMessage.messageOwner.from_id.user_id != 0) {
actionUser = MessagesController.getInstance(currentAccount).getUser(selectedMessage.messageOwner.from_id.user_id);
} else if (selectedMessage.messageOwner.from_id.channel_id != 0) {
actionChat = MessagesController.getInstance(currentAccount).getChat(selectedMessage.messageOwner.from_id.channel_id);
} else if (selectedMessage.messageOwner.from_id.chat_id != 0) {
actionChat = MessagesController.getInstance(currentAccount).getChat(selectedMessage.messageOwner.from_id.chat_id);
if (selectedGroup != null) {
messages.addAll(selectedGroup.messages);
} else {
messages.add(selectedMessage);
}
}
boolean hasOutgoing = !selectedMessage.isSendError() && selectedMessage.getDialogId() == mergeDialogId && (selectedMessage.messageOwner.action == null || selectedMessage.messageOwner.action instanceof TLRPC.TL_messageActionEmpty) && selectedMessage.isOut() && (currentDate - selectedMessage.messageOwner.date) <= revokeTimeLimit;
@ -6029,23 +6051,6 @@ public class AlertsCreator {
myMessagesCount++;
}
} else {
long from_id = -1;
for (int a = 1; a >= 0; a--) {
long channelId = 0;
for (int b = 0; b < selectedMessages[a].size(); b++) {
MessageObject msg = selectedMessages[a].valueAt(b);
if (from_id == -1) {
from_id = msg.getFromChatId();
}
if (from_id < 0 || from_id != msg.getSenderId()) {
from_id = -2;
break;
}
}
if (from_id == -2) {
break;
}
}
for (int a = 1; a >= 0; a--) {
for (int b = 0; b < selectedMessages[a].size(); b++) {
MessageObject msg = selectedMessages[a].valueAt(b);
@ -6056,77 +6061,97 @@ public class AlertsCreator {
}
}
}
messages.add(msg);
}
}
if (from_id != -1) {
actionUser = MessagesController.getInstance(currentAccount).getUser(from_id);
}
}
if ((actionUser != null && actionUser.id != UserConfig.getInstance(currentAccount).getClientUserId()) || (actionChat != null && !ChatObject.hasAdminRights(actionChat))) {
if (loadParticipant == 1 && !chat.creator && actionUser != null) {
long clientUserId = UserConfig.getInstance(currentAccount).getClientUserId();
ArrayList<TLObject> actionParticipants = messages
.stream()
.mapToLong(MessageObject::getFromChatId)
.distinct()
.mapToObj(fromId -> {
if (fromId > 0) {
return MessagesController.getInstance(currentAccount).getUser(fromId);
} else {
return MessagesController.getInstance(currentAccount).getChat(-fromId);
}
})
.filter(Objects::nonNull)
.filter(userOrChat -> {
if (userOrChat instanceof TLRPC.User) {
TLRPC.User user1 = (TLRPC.User) userOrChat;
return user1.id != clientUserId;
} else if (userOrChat instanceof TLRPC.Chat) {
TLRPC.Chat chat1 = (TLRPC.Chat) userOrChat;
return !ChatObject.hasAdminRights(chat1);
}
return false;
})
.collect(Collectors.toCollection(ArrayList::new));
if (!actionParticipants.isEmpty()) {
if (channelParticipants == null) {
final AlertDialog[] progressDialog = new AlertDialog[]{new AlertDialog(activity, AlertDialog.ALERT_TYPE_SPINNER)};
TLRPC.TL_channels_getParticipant req = new TLRPC.TL_channels_getParticipant();
req.channel = MessagesController.getInputChannel(chat);
req.participant = MessagesController.getInputPeer(actionUser);
int requestId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
try {
progressDialog[0].dismiss();
} catch (Throwable ignore) {
final int participantCount = actionParticipants.size();
TLRPC.ChannelParticipant[] channelParticipantsLoad = new TLRPC.ChannelParticipant[participantCount];
int[] requestIds = new int[participantCount];
int[] responseCounter = new int[1];
}
progressDialog[0] = null;
int loadType = 2;
if (response != null) {
TLRPC.TL_channels_channelParticipant participant = (TLRPC.TL_channels_channelParticipant) response;
if (!(participant.participant instanceof TLRPC.TL_channelParticipantAdmin || participant.participant instanceof TLRPC.TL_channelParticipantCreator)) {
loadType = 0;
for (int i = 0; i < participantCount; i++) {
TLRPC.TL_channels_getParticipant req = new TLRPC.TL_channels_getParticipant();
req.channel = MessagesController.getInputChannel(chat);
req.participant = MessagesController.getInputPeer(actionParticipants.get(i));
final int index = i;
requestIds[i] = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
responseCounter[0]++;
requestIds[index] = 0;
if (response != null) {
TLRPC.TL_channels_channelParticipant participant = (TLRPC.TL_channels_channelParticipant) response;
channelParticipantsLoad[index] = participant.participant;
}
} else if (error != null && "USER_NOT_PARTICIPANT".equals(error.text)) {
loadType = 0;
}
createDeleteMessagesAlert(fragment, user, chat, encryptedChat, chatInfo, mergeDialogId, selectedMessage, selectedMessages, selectedGroup, topicId, mode, loadType, onDelete, hideDim, resourcesProvider);
}));
if (responseCounter[0] == participantCount) {
try {
progressDialog[0].dismiss();
} catch (Throwable ignore) {
}
progressDialog[0] = null;
createDeleteMessagesAlert(fragment, user, chat, encryptedChat, chatInfo, mergeDialogId, selectedMessage, selectedMessages, selectedGroup, topicId, mode, channelParticipantsLoad, onDelete, hideDim, resourcesProvider);
}
}));
}
AndroidUtilities.runOnUIThread(() -> {
if (progressDialog[0] == null) {
return;
}
progressDialog[0].setOnCancelListener(dialog -> ConnectionsManager.getInstance(currentAccount).cancelRequest(requestId, true));
progressDialog[0].setOnCancelListener(dialog -> {
for (int requestId : requestIds) {
if (requestId != 0) {
ConnectionsManager.getInstance(currentAccount).cancelRequest(requestId, true);
}
}
if (hideDim != null) {
hideDim.run();
}
});
fragment.showDialog(progressDialog[0]);
}, 1000);
return;
}
FrameLayout frameLayout = new FrameLayout(activity);
int num = 0;
String name = actionUser != null ? ContactsController.formatName(actionUser.first_name, actionUser.last_name) : actionChat.title;
for (int a = 0; a < 3; a++) {
if ((loadParticipant == 2 || !canBan) && a == 0) {
continue;
}
CheckBoxCell cell = new CheckBoxCell(activity, 1, resourcesProvider);
cell.setBackgroundDrawable(Theme.getSelectorDrawable(false));
cell.setTag(a);
if (a == 0) {
cell.setText(LocaleController.getString("DeleteBanUser", R.string.DeleteBanUser), "", false, false);
} else if (a == 1) {
cell.setText(LocaleController.getString("DeleteReportSpam", R.string.DeleteReportSpam), "", false, false);
} else {
cell.setText(LocaleController.formatString("DeleteAllFrom", R.string.DeleteAllFrom, name), "", false, false);
}
cell.setPadding(LocaleController.isRTL ? dp(16) : dp(8), 0, LocaleController.isRTL ? dp(8) : dp(16), 0);
frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT, 0, 48 * num, 0, 0));
cell.setOnClickListener(v -> {
if (!v.isEnabled()) {
return;
}
CheckBoxCell cell13 = (CheckBoxCell) v;
Integer num1 = (Integer) cell13.getTag();
checks[num1] = !checks[num1];
cell13.setChecked(checks[num1], true);
DeleteMessagesBottomSheet deleteMessagesBottomSheet = new DeleteMessagesBottomSheet(fragment, chat, messages, actionParticipants, channelParticipants, mergeDialogId, topicId, mode, onDelete);
if (hideDim != null) {
deleteMessagesBottomSheet.setOnHideListener(i -> {
hideDim.run();
});
num++;
}
builder.setView(frameLayout);
deleteMessagesBottomSheet.show();
return;
} else if (!hasNotOut && myMessagesCount > 0 && hasNonDiceMessages) {
hasDeleteForAllCheck = true;
FrameLayout frameLayout = new FrameLayout(activity);
@ -6146,8 +6171,6 @@ public class AlertsCreator {
});
builder.setView(frameLayout);
builder.setCustomViewOffset(9);
} else {
actionUser = null;
}
} else if (!scheduled && !isSavedMessages && !ChatObject.isChannel(chat) && encryptedChat == null) {
if (user != null && user.id != UserConfig.getInstance(currentAccount).getClientUserId() && (!user.bot || user.support) || chat != null) {
@ -6209,8 +6232,6 @@ public class AlertsCreator {
builder.setCustomViewOffset(9);
}
}
final TLRPC.User userFinal = actionUser;
final TLRPC.Chat chatFinal = actionChat;
DialogInterface.OnClickListener deleteAction = (dialogInterface, i) -> {
ArrayList<Integer> ids = null;
@ -6239,6 +6260,9 @@ public class AlertsCreator {
random_ids.add(selectedMessage.messageOwner.random_id);
}
}
if (mergeDialogId != 0 && selectedMessage.messageOwner.peer_id != null && selectedMessage.messageOwner.peer_id.chat_id == -mergeDialogId) {
thisDialogId = mergeDialogId;
}
MessagesController.getInstance(currentAccount).deleteMessages(ids, random_ids, encryptedChat, thisDialogId, topicId, deleteForAll[0], mode);
} else {
for (int a = 1; a >= 0; a--) {
@ -6256,31 +6280,10 @@ public class AlertsCreator {
}
}
}
MessagesController.getInstance(currentAccount).deleteMessages(ids, random_ids, encryptedChat, thisDialogId, topicId, deleteForAll[0], mode);
MessagesController.getInstance(currentAccount).deleteMessages(ids, random_ids, encryptedChat, (a == 1 && mergeDialogId != 0) ? mergeDialogId : thisDialogId, topicId, deleteForAll[0], mode);
selectedMessages[a].clear();
}
}
if (userFinal != null || chatFinal != null) {
if (checks[0]) {
MessagesController.getInstance(currentAccount).deleteParticipantFromChat(chat.id, userFinal, chatFinal, false, false);
}
if (checks[1]) {
TLRPC.TL_channels_reportSpam req = new TLRPC.TL_channels_reportSpam();
req.channel = MessagesController.getInputChannel(chat);
if (userFinal != null) {
req.participant = MessagesController.getInputPeer(userFinal);
} else {
req.participant = MessagesController.getInputPeer(chatFinal);
}
req.id = ids;
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> {
});
}
if (checks[2]) {
MessagesController.getInstance(currentAccount).deleteUserChannelHistory(chat, userFinal, chatFinal, 0);
}
}
if (onDelete != null) {
onDelete.run();
}
@ -6839,11 +6842,7 @@ public class AlertsCreator {
public static ActionBarPopupWindow showPopupMenu(ActionBarPopupWindow.ActionBarPopupWindowLayout popupLayout, View anchorView, int offsetX, int offsetY) {
Rect rect = new Rect();
ActionBarPopupWindow popupWindow = new ActionBarPopupWindow(popupLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT);
if (Build.VERSION.SDK_INT >= 19) {
popupWindow.setAnimationStyle(0);
} else {
popupWindow.setAnimationStyle(R.style.PopupAnimation);
}
popupWindow.setAnimationStyle(R.style.PopupAnimation);
popupWindow.setAnimationEnabled(true);
@ -6866,7 +6865,8 @@ public class AlertsCreator {
popupWindow.showAsDropDown(anchorView, offsetX, offsetY);
popupLayout.updateRadialSelectors();
popupWindow.startAnimation();
// popupWindow.startAnimation();
ActionBarPopupWindow.startAnimation(popupLayout);
popupLayout.setOnTouchListener((v, event) -> {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {

Some files were not shown because too many files have changed in this diff Show more