diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index aadc728ba..e8ea176d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.database.LocalMetricsDatabase import org.thoughtcrime.securesms.database.LogDatabase +import org.thoughtcrime.securesms.database.MegaphoneDatabase import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobmanager.JobTracker @@ -35,6 +36,8 @@ import org.thoughtcrime.securesms.jobs.StorageForcePushJob import org.thoughtcrime.securesms.jobs.SubscriptionKeepAliveJob import org.thoughtcrime.securesms.jobs.SubscriptionReceiptRequestResponseJob import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.megaphone.MegaphoneRepository +import org.thoughtcrime.securesms.megaphone.Megaphones import org.thoughtcrime.securesms.payments.DataExportUtil import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.util.ConversationUtil @@ -431,6 +434,19 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from(R.string.preferences__internal_reset_donation_megaphone), + onClick = { + SignalDatabase.remoteMegaphones.debugRemoveAll() + MegaphoneDatabase.getInstance(ApplicationDependencies.getApplication()).let { + it.delete(Megaphones.Event.REMOTE_MEGAPHONE) + it.markFirstVisible(Megaphones.Event.DONATE_Q2_2022, System.currentTimeMillis() - TimeUnit.DAYS.toMillis(31)) + } + // Force repository database cache refresh + MegaphoneRepository(ApplicationDependencies.getApplication()).onFirstEverAppLaunch() + } + ) + clickPref( title = DSLSettingsText.from(R.string.preferences__internal_fetch_release_channel), onClick = { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneDatabase.kt index 6c5982234..1a74e9f1b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneDatabase.kt @@ -6,6 +6,7 @@ import android.database.Cursor import android.net.Uri import androidx.core.content.contentValuesOf import androidx.core.net.toUri +import org.signal.core.util.delete import org.signal.core.util.readToList import org.signal.core.util.requireInt import org.signal.core.util.requireLong @@ -167,6 +168,13 @@ class RemoteMegaphoneDatabase(context: Context, databaseHelper: SignalDatabase) .run() } + /** Only call from internal settings */ + fun debugRemoveAll() { + writableDatabase + .delete(TABLE_NAME) + .run() + } + private fun RemoteMegaphoneRecord.toContentValues(): ContentValues { return contentValuesOf( UUID to uuid, diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FetchRemoteMegaphoneImageJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/FetchRemoteMegaphoneImageJob.kt index 0444ed7c5..d34ea9c49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FetchRemoteMegaphoneImageJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FetchRemoteMegaphoneImageJob.kt @@ -1,16 +1,14 @@ package org.thoughtcrime.securesms.jobs -import okhttp3.Request import okhttp3.ResponseBody import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.database.SignalDatabase -import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobmanager.Data import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint import org.thoughtcrime.securesms.providers.BlobProvider +import org.thoughtcrime.securesms.s3.S3 import org.thoughtcrime.securesms.transport.RetryLaterException -import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException import java.io.IOException import java.util.concurrent.TimeUnit @@ -42,29 +40,20 @@ class FetchRemoteMegaphoneImageJob(parameters: Parameters, private val uuid: Str } override fun onRun() { - val request = Request.Builder() - .get() - .url(imageUrl) - .build() - try { - ApplicationDependencies.getOkHttpClient().newCall(request).execute().use { response -> - if (response.isSuccessful) { - val body: ResponseBody? = response.body() - if (body != null) { - val uri = BlobProvider.getInstance() - .forData(body.byteStream(), body.contentLength()) - .createForMultipleSessionsOnDisk(context) + S3.getObject(imageUrl).use { response -> + val body: ResponseBody? = response.body() + if (body != null) { + val uri = BlobProvider.getInstance() + .forData(body.byteStream(), body.contentLength()) + .createForMultipleSessionsOnDisk(context) - SignalDatabase.remoteMegaphones.setImageUri(uuid, uri) - } - } else { - throw NonSuccessfulResponseCodeException(response.code()) + SignalDatabase.remoteMegaphones.setImageUri(uuid, uri) } } } catch (e: IOException) { Log.i(TAG, "Encountered unknown IO error while fetching image for $uuid", e) - throw RetryLaterException() + throw RetryLaterException(e) } } 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 99b66875f..49bc24d9f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository.kt @@ -39,7 +39,7 @@ object RemoteMegaphoneRepository { } private val donate: Action = Action { context, controller, remote -> - controller.onMegaphoneNavigationRequested(AppSettingsActivity.subscriptions(context)) + controller.onMegaphoneNavigationRequested(AppSettingsActivity.manageSubscriptions(context)) finish.run(context, controller, remote) } diff --git a/app/src/main/res/navigation/app_settings.xml b/app/src/main/res/navigation/app_settings.xml index 4a91bd6cc..51d1b5417 100644 --- a/app/src/main/res/navigation/app_settings.xml +++ b/app/src/main/res/navigation/app_settings.xml @@ -505,7 +505,9 @@ app:enterAnim="@anim/fragment_open_enter" app:exitAnim="@anim/fragment_open_exit" app:popEnterAnim="@anim/fragment_close_enter" - app:popExitAnim="@anim/fragment_close_exit" /> + app:popExitAnim="@anim/fragment_close_exit" + app:popUpTo="@id/app_settings" + app:popUpToInclusive="true" /> Release channel Fetch release channel Set last version seen back 10 versions + Reset donation megaphone Add sample note Disable stories CDS