diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoDonateActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoDonateActivity.java index 4f12cbc7..4955a400 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoDonateActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoDonateActivity.java @@ -3,154 +3,59 @@ package tw.nekomimi.nekogram.settings; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Outline; -import android.text.TextUtils; import android.view.Gravity; -import android.view.HapticFeedbackConstants; import android.view.View; import android.view.ViewOutlineProvider; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.billingclient.api.BillingClient; -import com.android.billingclient.api.BillingClientStateListener; -import com.android.billingclient.api.BillingFlowParams; -import com.android.billingclient.api.BillingResult; -import com.android.billingclient.api.ConsumeParams; -import com.android.billingclient.api.PendingPurchasesParams; -import com.android.billingclient.api.ProductDetails; -import com.android.billingclient.api.Purchase; -import com.android.billingclient.api.PurchasesUpdatedListener; -import com.android.billingclient.api.QueryProductDetailsParams; -import com.google.common.collect.ImmutableList; import com.google.zxing.EncodeHintType; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; -import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.messenger.browser.Browser; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.BulletinFactory; -import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.ItemOptions; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.TextHelper; import org.telegram.ui.Components.UItem; import org.telegram.ui.Components.UniversalAdapter; -import org.telegram.ui.LaunchActivity; import org.telegram.ui.Stories.recorder.ButtonWithCounterView; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.stream.Collectors; import tw.nekomimi.nekogram.helpers.remote.ConfigHelper; -public class NekoDonateActivity extends BaseNekoSettingsActivity implements PurchasesUpdatedListener { - private static final List SKUS = Arrays.asList("donate001", "donate002", "donate005", "donate010", "donate020", "donate050", "donate100"); +public class NekoDonateActivity extends BaseNekoSettingsActivity { private final List cryptos = ConfigHelper.getCryptos(); - private final int donateRow = 100; + private final int supportProjectRow = 1; + private final int topSponsorsRow = 2; private final int cryptoRow = 200; - private BillingClient billingClient; - private List productDetails; - @Override public boolean onFragmentCreate() { super.onFragmentCreate(); - - billingClient = BillingClient.newBuilder(ApplicationLoader.applicationContext) - .setListener(this) - .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) - .build(); - return true; } - @Override - public void onFragmentDestroy() { - super.onFragmentDestroy(); - - billingClient.endConnection(); - } - - private void showErrorAlert(BillingResult result) { - if (getParentActivity() == null || result.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED || result.getResponseCode() == BillingClient.BillingResponseCode.OK) { - return; - } - AndroidUtilities.runOnUIThread(() -> { - if (TextUtils.isEmpty(result.getDebugMessage())) { - BulletinFactory.of(this).createErrorBulletin(LocaleController.getString(R.string.ErrorOccurred) + ": " + result.getResponseCode()).show(); - } else { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), resourcesProvider); - builder.setTitle(LocaleController.getString(R.string.ErrorOccurred)); - builder.setMessage(result.getDebugMessage()); - builder.setPositiveButton(LocaleController.getString(R.string.OK), null); - showDialog(builder.create()); - } - }); - } - - @Override - public View createView(Context context) { - View fragmentView = super.createView(context); - - billingClient.startConnection(new BillingClientStateListener() { - @Override - public void onBillingServiceDisconnected() { - - } - - @Override - public void onBillingSetupFinished(@NonNull BillingResult billingResult) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - var productList = - SKUS.stream().map(s -> QueryProductDetailsParams.Product.newBuilder() - .setProductId(s) - .setProductType(BillingClient.ProductType.INAPP) - .build()) - .collect(Collectors.toList()); - var params = QueryProductDetailsParams.newBuilder() - .setProductList(productList) - .build(); - billingClient.queryProductDetailsAsync(params, (queryResult, list) -> { - if (queryResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - if (!list.isEmpty()) { - AndroidUtilities.runOnUIThread(() -> { - productDetails = list; - if (listView != null) { - listView.adapter.update(true); - } - }); - } - } else { - showErrorAlert(queryResult); - } - }); - } else { - showErrorAlert(billingResult); - } - } - }); - - return fragmentView; - } - @Override protected void fillItems(ArrayList items, UniversalAdapter adapter) { + items.add(UItem.asButtonSubtext(supportProjectRow, R.drawable.msg_input_like, LocaleController.getString(R.string.FoxSupportProject), LocaleController.getString(R.string.FoxSupportProjectAbout))); + items.add(UItem.asButtonSubtext(topSponsorsRow, R.drawable.msg_premium_liststar, LocaleController.getString(R.string.FoxTopSponsors), LocaleController.getString(R.string.FoxTopSponsorsAbout))); + items.add(UItem.asShadow(null)); + if (cryptos != null && !cryptos.isEmpty()) { items.add(UItem.asHeader(LocaleController.getString(R.string.Cryptocurrency))); var cryptoId = 0; @@ -159,36 +64,15 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity implements Purc } items.add(UItem.asShadow(null)); } - - items.add(UItem.asHeader(LocaleController.getString(R.string.GooglePlay))); - if (productDetails != null && !productDetails.isEmpty()) { - for (int i = 0; i < productDetails.size(); i++) { - var product = productDetails.get(i); - var details = product.getOneTimePurchaseOfferDetails(); - items.add(TextSettingsCellFactory.of(donateRow + i, details != null ? details.getFormattedPrice() : product.getName())); - } - } else { - items.add(UItem.asFlicker(1, FlickerLoadingView.TEXT_SETTINGS_TYPE)); - } - items.add(UItem.asShadow(null)); } @Override protected void onItemClick(UItem item, View view, int position, float x, float y) { var id = item.id; - if (id >= donateRow && id < cryptoRow) { - if (productDetails != null && productDetails.size() > id - donateRow) { - var productDetailsParamsList = - ImmutableList.of( - BillingFlowParams.ProductDetailsParams.newBuilder() - .setProductDetails(productDetails.get(id - donateRow)) - .build() - ); - BillingFlowParams flowParams = BillingFlowParams.newBuilder() - .setProductDetailsParamsList(productDetailsParamsList) - .build(); - billingClient.launchBillingFlow(getParentActivity(), flowParams); - } + if (id == supportProjectRow) { + Browser.openUrl(getParentActivity(), "https://t.me/vpnghostbot"); + } else if (id == topSponsorsRow) { + presentFragment(new FoxSponsorsActivity()); } else if (id >= cryptoRow) { ConfigHelper.Crypto crypto = cryptos.get(id - cryptoRow); QRCodeBottomSheet.showForCrypto(this, crypto); @@ -219,37 +103,6 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity implements Purc return LocaleController.getString(R.string.Donate); } - @Override - public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List list) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) { - for (Purchase purchase : list) { - if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { - ConsumeParams params = ConsumeParams.newBuilder() - .setPurchaseToken(purchase.getPurchaseToken()) - .build(); - billingClient.consumeAsync(params, (billingResult1, s) -> { - if (billingResult1.getResponseCode() == BillingClient.BillingResponseCode.OK) { - AndroidUtilities.runOnUIThread(() -> { - BulletinFactory.of(this).createErrorBulletin(LocaleController.getString(R.string.DonateThankYou)).show(); - try { - fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignored) { - } - if (getParentActivity() instanceof LaunchActivity) { - ((LaunchActivity) getParentActivity()).getFireworksOverlay().start(); - } - }); - } else { - showErrorAlert(billingResult1); - } - }); - } - } - } else { - showErrorAlert(billingResult); - } - } - public static class QRCodeBottomSheet extends BottomSheet { private QRCodeBottomSheet(Context context, ConfigHelper.Crypto crypto, Theme.ResourcesProvider resourcesProvider) { diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoSettingsActivity.java index 6adbc61b..036f8c8e 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoSettingsActivity.java @@ -29,7 +29,6 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.SettingsSearchCell; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CubicBezierInterpolator; -import org.telegram.ui.Components.FragmentFloatingButton; import org.telegram.ui.Components.ItemOptions; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.UItem; @@ -43,7 +42,6 @@ import java.util.Locale; import me.vkryl.android.animator.BoolAnimator; import me.vkryl.android.animator.FactorAnimator; import tw.nekomimi.nekogram.accessibility.AccessibilitySettingsActivity; -import tw.nekomimi.nekogram.helpers.CloudSettingsHelper; import tw.nekomimi.nekogram.helpers.PasscodeHelper; import tw.nekomimi.nekogram.helpers.remote.ConfigHelper; @@ -68,12 +66,9 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa private final int sourceCodeRow = rowId++; private final int translationRow = rowId++; private final int donateRow = rowId++; - private final int supportProjectRow = rowId++; - private final int topSponsorsRow = rowId++; private final int sponsorRow = 100; - private ActionBarMenuItem syncItem; private final ArrayList searchArray = createSearchArray(); private final ArrayList resultNames = new ArrayList<>(); private final ArrayList searchResults = new ArrayList<>(); @@ -138,9 +133,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa search(editText.getText().toString()); } }); - syncItem = menu.addItem(1, R.drawable.cloud_sync); - syncItem.setContentDescription(LocaleController.getString(R.string.CloudConfig)); - syncItem.setOnClickListener(v -> CloudSettingsHelper.getInstance().showDialog(this)); return fragmentView; } @@ -180,10 +172,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa items.add(UItem.asButtonSubtext(donateRow, R.drawable.msg_input_like, LocaleController.getString(R.string.Donate), LocaleController.getString(R.string.DonateAbout)).slug("donate")); items.add(UItem.asShadow(null)); - items.add(UItem.asButtonSubtext(supportProjectRow, R.drawable.msg_input_like, LocaleController.getString(R.string.FoxSupportProject), LocaleController.getString(R.string.FoxSupportProjectAbout)).slug("supportProject")); - items.add(UItem.asButtonSubtext(topSponsorsRow, R.drawable.msg_premium_liststar, LocaleController.getString(R.string.FoxTopSponsors), LocaleController.getString(R.string.FoxTopSponsorsAbout)).slug("topSponsors")); - items.add(UItem.asShadow(null)); - newsList.clear(); newsList.addAll(ConfigHelper.getNewsForSettings()); if (!newsList.isEmpty()) { @@ -220,10 +208,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa getMessagesController().openByUserName(LocaleController.getString(R.string.OfficialChannelUsername), this, 1); } else if (id == donateRow) { presentFragment(new NekoDonateActivity()); - } else if (id == supportProjectRow) { - Browser.openUrl(getParentActivity(), "https://t.me/vpnghostbot"); - } else if (id == topSponsorsRow) { - presentFragment(new FoxSponsorsActivity()); } else if (id == translationRow) { Browser.openUrl(getParentActivity(), "https://neko.crowdin.com/nekogram"); } else if (id == websiteRow) { @@ -268,9 +252,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa @Override public void onFactorChanged(int id, float factor, float fraction, FactorAnimator callee) { - if (id == ANIMATOR_ID_SEARCH_PAGE_VISIBLE) { - FragmentFloatingButton.setAnimatedVisibility(syncItem, 1f - factor); - } } @Override diff --git a/TMessagesProj/src/main/res/values-ru/strings_neko.xml b/TMessagesProj/src/main/res/values-ru/strings_neko.xml index 47b3197a..164d62b1 100644 --- a/TMessagesProj/src/main/res/values-ru/strings_neko.xml +++ b/TMessagesProj/src/main/res/values-ru/strings_neko.xml @@ -1,6 +1,6 @@  - Настройки Neko + Настройки Foxi Предпочитать подключение через IPv6 Меню сообщений Скрыть мой номер телефона diff --git a/TMessagesProj/src/main/res/values/strings_neko.xml b/TMessagesProj/src/main/res/values/strings_neko.xml index 0d101197..bd49058f 100644 --- a/TMessagesProj/src/main/res/values/strings_neko.xml +++ b/TMessagesProj/src/main/res/values/strings_neko.xml @@ -3,7 +3,7 @@ @string/Nekogram FoxiGram FoxiGram Beta - Neko Settings + Foxi Settings Prefer connecting through IPv6 Message menu Hide my phone number