package org.telegram.messenger; import android.text.TextUtils; import android.util.LongSparseArray; import org.telegram.tgnet.TLRPC; import java.io.File; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashSet; public class CacheByChatsController { public static int KEEP_MEDIA_DELETE = 4; public static int KEEP_MEDIA_FOREVER = 2; public static int KEEP_MEDIA_ONE_DAY = 3; public static int KEEP_MEDIA_ONE_WEEK = 0; public static int KEEP_MEDIA_ONE_MONTH = 1; //TEST VALUE public static int KEEP_MEDIA_ONE_MINUTE = 5; public static final int KEEP_MEDIA_TYPE_USER = 0; public static final int KEEP_MEDIA_TYPE_GROUP = 1; public static final int KEEP_MEDIA_TYPE_CHANNEL = 2; private final int currentAccount; int[] keepMediaByTypes = {-1, -1, -1}; public CacheByChatsController(int currentAccount) { this.currentAccount = currentAccount; for (int i = 0; i < 3; i++) { keepMediaByTypes[i] = SharedConfig.getPreferences().getInt("keep_media_type_" + i, getDefault(i)); } } public static int getDefault(int type) { if (type == KEEP_MEDIA_TYPE_USER) { return KEEP_MEDIA_FOREVER; } else if (type == KEEP_MEDIA_TYPE_GROUP) { return KEEP_MEDIA_ONE_MONTH; } else if (type == KEEP_MEDIA_TYPE_CHANNEL) { return KEEP_MEDIA_ONE_WEEK; } return SharedConfig.keepMedia; } public static String getKeepMediaString(int keepMedia) { if (keepMedia == KEEP_MEDIA_ONE_MINUTE) { return LocaleController.formatPluralString("Minutes", 1); } else if (keepMedia == KEEP_MEDIA_ONE_DAY) { return LocaleController.formatPluralString("Days", 1); } else if (keepMedia == KEEP_MEDIA_ONE_WEEK) { return LocaleController.formatPluralString("Weeks", 1); } else if (keepMedia == KEEP_MEDIA_ONE_MONTH) { return LocaleController.formatPluralString("Months", 1); } return LocaleController.getString("AutoDeleteMediaNever", R.string.AutoDeleteMediaNever); } public static long getDaysInSeconds(int keepMedia) { long seconds; if (keepMedia == CacheByChatsController.KEEP_MEDIA_ONE_WEEK) { seconds = 60L * 60L * 24L * 7L; } else if (keepMedia == CacheByChatsController.KEEP_MEDIA_ONE_MONTH) { seconds = 60L * 60L * 24L * 30L; } else if (keepMedia == CacheByChatsController.KEEP_MEDIA_ONE_DAY) { seconds = 60L * 60L * 24L; } else if (keepMedia == CacheByChatsController.KEEP_MEDIA_ONE_MINUTE && BuildVars.DEBUG_PRIVATE_VERSION) { //one min seconds = 60L; } else { seconds = Long.MAX_VALUE; } return seconds; } public ArrayList getKeepMediaExceptions(int type) { ArrayList exceptions = new ArrayList<>(); HashSet idsSet = new HashSet<>(); String exceptionsHash = UserConfig.getInstance(currentAccount).getPreferences().getString("keep_media_exceptions_" + type, ""); if (TextUtils.isEmpty(exceptionsHash)) { return exceptions; } else { ByteBuffer byteBuffer = ByteBuffer.wrap(Utilities.hexToBytes(exceptionsHash)); int n = byteBuffer.getInt(); for (int i = 0; i < n; i++) { KeepMediaException exception = new KeepMediaException(byteBuffer.getLong(), byteBuffer.getInt()); if (!idsSet.contains(exception.dialogId)) { idsSet.add(exception.dialogId); exceptions.add(exception); } } byteBuffer.clear(); } return exceptions; } public void saveKeepMediaExceptions(int type, ArrayList exceptions) { String key = "keep_media_exceptions_" + type; if (exceptions.isEmpty()) { UserConfig.getInstance(currentAccount).getPreferences().edit().remove(key).apply(); } else { int n = exceptions.size(); ByteBuffer byteBuffer = ByteBuffer.allocate(4 + (8 + 4) * n); byteBuffer.putInt(n); for (int i = 0; i < n; i++) { byteBuffer.putLong(exceptions.get(i).dialogId); byteBuffer.putInt(exceptions.get(i).keepMedia); } UserConfig.getInstance(currentAccount).getPreferences().edit().putString(key, Utilities.bytesToHex(byteBuffer.array())).apply(); byteBuffer.clear(); } } public int getKeepMedia(int type) { if (keepMediaByTypes[type] == -1) { return SharedConfig.keepMedia; } return keepMediaByTypes[type]; } public void setKeepMedia(int type, int keepMedia) { keepMediaByTypes[type] = keepMedia; SharedConfig.getPreferences().edit().putInt("keep_media_type_" + type, keepMedia).apply(); } public void lookupFiles(ArrayList keepMediaFiles) { LongSparseArray> filesByDialogId = FileLoader.getInstance(currentAccount).getFileDatabase().lookupFiles(keepMediaFiles); LongSparseArray exceptionsByType = getKeepMediaExceptionsByDialogs(); for (int i = 0; i < filesByDialogId.size(); i++) { long dialogId = filesByDialogId.keyAt(i); ArrayList files = filesByDialogId.valueAt(i); int type; if (dialogId >= 0) { type = KEEP_MEDIA_TYPE_USER; } else { TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); if (chat == null) { chat = MessagesStorage.getInstance(currentAccount).getChatSync(-dialogId); } if (chat == null) { type = -1; } else if (ChatObject.isChannel(chat)) { type = KEEP_MEDIA_TYPE_CHANNEL; } else { type = KEEP_MEDIA_TYPE_GROUP; } } KeepMediaException exception = exceptionsByType.get(dialogId); for (int k = 0; k < files.size(); k++) { KeepMediaFile file = files.get(k); if (type >= 0) { file.dialogType = type; } if (exception != null) { file.keepMedia = exception.keepMedia; } } } } public LongSparseArray getKeepMediaExceptionsByDialogs() { LongSparseArray sparseArray = new LongSparseArray<>(); for (int i = 0; i < 3; i++) { ArrayList exceptions = getKeepMediaExceptions(i); if (exceptions != null) { for (int k = 0; k < exceptions.size(); k++) { sparseArray.put(exceptions.get(k).dialogId, exceptions.get(k)); } } } return sparseArray; } public static class KeepMediaException { public final long dialogId; public int keepMedia; public KeepMediaException(long dialogId, int keepMedia) { this.dialogId = dialogId; this.keepMedia = keepMedia; } } public static class KeepMediaFile { final File file; int keepMedia = -1; int dialogType = KEEP_MEDIA_TYPE_CHANNEL; public KeepMediaFile(File file) { this.file = file; } } }