diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/SyncMessageProcessorTest_synchronizeDeleteForMe.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/SyncMessageProcessorTest_synchronizeDeleteForMe.kt index bb24b8e934..e595005ace 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/SyncMessageProcessorTest_synchronizeDeleteForMe.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/SyncMessageProcessorTest_synchronizeDeleteForMe.kt @@ -27,8 +27,8 @@ import org.thoughtcrime.securesms.testing.SignalActivityRule import org.thoughtcrime.securesms.testing.assert import org.thoughtcrime.securesms.testing.assertIs import org.thoughtcrime.securesms.testing.assertIsNotNull -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.IdentityUtil +import org.thoughtcrime.securesms.util.RemoteConfig @Suppress("ClassName") @RunWith(AndroidJUnit4::class) @@ -43,15 +43,15 @@ class SyncMessageProcessorTest_synchronizeDeleteForMe { fun setUp() { messageHelper = MessageHelper(harness) - mockkStatic(FeatureFlags::class) - every { FeatureFlags.deleteSyncEnabled } returns true + mockkStatic(RemoteConfig::class) + every { RemoteConfig.deleteSyncEnabled } returns true } @After fun tearDown() { messageHelper.tearDown() - unmockkStatic(FeatureFlags::class) + unmockkStatic(RemoteConfig::class) } @Test diff --git a/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt b/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt index 3f2ae149cd..242e9b6823 100644 --- a/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt +++ b/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt @@ -4,7 +4,7 @@ import android.content.Context import org.thoughtcrime.securesms.BuildConfig import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.push.AccountManagerFactory -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.SignalServiceAccountManager import org.whispersystems.signalservice.api.account.PreKeyUpload import org.whispersystems.signalservice.api.push.ServiceId.ACI @@ -23,8 +23,8 @@ class DummyAccountManagerFactory : AccountManagerFactory() { deviceId, password, BuildConfig.SIGNAL_AGENT, - FeatureFlags.okHttpAutomaticRetry(), - FeatureFlags.groupLimits().hardLimit + RemoteConfig.okHttpAutomaticRetry(), + RemoteConfig.groupLimits().hardLimit ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 0c8c3c31b4..4864a669a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -98,7 +98,7 @@ import org.thoughtcrime.securesms.storage.StorageSyncHelper; import org.thoughtcrime.securesms.util.AppForegroundObserver; import org.thoughtcrime.securesms.util.AppStartup; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.thoughtcrime.securesms.util.SignalUncaughtExceptionHandler; import org.thoughtcrime.securesms.util.TextSecurePreferences; @@ -144,7 +144,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr long startTime = System.currentTimeMillis(); - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { Tracer.getInstance().setMaxBufferSize(35_000); } @@ -179,7 +179,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr } }) .addBlocking("blob-provider", this::initializeBlobProvider) - .addBlocking("feature-flags", FeatureFlags::init) + .addBlocking("remote-config", RemoteConfig::init) .addBlocking("ring-rtc", this::initializeRingRtc) .addBlocking("glide", () -> SignalGlideModule.setRegisterGlideComponents(new SignalGlideComponents())) .addNonBlocking(() -> RegistrationUtil.maybeMarkRegistrationComplete()) @@ -207,7 +207,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr .addPostRender(RefreshSvrCredentialsJob::enqueueIfNecessary) .addPostRender(() -> DownloadLatestEmojiDataJob.scheduleIfNecessary(this)) .addPostRender(EmojiSearchIndexDownloadJob::scheduleIfNecessary) - .addPostRender(() -> SignalDatabase.messageLog().trimOldMessages(System.currentTimeMillis(), FeatureFlags.retryRespondMaxAge())) + .addPostRender(() -> SignalDatabase.messageLog().trimOldMessages(System.currentTimeMillis(), RemoteConfig.retryRespondMaxAge())) .addPostRender(() -> JumboEmoji.updateCurrentVersion(this)) .addPostRender(RetrieveRemoteAnnouncementsJob::enqueue) .addPostRender(() -> AndroidTelecomUtil.registerPhoneAccount()) @@ -243,7 +243,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr startAnrDetector(); SignalExecutors.BOUNDED.execute(() -> { - FeatureFlags.refreshIfNecessary(); + RemoteConfig.refreshIfNecessary(); RetrieveProfileJob.enqueueRoutineFetchIfNecessary(); executePendingContactSync(); KeyCachingService.onAppForegrounded(this); @@ -289,7 +289,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr * This is so we can capture ANR's that happen on boot before the foreground event. */ private void startAnrDetector() { - AnrDetector.start(TimeUnit.SECONDS.toMillis(5), FeatureFlags::internalUser, (dumps) -> { + AnrDetector.start(TimeUnit.SECONDS.toMillis(5), RemoteConfig::internalUser, (dumps) -> { LogDatabase.getInstance(this).anrs().save(System.currentTimeMillis(), dumps); return Unit.INSTANCE; }); @@ -314,7 +314,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr @VisibleForTesting protected void initializeLogging() { - Log.initialize(FeatureFlags::internalUser, new AndroidLogger(), new PersistentLogger(this)); + Log.initialize(RemoteConfig::internalUser, new AndroidLogger(), new PersistentLogger(this)); SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger()); @@ -437,7 +437,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr private void initializeRingRtc() { try { Map fieldTrials = new HashMap<>(); - if (FeatureFlags.callingFieldTrialAnyAddressPortsKillSwitch()) { + if (RemoteConfig.callingFieldTrialAnyAddressPortsKillSwitch()) { fieldTrials.put("RingRTC-AnyAddressPortsKillSwitch", "Enabled"); } if (!SignalStore.internalValues().callingDisableLBRed()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java index 4d4e033cb0..b03279c122 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -29,14 +29,10 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.components.ContactFilterView; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; -import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.DisplayMetricsUtil; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.ServiceUtil; -import org.thoughtcrime.securesms.util.Util; import java.io.IOException; import java.lang.ref.WeakReference; diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java index 76e76db9db..c38e7a0740 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java @@ -33,7 +33,7 @@ import org.thoughtcrime.securesms.registration.v2.ui.RegistrationV2Activity; import org.thoughtcrime.securesms.restore.RestoreActivity; import org.thoughtcrime.securesms.service.KeyCachingService; import org.thoughtcrime.securesms.util.AppStartup; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.util.Locale; @@ -189,7 +189,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements } private boolean userCanTransferOrRestore() { - return !SignalStore.registrationValues().isRegistrationComplete() && FeatureFlags.restoreAfterRegistration() && !SignalStore.registrationValues().hasSkippedTransferOrRestore(); + return !SignalStore.registrationValues().isRegistrationComplete() && RemoteConfig.restoreAfterRegistration() && !SignalStore.registrationValues().hasSkippedTransferOrRestore(); } private boolean userMustCreateSignalPin() { @@ -222,7 +222,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements } private Intent getPushRegistrationIntent() { - if (FeatureFlags.registrationV2()) { + if (RemoteConfig.registrationV2()) { return RegistrationV2Activity.newIntentForNewRegistration(this, getIntent()); } else { return RegistrationNavigationActivity.newIntentForNewRegistration(this, getIntent()); @@ -269,7 +269,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements } private Intent getChangeNumberLockIntent() { - if (FeatureFlags.registrationV2()) { + if (RemoteConfig.registrationV2()) { return ChangeNumberLockV2Activity.createIntent(this); } else { return ChangeNumberLockActivity.createIntent(this); diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java index 125bd0c203..7fe7a85eed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -94,7 +94,7 @@ import org.thoughtcrime.securesms.service.webrtc.SignalCallManager; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.BottomSheetUtil; import org.thoughtcrime.securesms.util.EllapsedTimeFormatter; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.FullscreenHelper; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ThrottledDebouncer; @@ -415,7 +415,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } private void initializePendingParticipantFragmentListener() { - if (!FeatureFlags.adHocCalling()) { + if (!RemoteConfig.adHocCalling()) { return; } @@ -822,7 +822,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } public void handleGroupMemberCountChange(int count) { - boolean canRing = count <= FeatureFlags.maxGroupCallRingSize(); + boolean canRing = count <= RemoteConfig.maxGroupCallRingSize(); callScreen.enableRingGroup(canRing); AppDependencies.getSignalCallManager().setRingGroup(canRing); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt index fcd737e071..c0af9868dc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt @@ -14,13 +14,13 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.InAppPaymentData import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.lock.v2.PinKeyboardType import org.thoughtcrime.securesms.lock.v2.SvrConstants -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.kbs.PinHashUtil.verifyLocalPinHash class MessageBackupsFlowViewModel : ViewModel() { private val internalState = mutableStateOf( MessageBackupsFlowState( - availableBackupTiers = if (!FeatureFlags.messageBackups) { + availableBackupTiers = if (!RemoteConfig.messageBackups) { emptyList() } else { listOf(MessageBackupTier.FREE, MessageBackupTier.PAID) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt index 7478ab8853..cc5cc3ea99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/links/CallLinks.kt @@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.database.DatabaseObserver import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.service.webrtc.links.CallLinkRoomId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import java.net.URLDecoder /** @@ -54,7 +54,7 @@ object CallLinks { @JvmStatic fun isCallLink(url: String): Boolean { - if (!FeatureFlags.adHocCalling) { + if (!RemoteConfig.adHocCalling) { return false } @@ -67,7 +67,7 @@ object CallLinks { @JvmStatic fun parseUrl(url: String): CallLinkRootKey? { - if (!FeatureFlags.adHocCalling) { + if (!RemoteConfig.adHocCalling) { return null } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt index ed1fae9565..9dd188bc17 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt @@ -62,7 +62,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.stories.tabs.ConversationListTab import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel import org.thoughtcrime.securesms.util.CommunicationActions -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.doAfterNextLayout import org.thoughtcrime.securesms.util.fragments.requireListener @@ -253,7 +253,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getQuantityString(R.plurals.CallLogFragment__delete_d_calls, count, count)) .setMessage( - if (FeatureFlags.adHocCalling) { + if (RemoteConfig.adHocCalling) { getString(R.string.CallLogFragment__call_links_youve_created) } else { null @@ -403,7 +403,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getQuantityString(R.plurals.CallLogFragment__delete_d_calls, 1, 1)) .setMessage( - if (FeatureFlags.adHocCalling) { + if (RemoteConfig.adHocCalling) { getString(R.string.CallLogFragment__call_links_youve_created) } else { null diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt index 45073e9112..635ce62046 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogPagedDataSource.kt @@ -1,7 +1,7 @@ package org.thoughtcrime.securesms.calls.log import org.signal.paging.PagedDataSource -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig class CallLogPagedDataSource( private val query: String?, @@ -10,7 +10,7 @@ class CallLogPagedDataSource( ) : PagedDataSource { private val hasFilter = filter == CallLogFilter.MISSED - private val hasCallLinkRow = FeatureFlags.adHocCalling && filter == CallLogFilter.ALL && query.isNullOrEmpty() + private val hasCallLinkRow = RemoteConfig.adHocCalling && filter == CallLogFilter.ALL && query.isNullOrEmpty() private var callEventsCount = 0 private var callLinksCount = 0 diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogViewModel.kt index 94c7fc656e..91818b88dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogViewModel.kt @@ -16,7 +16,7 @@ import org.signal.paging.PagedData import org.signal.paging.PagingConfig import org.signal.paging.ProxyPagingController import org.thoughtcrime.securesms.dependencies.AppDependencies -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.rx.RxStore import java.util.concurrent.TimeUnit @@ -82,7 +82,7 @@ class CallLogViewModel( controller.onDataInvalidated() } - if (FeatureFlags.adHocCalling) { + if (RemoteConfig.adHocCalling) { disposables += Observable .interval(30, TimeUnit.SECONDS, Schedulers.computation()) .flatMapCompletable { callLogRepository.peekCallLinks() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/DeleteSyncEducationDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/components/DeleteSyncEducationDialog.kt index 26fb9a519c..492464af7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/DeleteSyncEducationDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/DeleteSyncEducationDialog.kt @@ -32,7 +32,7 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences /** @@ -48,7 +48,7 @@ class DeleteSyncEducationDialog : ComposeBottomSheetDialogFragment() { fun shouldShow(): Boolean { return TextSecurePreferences.isMultiDevice(AppDependencies.application) && !SignalStore.uiHints().hasSeenDeleteSyncEducationSheet && - FeatureFlags.deleteSyncEnabled + RemoteConfig.deleteSyncEnabled } @JvmStatic diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt index 70adca9ba8..43bbe1b409 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsActivity.kt @@ -22,7 +22,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.service.KeyCachingService import org.thoughtcrime.securesms.util.CachedInflater import org.thoughtcrime.securesms.util.DynamicTheme -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.navigation.safeNavigate private const val START_LOCATION = "app.settings.start.location" @@ -40,7 +40,7 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent { override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { if (intent?.hasExtra(ARG_NAV_GRAPH) != true) { - val navGraphResId = if (FeatureFlags.registrationV2) R.navigation.app_settings_with_change_number_v2 else R.navigation.app_settings + val navGraphResId = if (RemoteConfig.registrationV2) R.navigation.app_settings_with_change_number_v2 else R.navigation.app_settings intent?.putExtra(ARG_NAV_GRAPH, navGraphResId) } @@ -197,7 +197,7 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent { fun usernameRecovery(context: Context): Intent = getIntentForStartLocation(context, StartLocation.RECOVER_USERNAME) private fun getIntentForStartLocation(context: Context, startLocation: StartLocation): Intent { - val navGraphResId = if (FeatureFlags.registrationV2) R.navigation.app_settings_with_change_number_v2 else R.navigation.app_settings + val navGraphResId = if (RemoteConfig.registrationV2) R.navigation.app_settings_with_change_number_v2 else R.navigation.app_settings return Intent(context, AppSettingsActivity::class.java) .putExtra(ARG_NAV_GRAPH, navGraphResId) .putExtra(START_LOCATION, startLocation.code) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt index 4e0ad44415..2fe03979c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt @@ -35,8 +35,8 @@ import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.RegistrationNavigationActivity import org.thoughtcrime.securesms.util.Environment -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.PlayStoreUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory @@ -160,7 +160,7 @@ class AppSettingsFragment : DSLSettingsFragment( title = DSLSettingsText.from(R.string.preferences__linked_devices), icon = DSLSettingsIcon.from(R.drawable.symbol_devices_24), onClick = { - if (FeatureFlags.internalUser) { + if (RemoteConfig.internalUser) { findNavController().safeNavigate(R.id.action_appSettingsFragment_to_linkDeviceFragment) } else { findNavController().safeNavigate(R.id.action_appSettingsFragment_to_deviceActivity) @@ -281,7 +281,7 @@ class AppSettingsFragment : DSLSettingsFragment( } ) - if (FeatureFlags.internalUser) { + if (RemoteConfig.internalUser) { dividerPref() clickPref( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt index 81a7f5130f..40f542bd08 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt @@ -9,7 +9,7 @@ import org.thoughtcrime.securesms.components.settings.DSLConfiguration 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.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.navigation.safeNavigate @@ -84,7 +84,7 @@ class ChatsSettingsFragment : DSLSettingsFragment(R.string.preferences_chats__ch sectionHeaderPref(R.string.preferences_chats__backups) - if (FeatureFlags.messageBackups || state.remoteBackupsEnabled) { + if (RemoteConfig.messageBackups || state.remoteBackupsEnabled) { clickPref( title = DSLSettingsText.from("Signal Backups"), // TODO [message-backups] -- Finalized copy summary = DSLSettingsText.from(if (state.remoteBackupsEnabled) R.string.arrays__enabled else R.string.arrays__disabled), diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/storage/ManageStorageSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/storage/ManageStorageSettingsFragment.kt index bc0a1d71f5..9c5509b964 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/storage/ManageStorageSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/storage/ManageStorageSettingsFragment.kt @@ -66,7 +66,7 @@ import org.thoughtcrime.securesms.database.MediaTable import org.thoughtcrime.securesms.keyvalue.KeepMessagesDuration import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity import org.thoughtcrime.securesms.preferences.widgets.StorageGraphView -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.viewModel @@ -138,7 +138,7 @@ class ManageStorageSettingsFragment : ComposeFragment() { dialog("confirm-delete-chat-history") { Dialogs.SimpleAlertDialog( title = stringResource(id = R.string.preferences_storage__delete_message_history), - body = if (TextSecurePreferences.isMultiDevice(LocalContext.current) && FeatureFlags.deleteSyncEnabled) { + body = if (TextSecurePreferences.isMultiDevice(LocalContext.current) && RemoteConfig.deleteSyncEnabled) { stringResource(id = R.string.preferences_storage__this_will_delete_all_message_history_and_media_from_your_device_linked_device) } else { stringResource(id = R.string.preferences_storage__this_will_delete_all_message_history_and_media_from_your_device) @@ -154,7 +154,7 @@ class ManageStorageSettingsFragment : ComposeFragment() { dialog("double-confirm-delete-chat-history", dialogProperties = DialogProperties(dismissOnBackPress = true, dismissOnClickOutside = true)) { Dialogs.SimpleAlertDialog( title = stringResource(id = R.string.preferences_storage__are_you_sure_you_want_to_delete_all_message_history), - body = if (TextSecurePreferences.isMultiDevice(LocalContext.current) && FeatureFlags.deleteSyncEnabled) { + body = if (TextSecurePreferences.isMultiDevice(LocalContext.current) && RemoteConfig.deleteSyncEnabled) { stringResource(id = R.string.preferences_storage__all_message_history_will_be_permanently_removed_this_action_cannot_be_undone_linked_device) } else { stringResource(id = R.string.preferences_storage__all_message_history_will_be_permanently_removed_this_action_cannot_be_undone) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt index 160886d6e8..6e59d6604e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt @@ -4,8 +4,8 @@ import org.signal.donations.PaymentSourceType import org.thoughtcrime.securesms.database.InAppPaymentTable import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.Environment -import org.thoughtcrime.securesms.util.FeatureFlags -import org.thoughtcrime.securesms.util.LocaleFeatureFlags +import org.thoughtcrime.securesms.util.LocaleRemoteConfig +import org.thoughtcrime.securesms.util.RemoteConfig /** * Helper object to determine in-app donations availability. @@ -38,45 +38,45 @@ object InAppDonations { private fun isPayPalAvailableForDonateToSignalType(inAppPaymentType: InAppPaymentTable.Type): Boolean { return when (inAppPaymentType) { InAppPaymentTable.Type.UNKNOWN -> error("Unsupported type UNKNOWN") - InAppPaymentTable.Type.ONE_TIME_DONATION, InAppPaymentTable.Type.ONE_TIME_GIFT -> FeatureFlags.paypalOneTimeDonations - InAppPaymentTable.Type.RECURRING_DONATION -> FeatureFlags.paypalRecurringDonations - InAppPaymentTable.Type.RECURRING_BACKUP -> FeatureFlags.messageBackups && FeatureFlags.paypalRecurringDonations - } && !LocaleFeatureFlags.isPayPalDisabled() + InAppPaymentTable.Type.ONE_TIME_DONATION, InAppPaymentTable.Type.ONE_TIME_GIFT -> RemoteConfig.paypalOneTimeDonations + InAppPaymentTable.Type.RECURRING_DONATION -> RemoteConfig.paypalRecurringDonations + InAppPaymentTable.Type.RECURRING_BACKUP -> RemoteConfig.messageBackups && RemoteConfig.paypalRecurringDonations + } && !LocaleRemoteConfig.isPayPalDisabled() } /** * Whether the user is in a region that supports credit cards, based off local phone number. */ fun isCreditCardAvailable(): Boolean { - return !LocaleFeatureFlags.isCreditCardDisabled() + return !LocaleRemoteConfig.isCreditCardDisabled() } /** * Whether the user is in a region that supports PayPal, based off local phone number. */ fun isPayPalAvailable(): Boolean { - return (FeatureFlags.paypalOneTimeDonations || FeatureFlags.paypalRecurringDonations) && !LocaleFeatureFlags.isPayPalDisabled() + return (RemoteConfig.paypalOneTimeDonations || RemoteConfig.paypalRecurringDonations) && !LocaleRemoteConfig.isPayPalDisabled() } /** * Whether the user is using a device that supports GooglePay, based off Wallet API and phone number. */ fun isGooglePayAvailable(): Boolean { - return SignalStore.donationsValues().isGooglePayReady && !LocaleFeatureFlags.isGooglePayDisabled() + return SignalStore.donationsValues().isGooglePayReady && !LocaleRemoteConfig.isGooglePayDisabled() } /** * Whether the user is in a region which supports SEPA Debit transfers, based off local phone number. */ fun isSEPADebitAvailable(): Boolean { - return Environment.IS_STAGING || (FeatureFlags.sepaDebitDonations && LocaleFeatureFlags.isSepaEnabled()) + return Environment.IS_STAGING || (RemoteConfig.sepaDebitDonations && LocaleRemoteConfig.isSepaEnabled()) } /** * Whether the user is in a region which supports IDEAL transfers, based off local phone number. */ fun isIDEALAvailable(): Boolean { - return Environment.IS_STAGING || (FeatureFlags.idealDonations && LocaleFeatureFlags.isIdealEnabled()) + return Environment.IS_STAGING || (RemoteConfig.idealDonations && LocaleRemoteConfig.isIdealEnabled()) } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt index 26bdb59894..3243d78264 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt @@ -31,7 +31,7 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.donate.Do import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.databaseprotos.InAppPaymentData import org.thoughtcrime.securesms.databinding.DonationWebviewFragmentBinding -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.visible /** @@ -84,7 +84,7 @@ class Stripe3DSDialogFragment : DialogFragment(R.layout.donation_webview_fragmen ) ) - if (FeatureFlags.internalUser && args.inAppPayment.data.paymentMethodType == InAppPaymentData.PaymentMethodType.IDEAL) { + if (RemoteConfig.internalUser && args.inAppPayment.data.paymentMethodType == InAppPaymentData.PaymentMethodType.IDEAL) { val openApp = MaterialButton(requireContext()).apply { text = "Open App" layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt index 8007c5f76a..0293e8aabb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsRepository.kt @@ -28,7 +28,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientUtil -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import java.io.IOException private val TAG = Log.tag(ConversationSettingsRepository::class.java) @@ -159,9 +159,9 @@ class ConversationSettingsRepository( members.addAll(groupRecord.members) members.addAll(pendingMembers) - GroupCapacityResult(Recipient.self().id, members, FeatureFlags.groupLimits, groupRecord.isAnnouncementGroup) + GroupCapacityResult(Recipient.self().id, members, RemoteConfig.groupLimits, groupRecord.isAnnouncementGroup) } else { - GroupCapacityResult(Recipient.self().id, groupRecord.members, FeatureFlags.groupLimits, false) + GroupCapacityResult(Recipient.self().id, groupRecord.members, RemoteConfig.groupLimits, false) } ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt index 651b23c096..94097d5017 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.push.exceptions.CdsiInvalidTokenException import org.whispersystems.signalservice.api.push.exceptions.CdsiResourceExhaustedException import org.whispersystems.signalservice.api.services.CdsiV2Service @@ -98,7 +98,7 @@ object ContactDiscoveryRefreshV2 { Optional.empty(), BuildConfig.CDSI_MRENCLAVE, 10_000, - if (FeatureFlags.useLibsignalNetForCdsiLookup) AppDependencies.libsignalNetwork else null + if (RemoteConfig.useLibsignalNetForCdsiLookup) AppDependencies.libsignalNetwork else null ) { Log.i(TAG, "Ignoring token for one-off lookup.") } @@ -145,8 +145,8 @@ object ContactDiscoveryRefreshV2 { return ContactDiscovery.RefreshResult(emptySet(), emptyMap()) } - if (newE164s.size > FeatureFlags.cdsHardLimit) { - Log.w(TAG, "[$tag] Number of new contacts (${newE164s.size.roundedString()} > hard limit (${FeatureFlags.cdsHardLimit}! Failing and marking ourselves as permanently blocked.") + if (newE164s.size > RemoteConfig.cdsHardLimit) { + Log.w(TAG, "[$tag] Number of new contacts (${newE164s.size.roundedString()} > hard limit (${RemoteConfig.cdsHardLimit}! Failing and marking ourselves as permanently blocked.") SignalStore.misc().markCdsPermanentlyBlocked() throw IOException("New contacts over the CDS hard limit!") } @@ -163,7 +163,7 @@ object ContactDiscoveryRefreshV2 { Optional.ofNullable(token), BuildConfig.CDSI_MRENCLAVE, timeoutMs, - if (FeatureFlags.useLibsignalNetForCdsiLookup) AppDependencies.libsignalNetwork else null + if (RemoteConfig.useLibsignalNetForCdsiLookup) AppDependencies.libsignalNetwork else null ) { tokenToSave -> stopwatch.split("network-pre-token") if (!isPartialRefresh) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 59d2dc6c28..330537b592 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -74,7 +74,6 @@ import org.signal.ringrtc.CallLinkRootKey; import org.thoughtcrime.securesms.BindableConversationItem; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.attachments.Attachment; -import org.thoughtcrime.securesms.attachments.AttachmentId; import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.badges.BadgeImageView; import org.thoughtcrime.securesms.badges.gifts.GiftMessageView; @@ -115,9 +114,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.events.PartProgressEvent; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicy; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer; -import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob; -import org.thoughtcrime.securesms.jobs.RestoreAttachmentJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory; @@ -138,7 +135,7 @@ import org.thoughtcrime.securesms.recipients.RecipientForeverObserver; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.revealable.ViewOnceMessageView; import org.thoughtcrime.securesms.util.DateUtils; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.InterceptableLongClickCopyLinkSpan; import org.thoughtcrime.securesms.util.LongClickMovementMethod; import org.thoughtcrime.securesms.util.MediaUtil; @@ -1165,7 +1162,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo //noinspection ConstantConditions LinkPreview linkPreview = ((MmsMessageRecord) messageRecord).getLinkPreviews().get(0); - if (FeatureFlags.adHocCalling()) { + if (RemoteConfig.adHocCalling()) { CallLinkRootKey callLinkRootKey = CallLinks.parseUrl(linkPreview.getUrl()); if (callLinkRootKey != null) { joinCallLinkStub.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt index 6ec57082c5..a6d9b0bc46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt @@ -57,8 +57,8 @@ import org.thoughtcrime.securesms.stories.settings.create.CreateStoryFlowDialogF import org.thoughtcrime.securesms.stories.settings.create.CreateStoryWithViewersFragment import org.thoughtcrime.securesms.stories.settings.privacy.ChooseInitialMyStoryMembershipBottomSheetDialogFragment import org.thoughtcrime.securesms.util.BottomSheetUtil -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.FullscreenHelper +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.fragments.findListener import org.thoughtcrime.securesms.util.fragments.requireListener @@ -124,7 +124,7 @@ class MultiselectForwardFragment : contactSearchMediator = ContactSearchMediator( this, emptySet(), - FeatureFlags.shareSelectionLimit, + RemoteConfig.shareSelectionLimit, ContactSearchAdapter.DisplayOptions( displayCheckBox = !args.selectSingleRecipient, displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index b4640a73ed..2cbe4e295b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -296,13 +296,13 @@ import org.thoughtcrime.securesms.util.DeleteDialog import org.thoughtcrime.securesms.util.Dialogs import org.thoughtcrime.securesms.util.DoubleClickDebouncer import org.thoughtcrime.securesms.util.DrawableUtil -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.FullscreenHelper import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil.getEditMessageThresholdHours import org.thoughtcrime.securesms.util.MessageConstraintsUtil.isValidEditMessageSend import org.thoughtcrime.securesms.util.PlayStoreUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SaveAttachmentUtil import org.thoughtcrime.securesms.util.SignalLocalMetrics import org.thoughtcrime.securesms.util.StorageUtil @@ -1687,7 +1687,7 @@ class ConversationFragment : val keyboardPage = when (keyboardMode) { TextSecurePreferences.MediaKeyboardMode.EMOJI -> if (isSystemEmojiPreferred) KeyboardPage.STICKER else KeyboardPage.EMOJI TextSecurePreferences.MediaKeyboardMode.STICKER -> KeyboardPage.STICKER - TextSecurePreferences.MediaKeyboardMode.GIF -> if (FeatureFlags.gifSearchAvailable) KeyboardPage.GIF else KeyboardPage.STICKER + TextSecurePreferences.MediaKeyboardMode.GIF -> if (RemoteConfig.gifSearchAvailable) KeyboardPage.GIF else KeyboardPage.STICKER } inputPanel.setMediaKeyboardToggleMode(keyboardPage) @@ -2408,7 +2408,7 @@ class ConversationFragment : disposables += DeleteDialog.show( context = requireContext(), messageRecords = records, - message = if (TextSecurePreferences.isMultiDevice(requireContext()) && FeatureFlags.deleteSyncEnabled) { + message = if (TextSecurePreferences.isMultiDevice(requireContext()) && RemoteConfig.deleteSyncEnabled) { resources.getQuantityString(R.plurals.ConversationFragment_delete_on_linked_warning, records.size) } else { null diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt index 087c345274..8c629514b9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt @@ -24,7 +24,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository import org.thoughtcrime.securesms.recipients.Recipient -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel private typealias ConversationElement = MappingModel<*> @@ -125,7 +125,7 @@ class ConversationDataSource( records = MessageDataFetcher.updateModelsWithData(records, extraData).toMutableList() stopwatch.split("models") - if (FeatureFlags.messageBackups && SignalStore.backup().restoreState.inProgress) { + if (RemoteConfig.messageBackups && SignalStore.backup().restoreState.inProgress) { BackupRestoreManager.prioritizeAttachmentsIfNeeded(records) stopwatch.split("restore") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 03059d0507..b565a5cde2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -169,7 +169,7 @@ import org.thoughtcrime.securesms.util.AppForegroundObserver; import org.thoughtcrime.securesms.util.AppStartup; import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.ConversationUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.PlayStoreUtil; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.SignalLocalMetrics; @@ -1202,7 +1202,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode alert.setTitle(context.getResources().getQuantityString(R.plurals.ConversationListFragment_delete_selected_conversations, conversationsCount, conversationsCount)); - if (TextSecurePreferences.isMultiDevice(context) && FeatureFlags.deleteSyncEnabled()) { + if (TextSecurePreferences.isMultiDevice(context) && RemoteConfig.deleteSyncEnabled()) { alert.setMessage(context.getResources().getQuantityString(R.plurals.ConversationListFragment_this_will_permanently_delete_all_n_selected_conversations_linked_device, conversationsCount, conversationsCount)); } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/crash/CrashConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/crash/CrashConfig.kt index fdb3a6d21c..a809f318db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crash/CrashConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/crash/CrashConfig.kt @@ -10,8 +10,8 @@ import com.fasterxml.jackson.annotation.JsonProperty import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.BucketingUtil -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.JsonUtils +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.push.ServiceId import java.io.IOException @@ -28,7 +28,7 @@ object CrashConfig { fun computePatterns(): List { val aci: ServiceId.ACI = SignalStore.account().aci ?: return emptyList() - val serialized = FeatureFlags.crashPromptConfig + val serialized = RemoteConfig.crashPromptConfig if (serialized.isNullOrBlank()) { return emptyList() } @@ -113,7 +113,7 @@ object CrashConfig { } val partsPerMillion = (1_000_000 * percent).toInt() - val bucket = BucketingUtil.bucket(FeatureFlags.CRASH_PROMPT_CONFIG, aci.rawUuid, 1_000_000) + val bucket = BucketingUtil.bucket(RemoteConfig.CRASH_PROMPT_CONFIG, aci.rawUuid, 1_000_000) return partsPerMillion > bucket } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt index d3ed3d148e..4c802e6415 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.kt @@ -9,9 +9,9 @@ import org.signal.core.util.requireLong import org.signal.core.util.requireNonNullString import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MediaUtil.SlideType +import org.thoughtcrime.securesms.util.RemoteConfig @SuppressLint("RecipientIdDatabaseReferenceUsage", "ThreadIdDatabaseReferenceUsage") // Not a real table, just a view class MediaTable internal constructor(context: Context?, databaseHelper: SignalDatabase?) : DatabaseTable(context, databaseHelper) { @@ -164,7 +164,7 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD @JvmOverloads fun getGalleryMediaForThread(threadId: Long, sorting: Sorting, limit: Int = 0): Cursor { - var query = if (FeatureFlags.messageBackups) { + var query = if (RemoteConfig.messageBackups) { sorting.applyToQuery(applyEqualityOperator(threadId, GALLERY_MEDIA_QUERY_INCLUDING_TEMP_VIDEOS_AND_THUMBNAILS)) } else { sorting.applyToQuery(applyEqualityOperator(threadId, GALLERY_MEDIA_QUERY_INCLUDING_TEMP_VIDEOS)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt index 474c24c621..eeeadb7701 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt @@ -15,8 +15,8 @@ import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageLogEntry import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.RecipientAccessList +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.crypto.ContentHint import org.whispersystems.signalservice.api.messages.SendMessageResult import org.whispersystems.signalservice.internal.push.Content @@ -153,7 +153,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal /** @return The ID of the inserted entry, or -1 if none was inserted. Can be used with [addRecipientToExistingEntryIfPossible] */ fun insertIfPossible(recipientId: RecipientId, sentTimestamp: Long, sendMessageResult: SendMessageResult, contentHint: ContentHint, messageId: MessageId, urgent: Boolean): Long { - if (!FeatureFlags.retryReceipts) return -1 + if (!RemoteConfig.retryReceipts) return -1 if (sendMessageResult.isSuccess && sendMessageResult.success.content.isPresent) { val recipientDevice = listOf(RecipientDevice(recipientId, sendMessageResult.success.devices)) @@ -165,7 +165,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal /** @return The ID of the inserted entry, or -1 if none was inserted. Can be used with [addRecipientToExistingEntryIfPossible] */ fun insertIfPossible(recipientId: RecipientId, sentTimestamp: Long, sendMessageResult: SendMessageResult, contentHint: ContentHint, messageIds: List, urgent: Boolean): Long { - if (!FeatureFlags.retryReceipts) return -1 + if (!RemoteConfig.retryReceipts) return -1 if (sendMessageResult.isSuccess && sendMessageResult.success.content.isPresent) { val recipientDevice = listOf(RecipientDevice(recipientId, sendMessageResult.success.devices)) @@ -177,7 +177,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal /** @return The ID of the inserted entry, or -1 if none was inserted. Can be used with [addRecipientToExistingEntryIfPossible] */ fun insertIfPossible(sentTimestamp: Long, possibleRecipients: List, results: List, contentHint: ContentHint, messageId: MessageId, urgent: Boolean): Long { - if (!FeatureFlags.retryReceipts) return -1 + if (!RemoteConfig.retryReceipts) return -1 val accessList = RecipientAccessList(possibleRecipients) @@ -198,7 +198,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal } fun addRecipientToExistingEntryIfPossible(payloadId: Long, recipientId: RecipientId, sentTimestamp: Long, sendMessageResult: SendMessageResult, contentHint: ContentHint, messageId: MessageId, urgent: Boolean): Long { - if (!FeatureFlags.retryReceipts) return payloadId + if (!RemoteConfig.retryReceipts) return payloadId if (sendMessageResult.isSuccess && sendMessageResult.success.content.isPresent) { val db = databaseHelper.signalWritableDatabase @@ -274,9 +274,9 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal } fun getLogEntry(recipientId: RecipientId, device: Int, dateSent: Long): MessageLogEntry? { - if (!FeatureFlags.retryReceipts) return null + if (!RemoteConfig.retryReceipts) return null - trimOldMessages(System.currentTimeMillis(), FeatureFlags.retryRespondMaxAge) + trimOldMessages(System.currentTimeMillis(), RemoteConfig.retryRespondMaxAge) val db = databaseHelper.signalReadableDatabase val table = "${MslPayloadTable.TABLE_NAME} LEFT JOIN ${MslRecipientTable.TABLE_NAME} ON ${MslPayloadTable.TABLE_NAME}.${MslPayloadTable.ID} = ${MslRecipientTable.TABLE_NAME}.${MslRecipientTable.PAYLOAD_ID}" @@ -356,7 +356,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal } fun deleteAllForRecipient(recipientId: RecipientId) { - if (!FeatureFlags.retryReceipts) return + if (!RemoteConfig.retryReceipts) return writableDatabase .delete(MslRecipientTable.TABLE_NAME) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptCache.kt b/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptCache.kt index a1ca0bfd8d..da192eb9de 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptCache.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/PendingRetryReceiptCache.kt @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.database import androidx.annotation.VisibleForTesting import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig /** * A write-through cache for [PendingRetryReceiptTable]. @@ -21,7 +21,7 @@ class PendingRetryReceiptCache @VisibleForTesting constructor( private var populated: Boolean = false fun insert(author: RecipientId, authorDevice: Int, sentTimestamp: Long, receivedTimestamp: Long, threadId: Long) { - if (!FeatureFlags.retryReceipts) return + if (!RemoteConfig.retryReceipts) return ensurePopulated() val model: PendingRetryReceiptModel = database.insert(author, authorDevice, sentTimestamp, receivedTimestamp, threadId) synchronized(pendingRetries) { @@ -36,7 +36,7 @@ class PendingRetryReceiptCache @VisibleForTesting constructor( } fun get(author: RecipientId, sentTimestamp: Long): PendingRetryReceiptModel? { - if (!FeatureFlags.retryReceipts) return null + if (!RemoteConfig.retryReceipts) return null ensurePopulated() synchronized(pendingRetries) { @@ -45,7 +45,7 @@ class PendingRetryReceiptCache @VisibleForTesting constructor( } fun getOldest(): PendingRetryReceiptModel? { - if (!FeatureFlags.retryReceipts) return null + if (!RemoteConfig.retryReceipts) return null ensurePopulated() synchronized(pendingRetries) { @@ -54,7 +54,7 @@ class PendingRetryReceiptCache @VisibleForTesting constructor( } fun delete(model: PendingRetryReceiptModel) { - if (!FeatureFlags.retryReceipts) return + if (!RemoteConfig.retryReceipts) return ensurePopulated() synchronized(pendingRetries) { @@ -64,7 +64,7 @@ class PendingRetryReceiptCache @VisibleForTesting constructor( } fun clear() { - if (!FeatureFlags.retryReceipts) return + if (!RemoteConfig.retryReceipts) return synchronized(pendingRetries) { pendingRetries.clear() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index f0c82d1c3e..0ea135928e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -92,9 +92,9 @@ import org.thoughtcrime.securesms.service.webrtc.links.CallLinkRoomId import org.thoughtcrime.securesms.storage.StorageRecordUpdate import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.storage.StorageSyncModels -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.IdentityUtil import org.thoughtcrime.securesms.util.ProfileUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.wallpaper.ChatWallpaper import org.thoughtcrime.securesms.wallpaper.WallpaperStorage @@ -4152,7 +4152,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * get them back through CDS). */ fun debugClearServiceIds(recipientId: RecipientId? = null) { - check(FeatureFlags.internalUser) + check(RemoteConfig.internalUser) writableDatabase .update(TABLE_NAME) @@ -4177,7 +4177,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * Should only be used for debugging! A very destructive action that clears all known profile keys and credentials. */ fun debugClearProfileData(recipientId: RecipientId? = null) { - check(FeatureFlags.internalUser) + check(RemoteConfig.internalUser) writableDatabase .update(TABLE_NAME) @@ -4208,7 +4208,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * Should only be used for debugging! Clears the E164 and PNI from a recipient. */ fun debugClearE164AndPni(recipientId: RecipientId) { - check(FeatureFlags.internalUser) + check(RemoteConfig.internalUser) writableDatabase .update(TABLE_NAME) @@ -4228,7 +4228,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * Only works if the recipient has a PNI. */ fun debugRemoveAci(recipientId: RecipientId) { - check(FeatureFlags.internalUser) + check(RemoteConfig.internalUser) writableDatabase.execSQL( """ diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 25cf4bbeae..8f87d5377a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -62,10 +62,10 @@ import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientUtil import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.util.ConversationUtil -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.JsonUtils import org.thoughtcrime.securesms.util.JsonUtils.SaneJSONObject import org.thoughtcrime.securesms.util.LRUCache +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.isScheduled import org.whispersystems.signalservice.api.storage.SignalAccountRecord @@ -326,7 +326,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa return } - val syncThreadTrimDeletes = SignalStore.settings().shouldSyncThreadTrimDeletes() && FeatureFlags.deleteSyncEnabled + val syncThreadTrimDeletes = SignalStore.settings().shouldSyncThreadTrimDeletes() && RemoteConfig.deleteSyncEnabled val threadTrimsToSync = mutableListOf>>() readableDatabase @@ -1131,7 +1131,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa var addressableMessages: Set = emptySet() writableDatabase.withinTransaction { db -> - if (syncThreadDeletes && FeatureFlags.deleteSyncEnabled) { + if (syncThreadDeletes && RemoteConfig.deleteSyncEnabled) { addressableMessages = messages.getMostRecentAddressableMessages(threadId) } @@ -1164,7 +1164,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa db.deactivateThread(query) } - if (FeatureFlags.deleteSyncEnabled) { + if (RemoteConfig.deleteSyncEnabled) { for (threadId in selectedConversations) { addressableMessages += threadId to messages.getMostRecentAddressableMessages(threadId) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java index 7459585794..e8f4db3509 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java @@ -69,7 +69,7 @@ import org.thoughtcrime.securesms.util.AlarmSleepTimer; import org.thoughtcrime.securesms.util.AppForegroundObserver; import org.thoughtcrime.securesms.util.ByteUnit; import org.thoughtcrime.securesms.util.EarlyMessageCache; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.FrameRateTracker; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.video.exo.GiphyMp4Cache; @@ -120,7 +120,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { @Override public @NonNull GroupsV2Operations provideGroupsV2Operations(@NonNull SignalServiceConfiguration signalServiceConfiguration) { - return new GroupsV2Operations(provideClientZkOperations(signalServiceConfiguration), FeatureFlags.groupLimits().getHardLimit()); + return new GroupsV2Operations(provideClientZkOperations(signalServiceConfiguration), RemoteConfig.groupLimits().getHardLimit()); } @Override @@ -129,7 +129,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { new DynamicCredentialsProvider(), BuildConfig.SIGNAL_AGENT, groupsV2Operations, - FeatureFlags.okHttpAutomaticRetry()); + RemoteConfig.okHttpAutomaticRetry()); } @Override @@ -144,8 +144,8 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { provideGroupsV2Operations(signalServiceConfiguration).getProfileOperations(), SignalExecutors.newCachedBoundedExecutor("signal-messages", ThreadUtil.PRIORITY_IMPORTANT_BACKGROUND_THREAD, 1, 16, 30), ByteUnit.KILOBYTES.toBytes(256), - FeatureFlags.okHttpAutomaticRetry(), - FeatureFlags.useRxMessageSending()); + RemoteConfig.okHttpAutomaticRetry(), + RemoteConfig.useRxMessageSending()); } @Override @@ -154,7 +154,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { new DynamicCredentialsProvider(), BuildConfig.SIGNAL_AGENT, provideGroupsV2Operations(signalServiceConfiguration).getProfileOperations(), - FeatureFlags.okHttpAutomaticRetry()); + RemoteConfig.okHttpAutomaticRetry()); } @Override @@ -375,7 +375,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { new DynamicCredentialsProvider(), BuildConfig.SIGNAL_AGENT, groupsV2Operations, - FeatureFlags.okHttpAutomaticRetry()); + RemoteConfig.okHttpAutomaticRetry()); } @Override @@ -384,7 +384,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { new DynamicCredentialsProvider(), BuildConfig.SIGNAL_AGENT, groupsV2Operations, - FeatureFlags.okHttpAutomaticRetry()); + RemoteConfig.okHttpAutomaticRetry()); } @Override @@ -425,7 +425,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { @Override public WebSocketConnection createUnidentifiedWebSocket() { - int shadowPercentage = FeatureFlags.libSignalWebSocketShadowingPercentage(); + int shadowPercentage = RemoteConfig.libSignalWebSocketShadowingPercentage(); if (shadowPercentage > 0) { return new ShadowingWebSocketConnection( "unauth-shadow", @@ -439,7 +439,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { bridge ); } - if (FeatureFlags.libSignalWebSocketEnabled()) { + if (RemoteConfig.libSignalWebSocketEnabled()) { Network network = libSignalNetworkSupplier.get(); return new LibSignalChatConnection( "libsignal-unauth", diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java index 257990f890..a25886296d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java @@ -12,7 +12,7 @@ import org.signal.core.util.concurrent.LifecycleDisposable; import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.databinding.FragmentTransferRestoreBinding; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SpanUtil; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; @@ -41,7 +41,7 @@ public final class TransferOrRestoreFragment extends LoggingFragment { binding.transferOrRestoreFragmentNext.setOnClickListener(v -> launchSelection(viewModel.getStateSnapshot())); binding.transferOrRestoreFragmentMoreOptions.setOnClickListener(v -> SafeNavigation.safeNavigate(Navigation.findNavController(requireView()), R.id.action_transferOrRestore_to_moreOptions)); - int visibility = FeatureFlags.messageBackups() ? View.VISIBLE : View.GONE; + int visibility = RemoteConfig.messageBackups() ? View.VISIBLE : View.GONE; binding.transferOrRestoreFragmentRestoreRemoteCard.setVisibility(visibility); binding.transferOrRestoreFragmentMoreOptions.setVisibility(visibility); diff --git a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt index 4ffc3c64b2..e5eb861f75 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.jobs.MessageFetchJob import org.thoughtcrime.securesms.messages.WebSocketDrainer import org.thoughtcrime.securesms.notifications.NotificationChannels import org.thoughtcrime.securesms.notifications.NotificationIds -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SignalLocalMetrics import org.thoughtcrime.securesms.util.concurrent.SerialMonoLifoExecutor import kotlin.time.Duration.Companion.minutes @@ -71,7 +71,7 @@ object FcmFetchManager { } private fun postMayHaveMessagesNotification(context: Context) { - if (FeatureFlags.fcmMayHaveMessagesNotificationKillSwitch) { + if (RemoteConfig.fcmMayHaveMessagesNotificationKillSwitch) { Log.w(TAG, "May have messages notification kill switch") return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java index 15afefc9bc..26cd4623d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java @@ -26,7 +26,7 @@ import org.thoughtcrime.securesms.providers.BlobProvider; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; @@ -60,7 +60,7 @@ public class GiphyActivity extends PassphraseRequiredActivity implements Keyboar @SuppressLint("MissingInflatedId") @Override public void onCreate(Bundle bundle, boolean ready) { - if (!FeatureFlags.gifSearchAvailable()) { + if (!RemoteConfig.gifSearchAvailable()) { finish(); } setContentView(R.layout.giphy_activity); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java index 47a1138a32..f3463a83f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2ProcessingLock.java @@ -6,7 +6,7 @@ import org.signal.core.util.ThreadUtil; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.crypto.ReentrantSessionLock; import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import java.io.Closeable; import java.util.concurrent.TimeUnit; @@ -23,7 +23,7 @@ public final class GroupsV2ProcessingLock { @WorkerThread public static Closeable acquireGroupProcessingLock() throws GroupChangeBusyException { - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { if (!lock.isHeldByCurrentThread()) { if (SignalDatabase.inTransaction()) { throw new AssertionError("Tried to acquire the group lock inside of a database transaction!"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/GroupLimitDialog.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/GroupLimitDialog.java index add3f708ea..c5c7790c5b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/GroupLimitDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/GroupLimitDialog.java @@ -7,14 +7,14 @@ import androidx.annotation.NonNull; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; public final class GroupLimitDialog { public static void showHardLimitMessage(@NonNull Context context) { new MaterialAlertDialogBuilder(context) .setTitle(R.string.ContactSelectionListFragment_maximum_group_size_reached) - .setMessage(context.getString(R.string.ContactSelectionListFragment_signal_groups_can_have_a_maximum_of_d_members, FeatureFlags.groupLimits().getHardLimit())) + .setMessage(context.getString(R.string.ContactSelectionListFragment_signal_groups_can_have_a_maximum_of_d_members, RemoteConfig.groupLimits().getHardLimit())) .setPositiveButton(android.R.string.ok, null) .show(); } @@ -22,7 +22,7 @@ public final class GroupLimitDialog { public static void showRecommendedLimitMessage(@NonNull Context context) { new MaterialAlertDialogBuilder(context) .setTitle(R.string.ContactSelectionListFragment_recommended_member_limit_reached) - .setMessage(context.getString(R.string.ContactSelectionListFragment_signal_groups_perform_best_with_d_members_or_fewer, FeatureFlags.groupLimits().getRecommendedLimit())) + .setMessage(context.getString(R.string.ContactSelectionListFragment_signal_groups_perform_best_with_d_members_or_fewer, RemoteConfig.groupLimits().getRecommendedLimit())) .setPositiveButton(android.R.string.ok, null) .show(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index 84aec05ff9..51bf453d5a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -25,13 +25,12 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; import org.thoughtcrime.securesms.groups.ui.creategroup.details.AddGroupDetailsActivity; -import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientRepository; import org.thoughtcrime.securesms.recipients.ui.findby.FindByActivity; import org.thoughtcrime.securesms.recipients.ui.findby.FindByMode; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.io.IOException; @@ -62,7 +61,7 @@ public class CreateGroupActivity extends ContactSelectionActivity implements Con int displayMode = ContactSelectionDisplayMode.FLAG_PUSH; intent.putExtra(ContactSelectionListFragment.DISPLAY_MODE, displayMode); - intent.putExtra(ContactSelectionListFragment.SELECTION_LIMITS, FeatureFlags.groupLimits().excludingSelf()); + intent.putExtra(ContactSelectionListFragment.SELECTION_LIMITS, RemoteConfig.groupLimits().excludingSelf()); intent.putExtra(ContactSelectionListFragment.RV_PADDING_BOTTOM, (int) DimensionUnit.DP.toPixels(64f)); intent.putExtra(ContactSelectionListFragment.RV_CLIP, false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java index 39b06acb7f..f37da889f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java @@ -46,7 +46,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.ui.disappearingmessages.RecipientDisappearingMessagesActivity; import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.ExpirationUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; import org.thoughtcrime.securesms.util.text.AfterTextChanged; @@ -116,7 +116,7 @@ public class AddGroupDetailsFragment extends LoggingFragment { avatar.setOnClickListener(v -> showAvatarPicker()); members.setRecipientClickListener(this::handleRecipientClick); - EditTextUtil.addGraphemeClusterLimitFilter(name, FeatureFlags.getMaxGroupNameGraphemeLength()); + EditTextUtil.addGraphemeClusterLimitFilter(name, RemoteConfig.getMaxGroupNameGraphemeLength()); name.addTextChangedListener(new AfterTextChanged(editable -> viewModel.setName(editable.toString()))); toolbar.setNavigationOnClickListener(unused -> callback.onNavigationButtonPressed()); create.setOnClickListener(v -> handleCreateClicked()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java index bfe19b034d..b4dfea8e12 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java @@ -4,12 +4,11 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import java.util.LinkedList; import java.util.List; @@ -17,8 +16,6 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; -import static androidx.annotation.VisibleForTesting.PACKAGE_PRIVATE; - /** * A durable unit of work. * @@ -107,7 +104,7 @@ public abstract class Job { /** Provides a default exponential backoff given the current run attempt. */ protected final long defaultBackoff() { - return BackoffUtil.exponentialBackoff(runAttempt + 1, FeatureFlags.getDefaultMaxBackoff()); + return BackoffUtil.exponentialBackoff(runAttempt + 1, RemoteConfig.getDefaultMaxBackoff()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java index 1968050b23..7bddf19967 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java @@ -34,7 +34,7 @@ import org.thoughtcrime.securesms.mms.SentMediaQuality; import org.thoughtcrime.securesms.service.AttachmentProgressService; import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.BitmapDecodingException; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ImageCompressionUtil; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.MemoryFileDescriptor.MemoryFileException; @@ -256,8 +256,8 @@ public final class AttachmentCompressionJob extends BaseJob { } } - if (FeatureFlags.useStreamingVideoMuxer()) { - StreamingTranscoder transcoder = new StreamingTranscoder(dataSource, options, constraints.getVideoTranscodingSettings(), constraints.getCompressedVideoMaxSize(context), FeatureFlags.allowAudioRemuxing()); + if (RemoteConfig.useStreamingVideoMuxer()) { + StreamingTranscoder transcoder = new StreamingTranscoder(dataSource, options, constraints.getVideoTranscodingSettings(), constraints.getCompressedVideoMaxSize(context), RemoteConfig.allowAudioRemuxing()); if (transcoder.isTranscodeRequired()) { Log.i(TAG, "Compressing with streaming muxer"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt index 2bc5ab9451..37dd057672 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.kt @@ -34,7 +34,7 @@ import org.thoughtcrime.securesms.notifications.v2.ConversationId.Companion.forC import org.thoughtcrime.securesms.s3.S3 import org.thoughtcrime.securesms.transport.RetryLaterException import org.thoughtcrime.securesms.util.AttachmentUtil -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.backup.MediaName import org.whispersystems.signalservice.api.messages.SignalServiceAttachment @@ -222,7 +222,7 @@ class AttachmentDownloadJob private constructor( attachmentId: AttachmentId, attachment: DatabaseAttachment ) { - val maxReceiveSize: Long = FeatureFlags.maxAttachmentReceiveSizeBytes + val maxReceiveSize: Long = RemoteConfig.maxAttachmentReceiveSizeBytes val attachmentFile: File = SignalDatabase.attachments.getOrCreateTransferFile(attachmentId) var archiveFile: File? = null var useArchiveCdn = false @@ -401,7 +401,7 @@ class AttachmentDownloadJob private constructor( S3.getObject(attachment.fileName!!).use { response -> val body = response.body() if (body != null) { - if (body.contentLength() > FeatureFlags.maxAttachmentReceiveSizeBytes) { + if (body.contentLength() > RemoteConfig.maxAttachmentReceiveSizeBytes) { throw MmsException("Attachment too large, failing download") } SignalDatabase.attachments.finalizeAttachmentAfterDownload(messageId, attachmentId, (body.source() as Source).buffer().inputStream()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.kt index 5d5c92be99..14087abe91 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.kt @@ -27,7 +27,7 @@ import org.thoughtcrime.securesms.mms.MmsException import org.thoughtcrime.securesms.net.NotPushRegisteredException import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.service.AttachmentProgressService -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.crypto.AttachmentCipherStreamUtil import org.whispersystems.signalservice.api.messages.SignalServiceAttachment import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream @@ -66,7 +66,7 @@ class AttachmentUploadJob private constructor( @JvmStatic val maxPlaintextSize: Long get() { - val maxCipherTextSize = FeatureFlags.maxAttachmentSizeBytes + val maxCipherTextSize = RemoteConfig.maxAttachmentSizeBytes val maxPaddedSize = AttachmentCipherStreamUtil.getPlaintextLength(maxCipherTextSize) return PaddingInputStream.getMaxUnpaddedSize(maxPaddedSize) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AutomaticSessionResetJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AutomaticSessionResetJob.java index 44e8a5c887..3ef6b35807 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AutomaticSessionResetJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AutomaticSessionResetJob.java @@ -16,7 +16,7 @@ import org.thoughtcrime.securesms.notifications.v2.ConversationId; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; @@ -91,8 +91,8 @@ public class AutomaticSessionResetJob extends BaseJob { SignalDatabase.senderKeyShared().deleteAllFor(recipientId); insertLocalMessage(); - if (FeatureFlags.automaticSessionReset()) { - long resetInterval = TimeUnit.SECONDS.toMillis(FeatureFlags.automaticSessionResetIntervalSeconds()); + if (RemoteConfig.automaticSessionReset()) { + long resetInterval = TimeUnit.SECONDS.toMillis(RemoteConfig.automaticSessionResetIntervalSeconds()); DeviceLastResetTime resetTimes = SignalDatabase.recipients().getLastSessionResetTimes(recipientId); long timeSinceLastReset = System.currentTimeMillis() - getLastResetTime(resetTimes, deviceId); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java index c05043744d..bbc3baccd3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java @@ -9,7 +9,7 @@ import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobLogger; import org.thoughtcrime.securesms.jobmanager.JobManager.Chain; import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; public abstract class BaseJob extends Job { @@ -57,7 +57,7 @@ public abstract class BaseJob extends Job { * override this behavior to define custom backoff behavior. */ public long getNextRunAttemptBackoff(int pastAttemptCount, @NonNull Exception exception) { - return BackoffUtil.exponentialBackoff(pastAttemptCount, FeatureFlags.getDefaultMaxBackoff()); + return BackoffUtil.exponentialBackoff(pastAttemptCount, RemoteConfig.getDefaultMaxBackoff()); } protected abstract void onRun() throws Exception; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkPeekJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkPeekJob.kt index 20a5efa4a1..57b8586ffb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkPeekJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkPeekJob.kt @@ -12,7 +12,7 @@ import org.thoughtcrime.securesms.jobmanager.JsonJobData import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import java.util.concurrent.TimeUnit /** @@ -46,7 +46,7 @@ internal class CallLinkPeekJob private constructor( ) override fun onRun() { - if (!FeatureFlags.adHocCalling) { + if (!RemoteConfig.adHocCalling) { Log.i(TAG, "Ad hoc calling is disabled. Dropping peek for call link.") return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkUpdateSendJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkUpdateSendJob.kt index 003f3d343f..2d36042241 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkUpdateSendJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CallLinkUpdateSendJob.kt @@ -13,7 +13,7 @@ import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.jobs.protos.CallLinkUpdateSendJobData import org.thoughtcrime.securesms.service.webrtc.links.CallLinkRoomId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException @@ -65,7 +65,7 @@ class CallLinkUpdateSendJob private constructor( override fun onFailure() = Unit override fun onRun() { - if (!FeatureFlags.adHocCalling) { + if (!RemoteConfig.adHocCalling) { Log.i(TAG, "Call links are not enabled. Exiting.") return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceDeleteSendSyncJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceDeleteSendSyncJob.kt index 975ccd9e64..c59efabc29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceDeleteSendSyncJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceDeleteSendSyncJob.kt @@ -22,7 +22,7 @@ import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.pad import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient.Companion.self import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException import org.whispersystems.signalservice.internal.push.Content @@ -58,7 +58,7 @@ class MultiDeviceDeleteSendSyncJob private constructor( return } - if (!FeatureFlags.deleteSyncEnabled) { + if (!RemoteConfig.deleteSyncEnabled) { Log.i(TAG, "Delete sync support not enabled.") return } @@ -74,7 +74,7 @@ class MultiDeviceDeleteSendSyncJob private constructor( return } - if (!FeatureFlags.deleteSyncEnabled) { + if (!RemoteConfig.deleteSyncEnabled) { Log.i(TAG, "Delete sync support not enabled.") return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PaymentTransactionCheckJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PaymentTransactionCheckJob.java index ac78e90748..2a6ef98378 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PaymentTransactionCheckJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PaymentTransactionCheckJob.java @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.payments.FailureReason; import org.thoughtcrime.securesms.payments.PaymentTransactionId; import org.thoughtcrime.securesms.payments.Payments; import org.thoughtcrime.securesms.payments.Wallet; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import java.io.IOException; @@ -118,7 +118,7 @@ public final class PaymentTransactionCheckJob extends BaseJob { public long getNextRunAttemptBackoff(int pastAttemptCount, @NonNull Exception exception) { if (exception instanceof NonSuccessfulResponseCodeException) { if (((NonSuccessfulResponseCodeException) exception).is5xx()) { - return BackoffUtil.exponentialBackoff(pastAttemptCount, FeatureFlags.getServerErrorMaxBackoff()); + return BackoffUtil.exponentialBackoff(pastAttemptCount, RemoteConfig.getServerErrorMaxBackoff()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt index 1f5cd269b2..a26e1907c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt @@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.jobs.protos.PreKeysSyncJobData import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.NetworkResult import org.whispersystems.signalservice.api.SignalServiceAccountDataStore import org.whispersystems.signalservice.api.account.PreKeyUpload @@ -138,7 +138,7 @@ class PreKeysSyncJob private constructor( warn(TAG, "Forced rotation was requested, but the consistency checks passed!") val timeSinceLastForcedRotation = System.currentTimeMillis() - SignalStore.misc().lastForcedPreKeyRefresh // We check < 0 in case someone changed their clock and had a bad value set - timeSinceLastForcedRotation > FeatureFlags.preKeyForceRefreshInterval || timeSinceLastForcedRotation < 0 + timeSinceLastForcedRotation > RemoteConfig.preKeyForceRefreshInterval || timeSinceLastForcedRotation < 0 } } else { false diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java index d6f2e1396d..a5ff82143b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java @@ -62,7 +62,7 @@ import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.signal.core.util.Base64; import org.thoughtcrime.securesms.util.BitmapDecodingException; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ImageCompressionUtil; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; @@ -76,7 +76,6 @@ import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException; import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; -import org.whispersystems.signalservice.internal.push.AttachmentPointer; import org.whispersystems.signalservice.internal.push.BodyRange; import java.io.ByteArrayInputStream; @@ -176,7 +175,7 @@ public abstract class PushSendJob extends SendJob { } } else if (exception instanceof NonSuccessfulResponseCodeException) { if (((NonSuccessfulResponseCodeException) exception).is5xx()) { - return BackoffUtil.exponentialBackoff(pastAttemptCount, FeatureFlags.getServerErrorMaxBackoff()); + return BackoffUtil.exponentialBackoff(pastAttemptCount, RemoteConfig.getServerErrorMaxBackoff()); } } else if (exception instanceof RetryLaterException) { long backoff = ((RetryLaterException) exception).getBackoff(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob.kt index 06bd13a120..c93638a49a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob.kt @@ -9,7 +9,7 @@ import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.profiles.manage.UsernameRepository -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import kotlin.time.Duration.Companion.days /** @@ -48,7 +48,7 @@ class ReclaimUsernameAndLinkJob private constructor(parameters: Parameters) : Jo return when (UsernameRepository.reclaimUsernameIfNecessary()) { UsernameRepository.UsernameReclaimResult.SUCCESS -> Result.success() UsernameRepository.UsernameReclaimResult.PERMANENT_ERROR -> Result.success() - UsernameRepository.UsernameReclaimResult.NETWORK_ERROR -> Result.retry(BackoffUtil.exponentialBackoff(runAttempt + 1, FeatureFlags.defaultMaxBackoff)) + UsernameRepository.UsernameReclaimResult.NETWORK_ERROR -> Result.retry(BackoffUtil.exponentialBackoff(runAttempt + 1, RemoteConfig.defaultMaxBackoff)) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteConfigRefreshJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteConfigRefreshJob.java index a84ab4b0a5..277859d613 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteConfigRefreshJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteConfigRefreshJob.java @@ -8,7 +8,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.whispersystems.signalservice.api.RemoteConfigResult; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; @@ -52,7 +52,7 @@ public class RemoteConfigRefreshJob extends BaseJob { } RemoteConfigResult result = AppDependencies.getSignalServiceAccountManager().getRemoteConfig(); - FeatureFlags.update(result.getConfig()); + RemoteConfig.update(result.getConfig()); SignalStore.misc().setLastKnownServerTime(TimeUnit.SECONDS.toMillis(result.getServerEpochTimeSeconds()), System.currentTimeMillis()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt index 31d3b8cd4e..aed089f4e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt @@ -29,7 +29,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mms.MmsException import org.thoughtcrime.securesms.notifications.v2.ConversationId.Companion.forConversation import org.thoughtcrime.securesms.transport.RetryLaterException -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.backup.MediaName import org.whispersystems.signalservice.api.messages.SignalServiceAttachment @@ -208,7 +208,7 @@ class RestoreAttachmentJob private constructor( attachmentId: AttachmentId, attachment: DatabaseAttachment ) { - val maxReceiveSize: Long = FeatureFlags.maxAttachmentReceiveSizeBytes + val maxReceiveSize: Long = RemoteConfig.maxAttachmentReceiveSizeBytes val attachmentFile: File = SignalDatabase.attachments.getOrCreateTransferFile(attachmentId) var archiveFile: File? = null var useArchiveCdn = false @@ -439,7 +439,7 @@ class RestoreAttachmentJob private constructor( return } - val maxThumbnailSize: Long = FeatureFlags.maxAttachmentReceiveSizeBytes + val maxThumbnailSize: Long = RemoteConfig.maxAttachmentReceiveSizeBytes val thumbnailTransferFile: File = SignalDatabase.attachments.createArchiveThumbnailTransferFile() val thumbnailFile: File = SignalDatabase.attachments.createArchiveThumbnailTransferFile() diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt index b8d28c2fb5..b3487baa38 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt @@ -22,7 +22,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mms.MmsException import org.thoughtcrime.securesms.notifications.v2.ConversationId.Companion.forConversation import org.thoughtcrime.securesms.transport.RetryLaterException -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.messages.SignalServiceAttachment import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId @@ -197,7 +197,7 @@ class RestoreAttachmentThumbnailJob private constructor( return } - val maxThumbnailSize: Long = FeatureFlags.maxAttachmentReceiveSizeBytes + val maxThumbnailSize: Long = RemoteConfig.maxAttachmentReceiveSizeBytes val thumbnailTransferFile: File = SignalDatabase.attachments.createArchiveThumbnailTransferFile() val thumbnailFile: File = SignalDatabase.attachments.createArchiveThumbnailTransferFile() diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob.kt index b4268fa2c7..d736ba967b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob.kt @@ -29,7 +29,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.releasechannel.ReleaseChannel import org.thoughtcrime.securesms.s3.S3 import org.thoughtcrime.securesms.transport.RetryLaterException -import org.thoughtcrime.securesms.util.LocaleFeatureFlags +import org.thoughtcrime.securesms.util.LocaleRemoteConfig import org.whispersystems.signalservice.internal.ServiceResponse import java.io.IOException import java.lang.Integer.max @@ -170,7 +170,7 @@ class RetrieveRemoteAnnouncementsJob private constructor(private val force: Bool false } } - .filter { it.countries == null || LocaleFeatureFlags.shouldShowReleaseNote(it.uuid, it.countries) } + .filter { it.countries == null || LocaleRemoteConfig.shouldShowReleaseNote(it.uuid, it.countries) } .sortedBy { it.androidMinVersion!!.toInt() } .map { resolveReleaseNote(it) } .toList() diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java index d2400ee657..dd91862bfe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java @@ -28,7 +28,7 @@ import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.keyvalue.KeepMessagesDuration; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; public class TrimThreadJob extends BaseJob { @@ -78,7 +78,7 @@ public class TrimThreadJob extends BaseJob { long trimBeforeDate = keepMessagesDuration != KeepMessagesDuration.FOREVER ? System.currentTimeMillis() - keepMessagesDuration.getDuration() : ThreadTable.NO_TRIM_BEFORE_DATE_SET; - SignalDatabase.threads().trimThread(threadId, SignalStore.settings().shouldSyncThreadTrimDeletes() && FeatureFlags.deleteSyncEnabled(), trimLength, trimBeforeDate, false); + SignalDatabase.threads().trimThread(threadId, SignalStore.settings().shouldSyncThreadTrimDeletes() && RemoteConfig.deleteSyncEnabled(), trimLength, trimBeforeDate, false); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt index 4752dee389..b667080df9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt @@ -7,7 +7,7 @@ import org.signal.core.util.ThreadUtil import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.stickers.StickerSearchRepository import org.thoughtcrime.securesms.util.DefaultValueLiveData -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig class KeyboardPagerViewModel : ViewModel() { @@ -20,7 +20,7 @@ class KeyboardPagerViewModel : ViewModel() { startingPages.remove(KeyboardPage.EMOJI) } - if (!FeatureFlags.gifSearchAvailable) { + if (!RemoteConfig.gifSearchAvailable) { startingPages.remove(KeyboardPage.GIF) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java index 0982b162cc..f9f3f92a45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java @@ -5,7 +5,7 @@ import androidx.annotation.NonNull; import org.signal.ringrtc.CallManager; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.util.Environment; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import java.util.Arrays; import java.util.Collections; @@ -50,7 +50,7 @@ public final class InternalValues extends SignalStoreValues { * Members will not be added directly to a GV2 even if they could be. */ public synchronized boolean gv2ForceInvites() { - return FeatureFlags.internalUser() && getBoolean(GV2_FORCE_INVITES, false); + return RemoteConfig.internalUser() && getBoolean(GV2_FORCE_INVITES, false); } /** @@ -58,56 +58,56 @@ public final class InternalValues extends SignalStoreValues { * directly which allows testing of certain testing scenarios. */ public synchronized boolean gv2IgnoreP2PChanges() { - return FeatureFlags.internalUser() && getBoolean(GV2_IGNORE_P2P_CHANGES, false); + return RemoteConfig.internalUser() && getBoolean(GV2_IGNORE_P2P_CHANGES, false); } /** * Show detailed recipient info in the {@link org.thoughtcrime.securesms.components.settings.conversation.InternalConversationSettingsFragment}. */ public synchronized boolean recipientDetails() { - return FeatureFlags.internalUser() && getBoolean(RECIPIENT_DETAILS, true); + return RemoteConfig.internalUser() && getBoolean(RECIPIENT_DETAILS, true); } /** * Allow changing the censorship circumvention setting regardless of network status. */ public synchronized boolean allowChangingCensorshipSetting() { - return FeatureFlags.internalUser() && getBoolean(ALLOW_CENSORSHIP_SETTING, false); + return RemoteConfig.internalUser() && getBoolean(ALLOW_CENSORSHIP_SETTING, false); } /** * Force the app to use the emoji that ship with the app, as opposed to the ones that were downloaded. */ public synchronized boolean forceBuiltInEmoji() { - return FeatureFlags.internalUser() && getBoolean(FORCE_BUILT_IN_EMOJI, false); + return RemoteConfig.internalUser() && getBoolean(FORCE_BUILT_IN_EMOJI, false); } /** * Remove the requirement that there must be two sender-key-capable recipients to use sender key */ public synchronized boolean removeSenderKeyMinimum() { - return FeatureFlags.internalUser() && getBoolean(REMOVE_SENDER_KEY_MINIMUM, false); + return RemoteConfig.internalUser() && getBoolean(REMOVE_SENDER_KEY_MINIMUM, false); } /** * Delay resending messages in response to retry receipts by 10 seconds. */ public synchronized boolean delayResends() { - return FeatureFlags.internalUser() && getBoolean(DELAY_RESENDS, false); + return RemoteConfig.internalUser() && getBoolean(DELAY_RESENDS, false); } /** * Whether or not "shake to report" is enabled. */ public synchronized boolean shakeToReport() { - return FeatureFlags.internalUser() && getBoolean(SHAKE_TO_REPORT, true); + return RemoteConfig.internalUser() && getBoolean(SHAKE_TO_REPORT, true); } /** * Whether or not storage service is manually disabled. */ public synchronized boolean storageServiceDisabled() { - return FeatureFlags.internalUser() && getBoolean(DISABLE_STORAGE_SERVICE, false); + return RemoteConfig.internalUser() && getBoolean(DISABLE_STORAGE_SERVICE, false); } /** @@ -118,7 +118,7 @@ public final class InternalValues extends SignalStoreValues { * internal users cannot be left on old servers. */ public synchronized @NonNull String groupCallingServer() { - String internalServer = FeatureFlags.internalUser() ? getString(CALLING_SERVER, Environment.Calling.defaultSfuUrl()) : null; + String internalServer = RemoteConfig.internalUser() ? getString(CALLING_SERVER, Environment.Calling.defaultSfuUrl()) : null; if (internalServer != null && !Arrays.asList(BuildConfig.SIGNAL_SFU_INTERNAL_URLS).contains(internalServer)) { internalServer = null; } @@ -129,7 +129,7 @@ public final class InternalValues extends SignalStoreValues { * Setting to override the default handling of hardware/software AEC. */ public synchronized CallManager.AudioProcessingMethod callingAudioProcessingMethod() { - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { return CallManager.AudioProcessingMethod.values()[getInteger(CALLING_AUDIO_PROCESSING_METHOD, CallManager.AudioProcessingMethod.Default.ordinal())]; } else { return CallManager.AudioProcessingMethod.Default; @@ -140,7 +140,7 @@ public final class InternalValues extends SignalStoreValues { * Setting to override the default calling bandwidth mode. */ public synchronized CallManager.DataMode callingDataMode() { - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { int index = getInteger(CALLING_DATA_MODE, CallManager.DataMode.NORMAL.ordinal()); CallManager.DataMode[] modes = CallManager.DataMode.values(); @@ -154,7 +154,7 @@ public final class InternalValues extends SignalStoreValues { * Whether or not Telecom integration is manually disabled. */ public synchronized boolean callingDisableTelecom() { - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { return getBoolean(CALLING_DISABLE_TELECOM, true); } else { return false; @@ -165,7 +165,7 @@ public final class InternalValues extends SignalStoreValues { * Whether or not LBRed for Opus is manually disabled. */ public synchronized boolean callingDisableLBRed() { - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { return getBoolean(CALLING_DISABLE_LBRED, false); } else { return true; @@ -176,7 +176,7 @@ public final class InternalValues extends SignalStoreValues { * Whether or not the system is forced to be in 'websocket mode', where FCM is ignored and we use a foreground service to keep the app alive. */ public boolean isWebsocketModeForced() { - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { return getBoolean(FORCE_WEBSOCKET_MODE, false); } else { return false; @@ -196,7 +196,7 @@ public final class InternalValues extends SignalStoreValues { } public boolean useConversationItemV2Media() { - return FeatureFlags.internalUser() && getBoolean(CONVERSATION_ITEM_V2_MEDIA, false); + return RemoteConfig.internalUser() && getBoolean(CONVERSATION_ITEM_V2_MEDIA, false); } public synchronized void setWebSocketShadowingStats(byte[] bytes) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt index 147dbe9287..84c56e31ff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PaymentsValues.kt @@ -19,7 +19,7 @@ import org.thoughtcrime.securesms.payments.currency.CurrencyUtil import org.thoughtcrime.securesms.payments.proto.MobileCoinLedger import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.storage.StorageSyncHelper -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.payments.Money import java.io.IOException @@ -118,7 +118,7 @@ internal class PaymentsValues internal constructor(store: KeyValueStore) : Signa if (!SignalStore.account().isRegistered) { return PaymentsAvailability.NOT_IN_REGION } - return if (FeatureFlags.payments) { + return if (RemoteConfig.payments) { if (mobileCoinPaymentsEnabled()) { if (GeographicalRestrictions.e164Allowed(SignalStore.account().e164)) { PaymentsAvailability.WITHDRAW_AND_SEND diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionFeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionRemoteConfig.java similarity index 82% rename from app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionFeatureFlags.java rename to app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionRemoteConfig.java index 6d4bc34c10..220377ea9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionFeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionRemoteConfig.java @@ -6,24 +6,24 @@ import androidx.annotation.NonNull; import com.annimon.stream.Stream; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.Util; import java.util.Map; -public class LogSectionFeatureFlags implements LogSection { +public class LogSectionRemoteConfig implements LogSection { @Override public @NonNull String getTitle() { - return "FEATURE FLAGS"; + return "REMOTE CONFIG"; } @Override public @NonNull CharSequence getContent(@NonNull Context context) { StringBuilder out = new StringBuilder(); - Map memory = FeatureFlags.getDebugMemoryValues(); - Map disk = FeatureFlags.getDebugDiskValues(); - Map pending = FeatureFlags.getDebugPendingDiskValues(); + Map memory = RemoteConfig.getDebugMemoryValues(); + Map disk = RemoteConfig.getDebugDiskValues(); + Map pending = RemoteConfig.getDebugPendingDiskValues(); int remoteLength = Stream.of(memory.keySet()).map(String::length).max(Integer::compareTo).orElse(0); int diskLength = Stream.of(disk.keySet()).map(String::length).max(Integer::compareTo).orElse(0); int pendingLength = Stream.of(pending.keySet()).map(String::length).max(Integer::compareTo).orElse(0); diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java index cd8dbc5020..2f74dcfee2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java @@ -24,7 +24,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.net.StandardUserAgentInterceptor; import org.thoughtcrime.securesms.providers.BlobProvider; import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.signal.core.util.Stopwatch; import java.io.IOException; @@ -77,7 +77,7 @@ public class SubmitDebugLogRepository { add(new LogSectionCapabilities()); add(new LogSectionMemory()); add(new LogSectionLocalMetrics()); - add(new LogSectionFeatureFlags()); + add(new LogSectionRemoteConfig()); add(new LogSectionPin()); if (Build.VERSION.SDK_INT >= 28) { add(new LogSectionPower()); @@ -92,7 +92,7 @@ public class SubmitDebugLogRepository { add(new LogSectionTrace()); add(new LogSectionThreads()); add(new LogSectionThreadDump()); - if (FeatureFlags.internalUser()) { + if (RemoteConfig.internalUser()) { add(new LogSectionSenderKey()); } add(new LogSectionDatabaseSchema()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaActions.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaActions.java index 754b58d005..3a59134fbb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaActions.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaActions.java @@ -17,14 +17,13 @@ import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.jobs.MultiDeviceDeleteSendSyncJob; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.AttachmentUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SaveAttachmentTask; import org.thoughtcrime.securesms.util.StorageUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; -import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; @@ -66,7 +65,7 @@ final class MediaActions { recordCount); String confirmMessage; - if (TextSecurePreferences.isMultiDevice(context) && FeatureFlags.deleteSyncEnabled()) { + if (TextSecurePreferences.isMultiDevice(context) && RemoteConfig.deleteSyncEnabled()) { confirmMessage = res.getQuantityString(R.plurals.MediaOverviewActivity_Media_delete_confirm_message_linked_device, recordCount, recordCount); @@ -99,7 +98,7 @@ final class MediaActions { } } - if (FeatureFlags.deleteSyncEnabled() && Util.hasItems(deletedMessageRecords)) { + if (RemoteConfig.deleteSyncEnabled() && Util.hasItems(deletedMessageRecords)) { MultiDeviceDeleteSendSyncJob.enqueueMessageDeletes(deletedMessageRecords); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt index b6659334d3..829cd5096a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt @@ -26,7 +26,7 @@ import org.thoughtcrime.securesms.longmessage.resolveBody import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sms.MessageSender import org.thoughtcrime.securesms.util.AttachmentUtil -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig /** * Repository for accessing the attachments in the encrypted database. @@ -85,7 +85,7 @@ class MediaPreviewRepository { fun localDelete(attachment: DatabaseAttachment): Completable { return Completable.fromRunnable { val deletedMessageRecord = AttachmentUtil.deleteAttachment(attachment) - if (deletedMessageRecord != null && FeatureFlags.deleteSyncEnabled) { + if (deletedMessageRecord != null && RemoteConfig.deleteSyncEnabled) { MultiDeviceDeleteSendSyncJob.enqueueMessageDeletes(setOf(deletedMessageRecord)) } }.subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 22f9b10872..a0746efa97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -67,10 +67,10 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.Debouncer -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.FullscreenHelper import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SaveAttachmentTask import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.StorageUtil @@ -601,7 +601,7 @@ class MediaPreviewV2Fragment : LoggingFragment(R.layout.fragment_media_preview_v MaterialAlertDialogBuilder(requireContext()).apply { setIcon(R.drawable.symbol_error_triangle_fill_24) setTitle(R.string.MediaPreviewActivity_media_delete_confirmation_title) - setMessage(if (TextSecurePreferences.isMultiDevice(requireContext()) && FeatureFlags.deleteSyncEnabled) R.string.MediaPreviewActivity_media_delete_confirmation_message_linked_device else R.string.MediaPreviewActivity_media_delete_confirmation_message) + setMessage(if (TextSecurePreferences.isMultiDevice(requireContext()) && RemoteConfig.deleteSyncEnabled) R.string.MediaPreviewActivity_media_delete_confirmation_message_linked_device else R.string.MediaPreviewActivity_media_delete_confirmation_message) setCancelable(true) setNegativeButton(android.R.string.cancel, null) setPositiveButton(R.string.ConversationFragment_delete_for_me) { _, _ -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java index 35dbf740df..5cf3a08aa5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java @@ -62,7 +62,7 @@ import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.BottomSheetUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.MemoryFileDescriptor; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; @@ -178,7 +178,7 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment { previewView.setScaleType(PREVIEW_SCALE_TYPE); - if (FeatureFlags.customCameraXController()) { + if (RemoteConfig.customCameraXController()) { View focusIndicator = view.findViewById(R.id.camerax_focus_indicator); cameraController = new SignalCameraController(requireContext(), getViewLifecycleOwner(), previewView, focusIndicator); } else { @@ -199,7 +199,7 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment { onOrientationChanged(); - if (FeatureFlags.customCameraXController()) { + if (RemoteConfig.customCameraXController()) { cameraController.initializeAndBind(requireContext(), getViewLifecycleOwner()); } @@ -705,7 +705,7 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment { @Override public void onOrientationChanged(int orientation) { if (cameraController != null) { - if (FeatureFlags.customCameraXController()) { + if (RemoteConfig.customCameraXController()) { cameraController.setImageRotation(orientation); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java index e6ce4d06b1..ab314d6f2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java @@ -30,7 +30,7 @@ import org.thoughtcrime.securesms.mediasend.camerax.CameraXModePolicy; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.ContextUtil; import org.thoughtcrime.securesms.util.Debouncer; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.MemoryFileDescriptor; import org.thoughtcrime.securesms.video.VideoUtil; @@ -259,7 +259,7 @@ class CameraXVideoCaptureHelper implements CameraButtonView.VideoCaptureListener } public float getDefaultVideoZoomRatio() { - if (FeatureFlags.startVideoRecordAt1x()) { + if (RemoteConfig.startVideoRecordAt1x()) { return 1f; } else { return Objects.requireNonNull(cameraController.getZoomState().getValue()).getMinZoomRatio(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt index 8f13c156c5..ff5d644db2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt @@ -5,7 +5,7 @@ import android.os.Build import androidx.camera.view.CameraController import org.signal.core.util.asListContains import org.thoughtcrime.securesms.mms.MediaConstraints -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.video.VideoUtil /** @@ -86,7 +86,7 @@ sealed class CameraXModePolicy { val isMixedModeSupported = isVideoSupported && Build.VERSION.SDK_INT >= 26 && CameraXUtil.isMixedModeSupported(context) && - !FeatureFlags.cameraXMixedModelBlocklist.asListContains(Build.MODEL) + !RemoteConfig.cameraXMixedModelBlocklist.asListContains(Build.MODEL) return when { isMixedModeSupported -> Mixed(isQrScanEnabled) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModelBlocklist.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModelBlocklist.kt index eb1f399f6a..82eb7842f9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModelBlocklist.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModelBlocklist.kt @@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.mediasend.camerax import android.os.Build import org.signal.core.util.asListContains -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig /** * Some phones don't work well with CameraX. This class uses a remote config to decide @@ -12,6 +12,6 @@ object CameraXModelBlocklist { @JvmStatic fun isBlocklisted(): Boolean { - return FeatureFlags.cameraXModelBlocklist.asListContains(Build.MODEL) + return RemoteConfig.cameraXModelBlocklist.asListContains(Build.MODEL) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt index cc49f217fd..cc3557622f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt @@ -44,8 +44,8 @@ import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.safety.SafetyNumberBottomSheet import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.Debouncer -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.FullscreenHelper +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.WindowUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.visible @@ -92,7 +92,7 @@ class MediaSelectionActivity : override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { setContentView(R.layout.media_selection_activity) - if (FeatureFlags.customCameraXController) { + if (RemoteConfig.customCameraXController) { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED } 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 b14f4df041..637becb657 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 @@ -9,8 +9,8 @@ import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.mms.SentMediaQuality import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.stories.Stories -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.MediaUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.video.TranscodingPreset data class MediaSelectionState( @@ -36,7 +36,7 @@ data class MediaSelectionState( val transcodingPreset: TranscodingPreset = MediaConstraints.getPushMediaConstraints(SentMediaQuality.fromCode(quality.code)).videoTranscodingSettings - val maxSelection = FeatureFlags.maxAttachmentCount + val maxSelection = RemoteConfig.maxAttachmentCount val canSend = !isSent && selectedMedia.isNotEmpty() diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt index 38e1546fe2..8e32945a9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt @@ -24,7 +24,7 @@ import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.CommunicationActions -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.navigation.safeNavigate import java.io.FileDescriptor import java.util.Optional @@ -94,7 +94,7 @@ class MediaCaptureFragment : Fragment(R.layout.fragment_container), CameraFragme .setTitle(R.string.MediaCaptureFragment_device_link_dialog_title) .setMessage(R.string.MediaCaptureFragment_device_link_dialog_body) .setPositiveButton(R.string.MediaCaptureFragment_device_link_dialog_continue) { d, _ -> - if (FeatureFlags.internalUser) { + if (RemoteConfig.internalUser) { startActivity(AppSettingsActivity.linkedDevices(requireContext())) } else { startActivity(DeviceActivity.getIntentForScanner(requireContext())) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt index d8b402d505..ba3a34037c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt @@ -25,7 +25,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sharing.ShareContact import org.thoughtcrime.securesms.sharing.ShareSelectionAdapter import org.thoughtcrime.securesms.sharing.ShareSelectionMappingModel -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment() { @@ -65,7 +65,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment( val contactRecycler: RecyclerView = view.findViewById(R.id.contact_recycler) mediator = ContactSearchMediator( fragment = this, - selectionLimits = FeatureFlags.shareSelectionLimit, + selectionLimits = RemoteConfig.shareSelectionLimit, displayOptions = ContactSearchAdapter.DisplayOptions( displayCheckBox = true, displaySecondaryInformation = ContactSearchAdapter.DisplaySecondaryInformation.NEVER diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt index f48ac7e913..04fdd62a58 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt @@ -10,14 +10,14 @@ import kotlinx.parcelize.Parcelize import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.fonts.TextFont import org.thoughtcrime.securesms.scribbles.HSVColorSlider -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig @Parcelize data class TextStoryPostCreationState( val body: CharSequence = "", val textColor: Int = HSVColorSlider.getLastColor(), val textColorStyle: TextColorStyle = TextColorStyle.NO_BACKGROUND, - val textAlignment: TextAlignment = if (FeatureFlags.storiesTextFunctions) TextAlignment.START else TextAlignment.CENTER, + val textAlignment: TextAlignment = if (RemoteConfig.storiesTextFunctions) TextAlignment.START else TextAlignment.CENTER, val textFont: TextFont = TextFont.REGULAR, @IntRange(from = 0, to = 100) val textScale: Int = 50, val backgroundColor: ChatColors = TextStoryBackgroundColors.getInitialBackgroundColor(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostTextEntryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostTextEntryFragment.kt index 85327fd7a7..a4d2fb94c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostTextEntryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostTextEntryFragment.kt @@ -34,7 +34,7 @@ import org.thoughtcrime.securesms.scribbles.HSVColorSlider import org.thoughtcrime.securesms.scribbles.HSVColorSlider.getColor import org.thoughtcrime.securesms.scribbles.HSVColorSlider.setColor import org.thoughtcrime.securesms.scribbles.HSVColorSlider.setUpForColor -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.fragments.findListener @@ -105,7 +105,7 @@ class TextStoryPostTextEntryFragment : KeyboardEntryDialogFragment( backgroundButton ) - if (FeatureFlags.storiesTextFunctions) { + if (RemoteConfig.storiesTextFunctions) { fadeableViews = fadeableViews + alignmentButton alignmentButton.visibility = View.VISIBLE scaleBar.visibility = View.VISIBLE diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index be434b1927..fac2a51820 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -39,7 +39,7 @@ import org.thoughtcrime.securesms.profiles.manage.EditProfileActivity; import org.thoughtcrime.securesms.profiles.username.NewWaysToConnectDialogFragment; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.storage.StorageSyncHelper; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper; @@ -104,7 +104,7 @@ public final class Megaphones { * The megaphones we want to display *in priority order*. This is a {@link LinkedHashMap}, so order is preserved. * We will render the first applicable megaphone in this collection. *

- * This is also when you would hide certain megaphones based on things like {@link FeatureFlags}. + * This is also when you would hide certain megaphones based on things like {@link RemoteConfig}. */ private static Map buildDisplayOrder(@NonNull Context context, @NonNull Map records) { return new LinkedHashMap<>() {{ @@ -132,7 +132,7 @@ public final class Megaphones { return false; } - long expiringAt = device.lastActiveTimestamp + FeatureFlags.getLinkedDeviceLifespan(); + long expiringAt = device.lastActiveTimestamp + RemoteConfig.getLinkedDeviceLifespan(); long expiringIn = Math.max(expiringAt - System.currentTimeMillis(), 0); return expiringIn < TimeUnit.DAYS.toMillis(7) && expiringIn > 0; @@ -177,7 +177,7 @@ public final class Megaphones { throw new IllegalStateException("No linked device to show"); } - long expiringAt = device.lastActiveTimestamp + FeatureFlags.getLinkedDeviceLifespan(); + long expiringAt = device.lastActiveTimestamp + RemoteConfig.getLinkedDeviceLifespan(); long expiringIn = Math.max(expiringAt - System.currentTimeMillis(), 0); int expiringDays = (int) TimeUnit.MILLISECONDS.toDays(expiringIn); diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository.kt index 186e9bbc48..ad93c30012 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository.kt @@ -22,8 +22,8 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.megaphone.RemoteMegaphoneRepository.Action import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.recipients.Recipient -import org.thoughtcrime.securesms.util.FeatureFlags -import org.thoughtcrime.securesms.util.LocaleFeatureFlags +import org.thoughtcrime.securesms.util.LocaleRemoteConfig +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.VersionTracker import java.util.Objects import kotlin.math.min @@ -89,7 +89,7 @@ object RemoteMegaphoneRepository { return db.getPotentialMegaphonesAndClearOld(now) .asSequence() .filter { it.imageUrl == null || it.imageUri != null } - .filter { it.countries == null || LocaleFeatureFlags.shouldShowReleaseNote(it.uuid, it.countries) } + .filter { it.countries == null || LocaleRemoteConfig.shouldShowReleaseNote(it.uuid, it.countries) } .filter { it.conditionalId == null || checkCondition(it.conditionalId) } .filter { it.snoozedAt == 0L || checkSnooze(it, now) } .firstOrNull() @@ -112,7 +112,7 @@ object RemoteMegaphoneRepository { private fun checkCondition(conditionalId: String): Boolean { return when (conditionalId) { "standard_donate" -> shouldShowDonateMegaphone() - "internal_user" -> FeatureFlags.internalUser + "internal_user" -> RemoteConfig.internalUser else -> false } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java index 98703dacdf..45345a6d84 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageHeaderViewHolder.java @@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.messagedetails.MessageDetailsAdapter.Callbacks import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.ExpirationUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.ProjectionList; @@ -96,7 +96,7 @@ final class MessageHeaderViewHolder extends RecyclerView.ViewHolder implements G } private void bindInternalDetails(MessageRecord messageRecord) { - if (!FeatureFlags.internalUser()) { + if (!RemoteConfig.internalUser()) { internalDetailsButton.setVisibility(View.GONE); return; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver.java index 52b63f8934..dcec1665a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver.java @@ -18,7 +18,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobmanager.JobTracker; import org.thoughtcrime.securesms.jobs.MessageFetchJob; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import java.util.Locale; import java.util.Optional; @@ -48,7 +48,7 @@ public final class RoutineMessageFetchReceiver extends BroadcastReceiver { return; } - long foregroundDelayMs = FeatureFlags.getBackgroundMessageProcessForegroundDelay(); + long foregroundDelayMs = RemoteConfig.getBackgroundMessageProcessForegroundDelay(); long jobTimeout = foregroundDelayMs + 200; Log.i(TAG, String.format(Locale.US, "Starting PushNotificationReceiveJob asynchronously with %d delay before foreground shown", foregroundDelayMs)); @@ -76,7 +76,7 @@ public final class RoutineMessageFetchReceiver extends BroadcastReceiver { PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 123, alarmIntent, PendingIntentFlags.updateCurrent()); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - long interval = FeatureFlags.getBackgroundMessageProcessInterval(); + long interval = RemoteConfig.getBackgroundMessageProcessInterval(); if (interval < 0) { alarmManager.cancel(pendingIntent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt index b8034088d3..c9fc1d47e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -89,10 +89,10 @@ import org.thoughtcrime.securesms.recipients.RecipientUtil import org.thoughtcrime.securesms.stickers.StickerLocator import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.util.EarlyMessageCacheEntry -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.LinkUtil import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SignalLocalMetrics import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.isStory @@ -220,7 +220,7 @@ object DataMessageProcessor { if (insertResult != null && insertResult.threadWasNewlyCreated && !threadRecipient.isGroup && !threadRecipient.isSelf && !senderRecipient.isSystemContact) { val timeSinceLastSync = System.currentTimeMillis() - SignalStore.misc().lastCdsForegroundSyncTime - if (timeSinceLastSync > FeatureFlags.cdsForegroundSyncInterval || timeSinceLastSync < 0) { + if (timeSinceLastSync > RemoteConfig.cdsForegroundSyncInterval || timeSinceLastSync < 0) { log(envelope.timestamp!!, "New 1:1 chat. Scheduling a CDS sync to see if they match someone in our contacts.") AppDependencies.jobManager.add(DirectoryRefreshJob(false)) SignalStore.misc().lastCdsForegroundSyncTime = System.currentTimeMillis() diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java index ae89d62c92..79b82d3ff7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java @@ -23,7 +23,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.RecipientAccessList; import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.thoughtcrime.securesms.util.TextSecurePreferences; @@ -303,7 +303,7 @@ public final class GroupSendUtil { long keyCreateTime = SenderKeyUtil.getCreateTimeForOurKey(distributionId); long keyAge = System.currentTimeMillis() - keyCreateTime; - if (keyCreateTime != -1 && keyAge > FeatureFlags.senderKeyMaxAge()) { + if (keyCreateTime != -1 && keyAge > RemoteConfig.senderKeyMaxAge()) { Log.w(TAG, "DistributionId " + distributionId + " was created at " + keyCreateTime + " and is " + (keyAge) + " ms old (~" + TimeUnit.MILLISECONDS.toDays(keyAge) + " days). Rotating."); SenderKeyUtil.rotateOurKey(distributionId); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt index a5e7a63e43..cbe2123242 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt @@ -42,7 +42,7 @@ import org.thoughtcrime.securesms.notifications.v2.ConversationId import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.EarlyMessageCacheEntry -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SignalLocalMetrics import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.Util @@ -561,7 +561,7 @@ open class MessageContentProcessor(private val context: Context) { } private fun handleRetryReceipt(envelope: Envelope, metadata: EnvelopeMetadata, decryptionErrorMessage: DecryptionErrorMessage, senderRecipient: Recipient) { - if (!FeatureFlags.retryReceipts) { + if (!RemoteConfig.retryReceipts) { warn(envelope.timestamp!!, "[RetryReceipt] Feature flag disabled, skipping retry receipt.") return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt index a2d2c529c0..8f15fd4530 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt @@ -49,8 +49,8 @@ import org.thoughtcrime.securesms.notifications.NotificationChannels import org.thoughtcrime.securesms.notifications.NotificationIds import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.LRUCache +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.asChain import org.whispersystems.signalservice.api.InvalidMessageStructureException import org.whispersystems.signalservice.api.crypto.ContentHint @@ -156,7 +156,7 @@ object MessageDecryptor { if (validationResult is EnvelopeContentValidator.Result.Invalid) { Log.w(TAG, "${logPrefix(envelope, cipherResult)} Invalid content! ${validationResult.reason}", validationResult.throwable) - if (FeatureFlags.internalUser) { + if (RemoteConfig.internalUser) { postInvalidMessageNotification(context, validationResult.reason) } @@ -213,11 +213,11 @@ object MessageDecryptor { check(e is ProtocolException) Log.w(TAG, "${logPrefix(envelope, e)} Decryption error!", e, true) - if (FeatureFlags.internalUser) { + if (RemoteConfig.internalUser) { postDecryptionErrorNotification(context) } - if (FeatureFlags.retryReceipts) { + if (RemoteConfig.retryReceipts) { buildResultForDecryptionError(context, envelope, serverDeliveredTimestamp, followUpOperations, e) } else { Log.w(TAG, "${logPrefix(envelope, e)} Retry receipts disabled! Enqueuing a session reset job, which will also insert an error message.", e, true) @@ -296,7 +296,7 @@ object MessageDecryptor { val errorCount: DecryptionErrorCount = decryptionErrorCounts.getOrPut(sender.id) { DecryptionErrorCount(count = 0, lastReceivedTime = 0) } val timeSinceLastError = receivedTimestamp - errorCount.lastReceivedTime - if (timeSinceLastError > FeatureFlags.retryReceiptMaxCountResetAge && errorCount.count > 0) { + if (timeSinceLastError > RemoteConfig.retryReceiptMaxCountResetAge && errorCount.count > 0) { Log.i(TAG, "${logPrefix(envelope, senderServiceId)} Resetting decryption error count for ${sender.id} because it has been $timeSinceLastError ms since the last error.", true) errorCount.count = 0 } @@ -304,8 +304,8 @@ object MessageDecryptor { errorCount.count++ errorCount.lastReceivedTime = receivedTimestamp - if (errorCount.count > FeatureFlags.retryReceiptMaxCount) { - Log.w(TAG, "${logPrefix(envelope, senderServiceId)} This is error number ${errorCount.count} from ${sender.id}, which is greater than the maximum of ${FeatureFlags.retryReceiptMaxCount}. Ignoring.", true) + if (errorCount.count > RemoteConfig.retryReceiptMaxCount) { + Log.w(TAG, "${logPrefix(envelope, senderServiceId)} This is error number ${errorCount.count} from ${sender.id}, which is greater than the maximum of ${RemoteConfig.retryReceiptMaxCount}. Ignoring.", true) if (contentHint == ContentHint.IMPLICIT) { Log.w(TAG, "${logPrefix(envelope, senderServiceId)} The content hint is $contentHint, so no error message is needed.", true) diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SignalServiceProtoUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SignalServiceProtoUtil.kt index 3ba63add30..0a09e38108 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SignalServiceProtoUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SignalServiceProtoUtil.kt @@ -14,8 +14,8 @@ import org.thoughtcrime.securesms.attachments.PointerAttachment import org.thoughtcrime.securesms.database.model.StoryType import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.stickers.StickerLocator -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.MediaUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.InvalidMessageStructureException import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer @@ -171,7 +171,7 @@ object SignalServiceProtoUtil { } fun List.toPointersWithinLimit(): List { - return mapNotNull { it.toPointer() }.take(FeatureFlags.maxAttachmentCount) + return mapNotNull { it.toPointer() }.take(RemoteConfig.maxAttachmentCount) } fun AttachmentPointer.toPointer(stickerLocator: StickerLocator? = null): Attachment? { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt index 6f15372228..1dc4e45eb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt @@ -19,7 +19,7 @@ import org.thoughtcrime.securesms.mms.IncomingMessage import org.thoughtcrime.securesms.mms.MmsException import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.stories.Stories -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata import org.whispersystems.signalservice.internal.push.Content import org.whispersystems.signalservice.internal.push.Envelope @@ -90,7 +90,7 @@ object StoryMessageProcessor { } if (insertResult != null) { - Stories.enqueueNextStoriesForDownload(threadRecipient.id, false, FeatureFlags.storiesAutoDownloadMaximum) + Stories.enqueueNextStoriesForDownload(threadRecipient.id, false, RemoteConfig.storiesAutoDownloadMaximum) AppDependencies.expireStoriesManager.scheduleIfNecessary() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt index 8766e01ea2..d966bc3813 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt @@ -90,10 +90,10 @@ import org.thoughtcrime.securesms.service.webrtc.links.SignalCallLinkState import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.EarlyMessageCacheEntry -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.IdentityUtil import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata @@ -1368,7 +1368,7 @@ object SyncMessageProcessor { @Throws(BadGroupIdException::class) private fun handleSynchronizeGroupOrAdHocCallEvent(callEvent: SyncMessage.CallEvent, envelopeTimestamp: Long) { - if (!FeatureFlags.adHocCalling && callEvent.type == SyncMessage.CallEvent.Type.AD_HOC_CALL) { + if (!RemoteConfig.adHocCalling && callEvent.type == SyncMessage.CallEvent.Type.AD_HOC_CALL) { log(envelopeTimestamp, "Ad-Hoc calling is not currently supported by this client, ignoring.") return } @@ -1475,7 +1475,7 @@ object SyncMessageProcessor { } private fun handleSynchronizeDeleteForMe(context: Context, deleteForMe: SyncMessage.DeleteForMe, envelopeTimestamp: Long, earlyMessageCacheEntry: EarlyMessageCacheEntry?) { - if (!FeatureFlags.deleteSyncEnabled) { + if (!RemoteConfig.deleteSyncEnabled) { warn(envelopeTimestamp, "Delete for me sync message dropped as support not enabled") return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java index 1331b24194..7a66acee60 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/MigrationJob.java @@ -7,7 +7,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobLogger; import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; /** * A base class for jobs that are intended to be used in {@link ApplicationMigrations}. Some @@ -47,7 +47,7 @@ abstract class MigrationJob extends Job { } catch (Exception e) { if (shouldRetry(e)) { Log.w(TAG, JobLogger.format(this, "Encountered a retryable exception."), e); - return Result.retry(BackoffUtil.exponentialBackoff(getRunAttempt() + 1, FeatureFlags.getDefaultMaxBackoff())); + return Result.retry(BackoffUtil.exponentialBackoff(getRunAttempt() + 1, RemoteConfig.getDefaultMaxBackoff())); } else { Log.w(TAG, JobLogger.format(this, "Encountered a non-runtime fatal exception."), e); throw new FailedMigrationError(e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java index b61809d34c..9f25a81920 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -81,7 +81,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.BitmapUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.ProfileUtil; import org.thoughtcrime.securesms.util.ViewUtil; @@ -477,7 +477,7 @@ public class AttachmentManager { intent.putExtra(PaymentsActivity.EXTRA_PAYMENTS_STARTING_ACTION, R.id.action_directly_to_createPayment); intent.putExtra(PaymentsActivity.EXTRA_STARTING_ARGUMENTS, new CreatePaymentFragmentArgs.Builder(new PayeeParcelable(recipient.getId())).setFinishOnConfirm(true).build().toBundle()); fragment.startActivity(intent); - } else if (FeatureFlags.paymentsRequestActivateFlow() && recipient.getPaymentActivationCapability().isSupported()) { + } else if (RemoteConfig.paymentsRequestActivateFlow() && recipient.getPaymentActivationCapability().isSupported()) { showRequestToActivatePayments(fragment.requireContext(), recipient); } else { RecipientHasNotEnabledPaymentsDialog.show(fragment.requireContext()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java index 0c936ea150..9c0a3ba9d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java @@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.jobs.AttachmentUploadJob; import org.thoughtcrime.securesms.util.BitmapDecodingException; import org.thoughtcrime.securesms.util.BitmapUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.MemoryFileDescriptor; import org.thoughtcrime.securesms.video.TranscodingPreset; @@ -129,6 +129,6 @@ public abstract class MediaConstraints { } public static boolean isVideoTranscodeAvailable() { - return Build.VERSION.SDK_INT >= 26 && (FeatureFlags.useStreamingVideoMuxer() || MemoryFileDescriptor.supported()); + return Build.VERSION.SDK_INT >= 26 && (RemoteConfig.useStreamingVideoMuxer() || MemoryFileDescriptor.supported()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java index 98bd375068..89d282eb57 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java @@ -7,8 +7,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.dependencies.AppDependencies; -import org.thoughtcrime.securesms.util.FeatureFlags; -import org.thoughtcrime.securesms.util.LocaleFeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; +import org.thoughtcrime.securesms.util.LocaleRemoteConfig; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.video.TranscodingPreset; @@ -68,7 +68,7 @@ public class PushMediaConstraints extends MediaConstraints { @Override public long getCompressedVideoMaxSize(Context context) { - if (FeatureFlags.useStreamingVideoMuxer()) { + if (RemoteConfig.useStreamingVideoMuxer()) { return getMaxAttachmentSize(); } else { return Util.isLowMemory(context) ? 30 * MB @@ -104,7 +104,7 @@ public class PushMediaConstraints extends MediaConstraints { if (sentMediaQuality == SentMediaQuality.HIGH) { return MediaConfig.LEVEL_3; } - return LocaleFeatureFlags.getMediaQualityLevel().orElse(MediaConfig.getDefault(context)); + return LocaleRemoteConfig.getMediaQualityLevel().orElse(MediaConfig.getDefault(context)); } public enum MediaConfig { diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/DefaultWebSocketShadowingBridge.kt b/app/src/main/java/org/thoughtcrime/securesms/net/DefaultWebSocketShadowingBridge.kt index e4e7f6c264..55e1afddc0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/net/DefaultWebSocketShadowingBridge.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/net/DefaultWebSocketShadowingBridge.kt @@ -18,7 +18,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity import org.thoughtcrime.securesms.notifications.NotificationChannels import org.thoughtcrime.securesms.notifications.NotificationIds -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.internal.websocket.WebSocketShadowingBridge /** @@ -37,7 +37,7 @@ class DefaultWebSocketShadowingBridge(private val context: Application) : WebSoc } override fun triggerFailureNotification(message: String) { - if (!FeatureFlags.internalUser) { + if (!RemoteConfig.internalUser) { return } val notification: Notification = NotificationCompat.Builder(context, NotificationChannels.getInstance().FAILURES) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/SlowNotificationHeuristics.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/SlowNotificationHeuristics.kt index b7e416a313..f089e436b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/SlowNotificationHeuristics.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/SlowNotificationHeuristics.kt @@ -13,10 +13,10 @@ import org.thoughtcrime.securesms.database.LocalMetricsDatabase import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.DeviceProperties -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.JsonUtils -import org.thoughtcrime.securesms.util.LocaleFeatureFlags +import org.thoughtcrime.securesms.util.LocaleRemoteConfig import org.thoughtcrime.securesms.util.PowerManagerCompat +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SignalLocalMetrics import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.days @@ -36,7 +36,7 @@ object SlowNotificationHeuristics { private val TAG = Log.tag(SlowNotificationHeuristics::class.java) fun getConfiguration(): Configuration { - val json = FeatureFlags.delayedNotificationsPromptConfig + val json = RemoteConfig.delayedNotificationsPromptConfig return if (TextUtils.isEmpty(json)) { getDefaultConfiguration() } else { @@ -64,7 +64,7 @@ object SlowNotificationHeuristics { @JvmStatic fun shouldPromptUserForLogs(): Boolean { - if (!LocaleFeatureFlags.isDelayedNotificationPromptEnabled() || SignalStore.uiHints().hasDeclinedToShareNotificationLogs()) { + if (!LocaleRemoteConfig.isDelayedNotificationPromptEnabled() || SignalStore.uiHints().hasDeclinedToShareNotificationLogs()) { return false } if (System.currentTimeMillis() - SignalStore.uiHints().lastNotificationLogsPrompt < TimeUnit.DAYS.toMillis(7)) { @@ -80,7 +80,7 @@ object SlowNotificationHeuristics { return false } - val remoteEnabled = LocaleFeatureFlags.isBatterySaverPromptEnabled() || LocaleFeatureFlags.isDelayedNotificationPromptEnabled() + val remoteEnabled = LocaleRemoteConfig.isBatterySaverPromptEnabled() || LocaleRemoteConfig.isDelayedNotificationPromptEnabled() if (!remoteEnabled || SignalStore.uiHints().hasDismissedBatterySaverPrompt()) { return false } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationThumbnails.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationThumbnails.kt index eedf43faec..bc4d7aa90e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationThumbnails.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationThumbnails.kt @@ -12,8 +12,8 @@ import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader import org.thoughtcrime.securesms.mms.Slide import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.util.BitmapDecodingException -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.ImageCompressionUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.kb import org.thoughtcrime.securesms.util.mb @@ -41,7 +41,7 @@ object NotificationThumbnails { * specifics here, we'll just disable notification thumbnails for them. */ private val isBlocklisted by lazy { - FeatureFlags.notificationThumbnailProductBlocklist.asListContains(Build.PRODUCT) + RemoteConfig.notificationThumbnailProductBlocklist.asListContains(Build.PRODUCT) } fun getWithoutModifying(notificationItem: NotificationItem): NotificationItem.ThumbnailInfo { diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/DataExportUtil.java b/app/src/main/java/org/thoughtcrime/securesms/payments/DataExportUtil.java index 02ba083832..c438c510bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/DataExportUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/DataExportUtil.java @@ -12,7 +12,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.payments.reconciliation.LedgerReconcile; import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import java.time.Instant; import java.time.format.DateTimeFormatter; @@ -25,7 +25,7 @@ public final class DataExportUtil { private DataExportUtil() {} public static @NonNull String createTsv() { - if (!FeatureFlags.internalUser()) { + if (!RemoteConfig.internalUser()) { throw new AssertionError("This is intended for internal use only"); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/GeographicalRestrictions.java b/app/src/main/java/org/thoughtcrime/securesms/payments/GeographicalRestrictions.java index 1dcf692146..89d7b3d0b8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/GeographicalRestrictions.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/GeographicalRestrictions.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.Util; import java.util.Arrays; @@ -24,7 +24,7 @@ public final class GeographicalRestrictions { String bareE164 = e164.startsWith("+") ? e164.substring(1) : e164; - return parsePrefixes(FeatureFlags.paymentsCountryBlocklist()) + return parsePrefixes(RemoteConfig.paymentsCountryBlocklist()) .stream() .noneMatch(bareE164::startsWith); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java b/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java index 8643676443..f85d2c02e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/PinRestoreEntryFragment.java @@ -23,11 +23,9 @@ import com.google.android.material.button.MaterialButton; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.MainActivity; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.backup.v2.MessageBackupTier; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobs.ProfileUploadJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; @@ -40,7 +38,7 @@ import org.thoughtcrime.securesms.registration.RegistrationUtil; import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegate; import org.thoughtcrime.securesms.restore.RestoreActivity; import org.thoughtcrime.securesms.util.CommunicationActions; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.SupportEmailUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; @@ -240,7 +238,7 @@ public class PinRestoreEntryFragment extends LoggingFragment { Activity activity = requireActivity(); - if (FeatureFlags.messageBackups()) { + if (RemoteConfig.messageBackups()) { startActivity(RestoreActivity.getIntentForTransferOrRestore(activity)); } else if (Recipient.self().getProfileName().isEmpty() || !AvatarHelper.hasAvatar(activity, Recipient.self().getId())) { final Intent main = MainActivity.clearTop(activity); diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/Svr3Migration.kt b/app/src/main/java/org/thoughtcrime/securesms/pin/Svr3Migration.kt index 2c6850daed..674b0fa5da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/Svr3Migration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/Svr3Migration.kt @@ -5,7 +5,7 @@ package org.thoughtcrime.securesms.pin -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig object Svr3Migration { @@ -19,11 +19,11 @@ object Svr3Migration { * Whether or not you should write to SVR3. If [shouldWriteToSvr2] is also enabled, you should write to SVR3 first. */ val shouldWriteToSvr3: Boolean - get() = shouldReadFromSvr3 && FeatureFlags.svr3MigrationPhase.let { it == 1 || it == 2 } + get() = shouldReadFromSvr3 && RemoteConfig.svr3MigrationPhase.let { it == 1 || it == 2 } /** * Whether or not you should write to SVR2. If [shouldWriteToSvr3] is also enabled, you should write to SVR3 first. */ val shouldWriteToSvr2: Boolean - get() = !shouldReadFromSvr3 || FeatureFlags.svr3MigrationPhase != 2 + get() = !shouldReadFromSvr3 || RemoteConfig.svr3MigrationPhase != 2 } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java index 6f8f6795b4..d7b24e8d48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java @@ -41,7 +41,7 @@ import org.thoughtcrime.securesms.profiles.edit.pnp.WhoCanFindMeByPhoneNumberFra import org.thoughtcrime.securesms.profiles.manage.EditProfileNameFragment; import org.thoughtcrime.securesms.providers.BlobProvider; import org.thoughtcrime.securesms.util.CommunicationActions; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; import org.thoughtcrime.securesms.util.text.AfterTextChanged; @@ -166,7 +166,7 @@ public class CreateProfileFragment extends LoggingFragment { binding.mmsGroupHint.setVisibility(isEditingGroup && groupId.isMms() ? View.VISIBLE : View.GONE); if (isEditingGroup) { - EditTextUtil.addGraphemeClusterLimitFilter(binding.givenName, FeatureFlags.getMaxGroupNameGraphemeLength()); + EditTextUtil.addGraphemeClusterLimitFilter(binding.givenName, RemoteConfig.getMaxGroupNameGraphemeLength()); binding.profileDescriptionText.setVisibility(View.GONE); binding.whoCanFindMeContainer.setVisibility(View.GONE); binding.givenName.addTextChangedListener(new AfterTextChanged(s -> viewModel.setGivenName(s.toString()))); diff --git a/app/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java b/app/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java index 3e4c1a61a3..f738e7fa66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java +++ b/app/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java @@ -11,7 +11,7 @@ import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.dependencies.AppDependencies; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.ServiceId.PNI; @@ -62,8 +62,8 @@ public class AccountManagerFactory { deviceId, password, BuildConfig.SIGNAL_AGENT, - FeatureFlags.okHttpAutomaticRetry(), - FeatureFlags.groupLimits().getHardLimit()); + RemoteConfig.okHttpAutomaticRetry(), + RemoteConfig.groupLimits().getHardLimit()); } /** @@ -91,8 +91,8 @@ public class AccountManagerFactory { deviceId, password, BuildConfig.SIGNAL_AGENT, - FeatureFlags.okHttpAutomaticRetry(), - FeatureFlags.groupLimits().getHardLimit()); + RemoteConfig.okHttpAutomaticRetry(), + RemoteConfig.groupLimits().getHardLimit()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index 7ba47e1395..4f1d83c454 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -43,7 +43,6 @@ import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.recipients.ui.about.AboutSheet; import org.thoughtcrime.securesms.util.BottomSheetUtil; import org.thoughtcrime.securesms.util.ContextUtil; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.SpanUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterSmsCodeFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterSmsCodeFragment.java index 70f0aa087d..64a9318ccb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterSmsCodeFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterSmsCodeFragment.java @@ -8,7 +8,7 @@ import androidx.navigation.fragment.NavHostFragment; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.registration.viewmodel.RegistrationViewModel; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.signal.core.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; @@ -32,7 +32,7 @@ public final class EnterSmsCodeFragment extends BaseEnterSmsCodeFragment { long startTime = System.currentTimeMillis(); try { - FeatureFlags.refreshSync(); + RemoteConfig.refreshSync(); Log.i(TAG, "Took " + (System.currentTimeMillis() - startTime) + " ms to get feature flags."); } catch (IOException e) { Log.w(TAG, "Failed to refresh flags after " + (System.currentTimeMillis() - startTime) + " ms.", e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java index abfe9a8301..9a57f3505f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/RegistrationLockFragment.java @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.registration.viewmodel.BaseRegistrationViewModel; import org.thoughtcrime.securesms.registration.viewmodel.RegistrationViewModel; import org.thoughtcrime.securesms.util.CommunicationActions; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.signal.core.util.Stopwatch; import org.thoughtcrime.securesms.util.SupportEmailUtil; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; @@ -61,11 +61,11 @@ public final class RegistrationLockFragment extends BaseRegistrationLockFragment stopwatch.split("ContactRestore"); try { - FeatureFlags.refreshSync(); + RemoteConfig.refreshSync(); } catch (IOException e) { Log.w(TAG, "Failed to refresh flags.", e); } - stopwatch.split("FeatureFlags"); + stopwatch.split("RemoteConfig"); stopwatch.stop(TAG); diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2Activity.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2Activity.kt index 6e56f79c06..db9391eab9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2Activity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2Activity.kt @@ -25,7 +25,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.SmsRetrieverReceiver import org.thoughtcrime.securesms.registration.v2.ui.restore.RemoteRestoreActivity import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig /** * Activity to hold the entire registration process. @@ -86,7 +86,7 @@ class RegistrationV2Activity : BaseActivity() { val startIntent = MainActivity.clearTop(this).apply { if (needsPin) { putExtra("next_intent", CreateSvrPinActivity.getIntentForPinCreate(this@RegistrationV2Activity)) - } else if (!SignalStore.registrationValues().hasSkippedTransferOrRestore() && FeatureFlags.messageBackups) { + } else if (!SignalStore.registrationValues().hasSkippedTransferOrRestore() && RemoteConfig.messageBackups) { putExtra("next_intent", RemoteRestoreActivity.getIntent(this@RegistrationV2Activity)) } else if (needsProfile) { putExtra("next_intent", CreateProfileActivity.getIntentForUserProfile(this@RegistrationV2Activity)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2ViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2ViewModel.kt index 47925300ee..906b5afce8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2ViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/RegistrationV2ViewModel.kt @@ -60,7 +60,7 @@ import org.thoughtcrime.securesms.registration.v2.data.network.VerificationCodeR import org.thoughtcrime.securesms.registration.v2.data.network.VerificationCodeRequestResult.TokenNotAccepted import org.thoughtcrime.securesms.registration.v2.data.network.VerificationCodeRequestResult.UnknownError import org.thoughtcrime.securesms.registration.viewmodel.SvrAuthCredentialSet -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.dualsim.MccMncProducer import org.whispersystems.signalservice.api.SvrNoDataException @@ -782,13 +782,13 @@ class RegistrationV2ViewModel : ViewModel() { .enqueueAndBlockUntilCompletion(TimeUnit.SECONDS.toMillis(10)) stopwatch.split("ContactRestore") - refreshFeatureFlags() + refreshRemoteConfig() - stopwatch.split("FeatureFlags") + stopwatch.split("RemoteConfig") stopwatch.stop(TAG) } else { - refreshFeatureFlags() + refreshRemoteConfig() } store.update { @@ -865,10 +865,10 @@ class RegistrationV2ViewModel : ViewModel() { Log.i(TAG, "Took " + (System.currentTimeMillis() - startTime) + " ms to restore the backup tier..") } - private suspend fun refreshFeatureFlags() = withContext(Dispatchers.IO) { + private suspend fun refreshRemoteConfig() = withContext(Dispatchers.IO) { val startTime = System.currentTimeMillis() try { - FeatureFlags.refreshSync() + RemoteConfig.refreshSync() Log.i(TAG, "Took " + (System.currentTimeMillis() - startTime) + " ms to get feature flags.") } catch (e: IOException) { Log.w(TAG, "Failed to refresh flags after " + (System.currentTimeMillis() - startTime) + " ms.", e) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/welcome/WelcomeV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/welcome/WelcomeV2Fragment.kt index 5d0ac88b7b..0c4c5adbe0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/welcome/WelcomeV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/ui/welcome/WelcomeV2Fragment.kt @@ -28,7 +28,7 @@ import org.thoughtcrime.securesms.registration.v2.ui.grantpermissions.GrantPermi import org.thoughtcrime.securesms.restore.RestoreActivity import org.thoughtcrime.securesms.util.BackupUtil import org.thoughtcrime.securesms.util.CommunicationActions -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.visible @@ -61,7 +61,7 @@ class WelcomeV2Fragment : LoggingFragment(R.layout.fragment_registration_welcome binding.welcomeContinueButton.setOnClickListener { onContinueClicked() } binding.welcomeTermsButton.setOnClickListener { onTermsClicked() } binding.welcomeTransferOrRestore.setOnClickListener { onTransferOrRestoreClicked() } - binding.welcomeTransferOrRestore.visible = !FeatureFlags.restoreAfterRegistration + binding.welcomeTransferOrRestore.visible = !RemoteConfig.restoreAfterRegistration } private fun onContinueClicked() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java index dbcc3494ec..8795dc7bd3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java @@ -26,7 +26,7 @@ import org.thoughtcrime.securesms.registration.VerifyResponse; import org.thoughtcrime.securesms.registration.VerifyResponseProcessor; import org.thoughtcrime.securesms.registration.VerifyResponseWithRegistrationLockProcessor; import org.thoughtcrime.securesms.registration.VerifyResponseWithoutKbs; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.SvrNoDataException; import org.whispersystems.signalservice.api.kbs.MasterKey; @@ -407,11 +407,11 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel { stopwatch.split("ContactRestore"); try { - FeatureFlags.refreshSync(); + RemoteConfig.refreshSync(); } catch (IOException e) { Log.w(TAG, "Failed to refresh flags.", e); } - stopwatch.split("FeatureFlags"); + stopwatch.split("RemoteConfig"); stopwatch.stop(TAG); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/restore/transferorrestore/TransferOrRestoreV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/restore/transferorrestore/TransferOrRestoreV2Fragment.kt index 3c8199e6f5..34fb9e9576 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/restore/transferorrestore/TransferOrRestoreV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/restore/transferorrestore/TransferOrRestoreV2Fragment.kt @@ -19,7 +19,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegate import org.thoughtcrime.securesms.registration.v2.ui.restore.RemoteRestoreActivity import org.thoughtcrime.securesms.restore.RestoreViewModel -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.visible @@ -47,8 +47,8 @@ class TransferOrRestoreV2Fragment : LoggingFragment(R.layout.fragment_transfer_r binding.transferOrRestoreFragmentRestoreRemoteCard.visible = false } - binding.transferOrRestoreFragmentRestoreRemoteCard.visible = FeatureFlags.messageBackups - binding.transferOrRestoreFragmentMoreOptions.visible = FeatureFlags.messageBackups + binding.transferOrRestoreFragmentRestoreRemoteCard.visible = RemoteConfig.messageBackups + binding.transferOrRestoreFragmentMoreOptions.visible = RemoteConfig.messageBackups val description = getString(R.string.TransferOrRestoreFragment__transfer_your_account_and_messages_from_your_old_android_device) val toBold = getString(R.string.TransferOrRestoreFragment__you_need_access_to_your_old_device) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java index d95f988e4c..a809809999 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java @@ -6,7 +6,7 @@ import android.content.Context; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.util.concurrent.TimeUnit; @@ -30,7 +30,7 @@ public class DirectoryRefreshListener extends PersistentAlarmManagerListener { newTime = Math.min(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(6), SignalStore.misc().getCdsBlockedUtil()); } else { - newTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(FeatureFlags.cdsRefreshIntervalSeconds()); + newTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(RemoteConfig.cdsRefreshIntervalSeconds()); TextSecurePreferences.setDirectoryRefreshTime(context, newTime); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt b/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt index 53537093a2..e6fe6713a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt @@ -9,7 +9,7 @@ import android.content.Context import org.thoughtcrime.securesms.backup.v2.BackupFrequency import org.thoughtcrime.securesms.jobs.BackupMessagesJob import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.toMillis import java.time.LocalDateTime import java.util.Random @@ -36,7 +36,7 @@ class MessageBackupListener : PersistentAlarmManagerListener() { @JvmStatic fun schedule(context: Context?) { - if (FeatureFlags.messageBackups && SignalStore.backup().areBackupsEnabled) { + if (RemoteConfig.messageBackups && SignalStore.backup().areBackupsEnabled) { MessageBackupListener().onReceive(context, getScheduleIntent()) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt index cef14c371a..e4288d574a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt @@ -21,7 +21,7 @@ import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.webrtc.audio.SignalAudioManager /** @@ -192,7 +192,7 @@ object AndroidTelecomUtil { } private fun isTelecomAllowedForDevice(): Boolean { - if (FeatureFlags.internalUser) { + if (RemoteConfig.internalUser) { return !SignalStore.internalValues().callingDisableTelecom() } return RingRtcDynamicConfiguration.isTelecomAllowedForDevice() diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java index 692471738f..6b5232250f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.notifications.profiles.NotificationProfiles; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.whispersystems.signalservice.api.messages.calls.OfferMessage; import org.whispersystems.signalservice.api.push.ServiceId.ACI; @@ -102,8 +102,8 @@ public class IdleActionProcessor extends WebRtcActionProcessor { Log.i(TAG, "handleGroupCallRingUpdate(): recipient: " + remotePeerGroup.getId() + " ring: " + ringId + " update: " + ringUpdate); int groupSize = remotePeerGroup.getRecipient().getParticipantIds().size(); - if (groupSize > FeatureFlags.maxGroupCallRingSize()) { - Log.w(TAG, "Received ring request for large group, dropping. size: " + groupSize + " max: " + FeatureFlags.maxGroupCallRingSize()); + if (groupSize > RemoteConfig.maxGroupCallRingSize()) { + Log.w(TAG, "Received ring request for large group, dropping. size: " + groupSize + " max: " + RemoteConfig.maxGroupCallRingSize()); return currentState; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt index 4e33fc4a43..4898fd9a02 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/RingRtcDynamicConfiguration.kt @@ -4,7 +4,7 @@ import android.os.Build import org.signal.core.util.asListContains import org.signal.ringrtc.CallManager.AudioProcessingMethod import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig /** * Utility class to determine which AEC method RingRTC should use. @@ -22,19 +22,19 @@ object RingRtcDynamicConfiguration { return when { isHardwareBlocklisted() || isKnownFaultyHardwareImplementation() -> AudioProcessingMethod.ForceSoftwareAec3 isSoftwareBlocklisted() -> AudioProcessingMethod.ForceHardware - Build.VERSION.SDK_INT < 29 && FeatureFlags.useHardwareAecIfOlderThanApi29 -> AudioProcessingMethod.ForceHardware + Build.VERSION.SDK_INT < 29 && RemoteConfig.useHardwareAecIfOlderThanApi29 -> AudioProcessingMethod.ForceHardware Build.VERSION.SDK_INT < 29 -> AudioProcessingMethod.ForceSoftwareAec3 else -> AudioProcessingMethod.ForceHardware } } fun isTelecomAllowedForDevice(): Boolean { - return FeatureFlags.telecomManufacturerAllowList.lowercase().asListContains(Build.MANUFACTURER.lowercase()) && - !FeatureFlags.telecomModelBlocklist.lowercase().asListContains(Build.MODEL.lowercase()) + return RemoteConfig.telecomManufacturerAllowList.lowercase().asListContains(Build.MANUFACTURER.lowercase()) && + !RemoteConfig.telecomModelBlocklist.lowercase().asListContains(Build.MODEL.lowercase()) } private fun isHardwareBlocklisted(): Boolean { - return FeatureFlags.hardwareAecBlocklistModels.asListContains(Build.MODEL) + return RemoteConfig.hardwareAecBlocklistModels.asListContains(Build.MODEL) } fun isKnownFaultyHardwareImplementation(): Boolean { @@ -44,6 +44,6 @@ object RingRtcDynamicConfiguration { } private fun isSoftwareBlocklisted(): Boolean { - return FeatureFlags.softwareAecBlocklistModels.asListContains(Build.MODEL) + return RemoteConfig.softwareAecBlocklistModels.asListContains(Build.MODEL) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index fead549544..301245e65a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -66,7 +66,7 @@ import org.thoughtcrime.securesms.service.webrtc.links.SignalCallLinkManager; import org.thoughtcrime.securesms.service.webrtc.state.WebRtcEphemeralState; import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState; import org.thoughtcrime.securesms.util.AppForegroundObserver; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.RecipientAccessList; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; @@ -389,7 +389,7 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. return; } - if (!FeatureFlags.adHocCalling()) { + if (!RemoteConfig.adHocCalling()) { Log.i(TAG, "Ad Hoc Calling is disabled. Ignoring request to peek."); return; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java index 2a9ed76bab..4089f26c12 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java @@ -27,7 +27,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobs.ForegroundServiceUtil; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.TelephonyUtil; import org.thoughtcrime.securesms.webrtc.CallNotificationBuilder; import org.thoughtcrime.securesms.webrtc.UncaughtExceptionHandlerManager; @@ -88,7 +88,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag private boolean stopping = false; public synchronized static void update(@NonNull Context context, int type, @NonNull RecipientId recipientId, boolean isVideoCall) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { ActiveCallManager.update(context, type, recipientId, isVideoCall); return; @@ -104,7 +104,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public static void denyCall(@NonNull Context context) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { ActiveCallManager.denyCall(); return; } @@ -113,7 +113,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public static void hangup(@NonNull Context context) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { ActiveCallManager.hangup(); return; } @@ -122,7 +122,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static void stop(@NonNull Context context) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { ActiveCallManager.stop(); return; } @@ -134,7 +134,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static @NonNull PendingIntent denyCallIntent(@NonNull Context context) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { return ActiveCallManager.denyCallIntent(context); } @@ -142,7 +142,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static @NonNull PendingIntent hangupIntent(@NonNull Context context) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { return ActiveCallManager.hangupIntent(context); } @@ -150,7 +150,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static void sendAudioManagerCommand(@NonNull Context context, @NonNull AudioManagerCommand command) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { ActiveCallManager.sendAudioManagerCommand(context, command); return; } @@ -162,7 +162,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static void changePowerButtonReceiver(@NonNull Context context, boolean register) { - if (FeatureFlags.useActiveCallManager()) { + if (RemoteConfig.useActiveCallManager()) { ActiveCallManager.changePowerButtonReceiver(context, register); return; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt index 49e9c100f0..13f953fa3a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt @@ -11,8 +11,8 @@ import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.providers.BlobProvider -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.MediaUtil +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.UriUtil import java.io.IOException import java.io.InputStream @@ -82,7 +82,7 @@ class ShareRepository(context: Context) { } val media: List = mimeTypes.toList() - .take(FeatureFlags.maxAttachmentCount) + .take(RemoteConfig.maxAttachmentCount) .map { (uri, mimeType) -> val stream: InputStream = try { appContext.contentResolver.openInputStream(uri) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt index e784e559fe..67f179b28d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.stories.StoryViewerArgs -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.rx.RxStore import java.util.concurrent.TimeUnit import kotlin.math.max @@ -172,7 +172,7 @@ class StoryViewerViewModel( .filter { it != RecipientId.UNKNOWN } .distinctUntilChanged() .subscribe { - Stories.enqueueNextStoriesForDownload(it, true, FeatureFlags.storiesAutoDownloadMaximum) + Stories.enqueueNextStoriesForDownload(it, true, RemoteConfig.storiesAutoDownloadMaximum) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java index 35239f3e76..6dac5cf20d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java @@ -310,7 +310,7 @@ public class CommunicationActions { return; } - if (!FeatureFlags.adHocCalling()) { + if (!RemoteConfig.adHocCalling()) { Toast.makeText(activity, R.string.CommunicationActions_cant_join_call, Toast.LENGTH_SHORT).show(); return; } @@ -340,7 +340,7 @@ public class CommunicationActions { } private static void startVideoCall(@NonNull CallContext callContext, @NonNull CallLinkRootKey rootKey) { - if (!FeatureFlags.adHocCalling()) { + if (!RemoteConfig.adHocCalling()) { Toast.makeText(callContext.getContext(), R.string.CommunicationActions_cant_join_call, Toast.LENGTH_SHORT).show(); return; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DeleteDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/util/DeleteDialog.kt index 5b39c62392..5f3a89b545 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/DeleteDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DeleteDialog.kt @@ -109,7 +109,7 @@ object DeleteDialog { } } - if (FeatureFlags.deleteSyncEnabled) { + if (RemoteConfig.deleteSyncEnabled) { MultiDeviceDeleteSendSyncJob.enqueueMessageDeletes(messageRecords) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DeviceProperties.java b/app/src/main/java/org/thoughtcrime/securesms/util/DeviceProperties.java index b57cb2f5d2..8722a14082 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/DeviceProperties.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DeviceProperties.java @@ -30,11 +30,11 @@ public final class DeviceProperties { return false; } - if (memoryMb < FeatureFlags.animatedStickerMinimumTotalMemoryMb()) { + if (memoryMb < RemoteConfig.animatedStickerMinimumTotalMemoryMb()) { return false; } - if (getMemoryClass(context) < FeatureFlags.animatedStickerMinimumMemoryClass()) { + if (getMemoryClass(context) < RemoteConfig.animatedStickerMinimumMemoryClass()) { return false; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/LocaleFeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/LocaleRemoteConfig.java similarity index 84% rename from app/src/main/java/org/thoughtcrime/securesms/util/LocaleFeatureFlags.java rename to app/src/main/java/org/thoughtcrime/securesms/util/LocaleRemoteConfig.java index 7913fe8f89..ed6cacd9cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/LocaleFeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/LocaleRemoteConfig.java @@ -18,19 +18,19 @@ import java.util.Optional; import java.util.stream.Collectors; /** - * Provide access to locale specific values within feature flags following the locale CSV-Colon format. + * Provide access to locale-specific values within remote config, following the locale CSV-Colon format. * * Example: countryCode:integerValue,countryCode:integerValue,*:integerValue */ -public final class LocaleFeatureFlags { +public final class LocaleRemoteConfig { - private static final String TAG = Log.tag(LocaleFeatureFlags.class); + private static final String TAG = Log.tag(LocaleRemoteConfig.class); private static final String COUNTRY_WILDCARD = "*"; private static final int NOT_FOUND = -1; public static @NonNull Optional getMediaQualityLevel() { - Map countryValues = parseCountryValues(FeatureFlags.getMediaQualityLevels(), NOT_FOUND); + Map countryValues = parseCountryValues(RemoteConfig.getMediaQualityLevels(), NOT_FOUND); int level = getCountryValue(countryValues, Recipient.self().getE164().orElse(""), NOT_FOUND); return Optional.ofNullable(PushMediaConstraints.MediaConfig.forLevel(level)); @@ -44,37 +44,37 @@ public final class LocaleFeatureFlags { * @return Whether Google Pay is disabled in this region */ public static boolean isGooglePayDisabled() { - return isEnabledE164Start(FeatureFlags.googlePayDisabledRegions()); + return isEnabledE164Start(RemoteConfig.googlePayDisabledRegions()); } /** * @return Whether credit cards are disabled in this region */ public static boolean isCreditCardDisabled() { - return isEnabledE164Start(FeatureFlags.creditCardDisabledRegions()); + return isEnabledE164Start(RemoteConfig.creditCardDisabledRegions()); } /** * @return Whether PayPal is disabled in this region */ public static boolean isPayPalDisabled() { - return isEnabledE164Start(FeatureFlags.paypalDisabledRegions()); + return isEnabledE164Start(RemoteConfig.paypalDisabledRegions()); } public static boolean isIdealEnabled() { - return isEnabledE164Start(FeatureFlags.idealEnabledRegions()); + return isEnabledE164Start(RemoteConfig.idealEnabledRegions()); } public static boolean isSepaEnabled() { - return isEnabledE164Start(FeatureFlags.sepaEnabledRegions()); + return isEnabledE164Start(RemoteConfig.sepaEnabledRegions()); } public static boolean isDelayedNotificationPromptEnabled() { - return FeatureFlags.internalUser() || isEnabledPartsPerMillion(FeatureFlags.PROMPT_FOR_NOTIFICATION_LOGS, FeatureFlags.promptForDelayedNotificationLogs()); + return RemoteConfig.internalUser() || isEnabledPartsPerMillion(RemoteConfig.PROMPT_FOR_NOTIFICATION_LOGS, RemoteConfig.promptForDelayedNotificationLogs()); } public static boolean isBatterySaverPromptEnabled() { - return FeatureFlags.internalUser() || isEnabledPartsPerMillion(FeatureFlags.PROMPT_BATTERY_SAVER, FeatureFlags.promptBatterySaver()); + return RemoteConfig.internalUser() || isEnabledPartsPerMillion(RemoteConfig.PROMPT_BATTERY_SAVER, RemoteConfig.promptBatterySaver()); } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt similarity index 98% rename from app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.kt rename to app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 1a940a5206..6cd421df4e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -25,16 +25,15 @@ import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds /** - * A location for flags that can be set locally and remotely. These flags can guard features that - * are not yet ready to be activated. + * A location for accessing remotely-configured values. * - * When creating a new flag: + * When creating a new config: * - At the bottom of the file, create a new `val` with the name you'd like. * - Use one of the helper delegates, like [remoteBoolean] or [remoteValue], to define your `val`. - * - See the documentation for [Config] understand all of the fields. + * - See the documentation for [Config] to understand all of the fields. */ -object FeatureFlags { - private val TAG = Log.tag(FeatureFlags::class.java) +object RemoteConfig { + private val TAG = Log.tag(RemoteConfig::class.java) // region Core behavior @@ -851,7 +850,7 @@ object FeatureFlags { @JvmStatic @get:JvmName("promptForDelayedNotificationLogs") val promptForDelayedNotificationLogs: String by remoteString( - key = FeatureFlags.PROMPT_FOR_NOTIFICATION_LOGS, + key = RemoteConfig.PROMPT_FOR_NOTIFICATION_LOGS, defaultValue = "*", hotSwappable = true ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java index 306eb33044..f83fe9da09 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeprecation.java @@ -24,7 +24,7 @@ public final class RemoteDeprecation { * there's no pending expiration. */ public static long getTimeUntilDeprecation(long currentTime) { - return getTimeUntilDeprecation(FeatureFlags.clientExpiration(), currentTime, BuildConfig.VERSION_NAME); + return getTimeUntilDeprecation(RemoteConfig.clientExpiration(), currentTime, BuildConfig.VERSION_NAME); } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt index 9b0e734bd4..03031b1018 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.kt @@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.crypto.IdentityKeyParcelable import org.thoughtcrime.securesms.databinding.VerifyDisplayFragmentBinding import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible @@ -116,7 +116,7 @@ class VerifyDisplayFragment : Fragment(), OnScrollChangedListener { if (fingerprints.isEmpty()) { val resolved = viewModel.recipient.resolve() - Log.w(TAG, String.format(Locale.ENGLISH, "Could not show proper verification! verifyV2: %s, hasUuid: %s, hasE164: %s", FeatureFlags.verifyV2, resolved.serviceId.isPresent, resolved.e164.isPresent)) + Log.w(TAG, String.format(Locale.ENGLISH, "Could not show proper verification! verifyV2: %s, hasUuid: %s, hasE164: %s", RemoteConfig.verifyV2, resolved.serviceId.isPresent, resolved.e164.isPresent)) MaterialAlertDialogBuilder(requireContext()) .setMessage(getString(R.string.VerifyIdentityActivity_you_must_first_exchange_messages_in_order_to_view, resolved.getDisplayName(requireContext()))) .setPositiveButton(android.R.string.ok) { dialog: DialogInterface?, which: Int -> requireActivity().finish() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityActivity.java b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityActivity.java index b441e6c559..9983f37ca8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityActivity.java @@ -20,7 +20,6 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.FeatureFlags; /** * Activity for verifying identity keys. diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt index 499e22e43f..4ba881742c 100644 --- a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt +++ b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt @@ -29,7 +29,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.logging.PersistentLogger import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.AppSignatureUtil -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import java.util.Locale class SpinnerApplicationContext : ApplicationContext() { @@ -86,7 +86,7 @@ class SpinnerApplicationContext : ApplicationContext() { ) ) - Log.initialize({ FeatureFlags.internalUser }, AndroidLogger(), PersistentLogger(this), SpinnerLogger()) + Log.initialize({ RemoteConfig.internalUser }, AndroidLogger(), PersistentLogger(this), SpinnerLogger()) DatabaseMonitor.initialize(object : QueryMonitor { override fun onSql(sql: String, args: Array?) { diff --git a/app/src/test/java/org/thoughtcrime/securesms/crash/CrashConfigTest.kt b/app/src/test/java/org/thoughtcrime/securesms/crash/CrashConfigTest.kt index ffc086641e..8d1300fb89 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/crash/CrashConfigTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/crash/CrashConfigTest.kt @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.keyvalue.KeyValueDataSet import org.thoughtcrime.securesms.keyvalue.KeyValueStore import org.thoughtcrime.securesms.keyvalue.MockKeyValuePersistentStorage import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import java.util.UUID @RunWith(RobolectricTestRunner::class) @@ -26,7 +26,7 @@ class CrashConfigTest { @Before fun setup() { - mockkObject(FeatureFlags) + mockkObject(RemoteConfig) if (!AppDependencies.isInitialized) { AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider()) @@ -45,31 +45,31 @@ class CrashConfigTest { @Test fun `simple name pattern`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "name": "test", "percent": 100 } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "name": "test", "percent": 100 } ]""" CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(namePattern = "test")) } @Test fun `simple message pattern`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "message": "test", "percent": 100 } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "message": "test", "percent": 100 } ]""" CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(messagePattern = "test")) } @Test fun `simple stackTrace pattern`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "stackTrace": "test", "percent": 100 } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "stackTrace": "test", "percent": 100 } ]""" CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(stackTracePattern = "test")) } @Test fun `all fields set`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "name": "test1", "message": "test2", "stackTrace": "test3", "percent": 100 } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "name": "test1", "message": "test2", "stackTrace": "test3", "percent": 100 } ]""" CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(namePattern = "test1", messagePattern = "test2", stackTracePattern = "test3")) } @Test fun `multiple configs`() { - every { FeatureFlags.crashPromptConfig } returns + every { RemoteConfig.crashPromptConfig } returns """ [ { "name": "test1", "percent": 100 }, @@ -87,7 +87,7 @@ class CrashConfigTest { @Test fun `empty fields are considered null`() { - every { FeatureFlags.crashPromptConfig } returns + every { RemoteConfig.crashPromptConfig } returns """ [ { "name": "", "percent": 100 }, @@ -104,31 +104,31 @@ class CrashConfigTest { @Test fun `ignore zero percent`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "name": "test", "percent": 0 } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "name": "test", "percent": 0 } ]""" CrashConfig.computePatterns() assertIs emptyList() } @Test fun `not setting percent is the same as zero percent`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "name": "test" } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "name": "test" } ]""" CrashConfig.computePatterns() assertIs emptyList() } @Test fun `ignore configs without a pattern`() { - every { FeatureFlags.crashPromptConfig } returns """[ { "percent": 100 } ]""" + every { RemoteConfig.crashPromptConfig } returns """[ { "percent": 100 } ]""" CrashConfig.computePatterns() assertIs emptyList() } @Test fun `ignore invalid json`() { - every { FeatureFlags.crashPromptConfig } returns "asdf" + every { RemoteConfig.crashPromptConfig } returns "asdf" CrashConfig.computePatterns() assertIs emptyList() } @Test fun `ignore empty json`() { - every { FeatureFlags.crashPromptConfig } returns "" + every { RemoteConfig.crashPromptConfig } returns "" CrashConfig.computePatterns() assertIs emptyList() } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/keyvalue/PaymentsValuesTest.kt b/app/src/test/java/org/thoughtcrime/securesms/keyvalue/PaymentsValuesTest.kt index 35b0af42b4..f91f7c7f23 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/keyvalue/PaymentsValuesTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/keyvalue/PaymentsValuesTest.kt @@ -12,7 +12,7 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, application = Application::class) @@ -24,7 +24,7 @@ class PaymentsValuesTest { AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider()) } - mockkObject(FeatureFlags) + mockkObject(RemoteConfig) } @Test @@ -48,8 +48,8 @@ class PaymentsValuesTest { } ) - every { FeatureFlags.payments } returns false - every { FeatureFlags.paymentsCountryBlocklist } returns "" + every { RemoteConfig.payments } returns false + every { RemoteConfig.paymentsCountryBlocklist } returns "" assertEquals(PaymentsAvailability.DISABLED_REMOTELY, SignalStore.paymentsValues().paymentsAvailability) } @@ -64,8 +64,8 @@ class PaymentsValuesTest { } ) - every { FeatureFlags.payments } returns false - every { FeatureFlags.paymentsCountryBlocklist } returns "" + every { RemoteConfig.payments } returns false + every { RemoteConfig.paymentsCountryBlocklist } returns "" assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability) } @@ -80,8 +80,8 @@ class PaymentsValuesTest { } ) - every { FeatureFlags.payments } returns true - every { FeatureFlags.paymentsCountryBlocklist } returns "" + every { RemoteConfig.payments } returns true + every { RemoteConfig.paymentsCountryBlocklist } returns "" assertEquals(PaymentsAvailability.REGISTRATION_AVAILABLE, SignalStore.paymentsValues().paymentsAvailability) } @@ -96,8 +96,8 @@ class PaymentsValuesTest { } ) - every { FeatureFlags.payments } returns true - every { FeatureFlags.paymentsCountryBlocklist } returns "" + every { RemoteConfig.payments } returns true + every { RemoteConfig.paymentsCountryBlocklist } returns "" assertEquals(PaymentsAvailability.WITHDRAW_AND_SEND, SignalStore.paymentsValues().paymentsAvailability) } @@ -112,8 +112,8 @@ class PaymentsValuesTest { } ) - every { FeatureFlags.payments } returns true - every { FeatureFlags.paymentsCountryBlocklist } returns "1" + every { RemoteConfig.payments } returns true + every { RemoteConfig.paymentsCountryBlocklist } returns "1" assertEquals(PaymentsAvailability.NOT_IN_REGION, SignalStore.paymentsValues().paymentsAvailability) } @@ -128,8 +128,8 @@ class PaymentsValuesTest { } ) - every { FeatureFlags.payments } returns true - every { FeatureFlags.paymentsCountryBlocklist } returns "1" + every { RemoteConfig.payments } returns true + every { RemoteConfig.paymentsCountryBlocklist } returns "1" assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability) } diff --git a/app/src/test/java/org/thoughtcrime/securesms/payments/GeographicalRestrictionsTest.java b/app/src/test/java/org/thoughtcrime/securesms/payments/GeographicalRestrictionsTest.java index b467bf902f..a346e8b985 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/payments/GeographicalRestrictionsTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/payments/GeographicalRestrictionsTest.java @@ -6,7 +6,7 @@ import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -18,22 +18,22 @@ public final class GeographicalRestrictionsTest { public MockitoRule rule = MockitoJUnit.rule(); @Mock - private MockedStatic featureFlagsMockedStatic; + private MockedStatic remoteConfigMockedStatic; @Test public void e164Allowed_general() { - when(FeatureFlags.paymentsCountryBlocklist()).thenReturn(""); + when(RemoteConfig.paymentsCountryBlocklist()).thenReturn(""); assertTrue(GeographicalRestrictions.e164Allowed("+15551234567")); - when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1"); + when(RemoteConfig.paymentsCountryBlocklist()).thenReturn("1"); assertFalse(GeographicalRestrictions.e164Allowed("+15551234567")); - when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1,44"); + when(RemoteConfig.paymentsCountryBlocklist()).thenReturn("1,44"); assertFalse(GeographicalRestrictions.e164Allowed("+15551234567")); assertFalse(GeographicalRestrictions.e164Allowed("+445551234567")); assertTrue(GeographicalRestrictions.e164Allowed("+525551234567")); - when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1 234,44"); + when(RemoteConfig.paymentsCountryBlocklist()).thenReturn("1 234,44"); assertFalse(GeographicalRestrictions.e164Allowed("+12341234567")); assertTrue(GeographicalRestrictions.e164Allowed("+15551234567")); assertTrue(GeographicalRestrictions.e164Allowed("+525551234567")); diff --git a/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt b/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt index a2a9cb4cdb..25e6e7730e 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt @@ -20,7 +20,7 @@ import org.thoughtcrime.securesms.database.RecipientTable import org.thoughtcrime.securesms.keyvalue.AccountValues import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.testutil.EmptyLogger -import org.thoughtcrime.securesms.util.FeatureFlags +import org.thoughtcrime.securesms.util.RemoteConfig import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI import org.whispersystems.signalservice.api.storage.SignalContactRecord @@ -38,7 +38,7 @@ class ContactRecordProcessorTest { lateinit var recipientTable: RecipientTable @Mock - lateinit var featureFlags: MockedStatic + lateinit var remoteConfig: MockedStatic @Mock lateinit var signalStore: MockedStatic diff --git a/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java b/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java index d2aa7a6af5..c6c28199bf 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java @@ -12,7 +12,7 @@ import org.mockito.junit.MockitoRule; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.storage.StorageSyncHelper.IdDifferenceResult; -import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.storage.SignalAccountRecord; import org.whispersystems.signalservice.api.storage.SignalContactRecord; @@ -60,7 +60,7 @@ public final class StorageSyncHelperTest { private MockedStatic recipientMockedStatic; @Mock - private MockedStatic featureFlagsMockedStatic; + private MockedStatic remoteConfigMockedStatic; @Before public void setup() { diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlagsTest_getCountryValue.java b/app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfigTest_getCountryValue.java similarity index 92% rename from app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlagsTest_getCountryValue.java rename to app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfigTest_getCountryValue.java index e8de1a767d..e82a3f2eb6 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlagsTest_getCountryValue.java +++ b/app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfigTest_getCountryValue.java @@ -17,7 +17,7 @@ import java.util.Map; import static org.junit.Assert.assertEquals; @RunWith(Parameterized.class) -public class LocaleFeatureFlagsTest_getCountryValue { +public class LocaleRemoteConfigTest_getCountryValue { private final String phoneNumber; private final Map countryCounts; @@ -66,7 +66,7 @@ public class LocaleFeatureFlagsTest_getCountryValue { Log.initialize(new EmptyLogger()); } - public LocaleFeatureFlagsTest_getCountryValue(@NonNull String phoneNumber, + public LocaleRemoteConfigTest_getCountryValue(@NonNull String phoneNumber, @NonNull Map countryCounts, long output) { @@ -77,7 +77,7 @@ public class LocaleFeatureFlagsTest_getCountryValue { @Test public void determineCountEnabled() { - assertEquals(output, LocaleFeatureFlags.getCountryValue(countryCounts, phoneNumber, 0)); + assertEquals(output, LocaleRemoteConfig.getCountryValue(countryCounts, phoneNumber, 0)); } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlagsTest_parseCountryValues.java b/app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfigTest_parseCountryValues.java similarity index 88% rename from app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlagsTest_parseCountryValues.java rename to app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfigTest_parseCountryValues.java index e942475a4e..0f6156c467 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlagsTest_parseCountryValues.java +++ b/app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfigTest_parseCountryValues.java @@ -12,7 +12,7 @@ import java.util.Map; import static org.junit.Assert.assertEquals; @RunWith(Parameterized.class) -public class LocaleFeatureFlagsTest_parseCountryValues { +public class LocaleRemoteConfigTest_parseCountryValues { private final String input; private final Map output; @@ -46,14 +46,14 @@ public class LocaleFeatureFlagsTest_parseCountryValues { }); } - public LocaleFeatureFlagsTest_parseCountryValues(String input, Map output) { + public LocaleRemoteConfigTest_parseCountryValues(String input, Map output) { this.input = input; this.output = output; } @Test public void parseCountryCounts() { - assertEquals(output, LocaleFeatureFlags.parseCountryValues(input, 0)); + assertEquals(output, LocaleRemoteConfig.parseCountryValues(input, 0)); } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlags_isEnabled.kt b/app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfig_isEnabled.kt similarity index 91% rename from app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlags_isEnabled.kt rename to app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfig_isEnabled.kt index d84aaffb97..08cd8593eb 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/LocaleFeatureFlags_isEnabled.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/util/LocaleRemoteConfig_isEnabled.kt @@ -11,12 +11,12 @@ import org.junit.runners.Parameterized import org.thoughtcrime.securesms.assertIs @RunWith(Parameterized::class) -class LocaleFeatureFlags_isEnabled(private val serializedList: String, private val e164: List, private val output: Boolean) { +class LocaleRemoteConfig_isEnabled(private val serializedList: String, private val e164: List, private val output: Boolean) { @Test fun isLegal() { e164.forEach { - LocaleFeatureFlags.isEnabledE164Start(serializedList, it) assertIs output + LocaleRemoteConfig.isEnabledE164Start(serializedList, it) assertIs output } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/RemoteConfigTest.java similarity index 89% rename from app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/RemoteConfigTest.java index f3b156b057..c166817abf 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/util/RemoteConfigTest.java @@ -2,8 +2,8 @@ package org.thoughtcrime.securesms.util; import org.junit.Test; import org.thoughtcrime.securesms.BaseUnitTest; -import org.thoughtcrime.securesms.util.FeatureFlags.ConfigChange; -import org.thoughtcrime.securesms.util.FeatureFlags.UpdateResult; +import org.thoughtcrime.securesms.util.RemoteConfig.ConfigChange; +import org.thoughtcrime.securesms.util.RemoteConfig.UpdateResult; import java.util.Arrays; import java.util.HashMap; @@ -16,14 +16,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.thoughtcrime.securesms.testutil.TestHelpers.mapOf; -public class FeatureFlagsTest extends BaseUnitTest { +public class RemoteConfigTest extends BaseUnitTest { private static final String A = "A"; private static final String B = "B"; @Test public void updateInternal_newValue_ignoreNotInRemoteCapable() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true, + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true, B, true), mapOf(), mapOf(), @@ -38,7 +38,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_newValue() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(), mapOf(), setOf(A), @@ -52,7 +52,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_newValue_hotSwap() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(), mapOf(), setOf(A), @@ -66,7 +66,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_newValue_hotSwap_integer() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, 1), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, 1), mapOf(), mapOf(), setOf(A), @@ -80,7 +80,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_newValue_sticky() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(), mapOf(), setOf(A), @@ -94,7 +94,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_newValue_hotSwap_sticky() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(), mapOf(), setOf(A), @@ -108,7 +108,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceValue() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, false), mapOf(A, false), setOf(A), @@ -122,7 +122,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceValue_integer() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, 2), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, 2), mapOf(A, 1), mapOf(A, 1), setOf(A), @@ -136,7 +136,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceValue_hotSwap() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, false), mapOf(A, false), setOf(A), @@ -150,7 +150,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceValue_hotSwa_integer() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, 2), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, 2), mapOf(A, 1), mapOf(A, 1), setOf(A), @@ -164,7 +164,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceValue_hotSwap_stickyChange() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, false), mapOf(A, false), setOf(A), @@ -178,7 +178,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceValue_hotSwap_stickyIgnore_memoryAndDisk() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, false), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, false), mapOf(A, true), mapOf(A, true), setOf(A), @@ -192,7 +192,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(), mapOf(A, true), mapOf(A, true), setOf(A), @@ -206,7 +206,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_notRemoteCapable() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, true), mapOf(A, true), setOf(), @@ -220,7 +220,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_hotSwap() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(), mapOf(A, true), mapOf(A, true), setOf(A), @@ -234,7 +234,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_hotSwap_notRemoteCapable() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, true), mapOf(A, true), setOf(), @@ -248,7 +248,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_stickyAlreadyEnabled() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(), mapOf(A, true), mapOf(A, true), setOf(A), @@ -262,7 +262,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_stickyNotEnabled() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(), mapOf(A, false), mapOf(A, false), setOf(A), @@ -276,7 +276,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_stickyNotEnabled_notRemoteCapable() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, false), mapOf(A, false), setOf(), @@ -290,7 +290,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_hotSwap_stickyAlreadyEnabled() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(), mapOf(A, true), mapOf(A, true), setOf(A), @@ -304,7 +304,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_hotSwap_stickyAlreadyEnabled_notRemoteCapable() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true), mapOf(A, true), mapOf(A, true), setOf(), @@ -318,7 +318,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_hotSwap_stickyNotEnabled() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(), mapOf(A, false), mapOf(A, false), setOf(A), @@ -332,7 +332,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_removeValue_typeMismatch_hotSwap() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, "5"), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, "5"), mapOf(A, true), mapOf(A, true), setOf(A), @@ -346,9 +346,9 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_twoNewValues() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true, - B, false), - mapOf(), + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true, + B, false), + mapOf(), mapOf(), setOf(A, B), setOf(), @@ -361,7 +361,7 @@ public class FeatureFlagsTest extends BaseUnitTest { @Test public void updateInternal_replaceOneOfTwoValues() { - UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true, + UpdateResult result = RemoteConfig.updateInternal(mapOf(A, true, B, false), mapOf(A, true, B, true), @@ -400,7 +400,7 @@ public class FeatureFlagsTest extends BaseUnitTest { put("j", "stacy"); }}; - Map changes = FeatureFlags.computeChanges(oldMap, newMap); + Map changes = RemoteConfig.computeChanges(oldMap, newMap); assertFalse(changes.containsKey("a")); assertEquals(new ConfigChange(false, true), changes.get("b")); diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_StaticValuesTest.kt b/app/src/test/java/org/thoughtcrime/securesms/util/RemoteConfig_StaticValuesTest.kt similarity index 89% rename from app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_StaticValuesTest.kt rename to app/src/test/java/org/thoughtcrime/securesms/util/RemoteConfig_StaticValuesTest.kt index fed7b8d355..f502400818 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_StaticValuesTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/util/RemoteConfig_StaticValuesTest.kt @@ -8,7 +8,7 @@ import kotlin.reflect.full.memberProperties /** * Ensures we don't release with forced values which is intended for local development only. */ -class FeatureFlags_StaticValuesTest { +class RemoteConfig_StaticValuesTest { /** * This test cycles the REMOTE_VALUES through a bunch of different inputs, then looks at all of the public getters and checks to see if they return different @@ -31,7 +31,7 @@ class FeatureFlags_StaticValuesTest { "*" ) - val configKeys = FeatureFlags.configsByKey.keys + val configKeys = RemoteConfig.configsByKey.keys val ignoreList = setOf( "REMOTE_VALUES", @@ -44,7 +44,7 @@ class FeatureFlags_StaticValuesTest { "PROMPT_FOR_NOTIFICATION_LOGS" ) - val publicVals: List> = FeatureFlags::class.memberProperties + val publicVals: List> = RemoteConfig::class.memberProperties .filter { it.visibility == KVisibility.PUBLIC } .filterNot { ignoreList.contains(it.name) } @@ -52,11 +52,11 @@ class FeatureFlags_StaticValuesTest { for (input in remoteTestInputs) { for (key in configKeys) { - FeatureFlags.REMOTE_VALUES[key] = input + RemoteConfig.REMOTE_VALUES[key] = input } for (publicVal in publicVals) { - val output: Any? = publicVal.getter.call(FeatureFlags) + val output: Any? = publicVal.getter.call(RemoteConfig) val existingOutputs: MutableSet = publicValOutputs.getOrDefault(publicVal.name, mutableSetOf()) existingOutputs.add(output) publicValOutputs[publicVal.name] = existingOutputs diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/ShadowingWebSocketConnection.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/ShadowingWebSocketConnection.kt index 2cfb5b948a..f1ecb2d98d 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/ShadowingWebSocketConnection.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/ShadowingWebSocketConnection.kt @@ -37,7 +37,7 @@ import kotlin.time.Duration.Companion.seconds * * When a hardcoded error threshold is reached, the user is notified to submit debug logs. * - * @see [org.thoughtcrime.securesms.util.FeatureFlags.libSignalWebSocketShadowingPercentage] + * @see [org.thoughtcrime.securesms.util.RemoteConfig.libSignalWebSocketShadowingPercentage] */ class ShadowingWebSocketConnection( name: String,