Rename to Foxi Settings, drop cloud sync, move support/sponsors into Donate
- Rename 'Neko Settings' -> 'Foxi Settings' (en/ru) - Remove the cloud settings sync action (was broken/unneeded) - Move 'Support the project' (t.me/vpnghostbot) and 'Top sponsors' from the main settings list into the 'Support FoxiGram' (Donate) screen - Remove the Google Play billing section from the Donate screen
This commit is contained in:
parent
47f9aef160
commit
e9e9711f0b
4 changed files with 14 additions and 180 deletions
|
|
@ -3,154 +3,59 @@ package tw.nekomimi.nekogram.settings;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Outline;
|
import android.graphics.Outline;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.HapticFeedbackConstants;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewOutlineProvider;
|
import android.view.ViewOutlineProvider;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.ScrollView;
|
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.EncodeHintType;
|
||||||
import com.google.zxing.qrcode.QRCodeWriter;
|
import com.google.zxing.qrcode.QRCodeWriter;
|
||||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||||
|
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.LocaleController;
|
import org.telegram.messenger.LocaleController;
|
||||||
import org.telegram.messenger.R;
|
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.BaseFragment;
|
||||||
import org.telegram.ui.ActionBar.BottomSheet;
|
import org.telegram.ui.ActionBar.BottomSheet;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.Components.BulletinFactory;
|
import org.telegram.ui.Components.BulletinFactory;
|
||||||
import org.telegram.ui.Components.FlickerLoadingView;
|
|
||||||
import org.telegram.ui.Components.ItemOptions;
|
import org.telegram.ui.Components.ItemOptions;
|
||||||
import org.telegram.ui.Components.LayoutHelper;
|
import org.telegram.ui.Components.LayoutHelper;
|
||||||
import org.telegram.ui.Components.TextHelper;
|
import org.telegram.ui.Components.TextHelper;
|
||||||
import org.telegram.ui.Components.UItem;
|
import org.telegram.ui.Components.UItem;
|
||||||
import org.telegram.ui.Components.UniversalAdapter;
|
import org.telegram.ui.Components.UniversalAdapter;
|
||||||
import org.telegram.ui.LaunchActivity;
|
|
||||||
import org.telegram.ui.Stories.recorder.ButtonWithCounterView;
|
import org.telegram.ui.Stories.recorder.ButtonWithCounterView;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import tw.nekomimi.nekogram.helpers.remote.ConfigHelper;
|
import tw.nekomimi.nekogram.helpers.remote.ConfigHelper;
|
||||||
|
|
||||||
public class NekoDonateActivity extends BaseNekoSettingsActivity implements PurchasesUpdatedListener {
|
public class NekoDonateActivity extends BaseNekoSettingsActivity {
|
||||||
private static final List<String> SKUS = Arrays.asList("donate001", "donate002", "donate005", "donate010", "donate020", "donate050", "donate100");
|
|
||||||
private final List<ConfigHelper.Crypto> cryptos = ConfigHelper.getCryptos();
|
private final List<ConfigHelper.Crypto> cryptos = ConfigHelper.getCryptos();
|
||||||
|
|
||||||
private final int donateRow = 100;
|
private final int supportProjectRow = 1;
|
||||||
|
private final int topSponsorsRow = 2;
|
||||||
private final int cryptoRow = 200;
|
private final int cryptoRow = 200;
|
||||||
|
|
||||||
private BillingClient billingClient;
|
|
||||||
private List<ProductDetails> productDetails;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onFragmentCreate() {
|
public boolean onFragmentCreate() {
|
||||||
super.onFragmentCreate();
|
super.onFragmentCreate();
|
||||||
|
|
||||||
billingClient = BillingClient.newBuilder(ApplicationLoader.applicationContext)
|
|
||||||
.setListener(this)
|
|
||||||
.enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
return true;
|
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
|
@Override
|
||||||
protected void fillItems(ArrayList<UItem> items, UniversalAdapter adapter) {
|
protected void fillItems(ArrayList<UItem> 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()) {
|
if (cryptos != null && !cryptos.isEmpty()) {
|
||||||
items.add(UItem.asHeader(LocaleController.getString(R.string.Cryptocurrency)));
|
items.add(UItem.asHeader(LocaleController.getString(R.string.Cryptocurrency)));
|
||||||
var cryptoId = 0;
|
var cryptoId = 0;
|
||||||
|
|
@ -159,36 +64,15 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity implements Purc
|
||||||
}
|
}
|
||||||
items.add(UItem.asShadow(null));
|
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
|
@Override
|
||||||
protected void onItemClick(UItem item, View view, int position, float x, float y) {
|
protected void onItemClick(UItem item, View view, int position, float x, float y) {
|
||||||
var id = item.id;
|
var id = item.id;
|
||||||
if (id >= donateRow && id < cryptoRow) {
|
if (id == supportProjectRow) {
|
||||||
if (productDetails != null && productDetails.size() > id - donateRow) {
|
Browser.openUrl(getParentActivity(), "https://t.me/vpnghostbot");
|
||||||
var productDetailsParamsList =
|
} else if (id == topSponsorsRow) {
|
||||||
ImmutableList.of(
|
presentFragment(new FoxSponsorsActivity());
|
||||||
BillingFlowParams.ProductDetailsParams.newBuilder()
|
|
||||||
.setProductDetails(productDetails.get(id - donateRow))
|
|
||||||
.build()
|
|
||||||
);
|
|
||||||
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
|
|
||||||
.setProductDetailsParamsList(productDetailsParamsList)
|
|
||||||
.build();
|
|
||||||
billingClient.launchBillingFlow(getParentActivity(), flowParams);
|
|
||||||
}
|
|
||||||
} else if (id >= cryptoRow) {
|
} else if (id >= cryptoRow) {
|
||||||
ConfigHelper.Crypto crypto = cryptos.get(id - cryptoRow);
|
ConfigHelper.Crypto crypto = cryptos.get(id - cryptoRow);
|
||||||
QRCodeBottomSheet.showForCrypto(this, crypto);
|
QRCodeBottomSheet.showForCrypto(this, crypto);
|
||||||
|
|
@ -219,37 +103,6 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity implements Purc
|
||||||
return LocaleController.getString(R.string.Donate);
|
return LocaleController.getString(R.string.Donate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> 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 {
|
public static class QRCodeBottomSheet extends BottomSheet {
|
||||||
|
|
||||||
private QRCodeBottomSheet(Context context, ConfigHelper.Crypto crypto, Theme.ResourcesProvider resourcesProvider) {
|
private QRCodeBottomSheet(Context context, ConfigHelper.Crypto crypto, Theme.ResourcesProvider resourcesProvider) {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.Cells.SettingsSearchCell;
|
import org.telegram.ui.Cells.SettingsSearchCell;
|
||||||
import org.telegram.ui.Components.BackupImageView;
|
import org.telegram.ui.Components.BackupImageView;
|
||||||
import org.telegram.ui.Components.CubicBezierInterpolator;
|
import org.telegram.ui.Components.CubicBezierInterpolator;
|
||||||
import org.telegram.ui.Components.FragmentFloatingButton;
|
|
||||||
import org.telegram.ui.Components.ItemOptions;
|
import org.telegram.ui.Components.ItemOptions;
|
||||||
import org.telegram.ui.Components.LayoutHelper;
|
import org.telegram.ui.Components.LayoutHelper;
|
||||||
import org.telegram.ui.Components.UItem;
|
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.BoolAnimator;
|
||||||
import me.vkryl.android.animator.FactorAnimator;
|
import me.vkryl.android.animator.FactorAnimator;
|
||||||
import tw.nekomimi.nekogram.accessibility.AccessibilitySettingsActivity;
|
import tw.nekomimi.nekogram.accessibility.AccessibilitySettingsActivity;
|
||||||
import tw.nekomimi.nekogram.helpers.CloudSettingsHelper;
|
|
||||||
import tw.nekomimi.nekogram.helpers.PasscodeHelper;
|
import tw.nekomimi.nekogram.helpers.PasscodeHelper;
|
||||||
import tw.nekomimi.nekogram.helpers.remote.ConfigHelper;
|
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 sourceCodeRow = rowId++;
|
||||||
private final int translationRow = rowId++;
|
private final int translationRow = rowId++;
|
||||||
private final int donateRow = rowId++;
|
private final int donateRow = rowId++;
|
||||||
private final int supportProjectRow = rowId++;
|
|
||||||
private final int topSponsorsRow = rowId++;
|
|
||||||
|
|
||||||
private final int sponsorRow = 100;
|
private final int sponsorRow = 100;
|
||||||
|
|
||||||
private ActionBarMenuItem syncItem;
|
|
||||||
private final ArrayList<SearchResult> searchArray = createSearchArray();
|
private final ArrayList<SearchResult> searchArray = createSearchArray();
|
||||||
private final ArrayList<CharSequence> resultNames = new ArrayList<>();
|
private final ArrayList<CharSequence> resultNames = new ArrayList<>();
|
||||||
private final ArrayList<SearchResult> searchResults = new ArrayList<>();
|
private final ArrayList<SearchResult> searchResults = new ArrayList<>();
|
||||||
|
|
@ -138,9 +133,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa
|
||||||
search(editText.getText().toString());
|
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;
|
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.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.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.clear();
|
||||||
newsList.addAll(ConfigHelper.getNewsForSettings());
|
newsList.addAll(ConfigHelper.getNewsForSettings());
|
||||||
if (!newsList.isEmpty()) {
|
if (!newsList.isEmpty()) {
|
||||||
|
|
@ -220,10 +208,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa
|
||||||
getMessagesController().openByUserName(LocaleController.getString(R.string.OfficialChannelUsername), this, 1);
|
getMessagesController().openByUserName(LocaleController.getString(R.string.OfficialChannelUsername), this, 1);
|
||||||
} else if (id == donateRow) {
|
} else if (id == donateRow) {
|
||||||
presentFragment(new NekoDonateActivity());
|
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) {
|
} else if (id == translationRow) {
|
||||||
Browser.openUrl(getParentActivity(), "https://neko.crowdin.com/nekogram");
|
Browser.openUrl(getParentActivity(), "https://neko.crowdin.com/nekogram");
|
||||||
} else if (id == websiteRow) {
|
} else if (id == websiteRow) {
|
||||||
|
|
@ -268,9 +252,6 @@ public class NekoSettingsActivity extends BaseNekoSettingsActivity implements Fa
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFactorChanged(int id, float factor, float fraction, FactorAnimator callee) {
|
public void onFactorChanged(int id, float factor, float fraction, FactorAnimator callee) {
|
||||||
if (id == ANIMATOR_ID_SEARCH_PAGE_VISIBLE) {
|
|
||||||
FragmentFloatingButton.setAnimatedVisibility(syncItem, 1f - factor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="NekoSettings">Настройки Neko</string>
|
<string name="NekoSettings">Настройки Foxi</string>
|
||||||
<string name="PreferIPv6">Предпочитать подключение через IPv6</string>
|
<string name="PreferIPv6">Предпочитать подключение через IPv6</string>
|
||||||
<string name="MessageMenu">Меню сообщений</string>
|
<string name="MessageMenu">Меню сообщений</string>
|
||||||
<string name="HidePhone">Скрыть мой номер телефона</string>
|
<string name="HidePhone">Скрыть мой номер телефона</string>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<string name="AppNameNeko" translatable="false">@string/Nekogram</string>
|
<string name="AppNameNeko" translatable="false">@string/Nekogram</string>
|
||||||
<string name="Nekogram" translatable="false">FoxiGram</string>
|
<string name="Nekogram" translatable="false">FoxiGram</string>
|
||||||
<string name="NekogramBeta" translatable="false">FoxiGram Beta</string>
|
<string name="NekogramBeta" translatable="false">FoxiGram Beta</string>
|
||||||
<string name="NekoSettings">Neko Settings</string>
|
<string name="NekoSettings">Foxi Settings</string>
|
||||||
<string name="PreferIPv6">Prefer connecting through IPv6</string>
|
<string name="PreferIPv6">Prefer connecting through IPv6</string>
|
||||||
<string name="MessageMenu">Message menu</string>
|
<string name="MessageMenu">Message menu</string>
|
||||||
<string name="HidePhone">Hide my phone number</string>
|
<string name="HidePhone">Hide my phone number</string>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue