Add new My Story privacy settings.

This commit is contained in:
Cody Henthorne
2022-06-24 10:51:26 -04:00
parent ebc556801e
commit 9bc25132c3
58 changed files with 935 additions and 242 deletions

View File

@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.keyvalue
import org.signal.core.util.LongSerializer
import kotlin.reflect.KProperty
internal fun SignalStoreValues.longValue(key: String, default: Long): SignalStoreValueDelegate<Long> {
@@ -26,6 +27,10 @@ internal fun SignalStoreValues.blobValue(key: String, default: ByteArray): Signa
return BlobValue(key, default, this.store)
}
internal fun <T : Any?> SignalStoreValues.enumValue(key: String, default: T, serializer: LongSerializer<T>): SignalStoreValueDelegate<T> {
return KeyValueEnumValue(key, default, serializer, this.store)
}
/**
* Kotlin delegate that serves as a base for all other value types. This allows us to only expose this sealed
* class to callers and protect the individual implementations as private behind the various extension functions.
@@ -102,3 +107,17 @@ private class BlobValue(private val key: String, private val default: ByteArray,
values.beginWrite().putBlob(key, value).apply()
}
}
private class KeyValueEnumValue<T>(private val key: String, private val default: T, private val serializer: LongSerializer<T>, store: KeyValueStore) : SignalStoreValueDelegate<T>(store) {
override fun getValue(values: KeyValueStore): T {
return if (values.containsKey(key)) {
serializer.deserialize(values.getLong(key, 0))
} else {
default
}
}
override fun setValue(values: KeyValueStore, value: T) {
values.beginWrite().putLong(key, serializer.serialize(value)).apply()
}
}

View File

@@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
import com.google.protobuf.InvalidProtocolBufferException;
import org.signal.core.util.StringSerializer;
import org.thoughtcrime.securesms.database.model.databaseprotos.SignalStoreList;
import java.util.Collections;
@@ -50,7 +51,7 @@ abstract class SignalStoreValues {
return store.getBlob(key, defaultValue);
}
<T> List<T> getList(@NonNull String key, @NonNull Serializer<T> serializer) {
<T> List<T> getList(@NonNull String key, @NonNull StringSerializer<T> serializer) {
byte[] blob = getBlob(key, null);
if (blob == null) {
return Collections.emptyList();
@@ -93,7 +94,7 @@ abstract class SignalStoreValues {
store.beginWrite().putString(key, value).apply();
}
<T> void putList(@NonNull String key, @NonNull List<T> values, @NonNull Serializer<T> serializer) {
<T> void putList(@NonNull String key, @NonNull List<T> values, @NonNull StringSerializer<T> serializer) {
putBlob(key, SignalStoreList.newBuilder()
.addAllContents(values.stream()
.map(serializer::serialize)
@@ -105,9 +106,4 @@ abstract class SignalStoreValues {
void remove(@NonNull String key) {
store.beginWrite().remove(key).apply();
}
interface Serializer<T> {
@NonNull String serialize(@NonNull T data);
T deserialize(@NonNull String data);
}
}

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.keyvalue
import org.json.JSONObject
import org.signal.core.util.StringSerializer
import org.thoughtcrime.securesms.database.model.DistributionListId
import org.thoughtcrime.securesms.groups.GroupId
@@ -62,7 +63,7 @@ internal class StoryValues(store: KeyValueStore) : SignalStoreValues(store) {
return storySends.filter { it.timestamp >= activeCutoffTimestamp }
}
private object StorySendSerializer : Serializer<StorySend> {
private object StorySendSerializer : StringSerializer<StorySend> {
override fun serialize(data: StorySend): String {
return JSONObject()