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 099c18665..612c86d0c 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 @@ -74,8 +74,8 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter ) clickPref( - title = DSLSettingsText.from(R.string.preferences__internal_refresh_remote_values), - summary = DSLSettingsText.from(R.string.preferences__internal_refresh_remote_values_description), + title = DSLSettingsText.from(R.string.preferences__internal_refresh_remote_config), + summary = DSLSettingsText.from(R.string.preferences__internal_refresh_remote_config_description), onClick = { refreshRemoteValues() } @@ -83,7 +83,7 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter dividerPref() - sectionHeaderPref(R.string.preferences__internal_display) + sectionHeaderPref(R.string.preferences__internal_misc) switchPref( title = DSLSettingsText.from(R.string.preferences__internal_user_details), @@ -94,6 +94,15 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + switchPref( + title = DSLSettingsText.from(R.string.preferences__internal_shake_to_report), + summary = DSLSettingsText.from(R.string.preferences__internal_shake_to_report_description), + isChecked = state.shakeToReport, + onClick = { + viewModel.setShakeToReport(!state.shakeToReport) + } + ) + dividerPref() sectionHeaderPref(R.string.preferences__internal_storage_service) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt index c18a3894b..416a15415 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt @@ -4,6 +4,7 @@ import org.thoughtcrime.securesms.emoji.EmojiFiles data class InternalSettingsState( val seeMoreUserDetails: Boolean, + val shakeToReport: Boolean, val gv2doNotCreateGv2Groups: Boolean, val gv2forceInvites: Boolean, val gv2ignoreServerChanges: Boolean, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt index bc205340e..7c57d8d61 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt @@ -25,6 +25,11 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito refresh() } + fun setShakeToReport(enabled: Boolean) { + preferenceDataStore.putBoolean(InternalValues.SHAKE_TO_REPORT, enabled) + refresh() + } + fun setGv2DoNotCreateGv2Groups(enabled: Boolean) { preferenceDataStore.putBoolean(InternalValues.GV2_DO_NOT_CREATE_GV2, enabled) refresh() @@ -86,6 +91,7 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito private fun getState() = InternalSettingsState( seeMoreUserDetails = SignalStore.internalValues().recipientDetails(), + shakeToReport = SignalStore.internalValues().shakeToReport(), gv2doNotCreateGv2Groups = SignalStore.internalValues().gv2DoNotCreateGv2Groups(), gv2forceInvites = SignalStore.internalValues().gv2ForceInvites(), gv2ignoreServerChanges = SignalStore.internalValues().gv2IgnoreServerChanges(), 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 0f7710f2d..69ad958d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java @@ -23,6 +23,7 @@ public final class InternalValues extends SignalStoreValues { public static final String REMOVE_SENDER_KEY_MINIMUM = "internal.remove_sender_key_minimum"; public static final String DELAY_RESENDS = "internal.delay_resends"; public static final String CALLING_SERVER = "internal.calling_server"; + public static final String SHAKE_TO_REPORT = "internal.shake_to_report"; InternalValues(KeyValueStore store) { super(store); @@ -123,6 +124,13 @@ public final class InternalValues extends SignalStoreValues { return FeatureFlags.internalUser() && getBoolean(GV2_DISABLE_AUTOMIGRATE_NOTIFICATION, false); } + /** + * Whether or not "shake to report" is enabled. + */ + public synchronized boolean shakeToReport() { + return FeatureFlags.internalUser() && getBoolean(SHAKE_TO_REPORT, true); + } + /** * The selected group calling server to use. *

diff --git a/app/src/main/java/org/thoughtcrime/securesms/shakereport/ShakeToReport.java b/app/src/main/java/org/thoughtcrime/securesms/shakereport/ShakeToReport.java index 8265a658a..bbf56a518 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/shakereport/ShakeToReport.java +++ b/app/src/main/java/org/thoughtcrime/securesms/shakereport/ShakeToReport.java @@ -8,12 +8,15 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import org.signal.core.util.ShakeDetector; import org.signal.core.util.ThreadUtil; import org.signal.core.util.logging.Log; import org.signal.core.util.tracing.Tracer; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogRepository; import org.thoughtcrime.securesms.sharing.ShareIntents; import org.thoughtcrime.securesms.util.FeatureFlags; @@ -42,25 +45,27 @@ public final class ShakeToReport implements ShakeDetector.Listener { } public void enable() { - if (!FeatureFlags.internalUser()) return; + if (!SignalStore.internalValues().shakeToReport()) return; detector.start(ServiceUtil.getSensorManager(application)); } public void disable() { - if (!FeatureFlags.internalUser()) return; + if (!SignalStore.internalValues().shakeToReport()) return; detector.stop(); } public void registerActivity(@NonNull Activity activity) { - if (!FeatureFlags.internalUser()) return; + if (!SignalStore.internalValues().shakeToReport()) return; this.weakActivity = new WeakReference<>(activity); } @Override public void onShakeDetected() { + if (!SignalStore.internalValues().shakeToReport()) return; + Activity activity = weakActivity.get(); if (activity == null) { Log.w(TAG, "No registered activity!"); @@ -69,18 +74,18 @@ public final class ShakeToReport implements ShakeDetector.Listener { disable(); - new AlertDialog.Builder(activity) - .setTitle(R.string.ShakeToReport_shake_detected) - .setMessage(R.string.ShakeToReport_submit_debug_log) - .setNegativeButton(android.R.string.cancel, (d, i) -> { - d.dismiss(); - enableIfVisible(); - }) - .setPositiveButton(R.string.ShakeToReport_submit, (d, i) -> { - d.dismiss(); - submitLog(activity); - }) - .show(); + new MaterialAlertDialogBuilder(activity) + .setTitle(R.string.ShakeToReport_shake_detected) + .setMessage(R.string.ShakeToReport_submit_debug_log) + .setNegativeButton(android.R.string.cancel, (d, i) -> { + d.dismiss(); + enableIfVisible(); + }) + .setPositiveButton(R.string.ShakeToReport_submit, (d, i) -> { + d.dismiss(); + submitLog(activity); + }) + .show(); } private void submitLog(@NonNull Activity activity) { @@ -106,22 +111,22 @@ public final class ShakeToReport implements ShakeDetector.Listener { } private void showPostSubmitDialog(@NonNull Activity activity, @NonNull String url) { - AlertDialog dialog = new AlertDialog.Builder(activity) - .setTitle(R.string.ShakeToReport_success) - .setMessage(url) - .setNegativeButton(android.R.string.cancel, (d, i) -> { - d.dismiss(); - enableIfVisible(); - }) - .setPositiveButton(R.string.ShakeToReport_share, (d, i) -> { - d.dismiss(); - enableIfVisible(); + AlertDialog dialog = new MaterialAlertDialogBuilder(activity) + .setTitle(R.string.ShakeToReport_success) + .setMessage(url) + .setNegativeButton(android.R.string.cancel, (d, i) -> { + d.dismiss(); + enableIfVisible(); + }) + .setPositiveButton(R.string.ShakeToReport_share, (d, i) -> { + d.dismiss(); + enableIfVisible(); - activity.startActivity(new ShareIntents.Builder(activity) - .setText(url) - .build()); - }) - .show(); + activity.startActivity(new ShareIntents.Builder(activity) + .setText(url) + .build()); + }) + .show(); ((TextView) dialog.findViewById(android.R.id.message)).setTextIsSelectable(true); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 22607d23b..2200e919f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2459,11 +2459,13 @@ Forces a write of capabilities on to the server followed by a read. Rotate profile key Creates a new versioned profile, and triggers an update of any GV2 group you belong to. - Refresh remote values - Forces a refresh of remote values locally instead of waiting for the elapsed time - Display + Refresh remote config + Forces a refresh of the remote config locally instead of waiting for the elapsed time. + Miscellaneous User Details See more information about a user when viewing conversation settings. + Shake to Report + Shake your phone to easily submit and share a debug log. Storage service Overwrite remote data Forces remote storage to match the local device state.