kopia lustrzana https://github.com/ryukoposting/Signal-Android
Prevent scheduling of sends when alarm permission is denied.
rodzic
987fafff92
commit
6a8e82ef91
|
@ -366,7 +366,8 @@ public class ConversationParentFragment extends Fragment
|
||||||
Material3OnScrollHelperBinder,
|
Material3OnScrollHelperBinder,
|
||||||
MessageDetailsFragment.Callback,
|
MessageDetailsFragment.Callback,
|
||||||
ScheduleMessageTimePickerBottomSheet.ScheduleCallback,
|
ScheduleMessageTimePickerBottomSheet.ScheduleCallback,
|
||||||
ConversationBottomSheetCallback
|
ConversationBottomSheetCallback,
|
||||||
|
ScheduleMessageDialogCallback
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final int SHORTCUT_ICON_SIZE = Build.VERSION.SDK_INT >= 26 ? ViewUtil.dpToPx(72) : ViewUtil.dpToPx(48 + 16 * 2);
|
private static final int SHORTCUT_ICON_SIZE = Build.VERSION.SDK_INT >= 26 ? ViewUtil.dpToPx(72) : ViewUtil.dpToPx(48 + 16 * 2);
|
||||||
|
@ -2948,9 +2949,10 @@ public class ConversationParentFragment extends Fragment
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendMessage(@Nullable String metricId, long scheduledDate) {
|
private void sendMessage(@Nullable String metricId, long scheduledDate) {
|
||||||
if (scheduledDate != -1) {
|
if (scheduledDate != -1 && ReenableScheduledMessagesDialogFragment.showIfNeeded(requireContext(), getChildFragmentManager(), metricId, scheduledDate)) {
|
||||||
ReenableScheduledMessagesDialogFragment.showIfNeeded(requireContext(), getChildFragmentManager());
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputPanel.isRecordingInLockedMode()) {
|
if (inputPanel.isRecordingInLockedMode()) {
|
||||||
inputPanel.releaseRecordingLock();
|
inputPanel.releaseRecordingLock();
|
||||||
return;
|
return;
|
||||||
|
@ -3671,6 +3673,7 @@ public class ConversationParentFragment extends Fragment
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void onScheduleSend(long scheduledTime) {
|
public void onScheduleSend(long scheduledTime) {
|
||||||
sendMessage(null, scheduledTime);
|
sendMessage(null, scheduledTime);
|
||||||
}
|
}
|
||||||
|
@ -3685,6 +3688,11 @@ public class ConversationParentFragment extends Fragment
|
||||||
fragment.jumpToMessage(messageRecord);
|
fragment.jumpToMessage(messageRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSchedulePermissionsGranted(@Nullable String metricId, long scheduledDate) {
|
||||||
|
sendMessage(metricId, scheduledDate);
|
||||||
|
}
|
||||||
|
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
private class RecordingSession implements SingleObserver<VoiceNoteDraft>, Disposable {
|
private class RecordingSession implements SingleObserver<VoiceNoteDraft>, Disposable {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package org.thoughtcrime.securesms.conversation
|
package org.thoughtcrime.securesms.conversation
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
@ -13,13 +12,14 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
||||||
import org.thoughtcrime.securesms.conversation.ScheduleMessageFtuxBottomSheetDialog.Companion.show
|
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
||||||
import org.thoughtcrime.securesms.util.ServiceUtil
|
import org.thoughtcrime.securesms.util.ServiceUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.findListener
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bottom sheet dialog to prompt user to enable schedule alarms permission for scheduling messages
|
* Bottom sheet dialog to prompt user to enable schedule alarms permission for scheduling messages
|
||||||
|
@ -35,7 +35,11 @@ class ReenableScheduledMessagesDialogFragment : FixedRoundedCornerBottomSheetDia
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
val launcher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
val launcher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
if (it.resultCode == Activity.RESULT_OK) {
|
if (Build.VERSION.SDK_INT < 31 || ServiceUtil.getAlarmManager(context).canScheduleExactAlarms()) {
|
||||||
|
findListener<ScheduleMessageDialogCallback>()?.onSchedulePermissionsGranted(
|
||||||
|
requireArguments().getString(ScheduleMessageDialogCallback.ARGUMENT_METRIC_ID),
|
||||||
|
requireArguments().getLong(ScheduleMessageDialogCallback.ARGUMENT_SCHEDULED_DATE)
|
||||||
|
)
|
||||||
dismissAllowingStateLoss()
|
dismissAllowingStateLoss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,12 +51,9 @@ class ReenableScheduledMessagesDialogFragment : FixedRoundedCornerBottomSheetDia
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun showIfNeeded(context: Context, fragmentManager: FragmentManager) {
|
fun showIfNeeded(context: Context, fragmentManager: FragmentManager, metricId: String?, scheduledDate: Long): Boolean {
|
||||||
var hasPermission = true
|
val hasPermission = Build.VERSION.SDK_INT < 31 || ServiceUtil.getAlarmManager(context).canScheduleExactAlarms()
|
||||||
if (Build.VERSION.SDK_INT >= 31) {
|
|
||||||
val alarmManager = ServiceUtil.getAlarmManager(context)
|
|
||||||
hasPermission = alarmManager.canScheduleExactAlarms()
|
|
||||||
}
|
|
||||||
val fragment = if (!SignalStore.uiHints().hasSeenScheduledMessagesInfoSheet()) {
|
val fragment = if (!SignalStore.uiHints().hasSeenScheduledMessagesInfoSheet()) {
|
||||||
ScheduleMessageFtuxBottomSheetDialog()
|
ScheduleMessageFtuxBottomSheetDialog()
|
||||||
} else if (!hasPermission) {
|
} else if (!hasPermission) {
|
||||||
|
@ -60,7 +61,16 @@ class ReenableScheduledMessagesDialogFragment : FixedRoundedCornerBottomSheetDia
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fragment?.apply {
|
||||||
|
arguments = bundleOf(
|
||||||
|
ScheduleMessageDialogCallback.ARGUMENT_METRIC_ID to metricId,
|
||||||
|
ScheduleMessageDialogCallback.ARGUMENT_SCHEDULED_DATE to scheduledDate
|
||||||
|
)
|
||||||
|
}
|
||||||
fragment?.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)
|
fragment?.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)
|
||||||
|
|
||||||
|
return fragment != null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package org.thoughtcrime.securesms.conversation;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for responding to scheduled message dialogs blocking the send flow for permissions check.
|
||||||
|
*/
|
||||||
|
public interface ScheduleMessageDialogCallback {
|
||||||
|
String ARGUMENT_METRIC_ID = "ARGUMENT_METRIC_ID";
|
||||||
|
String ARGUMENT_SCHEDULED_DATE = "ARGUMENT_SCHEDULED_DATE";
|
||||||
|
|
||||||
|
void onSchedulePermissionsGranted(@Nullable String metricId, long scheduledDate);
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
package org.thoughtcrime.securesms.conversation
|
package org.thoughtcrime.securesms.conversation
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
@ -11,14 +10,13 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.fragment.app.FragmentManager
|
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
||||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||||
import org.thoughtcrime.securesms.databinding.ScheduleMessageFtuxBottomSheetBinding
|
import org.thoughtcrime.securesms.databinding.ScheduleMessageFtuxBottomSheetBinding
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
|
||||||
import org.thoughtcrime.securesms.util.ServiceUtil
|
import org.thoughtcrime.securesms.util.ServiceUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.findListener
|
||||||
|
|
||||||
class ScheduleMessageFtuxBottomSheetDialog : FixedRoundedCornerBottomSheetDialogFragment() {
|
class ScheduleMessageFtuxBottomSheetDialog : FixedRoundedCornerBottomSheetDialogFragment() {
|
||||||
override val peekHeightPercentage: Float = 0.66f
|
override val peekHeightPercentage: Float = 0.66f
|
||||||
|
@ -34,29 +32,30 @@ class ScheduleMessageFtuxBottomSheetDialog : FixedRoundedCornerBottomSheetDialog
|
||||||
if (Build.VERSION.SDK_INT >= 31 && !ServiceUtil.getAlarmManager(context).canScheduleExactAlarms()) {
|
if (Build.VERSION.SDK_INT >= 31 && !ServiceUtil.getAlarmManager(context).canScheduleExactAlarms()) {
|
||||||
binding.reenableSettings.visibility = View.VISIBLE
|
binding.reenableSettings.visibility = View.VISIBLE
|
||||||
binding.okay.visibility = View.GONE
|
binding.okay.visibility = View.GONE
|
||||||
|
|
||||||
val launcher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
val launcher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
if (it.resultCode == Activity.RESULT_OK) {
|
if (Build.VERSION.SDK_INT < 31 || ServiceUtil.getAlarmManager(context).canScheduleExactAlarms()) {
|
||||||
dismissAllowingStateLoss()
|
proceedWithScheduledSend()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.enableScheduledMessagesGoToSettings.setOnClickListener {
|
binding.enableScheduledMessagesGoToSettings.setOnClickListener {
|
||||||
SignalStore.uiHints().markHasSeenScheduledMessagesInfoSheet()
|
SignalStore.uiHints().markHasSeenScheduledMessagesInfoSheet()
|
||||||
launcher.launch(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, Uri.parse("package:" + requireContext().packageName)))
|
launcher.launch(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, Uri.parse("package:" + requireContext().packageName)))
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
binding.okay.setOnClickListener {
|
binding.okay.setOnClickListener {
|
||||||
|
proceedWithScheduledSend()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun proceedWithScheduledSend() {
|
||||||
SignalStore.uiHints().markHasSeenScheduledMessagesInfoSheet()
|
SignalStore.uiHints().markHasSeenScheduledMessagesInfoSheet()
|
||||||
dismiss()
|
findListener<ScheduleMessageDialogCallback>()?.onSchedulePermissionsGranted(
|
||||||
}
|
requireArguments().getString(ScheduleMessageDialogCallback.ARGUMENT_METRIC_ID),
|
||||||
}
|
requireArguments().getLong(ScheduleMessageDialogCallback.ARGUMENT_SCHEDULED_DATE)
|
||||||
|
)
|
||||||
companion object {
|
dismissAllowingStateLoss()
|
||||||
@JvmStatic
|
|
||||||
fun show(fragmentManager: FragmentManager) {
|
|
||||||
val fragment = ScheduleMessageFtuxBottomSheetDialog()
|
|
||||||
|
|
||||||
fragment.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue