mirror of
https://github.com/DrKLO/Telegram.git
synced 2024-12-22 14:35:03 +01:00
Update to 8.8.3
This commit is contained in:
parent
96dce2c9aa
commit
4a95c2fc1f
33 changed files with 255 additions and 97 deletions
|
@ -27,4 +27,4 @@ RUN cp $ANDROID_HOME/build-tools/30.0.3/lib/dx.jar $ANDROID_HOME/build-tools/31.
|
||||||
ENV PATH ${ANDROID_NDK_HOME}:$PATH
|
ENV PATH ${ANDROID_NDK_HOME}:$PATH
|
||||||
ENV PATH ${ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/:$PATH
|
ENV PATH ${ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/:$PATH
|
||||||
|
|
||||||
CMD mkdir -p /home/source/TMessagesProj/build/outputs/apk && mkdir -p /home/source/TMessagesProj/build/outputs/native-debug-symbols && cp -R /home/source/. /home/gradle && cd /home/gradle && gradle assembleRelease && gradle assembleStandalone && cp -R /home/gradle/TMessagesProj/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && cp -R /home/gradle/TMessagesProj/build/outputs/native-debug-symbols/. /home/source/TMessagesProj/build/outputs/native-debug-symbols
|
CMD mkdir -p /home/source/TMessagesProj/build/outputs/apk && mkdir -p /home/source/TMessagesProj/build/outputs/native-debug-symbols && cp -R /home/source/. /home/gradle && cd /home/gradle && gradle bundleBundleAfat_SDK23Release && gradle bundleBundleAfatRelease && gradle assembleStandalone && gradle assembleAfatRelease && cp -R /home/gradle/TMessagesProj/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && cp -R /home/gradle/TMessagesProj/build/outputs/bundle/. /home/source/TMessagesProj/build/outputs/bundle && cp -R /home/gradle/TMessagesProj/build/outputs/native-debug-symbols/. /home/source/TMessagesProj/build/outputs/native-debug-symbols
|
||||||
|
|
|
@ -40,8 +40,6 @@ dependencies {
|
||||||
implementation 'com.android.billingclient:billing:5.0.0'
|
implementation 'com.android.billingclient:billing:5.0.0'
|
||||||
implementation files('libs/libgsaverification-client.aar')
|
implementation files('libs/libgsaverification-client.aar')
|
||||||
|
|
||||||
implementation "com.android.billingclient:billing:5.0.0"
|
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,7 +235,7 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig.versionCode = 2702
|
defaultConfig.versionCode = 2705
|
||||||
|
|
||||||
applicationVariants.all { variant ->
|
applicationVariants.all { variant ->
|
||||||
variant.outputs.all { output ->
|
variant.outputs.all { output ->
|
||||||
|
@ -256,7 +254,7 @@ android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
versionName "8.8.2"
|
versionName "8.8.3"
|
||||||
|
|
||||||
vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi']
|
vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi']
|
||||||
|
|
||||||
|
|
1
TMessagesProj/src/main/assets/currencies.json
Normal file
1
TMessagesProj/src/main/assets/currencies.json
Normal file
File diff suppressed because one or more lines are too long
|
@ -21,6 +21,9 @@ import android.view.View;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.os.TraceCompat;
|
import androidx.core.os.TraceCompat;
|
||||||
|
|
||||||
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
|
import org.telegram.messenger.FileLog;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -274,6 +277,7 @@ final class GapWorker implements Runnable {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
private RecyclerView.ViewHolder prefetchPositionWithDeadline(RecyclerView view,
|
private RecyclerView.ViewHolder prefetchPositionWithDeadline(RecyclerView view,
|
||||||
int position, long deadlineNs) {
|
int position, long deadlineNs) {
|
||||||
if (isPrefetchPositionAttached(view, position)) {
|
if (isPrefetchPositionAttached(view, position)) {
|
||||||
|
@ -301,6 +305,14 @@ final class GapWorker implements Runnable {
|
||||||
recycler.addViewHolderToRecycledViewPool(holder, false);
|
recycler.addViewHolderToRecycledViewPool(holder, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
if (view.getAdapter() != null) {
|
||||||
|
view.getAdapter().notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return null;
|
||||||
} finally {
|
} finally {
|
||||||
view.onExitLayoutOrScroll(false);
|
view.onExitLayoutOrScroll(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.util.Consumer;
|
import androidx.core.util.Consumer;
|
||||||
|
|
||||||
import com.android.billingclient.api.AcknowledgePurchaseParams;
|
|
||||||
import com.android.billingclient.api.BillingClient;
|
import com.android.billingclient.api.BillingClient;
|
||||||
import com.android.billingclient.api.BillingClientStateListener;
|
import com.android.billingclient.api.BillingClientStateListener;
|
||||||
import com.android.billingclient.api.BillingFlowParams;
|
import com.android.billingclient.api.BillingFlowParams;
|
||||||
|
@ -22,12 +21,16 @@ import com.android.billingclient.api.PurchasesResponseListener;
|
||||||
import com.android.billingclient.api.PurchasesUpdatedListener;
|
import com.android.billingclient.api.PurchasesUpdatedListener;
|
||||||
import com.android.billingclient.api.QueryProductDetailsParams;
|
import com.android.billingclient.api.QueryProductDetailsParams;
|
||||||
import com.android.billingclient.api.QueryPurchasesParams;
|
import com.android.billingclient.api.QueryPurchasesParams;
|
||||||
|
import com.google.android.exoplayer2.util.Util;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
import org.telegram.tgnet.TLRPC;
|
import org.telegram.tgnet.TLRPC;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -46,6 +49,8 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien
|
||||||
private Map<String, Consumer<BillingResult>> resultListeners = new HashMap<>();
|
private Map<String, Consumer<BillingResult>> resultListeners = new HashMap<>();
|
||||||
private List<String> requestingTokens = new ArrayList<>();
|
private List<String> requestingTokens = new ArrayList<>();
|
||||||
|
|
||||||
|
private Map<String, Integer> currencyExpMap = new HashMap<>();
|
||||||
|
|
||||||
public static BillingController getInstance() {
|
public static BillingController getInstance() {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
instance = new BillingController(ApplicationLoader.applicationContext);
|
instance = new BillingController(ApplicationLoader.applicationContext);
|
||||||
|
@ -62,12 +67,41 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCurrencyExp(String currency) {
|
||||||
|
Integer exp = currencyExpMap.get(currency);
|
||||||
|
if (exp == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return exp;
|
||||||
|
}
|
||||||
|
|
||||||
public void startConnection() {
|
public void startConnection() {
|
||||||
if (isReady()) {
|
if (isReady()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (BuildVars.useInvoiceBilling()) {
|
||||||
|
try {
|
||||||
|
Context ctx = ApplicationLoader.applicationContext;
|
||||||
|
InputStream in = ctx.getAssets().open("currencies.json");
|
||||||
|
JSONObject obj = new JSONObject(new String(Util.toByteArray(in), "UTF-8"));
|
||||||
|
parseCurrencies(obj);
|
||||||
|
in.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
billingClient.startConnection(this);
|
billingClient.startConnection(this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseCurrencies(JSONObject obj) {
|
||||||
|
Iterator<String> it = obj.keys();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
String key = it.next();
|
||||||
|
JSONObject currency = obj.optJSONObject(key);
|
||||||
|
currencyExpMap.put(key, currency.optInt("exp"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isReady() {
|
public boolean isReady() {
|
||||||
return billingClient.isReady();
|
return billingClient.isReady();
|
||||||
|
|
|
@ -20,8 +20,8 @@ public class BuildVars {
|
||||||
public static boolean USE_CLOUD_STRINGS = true;
|
public static boolean USE_CLOUD_STRINGS = true;
|
||||||
public static boolean CHECK_UPDATES = true;
|
public static boolean CHECK_UPDATES = true;
|
||||||
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
|
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
|
||||||
public static int BUILD_VERSION = 2702;
|
public static int BUILD_VERSION = 2705;
|
||||||
public static String BUILD_VERSION_STRING = "8.8.2";
|
public static String BUILD_VERSION_STRING = "8.8.3";
|
||||||
public static int APP_ID = 4;
|
public static int APP_ID = 4;
|
||||||
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";
|
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";
|
||||||
|
|
||||||
|
|
|
@ -893,6 +893,9 @@ public class FileLoader extends BaseController {
|
||||||
MessageObject messageObject = (MessageObject) parentObject;
|
MessageObject messageObject = (MessageObject) parentObject;
|
||||||
int flag;
|
int flag;
|
||||||
long dialogId = messageObject.getDialogId();
|
long dialogId = messageObject.getDialogId();
|
||||||
|
if (messageObject.isAnyKindOfSticker() || getMessagesController().isChatNoForwards(getMessagesController().getChat(-dialogId)) || messageObject.messageOwner.noforwards) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (dialogId >= 0) {
|
if (dialogId >= 0) {
|
||||||
flag = SharedConfig.SAVE_TO_GALLERY_FLAG_PEER;
|
flag = SharedConfig.SAVE_TO_GALLERY_FLAG_PEER;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -19,7 +19,6 @@ public class FilePathDatabase {
|
||||||
|
|
||||||
private SQLiteDatabase database;
|
private SQLiteDatabase database;
|
||||||
private File cacheFile;
|
private File cacheFile;
|
||||||
private File walCacheFile;
|
|
||||||
private File shmCacheFile;
|
private File shmCacheFile;
|
||||||
|
|
||||||
private final static int LAST_DB_VERSION = 1;
|
private final static int LAST_DB_VERSION = 1;
|
||||||
|
@ -31,11 +30,11 @@ public class FilePathDatabase {
|
||||||
this.currentAccount = currentAccount;
|
this.currentAccount = currentAccount;
|
||||||
dispatchQueue = new DispatchQueue("files_database_queue_" + currentAccount);
|
dispatchQueue = new DispatchQueue("files_database_queue_" + currentAccount);
|
||||||
dispatchQueue.postRunnable(() -> {
|
dispatchQueue.postRunnable(() -> {
|
||||||
createDatabase(false);
|
createDatabase(0, false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createDatabase(boolean fromBackup) {
|
public void createDatabase(int tryCount, boolean fromBackup) {
|
||||||
File filesDir = ApplicationLoader.getFilesDirFixed();
|
File filesDir = ApplicationLoader.getFilesDirFixed();
|
||||||
if (currentAccount != 0) {
|
if (currentAccount != 0) {
|
||||||
filesDir = new File(filesDir, "account" + currentAccount + "/");
|
filesDir = new File(filesDir, "account" + currentAccount + "/");
|
||||||
|
@ -47,6 +46,7 @@ public class FilePathDatabase {
|
||||||
|
|
||||||
boolean createTable = false;
|
boolean createTable = false;
|
||||||
|
|
||||||
|
|
||||||
if (!cacheFile.exists()) {
|
if (!cacheFile.exists()) {
|
||||||
createTable = true;
|
createTable = true;
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,13 @@ public class FilePathDatabase {
|
||||||
database.executeFast("CREATE TABLE paths(document_id INTEGER, dc_id INTEGER, type INTEGER, path TEXT, PRIMARY KEY(document_id, dc_id, type));").stepThis().dispose();
|
database.executeFast("CREATE TABLE paths(document_id INTEGER, dc_id INTEGER, type INTEGER, path TEXT, PRIMARY KEY(document_id, dc_id, type));").stepThis().dispose();
|
||||||
database.executeFast("PRAGMA user_version = " + LAST_DB_VERSION).stepThis().dispose();
|
database.executeFast("PRAGMA user_version = " + LAST_DB_VERSION).stepThis().dispose();
|
||||||
} else {
|
} else {
|
||||||
|
int version = database.executeInt("PRAGMA user_version");
|
||||||
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
|
FileLog.d("current db version = " + version);
|
||||||
|
}
|
||||||
|
if (version == 0) {
|
||||||
|
throw new Exception("malformed");
|
||||||
|
}
|
||||||
//migration
|
//migration
|
||||||
}
|
}
|
||||||
if (!fromBackup) {
|
if (!fromBackup) {
|
||||||
|
@ -66,12 +73,18 @@ public class FilePathDatabase {
|
||||||
}
|
}
|
||||||
FileLog.d("files db created from_backup= " + fromBackup);
|
FileLog.d("files db created from_backup= " + fromBackup);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
if (tryCount < 4) {
|
||||||
if (!fromBackup && restoreBackup()) {
|
if (!fromBackup && restoreBackup()) {
|
||||||
createDatabase(true);
|
createDatabase(tryCount + 1, true);
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
cacheFile.delete();
|
||||||
|
shmCacheFile.delete();
|
||||||
|
createDatabase(tryCount + 1, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (BuildVars.DEBUG_VERSION) {
|
if (BuildVars.DEBUG_VERSION) {
|
||||||
throw new RuntimeException(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +117,7 @@ public class FilePathDatabase {
|
||||||
try {
|
try {
|
||||||
return AndroidUtilities.copyFile(backupCacheFile, cacheFile);
|
return AndroidUtilities.copyFile(backupCacheFile, cacheFile);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -130,7 +143,7 @@ public class FilePathDatabase {
|
||||||
}
|
}
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
} catch (SQLiteException e) {
|
} catch (SQLiteException e) {
|
||||||
throw new RuntimeException(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
syncLatch.countDown();
|
syncLatch.countDown();
|
||||||
});
|
});
|
||||||
|
@ -149,9 +162,7 @@ public class FilePathDatabase {
|
||||||
}
|
}
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
} catch (SQLiteException e) {
|
} catch (SQLiteException e) {
|
||||||
if (BuildVars.DEBUG_VERSION) {
|
FileLog.e(e);
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -173,9 +184,7 @@ public class FilePathDatabase {
|
||||||
database.executeFast("DELETE FROM paths WHERE document_id = " + id + " AND dc_id = " + dc + " AND type = " + type).stepThis().dispose();
|
database.executeFast("DELETE FROM paths WHERE document_id = " + id + " AND dc_id = " + dc + " AND type = " + type).stepThis().dispose();
|
||||||
}
|
}
|
||||||
} catch (SQLiteException e) {
|
} catch (SQLiteException e) {
|
||||||
if (BuildVars.DEBUG_VERSION) {
|
FileLog.e(e);
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -203,7 +212,7 @@ public class FilePathDatabase {
|
||||||
try {
|
try {
|
||||||
syncLatch.await();
|
syncLatch.await();
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileLog.d("checkMediaExistance size=" + messageObjects.size() + " time=" + (System.currentTimeMillis() - time));
|
FileLog.d("checkMediaExistance size=" + messageObjects.size() + " time=" + (System.currentTimeMillis() - time));
|
||||||
|
|
|
@ -997,7 +997,7 @@ public class ImageLoader {
|
||||||
boolean needInvert = false;
|
boolean needInvert = false;
|
||||||
int orientation = 0;
|
int orientation = 0;
|
||||||
File cacheFileFinal = cacheImage.finalFilePath;
|
File cacheFileFinal = cacheImage.finalFilePath;
|
||||||
boolean inEncryptedFile = cacheImage.secureDocument != null || cacheImage.encryptionKeyPath != null && cacheFileFinal != null && cacheFileFinal.getAbsolutePath().endsWith(".enc");
|
boolean inEncryptedFile = cacheImage.secureDocument != null || cacheImage.encryptionKeyPath != null && cacheFileFinal != null && (cacheFileFinal.getAbsolutePath().endsWith(".enc") || cacheFileFinal.getAbsolutePath().endsWith(".64enc"));
|
||||||
SecureDocumentKey secureDocumentKey;
|
SecureDocumentKey secureDocumentKey;
|
||||||
byte[] secureDocumentHash;
|
byte[] secureDocumentHash;
|
||||||
if (cacheImage.secureDocument != null) {
|
if (cacheImage.secureDocument != null) {
|
||||||
|
|
|
@ -226,6 +226,7 @@ public class MediaDataController extends BaseController {
|
||||||
|
|
||||||
private long loadFeaturedHash;
|
private long loadFeaturedHash;
|
||||||
private int loadFeaturedDate;
|
private int loadFeaturedDate;
|
||||||
|
public boolean loadFeaturedPremium;
|
||||||
private ArrayList<TLRPC.StickerSetCovered> featuredStickerSets = new ArrayList<>();
|
private ArrayList<TLRPC.StickerSetCovered> featuredStickerSets = new ArrayList<>();
|
||||||
private LongSparseArray<TLRPC.StickerSetCovered> featuredStickerSetsById = new LongSparseArray<>();
|
private LongSparseArray<TLRPC.StickerSetCovered> featuredStickerSetsById = new LongSparseArray<>();
|
||||||
private ArrayList<Long> unreadStickerSets = new ArrayList<>();
|
private ArrayList<Long> unreadStickerSets = new ArrayList<>();
|
||||||
|
@ -1534,9 +1535,10 @@ public class MediaDataController extends BaseController {
|
||||||
ArrayList<Long> unread = new ArrayList<>();
|
ArrayList<Long> unread = new ArrayList<>();
|
||||||
int date = 0;
|
int date = 0;
|
||||||
long hash = 0;
|
long hash = 0;
|
||||||
|
boolean premium = false;
|
||||||
SQLiteCursor cursor = null;
|
SQLiteCursor cursor = null;
|
||||||
try {
|
try {
|
||||||
cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, unread, date, hash FROM stickers_featured WHERE 1");
|
cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, unread, date, hash, premium FROM stickers_featured WHERE 1");
|
||||||
if (cursor.next()) {
|
if (cursor.next()) {
|
||||||
NativeByteBuffer data = cursor.byteBufferValue(0);
|
NativeByteBuffer data = cursor.byteBufferValue(0);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
|
@ -1558,6 +1560,7 @@ public class MediaDataController extends BaseController {
|
||||||
}
|
}
|
||||||
date = cursor.intValue(2);
|
date = cursor.intValue(2);
|
||||||
hash = calcFeaturedStickersHash(newStickerArray);
|
hash = calcFeaturedStickersHash(newStickerArray);
|
||||||
|
premium = cursor.intValue(4) == 1;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
|
@ -1566,7 +1569,7 @@ public class MediaDataController extends BaseController {
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
processLoadedFeaturedStickers(newStickerArray, unread, true, date, hash);
|
processLoadedFeaturedStickers(newStickerArray, unread, premium, true, date, hash);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
TLRPC.TL_messages_getFeaturedStickers req = new TLRPC.TL_messages_getFeaturedStickers();
|
TLRPC.TL_messages_getFeaturedStickers req = new TLRPC.TL_messages_getFeaturedStickers();
|
||||||
|
@ -1574,15 +1577,15 @@ public class MediaDataController extends BaseController {
|
||||||
getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
|
getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
|
||||||
if (response instanceof TLRPC.TL_messages_featuredStickers) {
|
if (response instanceof TLRPC.TL_messages_featuredStickers) {
|
||||||
TLRPC.TL_messages_featuredStickers res = (TLRPC.TL_messages_featuredStickers) response;
|
TLRPC.TL_messages_featuredStickers res = (TLRPC.TL_messages_featuredStickers) response;
|
||||||
processLoadedFeaturedStickers(res.sets, res.unread, false, (int) (System.currentTimeMillis() / 1000), res.hash);
|
processLoadedFeaturedStickers(res.sets, res.unread, res.premium,false, (int) (System.currentTimeMillis() / 1000), res.hash);
|
||||||
} else {
|
} else {
|
||||||
processLoadedFeaturedStickers(null, null, false, (int) (System.currentTimeMillis() / 1000), req.hash);
|
processLoadedFeaturedStickers(null, null, false, false, (int) (System.currentTimeMillis() / 1000), req.hash);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processLoadedFeaturedStickers(ArrayList<TLRPC.StickerSetCovered> res, ArrayList<Long> unreadStickers, boolean cache, int date, long hash) {
|
private void processLoadedFeaturedStickers(ArrayList<TLRPC.StickerSetCovered> res, ArrayList<Long> unreadStickers, boolean premium, boolean cache, int date, long hash) {
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
loadingFeaturedStickers = false;
|
loadingFeaturedStickers = false;
|
||||||
featuredStickersLoaded = true;
|
featuredStickersLoaded = true;
|
||||||
|
@ -1611,7 +1614,7 @@ public class MediaDataController extends BaseController {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cache) {
|
if (!cache) {
|
||||||
putFeaturedStickersToCache(stickerSetsNew, unreadStickers, date, hash);
|
putFeaturedStickersToCache(stickerSetsNew, unreadStickers, date, hash, premium);
|
||||||
}
|
}
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
unreadStickerSets = unreadStickers;
|
unreadStickerSets = unreadStickers;
|
||||||
|
@ -1619,6 +1622,7 @@ public class MediaDataController extends BaseController {
|
||||||
featuredStickerSets = stickerSetsNew;
|
featuredStickerSets = stickerSetsNew;
|
||||||
loadFeaturedHash = hash;
|
loadFeaturedHash = hash;
|
||||||
loadFeaturedDate = date;
|
loadFeaturedDate = date;
|
||||||
|
loadFeaturedPremium = premium;
|
||||||
loadStickers(TYPE_FEATURED, true, false);
|
loadStickers(TYPE_FEATURED, true, false);
|
||||||
getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad);
|
getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad);
|
||||||
});
|
});
|
||||||
|
@ -1627,17 +1631,17 @@ public class MediaDataController extends BaseController {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AndroidUtilities.runOnUIThread(() -> loadFeaturedDate = date);
|
AndroidUtilities.runOnUIThread(() -> loadFeaturedDate = date);
|
||||||
putFeaturedStickersToCache(null, null, date, 0);
|
putFeaturedStickersToCache(null, null, date, 0, premium);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void putFeaturedStickersToCache(ArrayList<TLRPC.StickerSetCovered> stickers, ArrayList<Long> unreadStickers, int date, long hash) {
|
private void putFeaturedStickersToCache(ArrayList<TLRPC.StickerSetCovered> stickers, ArrayList<Long> unreadStickers, int date, long hash, boolean premium) {
|
||||||
ArrayList<TLRPC.StickerSetCovered> stickersFinal = stickers != null ? new ArrayList<>(stickers) : null;
|
ArrayList<TLRPC.StickerSetCovered> stickersFinal = stickers != null ? new ArrayList<>(stickers) : null;
|
||||||
getMessagesStorage().getStorageQueue().postRunnable(() -> {
|
getMessagesStorage().getStorageQueue().postRunnable(() -> {
|
||||||
try {
|
try {
|
||||||
if (stickersFinal != null) {
|
if (stickersFinal != null) {
|
||||||
SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("REPLACE INTO stickers_featured VALUES(?, ?, ?, ?, ?)");
|
SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("REPLACE INTO stickers_featured VALUES(?, ?, ?, ?, ?, ?)");
|
||||||
state.requery();
|
state.requery();
|
||||||
int size = 4;
|
int size = 4;
|
||||||
for (int a = 0; a < stickersFinal.size(); a++) {
|
for (int a = 0; a < stickersFinal.size(); a++) {
|
||||||
|
@ -1658,6 +1662,7 @@ public class MediaDataController extends BaseController {
|
||||||
state.bindByteBuffer(3, data2);
|
state.bindByteBuffer(3, data2);
|
||||||
state.bindInteger(4, date);
|
state.bindInteger(4, date);
|
||||||
state.bindLong(5, hash);
|
state.bindLong(5, hash);
|
||||||
|
state.bindInteger(6, premium ? 1 : 0);
|
||||||
state.step();
|
state.step();
|
||||||
data.reuse();
|
data.reuse();
|
||||||
data2.reuse();
|
data2.reuse();
|
||||||
|
@ -1707,7 +1712,7 @@ public class MediaDataController extends BaseController {
|
||||||
unreadStickerSets.clear();
|
unreadStickerSets.clear();
|
||||||
loadFeaturedHash = calcFeaturedStickersHash(featuredStickerSets);
|
loadFeaturedHash = calcFeaturedStickersHash(featuredStickerSets);
|
||||||
getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad);
|
getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad);
|
||||||
putFeaturedStickersToCache(featuredStickerSets, unreadStickerSets, loadFeaturedDate, loadFeaturedHash);
|
putFeaturedStickersToCache(featuredStickerSets, unreadStickerSets, loadFeaturedDate, loadFeaturedHash, loadFeaturedPremium);
|
||||||
if (query) {
|
if (query) {
|
||||||
TLRPC.TL_messages_readFeaturedStickers req = new TLRPC.TL_messages_readFeaturedStickers();
|
TLRPC.TL_messages_readFeaturedStickers req = new TLRPC.TL_messages_readFeaturedStickers();
|
||||||
getConnectionsManager().sendRequest(req, (response, error) -> {
|
getConnectionsManager().sendRequest(req, (response, error) -> {
|
||||||
|
@ -1743,7 +1748,7 @@ public class MediaDataController extends BaseController {
|
||||||
readingStickerSets.remove(id);
|
readingStickerSets.remove(id);
|
||||||
loadFeaturedHash = calcFeaturedStickersHash(featuredStickerSets);
|
loadFeaturedHash = calcFeaturedStickersHash(featuredStickerSets);
|
||||||
getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad);
|
getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad);
|
||||||
putFeaturedStickersToCache(featuredStickerSets, unreadStickerSets, loadFeaturedDate, loadFeaturedHash);
|
putFeaturedStickersToCache(featuredStickerSets, unreadStickerSets, loadFeaturedDate, loadFeaturedHash, loadFeaturedPremium);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -873,11 +873,17 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
};
|
};
|
||||||
|
|
||||||
private static volatile MessagesController[] Instance = new MessagesController[UserConfig.MAX_ACCOUNT_COUNT];
|
private static volatile MessagesController[] Instance = new MessagesController[UserConfig.MAX_ACCOUNT_COUNT];
|
||||||
|
private static volatile Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT];
|
||||||
|
static {
|
||||||
|
for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) {
|
||||||
|
lockObjects[i] = new Object();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static MessagesController getInstance(int num) {
|
public static MessagesController getInstance(int num) {
|
||||||
MessagesController localInstance = Instance[num];
|
MessagesController localInstance = Instance[num];
|
||||||
if (localInstance == null) {
|
if (localInstance == null) {
|
||||||
synchronized (MessagesController.class) {
|
synchronized (lockObjects[num]) {
|
||||||
localInstance = Instance[num];
|
localInstance = Instance[num];
|
||||||
if (localInstance == null) {
|
if (localInstance == null) {
|
||||||
Instance[num] = localInstance = new MessagesController(num);
|
Instance[num] = localInstance = new MessagesController(num);
|
||||||
|
|
|
@ -83,7 +83,7 @@ public class MessagesStorage extends BaseController {
|
||||||
private CountDownLatch openSync = new CountDownLatch(1);
|
private CountDownLatch openSync = new CountDownLatch(1);
|
||||||
|
|
||||||
private static volatile MessagesStorage[] Instance = new MessagesStorage[UserConfig.MAX_ACCOUNT_COUNT];
|
private static volatile MessagesStorage[] Instance = new MessagesStorage[UserConfig.MAX_ACCOUNT_COUNT];
|
||||||
private final static int LAST_DB_VERSION = 97;
|
private final static int LAST_DB_VERSION = 98;
|
||||||
private boolean databaseMigrationInProgress;
|
private boolean databaseMigrationInProgress;
|
||||||
public boolean showClearDatabaseAlert;
|
public boolean showClearDatabaseAlert;
|
||||||
|
|
||||||
|
@ -361,7 +361,7 @@ public class MessagesStorage extends BaseController {
|
||||||
database.executeFast("CREATE TABLE dialog_settings(did INTEGER PRIMARY KEY, flags INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE dialog_settings(did INTEGER PRIMARY KEY, flags INTEGER);").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, document BLOB, PRIMARY KEY (id, type));").stepThis().dispose();
|
database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, document BLOB, PRIMARY KEY (id, type));").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE stickers_v2(id INTEGER PRIMARY KEY, data BLOB, date INTEGER, hash INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE stickers_v2(id INTEGER PRIMARY KEY, data BLOB, date INTEGER, hash INTEGER);").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER, premium INTEGER);").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE stickers_dice(emoji TEXT PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE stickers_dice(emoji TEXT PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE webpage_pending_v2(id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (id, mid, uid));").stepThis().dispose();
|
database.executeFast("CREATE TABLE webpage_pending_v2(id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (id, mid, uid));").stepThis().dispose();
|
||||||
|
@ -1586,6 +1586,13 @@ public class MessagesStorage extends BaseController {
|
||||||
version = 97;
|
version = 97;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (version == 97) {
|
||||||
|
database.executeFast("DROP TABLE IF EXISTS stickers_featured;").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER, premium INTEGER);").stepThis().dispose();
|
||||||
|
database.executeFast("PRAGMA user_version = 98").stepThis().dispose();
|
||||||
|
version = 98;
|
||||||
|
}
|
||||||
|
|
||||||
FileLog.d("MessagesStorage db migration finished");
|
FileLog.d("MessagesStorage db migration finished");
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
databaseMigrationInProgress = false;
|
databaseMigrationInProgress = false;
|
||||||
|
|
|
@ -417,8 +417,8 @@ public class SharedConfig {
|
||||||
configLoaded = true;
|
configLoaded = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && debugWebView) {
|
||||||
WebView.setWebContentsDebuggingEnabled(debugWebView);
|
WebView.setWebContentsDebuggingEnabled(true);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
|
|
|
@ -7389,6 +7389,7 @@ public class TLRPC {
|
||||||
public void serializeToStream(AbstractSerializedData stream) {
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
stream.writeInt32(constructor);
|
stream.writeInt32(constructor);
|
||||||
flags = nopremium ? (flags | 8) : (flags &~ 8);
|
flags = nopremium ? (flags | 8) : (flags &~ 8);
|
||||||
|
flags = document != null ? (flags | 1) : (flags &~ 1);
|
||||||
stream.writeInt32(flags);
|
stream.writeInt32(flags);
|
||||||
if ((flags & 1) != 0) {
|
if ((flags & 1) != 0) {
|
||||||
document.serializeToStream(stream);
|
document.serializeToStream(stream);
|
||||||
|
@ -22949,7 +22950,6 @@ public class TLRPC {
|
||||||
public static int constructor = 0x40699cd0;
|
public static int constructor = 0x40699cd0;
|
||||||
|
|
||||||
public void readParams(AbstractSerializedData stream, boolean exception) {
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
flags = stream.readInt32(exception);
|
|
||||||
currency = stream.readString(exception);
|
currency = stream.readString(exception);
|
||||||
total_amount = stream.readInt64(exception);
|
total_amount = stream.readInt64(exception);
|
||||||
}
|
}
|
||||||
|
@ -38596,7 +38596,7 @@ public class TLRPC {
|
||||||
public TL_chatInviteExported invite;
|
public TL_chatInviteExported invite;
|
||||||
|
|
||||||
public void readParams(AbstractSerializedData stream, boolean exception) {
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
invite = (TL_chatInviteExported) ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception);
|
invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void serializeToStream(AbstractSerializedData stream) {
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
@ -59978,6 +59978,10 @@ public class TLRPC {
|
||||||
public void serializeToStream(AbstractSerializedData stream) {
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
stream.writeInt32(constructor);
|
stream.writeInt32(constructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TL_phone_saveCallLog extends TLObject {
|
public static class TL_phone_saveCallLog extends TLObject {
|
||||||
|
|
|
@ -383,6 +383,7 @@ public class AvatarPreviewer {
|
||||||
@Override
|
@Override
|
||||||
protected void onAttachedToWindow() {
|
protected void onAttachedToWindow() {
|
||||||
super.onAttachedToWindow();
|
super.onAttachedToWindow();
|
||||||
|
imageReceiver.onAttachedToWindow();
|
||||||
NotificationCenter.getInstance(UserConfig.selectedAccount).addObserver(this, NotificationCenter.fileLoaded);
|
NotificationCenter.getInstance(UserConfig.selectedAccount).addObserver(this, NotificationCenter.fileLoaded);
|
||||||
NotificationCenter.getInstance(UserConfig.selectedAccount).addObserver(this, NotificationCenter.fileLoadProgressChanged);
|
NotificationCenter.getInstance(UserConfig.selectedAccount).addObserver(this, NotificationCenter.fileLoadProgressChanged);
|
||||||
}
|
}
|
||||||
|
@ -390,6 +391,7 @@ public class AvatarPreviewer {
|
||||||
@Override
|
@Override
|
||||||
protected void onDetachedFromWindow() {
|
protected void onDetachedFromWindow() {
|
||||||
super.onDetachedFromWindow();
|
super.onDetachedFromWindow();
|
||||||
|
imageReceiver.onDetachedFromWindow();
|
||||||
NotificationCenter.getInstance(UserConfig.selectedAccount).removeObserver(this, NotificationCenter.fileLoaded);
|
NotificationCenter.getInstance(UserConfig.selectedAccount).removeObserver(this, NotificationCenter.fileLoaded);
|
||||||
NotificationCenter.getInstance(UserConfig.selectedAccount).removeObserver(this, NotificationCenter.fileLoadProgressChanged);
|
NotificationCenter.getInstance(UserConfig.selectedAccount).removeObserver(this, NotificationCenter.fileLoadProgressChanged);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15090,6 +15090,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
|
||||||
public static final int COMMENT = 496;
|
public static final int COMMENT = 496;
|
||||||
public static final int POLL_HINT = 495;
|
public static final int POLL_HINT = 495;
|
||||||
public static final int FORWARD = 494;
|
public static final int FORWARD = 494;
|
||||||
|
public static final int TRANSCRIBE = 493;
|
||||||
private Path linkPath = new Path();
|
private Path linkPath = new Path();
|
||||||
private RectF rectF = new RectF();
|
private RectF rectF = new RectF();
|
||||||
private Rect rect = new Rect();
|
private Rect rect = new Rect();
|
||||||
|
@ -15178,10 +15179,15 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
|
||||||
}
|
}
|
||||||
sb.append(title);
|
sb.append(title);
|
||||||
}
|
}
|
||||||
|
if (currentMessageObject.isVoiceTranscriptionOpen()) {
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append(currentMessageObject.getVoiceTranscription());
|
||||||
|
} else {
|
||||||
if (currentMessageObject.messageOwner.media != null && !TextUtils.isEmpty(currentMessageObject.caption)) {
|
if (currentMessageObject.messageOwner.media != null && !TextUtils.isEmpty(currentMessageObject.caption)) {
|
||||||
sb.append("\n");
|
sb.append("\n");
|
||||||
sb.append(currentMessageObject.caption);
|
sb.append(currentMessageObject.caption);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (documentAttach != null) {
|
if (documentAttach != null) {
|
||||||
if (documentAttachType == DOCUMENT_ATTACH_TYPE_VIDEO) {
|
if (documentAttachType == DOCUMENT_ATTACH_TYPE_VIDEO) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
|
@ -15343,6 +15349,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
|
||||||
seekBarAccessibilityDelegate.onInitializeAccessibilityNodeInfoInternal(info);
|
seekBarAccessibilityDelegate.onInitializeAccessibilityNodeInfoInternal(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (useTranscribeButton && transcribeButton != null) {
|
||||||
|
info.addChild(ChatMessageCell.this, TRANSCRIBE);
|
||||||
|
}
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||||
if (isChat && currentUser != null && !currentMessageObject.isOut()) {
|
if (isChat && currentUser != null && !currentMessageObject.isOut()) {
|
||||||
|
@ -15666,6 +15676,16 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
|
||||||
rect.offset(pos[0], pos[1]);
|
rect.offset(pos[0], pos[1]);
|
||||||
info.setBoundsInScreen(rect);
|
info.setBoundsInScreen(rect);
|
||||||
info.setClickable(true);
|
info.setClickable(true);
|
||||||
|
} else if (virtualViewId == TRANSCRIBE) {
|
||||||
|
info.setClassName("android.widget.Button");
|
||||||
|
info.setEnabled(true);
|
||||||
|
info.setText(currentMessageObject.isVoiceTranscriptionOpen() ? LocaleController.getString("AccActionCloseTranscription", R.string.AccActionCloseTranscription) : LocaleController.getString("AccActionOpenTranscription", R.string.AccActionOpenTranscription));
|
||||||
|
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
|
||||||
|
rect.set((int) transcribeX, (int) transcribeY, (int) (transcribeX + AndroidUtilities.dp(30)), (int) (transcribeY + AndroidUtilities.dp(30)));
|
||||||
|
info.setBoundsInParent(rect);
|
||||||
|
rect.offset(pos[0], pos[1]);
|
||||||
|
info.setBoundsInScreen(rect);
|
||||||
|
info.setClickable(true);
|
||||||
}
|
}
|
||||||
info.setFocusable(true);
|
info.setFocusable(true);
|
||||||
info.setVisibleToUser(true);
|
info.setVisibleToUser(true);
|
||||||
|
@ -15755,6 +15775,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
|
||||||
delegate.didPressCommentButton(ChatMessageCell.this);
|
delegate.didPressCommentButton(ChatMessageCell.this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (virtualViewId == TRANSCRIBE && transcribeButton != null) {
|
||||||
|
transcribeButton.onTap();
|
||||||
}
|
}
|
||||||
} else if (action == AccessibilityNodeInfo.ACTION_LONG_CLICK) {
|
} else if (action == AccessibilityNodeInfo.ACTION_LONG_CLICK) {
|
||||||
ClickableSpan link = getLinkById(virtualViewId, virtualViewId >= LINK_CAPTION_IDS_START);
|
ClickableSpan link = getLinkById(virtualViewId, virtualViewId >= LINK_CAPTION_IDS_START);
|
||||||
|
|
|
@ -82,7 +82,7 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter.
|
||||||
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
paint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton));
|
paint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton));
|
||||||
|
|
||||||
premiumIconView = new PremiumLockIconView(context, PremiumLockIconView.TYPE_STICKERS);
|
premiumIconView = new PremiumLockIconView(context, PremiumLockIconView.TYPE_STICKERS_PREMIUM_LOCKED);
|
||||||
premiumIconView.setImageReceiver(imageView.getImageReceiver());
|
premiumIconView.setImageReceiver(imageView.getImageReceiver());
|
||||||
premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4));
|
premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4));
|
||||||
premiumIconView.setImageReceiver(imageView.getImageReceiver());
|
premiumIconView.setImageReceiver(imageView.getImageReceiver());
|
||||||
|
@ -213,18 +213,26 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter.
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePremiumStatus(boolean animated) {
|
private void updatePremiumStatus(boolean animated) {
|
||||||
float alpha;
|
if (isPremiumSticker) {
|
||||||
if (isPremiumSticker && !UserConfig.getInstance(currentAccount).isPremium()) {
|
|
||||||
alpha = 0.5f;
|
|
||||||
showPremiumLock = true;
|
showPremiumLock = true;
|
||||||
} else {
|
} else {
|
||||||
alpha = 1f;
|
|
||||||
showPremiumLock = false;
|
showPremiumLock = false;
|
||||||
}
|
}
|
||||||
|
FrameLayout.LayoutParams layoutParams = (LayoutParams) premiumIconView.getLayoutParams();
|
||||||
|
if (!UserConfig.getInstance(currentAccount).isPremium()) {
|
||||||
|
layoutParams.height = layoutParams.width = AndroidUtilities.dp(24);
|
||||||
|
layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
|
||||||
|
layoutParams.bottomMargin = layoutParams.rightMargin = 0;
|
||||||
|
premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4));
|
||||||
|
} else {
|
||||||
|
layoutParams.height = layoutParams.width = AndroidUtilities.dp(16);
|
||||||
|
layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT;
|
||||||
|
layoutParams.bottomMargin = AndroidUtilities.dp(8);
|
||||||
|
layoutParams.rightMargin = AndroidUtilities.dp(8);
|
||||||
|
premiumIconView.setPadding(AndroidUtilities.dp(1), AndroidUtilities.dp(1), AndroidUtilities.dp(1), AndroidUtilities.dp(1));
|
||||||
|
}
|
||||||
|
premiumIconView.setLocked(!UserConfig.getInstance(currentAccount).isPremium());
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(premiumIconView, showPremiumLock, 0.9f, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(premiumIconView, showPremiumLock, 0.9f, animated);
|
||||||
// if (!animated) {
|
|
||||||
// premiumAlpha = alpha;
|
|
||||||
// }
|
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -250,6 +250,7 @@ import org.telegram.ui.Components.StickersAlert;
|
||||||
import org.telegram.ui.Components.TextSelectionHint;
|
import org.telegram.ui.Components.TextSelectionHint;
|
||||||
import org.telegram.ui.Components.TextStyleSpan;
|
import org.telegram.ui.Components.TextStyleSpan;
|
||||||
import org.telegram.ui.Components.ThemeEditorView;
|
import org.telegram.ui.Components.ThemeEditorView;
|
||||||
|
import org.telegram.ui.Components.TranscribeButton;
|
||||||
import org.telegram.ui.Components.TranslateAlert;
|
import org.telegram.ui.Components.TranslateAlert;
|
||||||
import org.telegram.ui.Components.TrendingStickersAlert;
|
import org.telegram.ui.Components.TrendingStickersAlert;
|
||||||
import org.telegram.ui.Components.TypefaceSpan;
|
import org.telegram.ui.Components.TypefaceSpan;
|
||||||
|
@ -20939,6 +20940,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent
|
||||||
if (!TextUtils.isEmpty(restrictionReason)) {
|
if (!TextUtils.isEmpty(restrictionReason)) {
|
||||||
return restrictionReason;
|
return restrictionReason;
|
||||||
}
|
}
|
||||||
|
if (messageObject.isVoiceTranscriptionOpen() && !TranscribeButton.isTranscribing(messageObject)) {
|
||||||
|
return messageObject.getVoiceTranscription();
|
||||||
|
}
|
||||||
if (messageObject.caption != null) {
|
if (messageObject.caption != null) {
|
||||||
return messageObject.caption;
|
return messageObject.caption;
|
||||||
}
|
}
|
||||||
|
|
|
@ -847,7 +847,8 @@ public class EditTextBoldCursor extends EditTextEffects {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int bottom = (int) lineY;
|
int scrollHeight = (getLayout() == null ? 0 : getLayout().getHeight()) - getMeasuredHeight() + getPaddingBottom() + getPaddingTop();
|
||||||
|
int bottom = (int) lineY + getScrollY() + Math.min(Math.max(0, scrollHeight - getScrollY()), AndroidUtilities.dp(2));
|
||||||
int centerX = lastTouchX < 0 ? getMeasuredWidth() / 2 : lastTouchX,
|
int centerX = lastTouchX < 0 ? getMeasuredWidth() / 2 : lastTouchX,
|
||||||
maxWidth = Math.max(centerX, getMeasuredWidth() - centerX) * 2;
|
maxWidth = Math.max(centerX, getMeasuredWidth() - centerX) * 2;
|
||||||
if (lineActiveness < 1f) {
|
if (lineActiveness < 1f) {
|
||||||
|
|
|
@ -4265,7 +4265,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
|
||||||
}
|
}
|
||||||
Object pack = rowStartPack.get(row);
|
Object pack = rowStartPack.get(row);
|
||||||
if (pack instanceof String) {
|
if (pack instanceof String) {
|
||||||
if ("recent".equals(pack)) {
|
if ("premium".equals(pack)) {
|
||||||
|
return premiumTabNum;
|
||||||
|
} else if ("recent".equals(pack)) {
|
||||||
return recentTabNum;
|
return recentTabNum;
|
||||||
} else {
|
} else {
|
||||||
return favTabNum;
|
return favTabNum;
|
||||||
|
@ -4476,7 +4478,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
|
||||||
}
|
}
|
||||||
case 5: {
|
case 5: {
|
||||||
StickerSetNameCell cell = (StickerSetNameCell) holder.itemView;
|
StickerSetNameCell cell = (StickerSetNameCell) holder.itemView;
|
||||||
cell.setText(LocaleController.getString("FeaturedStickers", R.string.FeaturedStickers), R.drawable.msg_close);
|
cell.setText(MediaDataController.getInstance(currentAccount).loadFeaturedPremium ? LocaleController.getString("FeaturedStickersPremium", R.string.FeaturedStickersPremium) : LocaleController.getString("FeaturedStickers", R.string.FeaturedStickers), R.drawable.msg_close);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4566,7 +4568,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
|
||||||
if (pack != null) {
|
if (pack != null) {
|
||||||
rowStartPack.put(startRow + b, pack);
|
rowStartPack.put(startRow + b, pack);
|
||||||
} else {
|
} else {
|
||||||
rowStartPack.put(startRow + b, a == -1 ? "recent" : "fav");
|
if (a == -1) {
|
||||||
|
rowStartPack.put(startRow + b, "premium");
|
||||||
|
} else if (a == -2) {
|
||||||
|
rowStartPack.put(startRow + b, "recent");
|
||||||
|
} else {
|
||||||
|
rowStartPack.put(startRow + b, "fav");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
totalItems += count * stickersPerRow + 1;
|
totalItems += count * stickersPerRow + 1;
|
||||||
|
|
|
@ -21,11 +21,13 @@ import org.telegram.ui.Components.voip.CellFlickerDrawable;
|
||||||
public class PremiumLockIconView extends ImageView {
|
public class PremiumLockIconView extends ImageView {
|
||||||
|
|
||||||
public static int TYPE_REACTIONS = 0;
|
public static int TYPE_REACTIONS = 0;
|
||||||
public static int TYPE_STICKERS = 1;
|
public static int TYPE_STICKERS_PREMIUM_LOCKED = 1;
|
||||||
|
|
||||||
private final int type;
|
private final int type;
|
||||||
public boolean isEnter;
|
public boolean isEnter;
|
||||||
private float[] colorFloat = new float[3];
|
private float[] colorFloat = new float[3];
|
||||||
StarParticlesView.Drawable starParticles;
|
StarParticlesView.Drawable starParticles;
|
||||||
|
private boolean locked;
|
||||||
|
|
||||||
public PremiumLockIconView(Context context, int type) {
|
public PremiumLockIconView(Context context, int type) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@ -174,7 +176,7 @@ public class PremiumLockIconView extends ImageView {
|
||||||
int c1 = currentColor;
|
int c1 = currentColor;
|
||||||
int c2;
|
int c2;
|
||||||
Color.colorToHSV(c1, colorFloat);
|
Color.colorToHSV(c1, colorFloat);
|
||||||
colorFloat[1] *= 2;
|
colorFloat[1] *= locked ? 2 : 1;
|
||||||
if (colorFloat[2] > 0.7f) {
|
if (colorFloat[2] > 0.7f) {
|
||||||
colorFloat[2] = 0.7f;
|
colorFloat[2] = 0.7f;
|
||||||
}
|
}
|
||||||
|
@ -216,4 +218,10 @@ public class PremiumLockIconView extends ImageView {
|
||||||
setScaleX(0);
|
setScaleX(0);
|
||||||
setScaleY(0);
|
setScaleY(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLocked(boolean locked) {
|
||||||
|
if (type != TYPE_REACTIONS) {
|
||||||
|
setImageResource(locked ? R.drawable.msg_mini_premiumlock : R.drawable.msg_mini_stickerstar);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.telegram.messenger.LocaleController;
|
||||||
import org.telegram.messenger.MediaDataController;
|
import org.telegram.messenger.MediaDataController;
|
||||||
import org.telegram.messenger.NotificationCenter;
|
import org.telegram.messenger.NotificationCenter;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
|
import org.telegram.messenger.UserConfig;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
import org.telegram.tgnet.TLRPC;
|
import org.telegram.tgnet.TLRPC;
|
||||||
import org.telegram.ui.ActionBar.BaseFragment;
|
import org.telegram.ui.ActionBar.BaseFragment;
|
||||||
|
@ -101,7 +102,9 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView {
|
||||||
rowCount += premiumFeatures.size();
|
rowCount += premiumFeatures.size();
|
||||||
featuresEndRow = rowCount;
|
featuresEndRow = rowCount;
|
||||||
sectionRow = rowCount++;
|
sectionRow = rowCount++;
|
||||||
|
if (!UserConfig.getInstance(currentAccount).isPremium()) {
|
||||||
buttonRow = rowCount++;
|
buttonRow = rowCount++;
|
||||||
|
}
|
||||||
recyclerListView.setPadding(AndroidUtilities.dp(6), 0, AndroidUtilities.dp(6), 0);
|
recyclerListView.setPadding(AndroidUtilities.dp(6), 0, AndroidUtilities.dp(6), 0);
|
||||||
recyclerListView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() {
|
recyclerListView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -154,10 +157,11 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView {
|
||||||
buttonDivider.getLayoutParams().height = 1;
|
buttonDivider.getLayoutParams().height = 1;
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(buttonDivider, true, 1f, false);
|
AndroidUtilities.updateViewVisibilityAnimated(buttonDivider, true, 1f, false);
|
||||||
|
|
||||||
|
if (!UserConfig.getInstance(currentAccount).isPremium()) {
|
||||||
buttonContainer.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.CENTER_VERTICAL, 16, 0, 16, 0));
|
buttonContainer.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.CENTER_VERTICAL, 16, 0, 16, 0));
|
||||||
buttonContainer.setBackgroundColor(getThemedColor(Theme.key_dialogBackground));
|
buttonContainer.setBackgroundColor(getThemedColor(Theme.key_dialogBackground));
|
||||||
containerView.addView(buttonContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 68, Gravity.BOTTOM));
|
containerView.addView(buttonContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 68, Gravity.BOTTOM));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -151,6 +151,27 @@ public class TranscribeButton {
|
||||||
public boolean onTouch(int action, float x, float y) {
|
public boolean onTouch(int action, float x, float y) {
|
||||||
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
|
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
|
||||||
if (pressed && action == MotionEvent.ACTION_UP) {
|
if (pressed && action == MotionEvent.ACTION_UP) {
|
||||||
|
onTap();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
pressed = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!pressBounds.contains((int) x, (int) y)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (action == MotionEvent.ACTION_DOWN) {
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
if (pressed && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && selectorDrawable instanceof RippleDrawable) {
|
||||||
|
selectorDrawable.setHotspot(x, y);
|
||||||
|
selectorDrawable.setState(pressedState);
|
||||||
|
parent.invalidate();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTap() {
|
||||||
boolean processClick, toOpen = !shouldBeOpen;
|
boolean processClick, toOpen = !shouldBeOpen;
|
||||||
if (!shouldBeOpen) {
|
if (!shouldBeOpen) {
|
||||||
processClick = !loading;
|
processClick = !loading;
|
||||||
|
@ -176,23 +197,6 @@ public class TranscribeButton {
|
||||||
transcribePressed(parent.getMessageObject(), toOpen);
|
transcribePressed(parent.getMessageObject(), toOpen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
pressed = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!pressBounds.contains((int) x, (int) y)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (action == MotionEvent.ACTION_DOWN) {
|
|
||||||
pressed = true;
|
|
||||||
}
|
|
||||||
if (pressed && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && selectorDrawable instanceof RippleDrawable) {
|
|
||||||
selectorDrawable.setHotspot(x, y);
|
|
||||||
selectorDrawable.setState(pressedState);
|
|
||||||
parent.invalidate();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setColor(boolean isOut, int color, int grayColor) {
|
public void setColor(boolean isOut, int color, int grayColor) {
|
||||||
|
|
|
@ -512,7 +512,7 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showStickerSetBulletin(TLRPC.TL_messages_stickerSet stickerSet, MessageObject messageObject) {
|
private void showStickerSetBulletin(TLRPC.TL_messages_stickerSet stickerSet, MessageObject messageObject) {
|
||||||
if (MessagesController.getInstance(currentAccount).premiumLocked) {
|
if (MessagesController.getInstance(currentAccount).premiumLocked || chatActivity.getParentActivity() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
StickerSetBulletinLayout layout = new StickerSetBulletinLayout(contentLayout.getContext(), null, StickerSetBulletinLayout.TYPE_EMPTY, messageObject.getDocument(), chatActivity.getResourceProvider());
|
StickerSetBulletinLayout layout = new StickerSetBulletinLayout(contentLayout.getContext(), null, StickerSetBulletinLayout.TYPE_EMPTY, messageObject.getDocument(), chatActivity.getResourceProvider());
|
||||||
|
|
|
@ -381,8 +381,10 @@ public class GroupStickersActivity extends BaseFragment implements NotificationC
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, info, 0, true, false);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, info, 0, true, false);
|
||||||
finishFragment();
|
finishFragment();
|
||||||
} else {
|
} else {
|
||||||
|
if (getParentActivity() != null) {
|
||||||
Toast.makeText(getParentActivity(), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getParentActivity(), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3234,7 +3234,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen
|
||||||
}
|
}
|
||||||
case STEP_CHECKOUT:
|
case STEP_CHECKOUT:
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.paymentFinished);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.paymentFinished);
|
||||||
if (botUser.username != null && botUser.username.equalsIgnoreCase(getMessagesController().premiumBotUsername) || Objects.equals(invoiceSlug, getMessagesController().premiumInvoiceSlug)) {
|
if (botUser.username != null && botUser.username.equalsIgnoreCase(getMessagesController().premiumBotUsername) || invoiceSlug != null && getMessagesController().premiumInvoiceSlug != null && Objects.equals(invoiceSlug, getMessagesController().premiumInvoiceSlug)) {
|
||||||
for (BaseFragment fragment : new ArrayList<>(getParentLayout().fragmentsStack)) {
|
for (BaseFragment fragment : new ArrayList<>(getParentLayout().fragmentsStack)) {
|
||||||
if (fragment instanceof ChatActivity || fragment instanceof PremiumPreviewFragment) {
|
if (fragment instanceof ChatActivity || fragment instanceof PremiumPreviewFragment) {
|
||||||
fragment.removeSelfFromStack();
|
fragment.removeSelfFromStack();
|
||||||
|
|
|
@ -235,7 +235,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification
|
||||||
shadowDrawable.getPadding(padding);
|
shadowDrawable.getPadding(padding);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
statusBarHeight = AndroidUtilities.statusBarHeight;
|
statusBarHeight = AndroidUtilities.isTablet() ? 0 : AndroidUtilities.statusBarHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
contentView = new FrameLayout(context) {
|
contentView = new FrameLayout(context) {
|
||||||
|
@ -269,7 +269,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification
|
||||||
isLandscapeMode = false;
|
isLandscapeMode = false;
|
||||||
}
|
}
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
statusBarHeight = AndroidUtilities.statusBarHeight;
|
statusBarHeight = AndroidUtilities.isTablet() ? 0 : AndroidUtilities.statusBarHeight;
|
||||||
}
|
}
|
||||||
backgroundView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
|
backgroundView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
|
||||||
particlesView.getLayoutParams().height = backgroundView.getMeasuredHeight();
|
particlesView.getLayoutParams().height = backgroundView.getMeasuredHeight();
|
||||||
|
@ -633,7 +633,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification
|
||||||
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
|
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
|
||||||
numberFormat.setCurrency(currency);
|
numberFormat.setCurrency(currency);
|
||||||
|
|
||||||
return LocaleController.formatString(R.string.SubscribeToPremium, numberFormat.format(premiumPromo.monthly_amount / 100f));
|
return LocaleController.formatString(R.string.SubscribeToPremium, numberFormat.format(premiumPromo.monthly_amount / Math.pow(10, BillingController.getInstance().getCurrencyExp(premiumPromo.currency))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,19 @@ public class SecretMediaViewer implements NotificationCenter.NotificationCenterD
|
||||||
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
|
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
|
||||||
return child != aspectRatioFrameLayout && super.drawChild(canvas, child, drawingTime);
|
return child != aspectRatioFrameLayout && super.drawChild(canvas, child, drawingTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onAttachedToWindow() {
|
||||||
|
super.onAttachedToWindow();
|
||||||
|
centerImage.onAttachedToWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDetachedFromWindow() {
|
||||||
|
super.onDetachedFromWindow();
|
||||||
|
centerImage.onDetachedFromWindow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SecretDeleteTimer extends FrameLayout {
|
private class SecretDeleteTimer extends FrameLayout {
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 416 B |
Binary file not shown.
After Width: | Height: | Size: 318 B |
Binary file not shown.
After Width: | Height: | Size: 507 B |
Binary file not shown.
After Width: | Height: | Size: 716 B |
|
@ -4776,6 +4776,8 @@
|
||||||
<string name="AccActionOpenForwardedOrigin">Forwarded origin</string>
|
<string name="AccActionOpenForwardedOrigin">Forwarded origin</string>
|
||||||
<string name="AccActionEnterSelectionMode">Enter selection mode</string>
|
<string name="AccActionEnterSelectionMode">Enter selection mode</string>
|
||||||
<string name="AccActionChatPreview">Chat Preview</string>
|
<string name="AccActionChatPreview">Chat Preview</string>
|
||||||
|
<string name="AccActionOpenTranscription">Open Voice Transcription</string>
|
||||||
|
<string name="AccActionCloseTranscription">Close Transcription</string>
|
||||||
<string name="AccDescrEmojiButton">Emoji, stickers, and GIFs</string>
|
<string name="AccDescrEmojiButton">Emoji, stickers, and GIFs</string>
|
||||||
<string name="AccDescrAttachButton">Attach media</string>
|
<string name="AccDescrAttachButton">Attach media</string>
|
||||||
<string name="AccDescrChanSilentOn">Send silently</string>
|
<string name="AccDescrChanSilentOn">Send silently</string>
|
||||||
|
@ -5446,4 +5448,5 @@
|
||||||
<string name="PremiumPreviewAdvancedChatManagementDescription">Tools to set the default folder, auto-archive and hide new chats from non-contacts.</string>
|
<string name="PremiumPreviewAdvancedChatManagementDescription">Tools to set the default folder, auto-archive and hide new chats from non-contacts.</string>
|
||||||
<string name="TelegramPremiumUserDialogSubtitle">Owners of **Telegram Premium** accounts have exclusive acces to multiple additional features.</string>
|
<string name="TelegramPremiumUserDialogSubtitle">Owners of **Telegram Premium** accounts have exclusive acces to multiple additional features.</string>
|
||||||
<string name="PremiumPreviewNoAdsDescription2">Remove ads such as this one by subscribing to Telegram Premium.</string>
|
<string name="PremiumPreviewNoAdsDescription2">Remove ads such as this one by subscribing to Telegram Premium.</string>
|
||||||
|
<string name="FeaturedStickersPremium">Trending Premium Stickers</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue