From c5c60b72148696f71ce8ed9d1f20f4a65f0b5f66 Mon Sep 17 00:00:00 2001 From: Clark Date: Thu, 26 Jan 2023 14:08:26 -0500 Subject: [PATCH] Add permissions dialogs for scheduled messages. --- .../ConversationParentFragment.java | 5 +- ...ReenableScheduledMessagesDialogFragment.kt | 66 ++++++++ .../ScheduleMessageFtuxBottomSheetDialog.kt | 22 +++ ...ble_scheduled_messages_dialog_fragment.xml | 154 ++++++++++++++++++ .../schedule_message_ftux_bottom_sheet.xml | 146 ++++++++++++++++- .../scheduled_messages_bottom_sheet.xml | 5 +- app/src/main/res/values/strings.xml | 5 +- 7 files changed, 396 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/ReenableScheduledMessagesDialogFragment.kt create mode 100644 app/src/main/res/layout/reenable_scheduled_messages_dialog_fragment.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index b132bcfd3f..df925a66da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -20,6 +20,7 @@ import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; +import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; @@ -2942,8 +2943,8 @@ public class ConversationParentFragment extends Fragment } private void sendMessage(@Nullable String metricId, long scheduledDate) { - if (scheduledDate != -1 && !SignalStore.uiHints().hasSeenScheduledMessagesInfoSheet()) { - ScheduleMessageFtuxBottomSheetDialog.show(getChildFragmentManager()); + if (scheduledDate != -1) { + ReenableScheduledMessagesDialogFragment.showIfNeeded(requireContext(), getChildFragmentManager()); } if (inputPanel.isRecordingInLockedMode()) { inputPanel.releaseRecordingLock(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ReenableScheduledMessagesDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ReenableScheduledMessagesDialogFragment.kt new file mode 100644 index 0000000000..84ee070644 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ReenableScheduledMessagesDialogFragment.kt @@ -0,0 +1,66 @@ +package org.thoughtcrime.securesms.conversation + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.fragment.app.FragmentManager +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment +import org.thoughtcrime.securesms.conversation.ScheduleMessageFtuxBottomSheetDialog.Companion.show +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.util.BottomSheetUtil +import org.thoughtcrime.securesms.util.ServiceUtil + +/** + * Bottom sheet dialog to prompt user to enable schedule alarms permission for scheduling messages + */ +class ReenableScheduledMessagesDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() { + + override val peekHeightPercentage: Float = 1f + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.reenable_scheduled_messages_dialog_fragment, container, false) + } + + @SuppressLint("InlinedApi") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + val launcher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + dismissAllowingStateLoss() + } + } + + view.findViewById(R.id.reenable_scheduled_messages_go_to_settings).setOnClickListener { + launcher.launch(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, Uri.parse("package:" + requireContext().packageName))) + } + } + + companion object { + @JvmStatic + fun showIfNeeded(context: Context, fragmentManager: FragmentManager) { + var hasPermission = true + if (Build.VERSION.SDK_INT >= 31) { + val alarmManager = ServiceUtil.getAlarmManager(context) + hasPermission = alarmManager.canScheduleExactAlarms() + } + val fragment = if (!SignalStore.uiHints().hasSeenScheduledMessagesInfoSheet()) { + ScheduleMessageFtuxBottomSheetDialog() + } else if (!hasPermission) { + ReenableScheduledMessagesDialogFragment() + } else { + null + } + fragment?.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduleMessageFtuxBottomSheetDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduleMessageFtuxBottomSheetDialog.kt index 2fc117163f..22839eedb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduleMessageFtuxBottomSheetDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduleMessageFtuxBottomSheetDialog.kt @@ -1,9 +1,16 @@ package org.thoughtcrime.securesms.conversation +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build import android.os.Bundle +import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.FragmentManager import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment @@ -11,6 +18,7 @@ import org.thoughtcrime.securesms.components.ViewBinderDelegate import org.thoughtcrime.securesms.databinding.ScheduleMessageFtuxBottomSheetBinding import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.BottomSheetUtil +import org.thoughtcrime.securesms.util.ServiceUtil class ScheduleMessageFtuxBottomSheetDialog : FixedRoundedCornerBottomSheetDialogFragment() { override val peekHeightPercentage: Float = 0.66f @@ -23,6 +31,20 @@ class ScheduleMessageFtuxBottomSheetDialog : FixedRoundedCornerBottomSheetDialog } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + if (Build.VERSION.SDK_INT >= 31 && !ServiceUtil.getAlarmManager(context).canScheduleExactAlarms()) { + binding.reenableSettings.visibility = View.VISIBLE + binding.okay.visibility = View.GONE + val launcher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + dismissAllowingStateLoss() + } + } + binding.enableScheduledMessagesGoToSettings.setOnClickListener { + SignalStore.uiHints().markHasSeenScheduledMessagesInfoSheet() + launcher.launch(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, Uri.parse("package:" + requireContext().packageName))) + dismiss() + } + } binding.okay.setOnClickListener { SignalStore.uiHints().markHasSeenScheduledMessagesInfoSheet() dismiss() diff --git a/app/src/main/res/layout/reenable_scheduled_messages_dialog_fragment.xml b/app/src/main/res/layout/reenable_scheduled_messages_dialog_fragment.xml new file mode 100644 index 0000000000..ae4e2e4206 --- /dev/null +++ b/app/src/main/res/layout/reenable_scheduled_messages_dialog_fragment.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/schedule_message_ftux_bottom_sheet.xml b/app/src/main/res/layout/schedule_message_ftux_bottom_sheet.xml index 478ac85fc5..136fff3d5c 100644 --- a/app/src/main/res/layout/schedule_message_ftux_bottom_sheet.xml +++ b/app/src/main/res/layout/schedule_message_ftux_bottom_sheet.xml @@ -1,6 +1,7 @@ - @@ -40,6 +41,147 @@ android:text="@string/ScheduleMessageFTUXBottomSheet__disclaimer" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -51,4 +52,4 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81ae0d2f98..0b168f0cdd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -648,7 +648,10 @@ When you send a scheduled message, make sure your device will be on and connected to the internet at the time of sending. If not, your message will send when your device reconnects. Okay - + + To enable message scheduling: + + To re-enable message scheduling: Select date