session-android/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository...

125 lines
4.3 KiB
Java

package org.thoughtcrime.securesms.stickers;
import android.content.Context;
import android.database.Cursor;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.StickerDatabase;
import org.thoughtcrime.securesms.database.StickerDatabase.StickerPackRecordReader;
import org.thoughtcrime.securesms.database.model.StickerPackRecord;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobs.StickerPackDownloadJob;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsession.utilities.concurrent.SignalExecutors;
import java.util.ArrayList;
import java.util.List;
final class StickerManagementRepository {
private final Context context;
private final StickerDatabase stickerDatabase;
private final AttachmentDatabase attachmentDatabase;
StickerManagementRepository(@NonNull Context context) {
this.context = context.getApplicationContext();
this.stickerDatabase = DatabaseFactory.getStickerDatabase(context);
this.attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context);
}
void deleteOrphanedStickerPacks() {
SignalExecutors.SERIAL.execute(stickerDatabase::deleteOrphanedPacks);
}
void fetchUnretrievedReferencePacks() {
SignalExecutors.SERIAL.execute(() -> {
JobManager jobManager = ApplicationContext.getInstance(context).getJobManager();
try (Cursor cursor = attachmentDatabase.getUnavailableStickerPacks()) {
while (cursor != null && cursor.moveToNext()) {
String packId = cursor.getString(cursor.getColumnIndexOrThrow(AttachmentDatabase.STICKER_PACK_ID));
String packKey = cursor.getString(cursor.getColumnIndexOrThrow(AttachmentDatabase.STICKER_PACK_KEY));
jobManager.add(new StickerPackDownloadJob(packId, packKey, true));
}
}
});
}
void getStickerPacks(@NonNull Callback<PackResult> callback) {
SignalExecutors.SERIAL.execute(() -> {
List<StickerPackRecord> installedPacks = new ArrayList<>();
List<StickerPackRecord> availablePacks = new ArrayList<>();
List<StickerPackRecord> blessedPacks = new ArrayList<>();
try (StickerPackRecordReader reader = new StickerPackRecordReader(stickerDatabase.getAllStickerPacks())) {
StickerPackRecord record;
while ((record = reader.getNext()) != null) {
if (record.isInstalled()) {
installedPacks.add(record);
} else if (BlessedPacks.contains(record.getPackId())) {
blessedPacks.add(record);
} else {
availablePacks.add(record);
}
}
}
callback.onComplete(new PackResult(installedPacks, availablePacks, blessedPacks));
});
}
void uninstallStickerPack(@NonNull String packId, @NonNull String packKey) {
SignalExecutors.SERIAL.execute(() -> {
stickerDatabase.uninstallPack(packId);
});
}
void installStickerPack(@NonNull String packId, @NonNull String packKey) {
SignalExecutors.SERIAL.execute(() -> {
JobManager jobManager = ApplicationContext.getInstance(context).getJobManager();
if (stickerDatabase.isPackAvailableAsReference(packId)) {
stickerDatabase.markPackAsInstalled(packId);
}
jobManager.add(new StickerPackDownloadJob(packId, packKey, false));
});
}
static class PackResult {
private final List<StickerPackRecord> installedPacks;
private final List<StickerPackRecord> availablePacks;
private final List<StickerPackRecord> blessedPacks;
PackResult(@NonNull List<StickerPackRecord> installedPacks,
@NonNull List<StickerPackRecord> availablePacks,
@NonNull List<StickerPackRecord> blessedPacks)
{
this.installedPacks = installedPacks;
this.availablePacks = availablePacks;
this.blessedPacks = blessedPacks;
}
@NonNull List<StickerPackRecord> getInstalledPacks() {
return installedPacks;
}
@NonNull List<StickerPackRecord> getAvailablePacks() {
return availablePacks;
}
@NonNull List<StickerPackRecord> getBlessedPacks() {
return blessedPacks;
}
}
interface Callback<T> {
void onComplete(T result);
}
}