Add FoxiGram Premium features screen with animated sticker header

This commit is contained in:
instant992 2026-06-19 00:04:32 +04:00
parent 660d2880bb
commit 2d473f33b9
5 changed files with 146 additions and 2 deletions

View file

@ -45,7 +45,7 @@ import org.telegram.ui.LauncherIconController;
import org.telegram.ui.PremiumPreviewFragment;
import tw.nekomimi.nekogram.helpers.SponsorHelper;
import tw.nekomimi.nekogram.settings.NekoDonateActivity;
import tw.nekomimi.nekogram.settings.FoxPremiumActivity;
import java.util.ArrayList;
import java.util.Arrays;
@ -113,7 +113,7 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati
IconHolderView holderView = (IconHolderView) view;
LauncherIconController.LauncherIcon icon = availableIcons.get(position);
if (icon.premium && !SponsorHelper.isCurrentUserSponsor()) {
fragment.presentFragment(new NekoDonateActivity());
fragment.presentFragment(new FoxPremiumActivity());
return;
}

View file

@ -0,0 +1,126 @@
package tw.nekomimi.nekogram.settings;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Components.AnimatedFileDrawable;
import org.telegram.ui.Components.BackupImageView;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.UItem;
import org.telegram.ui.Components.UniversalAdapter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
public class FoxPremiumActivity extends BaseNekoSettingsActivity {
private final int serversRow = rowId++;
private final int sponsorRow = rowId++;
private final int iconsRow = rowId++;
private final int buttonRow = rowId++;
private FrameLayout topView;
private BackupImageView stickerView;
private AnimatedFileDrawable stickerDrawable;
@Override
public View createView(Context context) {
topView = new FrameLayout(context);
stickerView = new BackupImageView(context);
topView.addView(stickerView, LayoutHelper.createFrame(130, 130, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 16, 0, 0));
var titleView = new TextView(context);
titleView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, 22);
titleView.setTypeface(AndroidUtilities.bold());
titleView.setGravity(Gravity.CENTER);
titleView.setText(LocaleController.getString(R.string.FoxPremiumTitle));
titleView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteBlackText));
topView.addView(titleView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 16, 158, 16, 0));
var subtitleView = new TextView(context);
subtitleView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, 14);
subtitleView.setGravity(Gravity.CENTER);
subtitleView.setText(LocaleController.getString(R.string.FoxPremiumSubtitle));
subtitleView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText));
topView.addView(subtitleView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 24, 192, 24, 0));
var fragmentView = super.createView(context);
loadSticker();
return fragmentView;
}
private void loadSticker() {
try {
File cacheFile = new File(AndroidUtilities.getCacheDir(), "foxi_premium.webm");
if (!cacheFile.exists() || cacheFile.length() == 0) {
try (InputStream in = ApplicationLoader.applicationContext.getResources().openRawResource(R.raw.foxi_premium);
FileOutputStream out = new FileOutputStream(cacheFile)) {
byte[] buffer = new byte[16 * 1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
}
stickerDrawable = new AnimatedFileDrawable(cacheFile, true, 0, 0, null, null, null, 0, UserConfig.selectedAccount, true, 260, 260, null);
stickerView.setImageDrawable(stickerDrawable);
stickerView.getImageReceiver().setAutoRepeat(1);
stickerDrawable.start();
stickerView.setOnClickListener(v -> {
if (stickerDrawable != null) {
stickerDrawable.start();
}
});
} catch (Throwable ignore) {
}
}
@Override
protected boolean needActionBarPadding() {
return false;
}
@Override
protected void fillItems(ArrayList<UItem> items, UniversalAdapter adapter) {
items.add(UItem.asCustomShadow(topView, 240));
items.add(UItem.asButtonSubtext(serversRow, R.drawable.msg2_devices, LocaleController.getString(R.string.FoxPremiumFeatureServersTitle), LocaleController.getString(R.string.FoxPremiumFeatureServersAbout)));
items.add(UItem.asButtonSubtext(sponsorRow, R.drawable.msg_input_like, LocaleController.getString(R.string.FoxPremiumFeatureSponsorTitle), LocaleController.getString(R.string.FoxPremiumFeatureSponsorAbout)));
items.add(UItem.asButtonSubtext(iconsRow, R.drawable.msg_emoji_smiles, LocaleController.getString(R.string.FoxPremiumFeatureIconsTitle), LocaleController.getString(R.string.FoxPremiumFeatureIconsAbout)));
items.add(UItem.asShadow(null));
items.add(UItem.asButton(buttonRow, R.drawable.msg_input_like, LocaleController.getString(R.string.FoxPremiumButton)));
items.add(UItem.asShadow(null));
}
@Override
protected void onItemClick(UItem item, View view, int position, float x, float y) {
if (item.id == buttonRow) {
presentFragment(new NekoDonateActivity());
}
}
@Override
protected String getActionBarTitle() {
return LocaleController.getString(R.string.FoxPremiumTitle);
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
if (stickerDrawable != null) {
stickerDrawable.recycle();
stickerDrawable = null;
}
}
}

Binary file not shown.

View file

@ -325,6 +325,15 @@
<!-- Accessibility -->
<string name="AccessibilitySettings">Настройки специальных возможностей</string>
<string name="FoxSponsorBadge">Спонсор GhostCloud</string>
<string name="FoxPremiumTitle">FoxiGram Premium</string>
<string name="FoxPremiumSubtitle">Поддержите проект и откройте эксклюзивные возможности</string>
<string name="FoxPremiumFeatureServersTitle">Больше LTE и Wi-Fi серверов</string>
<string name="FoxPremiumFeatureServersAbout">Доступ к дополнительным быстрым LTE и Wi-Fi серверам</string>
<string name="FoxPremiumFeatureSponsorTitle">Сердечко спонсора</string>
<string name="FoxPremiumFeatureSponsorAbout">Значок сердечка рядом с вашим именем в чатах</string>
<string name="FoxPremiumFeatureIconsTitle">Эксклюзивные иконки приложения</string>
<string name="FoxPremiumFeatureIconsAbout">Иконки приложения Premium, Космос и Облако</string>
<string name="FoxPremiumButton">Поддержать FoxiGram</string>
<string name="FoxSponsorBadgeInfo">Эта отметка выдана за поддержание проекта на 444+ рублей.</string>
<string name="FoxSupportProject">Поддержать проект</string>
<string name="FoxSupportProjectAbout">Оформите GhostCloud через нашего бота</string>

View file

@ -155,6 +155,15 @@
<string name="NekogramVersion">FoxiGram %1$s\nBased on Telegram %2$s\nDesigned by %3$s</string>
<string name="UpdateInstalling">Installing update...</string>
<string name="FoxSponsorBadge">Sponsor GhostCloud</string>
<string name="FoxPremiumTitle">FoxiGram Premium</string>
<string name="FoxPremiumSubtitle">Support the project and unlock exclusive perks</string>
<string name="FoxPremiumFeatureServersTitle">More LTE and Wi-Fi servers</string>
<string name="FoxPremiumFeatureServersAbout">Get access to additional fast LTE and Wi-Fi servers</string>
<string name="FoxPremiumFeatureSponsorTitle">Sponsor heart</string>
<string name="FoxPremiumFeatureSponsorAbout">A heart badge next to your name in chats</string>
<string name="FoxPremiumFeatureIconsTitle">Exclusive app icons</string>
<string name="FoxPremiumFeatureIconsAbout">Premium, Space and Cloud app icons</string>
<string name="FoxPremiumButton">Support FoxiGram</string>
<string name="FoxSponsorBadgeInfo">This badge is granted for supporting the project with 444+ rubles.</string>
<string name="FoxSupportProject">Support the project</string>
<string name="FoxSupportProjectAbout">Subscribe to GhostCloud via our bot</string>