Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Viewing giveaway messages #523

Merged
merged 41 commits into from
Jan 12, 2024
Merged
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
3eef115
Update
Arseny271 Dec 29, 2023
56cdfea
Update
Arseny271 Dec 29, 2023
09157da
Update tdlib
Arseny271 Dec 30, 2023
7119c48
Update
Arseny271 Dec 30, 2023
f40118b
Update
Arseny271 Dec 30, 2023
bad683e
Update
Arseny271 Dec 30, 2023
353e427
Update
Arseny271 Dec 31, 2023
3a20382
Merge branch 'main' into giveaways
Arseny271 Dec 31, 2023
2571d18
Update TGMessage.java
Arseny271 Dec 31, 2023
966d024
Update
Arseny271 Dec 31, 2023
95e25f7
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 1, 2024
1a7b623
Update
Arseny271 Jan 1, 2024
0d9495a
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 2, 2024
e6bd25b
Touch fix In Text
Arseny271 Jan 2, 2024
90d4b13
Update
Arseny271 Jan 2, 2024
c552bcd
Update
Arseny271 Jan 2, 2024
f6f33a6
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 3, 2024
089a0c4
Update
Arseny271 Jan 3, 2024
e5b30f5
Update
Arseny271 Jan 4, 2024
e7f9966
Update
Arseny271 Jan 4, 2024
4d3f016
Update
Arseny271 Jan 4, 2024
3ad24e3
Update BubbleWrapView.java
Arseny271 Jan 4, 2024
d51dcae
Update
Arseny271 Jan 4, 2024
0a3aa41
Update BubbleWrapView2.java
Arseny271 Jan 4, 2024
981a848
Update
Arseny271 Jan 4, 2024
558a4f6
Update
Arseny271 Jan 4, 2024
af2e753
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 5, 2024
1945794
Update
Arseny271 Jan 5, 2024
b4bf62b
Crashfix
Arseny271 Jan 7, 2024
e59aa7e
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 7, 2024
aa508b0
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 7, 2024
f3ec95e
Update TGMessageSticker.java
Arseny271 Jan 8, 2024
aaf89d1
Update
Arseny271 Jan 8, 2024
d991c09
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 9, 2024
7ca7df0
Bugfix
Arseny271 Jan 9, 2024
8da69be
Update GiftParticlesDrawable.java
Arseny271 Jan 9, 2024
e87e8d1
Merge branch 'TGX-Android:main' into giveaways
Arseny271 Jan 10, 2024
647b36e
Merge branch 'main' into giveaways
vkryl Jan 10, 2024
504bc81
Fixes
vkryl Jan 12, 2024
f1b838a
Refactoring
vkryl Jan 12, 2024
99a83d9
Refactoring
vkryl Jan 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ public class MessageView extends SparseDrawableView implements Destroyable, Draw
private final AvatarReceiver avatarReceiver;
private final GifReceiver gifReceiver;
private final ComplexReceiver avatarsReceiver;
private final ComplexReceiver giveawayAvatarsReceiver;
private final ComplexReceiver reactionAvatarsReceiver;
private final ComplexReceiver emojiStatusReceiver;
private final ComplexReceiver reactionsComplexReceiver, textMediaReceiver, replyTextMediaReceiver;
Expand All @@ -125,6 +126,8 @@ public MessageView (Context context) {
.setUpdateListener(refreshRateLimiter.passThroughUpdateListener());
avatarsReceiver = new ComplexReceiver(this)
.setUpdateListener(refreshRateLimiter.passThroughComplexUpdateListener());
giveawayAvatarsReceiver = new ComplexReceiver(this)
.setUpdateListener(refreshRateLimiter.passThroughComplexUpdateListener());
reactionAvatarsReceiver = new ComplexReceiver(this)
.setUpdateListener(refreshRateLimiter.passThroughComplexUpdateListener());
gifReceiver = new GifReceiver(this)
Expand Down Expand Up @@ -167,6 +170,7 @@ public void setCustomMeasureDisabled (boolean disabled) {
public void performDestroy () {
avatarReceiver.destroy();
avatarsReceiver.performDestroy();
giveawayAvatarsReceiver.performDestroy();
reactionAvatarsReceiver.performDestroy();
replyReceiver.destroy();
replyTextMediaReceiver.performDestroy();
Expand Down Expand Up @@ -300,6 +304,7 @@ public void setMessage (TGMessage message) {
message.requestAvatar(avatarReceiver);
message.requestReactions(reactionsComplexReceiver);
message.requestCommentsResources(avatarsReceiver, false);
message.requestGiveawayAvatars(giveawayAvatarsReceiver, false);
message.requestReactionsResources(reactionAvatarsReceiver, false);
message.requestAllTextMedia(this);

Expand Down Expand Up @@ -423,6 +428,10 @@ public ComplexReceiver getAvatarsReceiver () {
return avatarsReceiver;
}

public ComplexReceiver getGiveawayAvatarsReceiver () {
return giveawayAvatarsReceiver;
}

public ComplexReceiver getReactionAvatarsReceiver () {
return reactionAvatarsReceiver;
}
Expand Down Expand Up @@ -472,6 +481,7 @@ public void onAttachedToRecyclerView () {
isAttached = true;
avatarReceiver.attach();
avatarsReceiver.attach();
giveawayAvatarsReceiver.attach();
reactionAvatarsReceiver.attach();
gifReceiver.attach();
reactionsComplexReceiver.attach();
Expand All @@ -494,6 +504,7 @@ public void onDetachedFromRecyclerView () {
isAttached = false;
avatarReceiver.detach();
avatarsReceiver.detach();
giveawayAvatarsReceiver.detach();
reactionAvatarsReceiver.detach();
gifReceiver.detach();
reactionsComplexReceiver.detach();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
package org.thunderdog.challegram.component.popups;

import android.content.Context;
import android.text.style.ClickableSpan;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import org.drinkless.tdlib.TdApi;
import org.thunderdog.challegram.R;
import org.thunderdog.challegram.U;
import org.thunderdog.challegram.component.attach.MediaBottomBaseController;
import org.thunderdog.challegram.component.attach.MediaLayout;
import org.thunderdog.challegram.component.base.SettingView;
import org.thunderdog.challegram.core.Lang;
import org.thunderdog.challegram.data.TD;
import org.thunderdog.challegram.data.TGMessageServiceImpl;
import org.thunderdog.challegram.navigation.BackHeaderButton;
import org.thunderdog.challegram.navigation.HeaderView;
import org.thunderdog.challegram.support.ViewSupport;
import org.thunderdog.challegram.theme.ColorId;
import org.thunderdog.challegram.theme.Theme;
import org.thunderdog.challegram.tool.Screen;
import org.thunderdog.challegram.ui.ListItem;
import org.thunderdog.challegram.ui.SettingHolder;
import org.thunderdog.challegram.ui.SettingsAdapter;
import org.thunderdog.challegram.util.AvatarDrawModifier;
import org.thunderdog.challegram.util.text.FormattedText;
import org.thunderdog.challegram.util.text.TextColorSets;
import org.thunderdog.challegram.util.text.TextEntity;
import org.thunderdog.challegram.util.text.TextEntityCustom;
import org.thunderdog.challegram.widget.CustomTextView;
import org.thunderdog.challegram.widget.GiftHeaderView;
import org.thunderdog.challegram.widget.ScalableTextView;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import me.vkryl.android.ViewUtils;
import me.vkryl.android.widget.FrameLayoutFix;
import me.vkryl.td.ChatId;
import me.vkryl.td.MessageId;
import me.vkryl.td.Td;

public class GiftCodeController extends MediaBottomBaseController<Void> implements View.OnClickListener {
private final @Nullable TdApi.MessagePremiumGiftCode giftCodeContent;
private final @NonNull TdApi.PremiumGiftCodeInfo giftCodeInfo;
private final String code;

private int measuredRecyclerHeight;

protected GiftCodeController (MediaLayout context, String code, @Nullable TdApi.MessagePremiumGiftCode giftCodeContent, @NonNull TdApi.PremiumGiftCodeInfo giftCodeInfo) {
super(context, Lang.getString(R.string.GiftLink));
this.giftCodeContent = giftCodeContent;
this.giftCodeInfo = giftCodeInfo;
this.code = code;
}

@Override
protected View onCreateView (Context context) {
buildContentView(false);
setLayoutManager(new LinearLayoutManager(context(), RecyclerView.VERTICAL, false));

final boolean isActivated = giftCodeInfo.useDate > 0;
final TdApi.MessageSender creatorId = getCreatorId();

final ArrayList<ListItem> items = new ArrayList<>();

items.add(new ListItem(ListItem.TYPE_GIFT_HEADER));
items.add(new ListItem(ListItem.TYPE_SETTING, R.id.btn_copyLink, R.drawable.baseline_link_24, R.string.GiftLink)
.setStringValue(TD.makeGiftCodeLink(code)));

items.add(new ListItem(ListItem.TYPE_SEPARATOR_FULL));
items.add(new ListItem(ListItem.TYPE_SETTING, R.id.btn_openGiftSender, creatorId != null ? 0 : R.drawable.dot_baseline_acc_anon_24, R.string.GiftFrom)
.setStringValue(creatorId != null ? tdlib.chatTitle(Td.getSenderId(creatorId)) : Lang.getString(R.string.GiftFromUnknown))
.setDrawModifier(creatorId != null ? new AvatarDrawModifier(24): null)
.setData(creatorId)
);

items.add(new ListItem(ListItem.TYPE_SEPARATOR_FULL));
items.add(new ListItem(ListItem.TYPE_SETTING, R.id.btn_openGiftReceiver, giftCodeInfo.userId != 0 ? 0 : R.drawable.dot_baseline_acc_anon_24, R.string.GiftTo)
.setStringValue(giftCodeInfo.userId != 0 ? tdlib.chatTitle(ChatId.fromUserId(giftCodeInfo.userId), false, false) : Lang.getString(R.string.GiftToUnknown))
.setDrawModifier(giftCodeInfo.userId != 0 ? new AvatarDrawModifier(24) : null)
.setData(new TdApi.MessageSenderUser(giftCodeInfo.userId))
);

items.add(new ListItem(ListItem.TYPE_SEPARATOR_FULL));
items.add(new ListItem(ListItem.TYPE_SETTING,0, R.drawable.baseline_gift_outline_24, R.string.Gift)
.setStringValue(Lang.plural(R.string.xTelegramPremiumForMonth, giftCodeInfo.monthCount)));
items.add(new ListItem(ListItem.TYPE_SEPARATOR_FULL));
items.add(new ListItem(ListItem.TYPE_SETTING, R.id.btn_showGiveawayMessage, R.drawable.baseline_info_24, R.string.GiftReason)
.setStringValue(Lang.getString(giftCodeInfo.isFromGiveaway ? R.string.GiftReasonGiveaway : R.string.GiftReasonGift)));
items.add(new ListItem(ListItem.TYPE_SEPARATOR_FULL));
items.add(new ListItem(ListItem.TYPE_SETTING,0, R.drawable.baseline_date_range_24, R.string.GiftDate)
.setStringValue(Lang.getString(R.string.format_GiveawayDateTime,
Lang.dateYearFull(giftCodeInfo.creationDate, TimeUnit.SECONDS),
Lang.time(giftCodeInfo.creationDate, TimeUnit.SECONDS)))
);

items.add(new ListItem(ListItem.TYPE_SHADOW_BOTTOM));

if (isActivated) {
items.add(new ListItem(ListItem.TYPE_DESCRIPTION, 0, 0, Lang.getString(R.string.GiftLinkWasActivated, Lang.dateFullShort(giftCodeInfo.useDate, TimeUnit.SECONDS), Lang.time(giftCodeInfo.useDate, TimeUnit.SECONDS))));
} else {
items.add(new ListItem(ListItem.TYPE_TEXT_VIEW));
items.add(new ListItem(ListItem.TYPE_SHADOW_TOP));
items.add(new ListItem(ListItem.TYPE_BUTTON, R.id.btn_redeemGiftLink, 0, R.string.GiftLinkRedeem));
}

FrameLayoutFix.LayoutParams params;
params = FrameLayoutFix.newParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.topMargin = HeaderView.getSize(false);
params.bottomMargin = HeaderView.getTopOffset();
recyclerView.setLayoutParams(params);

SettingsAdapter adapter = new SettingsAdapter(this) {
@Override
public void updateView (SettingHolder holder, int position, int viewType) {
super.updateView(holder, position, viewType);
if (viewType == ListItem.TYPE_GIFT_HEADER) {
final boolean isActivated = giftCodeInfo.useDate > 0;
GiftHeaderView view = (GiftHeaderView) (holder.itemView);
view.setTexts(
isActivated ? R.string.GiftLinkActivated : R.string.GiftLink,
isActivated ? R.string.GiftLinkActivatedDesc: R.string.GiftLinkDesc);
}
}

@Override
protected void setValuedSetting (ListItem item, SettingView view, boolean isUpdate) {
view.setType(SettingView.TYPE_INFO_COMPACT);
view.setData(item.getStringValue());
view.forcePadding(Screen.dp(72), Screen.dp(16));
AvatarDrawModifier dm = (AvatarDrawModifier) item.getDrawModifier();
if (dm != null) {
view.setDrawModifier(dm);
dm.requestFiles(view.getComplexReceiver(), tdlib, (TdApi.MessageSender) item.getData());
}
}

@Override
protected void setText (ListItem item, CustomTextView view, boolean isUpdate) {

String gvw = Lang.getString(R.string.GiftLinkShareDesc_SendThisLink);
TextEntityCustom custom = new TextEntityCustom(GiftCodeController.this, tdlib, gvw, 0, gvw.length(), 0, null);
custom.setCustomColorSet(TextColorSets.Regular.LINK);
custom.setOnClickListener(new ClickableSpan() {
@Override
public void onClick (@NonNull View widget) {
tdlib.ui().shareText(GiftCodeController.this, TD.makeGiftCodeLink(code));
}
});
FormattedText gvwf = new FormattedText(gvw, new TextEntity[] {custom});

FormattedText formattedText = TGMessageServiceImpl.getText(tdlib, null, R.string.GiftLinkShareDesc, gvwf);

view.setText(formattedText.text, formattedText.entities, false);
view.setTextSize(15f);
view.setPadding(Screen.dp(16f), Screen.dp(7f), Screen.dp(16f), Screen.dp(12f));
view.setTextColorId(ColorId.background_text);
}

@Override
protected void setButtonText (ListItem item, ScalableTextView view, boolean isUpdate) {
super.setButtonText(item, view, isUpdate);
removeThemeListenerByTarget(view);

view.setTextColor(Theme.getColor(ColorId.badgeText));
addThemeTextColorListener(view, ColorId.badgeText);

ViewUtils.setBackground(view, Theme.fillingSelector(ColorId.badge));
addThemeInvalidateListener(view);
}
};
adapter.setItems(items.toArray(new ListItem[0]), false);
initMetrics();

ViewSupport.setThemedBackground(recyclerView, ColorId.background);
recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange (View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
recyclerView.removeOnLayoutChangeListener(this);
measuredRecyclerHeight = recyclerView.getMeasuredHeight();
initMetrics();
}
});

setAdapter(adapter);

return contentView;
}



@Override
protected int getInitialContentHeight () {
if (measuredRecyclerHeight != 0) {
return measuredRecyclerHeight;
}

return super.getInitialContentHeight();
}

@Override
public boolean ignoreStartHeightLimits () {
return true;
}

@Override
protected boolean canExpandHeight () {
return false;
}

@Override
protected int getBackButton () {
return BackHeaderButton.TYPE_CLOSE;
}

@Override
public boolean onBackPressed (boolean fromTop) {
mediaLayout.hide(false);
return true;
}

@Override
public int getId () {
return R.id.controller_giftDialog;
}

private boolean redeemLoading;

@Override
public void onClick (View v) {
final int id = v.getId();

if (id == R.id.btn_copyLink) {
U.copyText(TD.makeGiftCodeLink(code));
} else if (id == R.id.btn_openGiftSender) {
final TdApi.MessageSender creatorId = getCreatorId();
if (creatorId != null) {
tdlib.ui().openChat(this, creatorId, null);
mediaLayout.hide(false);
}
} else if (id == R.id.btn_openGiftReceiver) {
if (giftCodeInfo.userId != 0) {
tdlib.ui().openChatProfile(this, ChatId.fromUserId(giftCodeInfo.userId), null, null);
mediaLayout.hide(false);
}
} else if (id == R.id.btn_showGiveawayMessage) {
final TdApi.MessageSender creatorId = getCreatorId();
if (creatorId != null) {
final long chatId = Td.getSenderId(creatorId);
tdlib.ui().openMessage(this, chatId, new MessageId(chatId, giftCodeInfo.giveawayMessageId, null), null);
mediaLayout.hide(false);
}
} else if (id == R.id.btn_redeemGiftLink) {
if (!redeemLoading) {
redeemLoading = true;
tdlib.client().send(new TdApi.ApplyPremiumGiftCode(code), tdlib.okHandler(() -> mediaLayout.hide(false)));
}
}
}

@Override
protected ViewGroup createCustomBottomBar () {
return new FrameLayout(context);
}

private @Nullable TdApi.MessageSender getCreatorId () {
return giftCodeContent != null && giftCodeContent.creatorId != null ?
giftCodeContent.creatorId : giftCodeInfo.creatorId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
*/
package org.thunderdog.challegram.component.popups;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import org.drinkless.tdlib.TdApi;
import org.thunderdog.challegram.component.attach.MediaBottomBaseController;
import org.thunderdog.challegram.component.attach.MediaLayout;
Expand All @@ -21,6 +24,10 @@
public class ModernActionedLayout extends MediaLayout {
private MediaBottomBaseController<?> curController;

public static void showGiftCode (ViewController<?> context, String code, @Nullable TdApi.MessagePremiumGiftCode giftCodeContent, @NonNull TdApi.PremiumGiftCodeInfo giftCodeInfo) {
showMal(context, (mal) -> new GiftCodeController(mal, code, giftCodeContent, giftCodeInfo));
}

public static void showMessageSeen (ViewController<?> context, TGMessage msg, TdApi.MessageViewers viewers) {
showMal(context, (mal) -> new MessageSeenController(mal, msg, viewers));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.thunderdog.challegram.navigation.HeaderView;
import org.thunderdog.challegram.navigation.RtlCheckListener;
import org.thunderdog.challegram.navigation.StretchyHeaderView;
import org.thunderdog.challegram.telegram.Tdlib;
import org.thunderdog.challegram.tool.Screen;
import org.thunderdog.challegram.tool.Views;
import org.thunderdog.challegram.unsorted.Size;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,4 +362,4 @@ public void onDetachedFromWindow () {
receiver.detach();
}
}
}
}