diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt index 37427590d..041ec7c78 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt @@ -9,6 +9,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.configure +import org.thoughtcrime.securesms.mms.SentMediaQuality import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.webrtc.CallBandwidthMode import kotlin.math.abs @@ -18,6 +19,8 @@ class DataAndStorageSettingsFragment : DSLSettingsFragment(R.string.preferences_ private val autoDownloadValues by lazy { resources.getStringArray(R.array.pref_media_download_entries) } private val autoDownloadLabels by lazy { resources.getStringArray(R.array.pref_media_download_values) } + private val sentMediaQualityLabels by lazy { SentMediaQuality.getLabels(requireContext()) } + private val callBandwidthLabels by lazy { resources.getStringArray(R.array.pref_data_and_storage_call_bandwidth_values) } private lateinit var viewModel: DataAndStorageSettingsViewModel @@ -84,6 +87,21 @@ class DataAndStorageSettingsFragment : DSLSettingsFragment(R.string.preferences_ dividerPref() + sectionHeaderPref(R.string.DataAndStorageSettingsFragment__media_quality) + + radioListPref( + title = DSLSettingsText.from(R.string.DataAndStorageSettingsFragment__sent_media_quality), + listItems = sentMediaQualityLabels, + selected = SentMediaQuality.values().indexOf(state.sentMediaQuality), + onSelected = { viewModel.setSentMediaQuality(SentMediaQuality.values()[it]) } + ) + + textPref( + summary = DSLSettingsText.from(R.string.DataAndStorageSettingsFragment__sending_high_quality_media_will_use_more_data) + ) + + dividerPref() + sectionHeaderPref(R.string.DataAndStorageSettingsFragment__calls) radioListPref( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsState.kt index 1731022f7..1c6af0026 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsState.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.components.settings.app.data +import org.thoughtcrime.securesms.mms.SentMediaQuality import org.thoughtcrime.securesms.webrtc.CallBandwidthMode data class DataAndStorageSettingsState( @@ -8,5 +9,6 @@ data class DataAndStorageSettingsState( val wifiAutoDownloadValues: Set, val roamingAutoDownloadValues: Set, val callBandwidthMode: CallBandwidthMode, - val isProxyEnabled: Boolean + val isProxyEnabled: Boolean, + val sentMediaQuality: SentMediaQuality ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsViewModel.kt index a05ae092f..554994ac3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.mms.SentMediaQuality import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.livedata.Store import org.thoughtcrime.securesms.webrtc.CallBandwidthMode @@ -46,6 +47,11 @@ class DataAndStorageSettingsViewModel( getStateAndCopyStorageUsage() } + fun setSentMediaQuality(sentMediaQuality: SentMediaQuality) { + SignalStore.settings().sentMediaQuality = sentMediaQuality + getStateAndCopyStorageUsage() + } + private fun getStateAndCopyStorageUsage() { store.update { getState().copy(totalStorageUse = it.totalStorageUse) } } @@ -62,7 +68,8 @@ class DataAndStorageSettingsViewModel( ApplicationDependencies.getApplication() ), callBandwidthMode = SignalStore.settings().callBandwidthMode, - isProxyEnabled = SignalStore.proxy().isProxyEnabled + isProxyEnabled = SignalStore.proxy().isProxyEnabled, + sentMediaQuality = SignalStore.settings().sentMediaQuality ) class Factory( diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java index a7fea540c..ce772e5aa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java @@ -12,6 +12,7 @@ import androidx.lifecycle.LiveData; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.mms.SentMediaQuality; import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.storage.StorageSyncHelper; @@ -64,6 +65,7 @@ public final class SettingsValues extends SignalStoreValues { public static final String NOTIFY_WHEN_CONTACT_JOINS_SIGNAL = "settings.notify.when.contact.joins.signal"; private static final String DEFAULT_SMS = "settings.default_sms"; private static final String UNIVERSAL_EXPIRE_TIMER = "settings.universal.expire.timer"; + private static final String SENT_MEDIA_QUALITY = "settings.sentMediaQuality"; private final SingleLiveEvent onConfigurationSettingChanged = new SingleLiveEvent<>(); @@ -106,7 +108,8 @@ public final class SettingsValues extends SignalStoreValues { CALL_RINGTONE, CALL_VIBRATE_ENABLED, NOTIFY_WHEN_CONTACT_JOINS_SIGNAL, - UNIVERSAL_EXPIRE_TIMER); + UNIVERSAL_EXPIRE_TIMER, + SENT_MEDIA_QUALITY); } public @NonNull LiveData getOnConfigurationSettingChanged() { @@ -384,6 +387,14 @@ public final class SettingsValues extends SignalStoreValues { return getInteger(UNIVERSAL_EXPIRE_TIMER, 0); } + public void setSentMediaQuality(@NonNull SentMediaQuality sentMediaQuality) { + putInteger(SENT_MEDIA_QUALITY, sentMediaQuality.getCode()); + } + + public @NonNull SentMediaQuality getSentMediaQuality() { + return SentMediaQuality.fromCode(getInteger(SENT_MEDIA_QUALITY, SentMediaQuality.STANDARD.getCode())); + } + private @Nullable Uri getUri(@NonNull String key) { String uri = getString(key, ""); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt index cd125ebd4..ce06a0d1d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.mediasend.v2 import android.net.Uri import org.thoughtcrime.securesms.TransportOption +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendConstants import org.thoughtcrime.securesms.mms.SentMediaQuality @@ -12,7 +13,7 @@ data class MediaSelectionState( val selectedMedia: List = listOf(), val focusedMedia: Media? = null, val recipient: Recipient? = null, - val quality: SentMediaQuality = SentMediaQuality.STANDARD, + val quality: SentMediaQuality = SignalStore.settings().sentMediaQuality, val message: CharSequence? = null, val viewOnceToggleState: ViewOnceToggleState = ViewOnceToggleState.INFINITE, val isTouchEnabled: Boolean = true, diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/SentMediaQuality.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SentMediaQuality.java index f205ff4f5..d2976b44b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/SentMediaQuality.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/SentMediaQuality.java @@ -1,19 +1,28 @@ package org.thoughtcrime.securesms.mms; +import android.content.Context; + import androidx.annotation.NonNull; +import androidx.annotation.StringRes; + +import org.thoughtcrime.securesms.R; + +import java.util.Arrays; /** * Quality levels to send media at. */ public enum SentMediaQuality { - STANDARD(0), - HIGH(1); + STANDARD(0, R.string.DataAndStorageSettingsFragment__standard), + HIGH(1, R.string.DataAndStorageSettingsFragment__high); private final int code; + private final int label; - SentMediaQuality(int code) { - this.code = code; + SentMediaQuality(int code, @StringRes int label) { + this.code = code; + this.label = label; } public static @NonNull SentMediaQuality fromCode(int code) { @@ -23,6 +32,10 @@ public enum SentMediaQuality { return STANDARD; } + public static @NonNull String[] getLabels(@NonNull Context context) { + return Arrays.stream(values()).map(q -> context.getString(q.label)).toArray(String[]::new); + } + public int getCode() { return code; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 314e5d1d5..c52ae3c54 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3610,6 +3610,11 @@ Licensed under the GPLv3 + Media quality + Sent media quality + Sending high quality media will use more data. + High + Standard Calls