diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c6e73dc98d..cf888449ec 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -155,7 +155,8 @@ android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/> + android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" + android:exported="true"> @@ -181,10 +182,10 @@ @@ -212,13 +213,14 @@ - + @@ -386,10 +389,12 @@ android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/> @@ -517,10 +522,11 @@ android:finishOnTaskLaunch="true" /> - + @@ -539,6 +545,7 @@ - + - + @@ -737,7 +744,7 @@ - + @@ -828,51 +835,51 @@ - + - + - + - + - + - + - + - + @@ -880,7 +887,7 @@ - + @@ -908,16 +915,19 @@ + android:enabled="@bool/enable_alarm_manager" + android:exported="false"/> + android:enabled="@bool/enable_alarm_manager" + android:exported="false"/> + android:enabled="true" + android:exported="false"> diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/BackupFileIOError.java b/app/src/main/java/org/thoughtcrime/securesms/backup/BackupFileIOError.java index 76b28646f8..aacd077b8a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/BackupFileIOError.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/BackupFileIOError.java @@ -10,6 +10,7 @@ import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import org.signal.core.util.PendingIntentFlags; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity; import org.thoughtcrime.securesms.notifications.NotificationCancellationHelper; @@ -40,7 +41,7 @@ public enum BackupFileIOError { } public void postNotification(@NonNull Context context) { - PendingIntent pendingIntent = PendingIntent.getActivity(context, -1, AppSettingsActivity.backups(context), 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, -1, AppSettingsActivity.backups(context), PendingIntentFlags.mutable()); Notification backupFailedNotification = new NotificationCompat.Builder(context, NotificationChannels.FAILURES) .setSmallIcon(R.drawable.ic_signal_backup) .setContentTitle(context.getString(titleId)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/errors/DonationErrorNotifications.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/errors/DonationErrorNotifications.kt index 5699842ff9..ade8cefd33 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/errors/DonationErrorNotifications.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/errors/DonationErrorNotifications.kt @@ -7,6 +7,7 @@ import android.net.Uri import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import org.signal.core.util.PendingIntentFlags import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.help.HelpFragment @@ -90,7 +91,7 @@ object DonationErrorNotifications { context, 0, actionIntent, - if (Build.VERSION.SDK_INT >= 23) PendingIntent.FLAG_ONE_SHOT else 0 + if (Build.VERSION.SDK_INT >= 23) PendingIntentFlags.oneShot() else PendingIntentFlags.mutable() ) } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java index 65d62d1d4b..4e38c0de72 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.ui.PlayerNotificationManager; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.conversation.ConversationIntents; @@ -107,7 +108,7 @@ class VoiceNoteNotificationManager { return PendingIntent.getActivity(context, 0, conversationActivity, - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntentFlags.cancelCurrent()); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/GroupCallSafetyNumberChangeNotificationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/GroupCallSafetyNumberChangeNotificationUtil.java index 188e91d01d..704c59b604 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/GroupCallSafetyNumberChangeNotificationUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/GroupCallSafetyNumberChangeNotificationUtil.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import org.signal.core.util.PendingIntentFlags; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.WebRtcCallActivity; import org.thoughtcrime.securesms.notifications.NotificationChannels; @@ -28,7 +29,7 @@ public final class GroupCallSafetyNumberChangeNotificationUtil { Intent contentIntent = new Intent(context, WebRtcCallActivity.class); contentIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, PendingIntentFlags.mutable()); Notification safetyNumberChangeNotification = new NotificationCompat.Builder(context, NotificationChannels.CALLS) .setSmallIcon(R.drawable.ic_notification) 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 6f831436dc..5514625b68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -101,6 +101,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.StringUtil; import org.signal.core.util.ThreadUtil; import org.signal.core.util.concurrent.SignalExecutors; @@ -1381,7 +1382,7 @@ public class ConversationParentFragment extends Fragment .build(); Intent callbackIntent = new Intent(ACTION_PINNED_SHORTCUT); - PendingIntent shortcutPinnedCallback = PendingIntent.getBroadcast(context, REQUEST_CODE_PIN_SHORTCUT, callbackIntent, 0); + PendingIntent shortcutPinnedCallback = PendingIntent.getBroadcast(context, REQUEST_CODE_PIN_SHORTCUT, callbackIntent, PendingIntentFlags.mutable()); ShortcutManagerCompat.requestPinShortcut(context, shortcutInfoCompat, shortcutPinnedCallback.getIntentSender()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferSetupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferSetupFragment.java index af8e4f2789..c67dee8879 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferSetupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferSetupFragment.java @@ -6,6 +6,7 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.navigation.fragment.NavHostFragment; +import org.signal.core.util.PendingIntentFlags; import org.signal.devicetransfer.DeviceToDeviceTransferService; import org.signal.devicetransfer.DeviceToDeviceTransferService.TransferNotificationData; import org.thoughtcrime.securesms.MainActivity; @@ -82,7 +83,7 @@ public final class NewDeviceTransferSetupFragment extends DeviceTransferSetupFra @Override protected void startTransfer() { - PendingIntent pendingIntent = PendingIntent.getActivity(requireContext(), 0, MainActivity.clearTop(requireContext()), 0); + PendingIntent pendingIntent = PendingIntent.getActivity(requireContext(), 0, MainActivity.clearTop(requireContext()), PendingIntentFlags.mutable()); TransferNotificationData notificationData = new TransferNotificationData(NotificationIds.DEVICE_TRANSFER, NotificationChannels.BACKUPS, R.drawable.ic_signal_backup); DeviceToDeviceTransferService.startServer(requireContext(), new NewDeviceServerTask(), notificationData, pendingIntent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java index 3ae26f6245..3f1a87fe37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.navigation.fragment.NavHostFragment; +import org.signal.core.util.PendingIntentFlags; import org.signal.devicetransfer.DeviceToDeviceTransferService; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity; @@ -55,7 +56,7 @@ public final class OldDeviceTransferSetupFragment extends DeviceTransferSetupFra protected void startTransfer() { Intent intent = new Intent(requireContext(), OldDeviceTransferActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity(requireContext(), 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(requireContext(), 0, intent, PendingIntentFlags.mutable()); DeviceToDeviceTransferService.TransferNotificationData notificationData = new DeviceToDeviceTransferService.TransferNotificationData(NotificationIds.DEVICE_TRANSFER, NotificationChannels.BACKUPS, R.drawable.ic_signal_backup); DeviceToDeviceTransferService.startClient(requireContext(), new OldDeviceClientTask(), notificationData, pendingIntent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchForegroundService.kt b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchForegroundService.kt index ff9ec27e9d..bd9633f3fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchForegroundService.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchForegroundService.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.Intent import android.os.IBinder import androidx.core.app.NotificationCompat +import org.signal.core.util.PendingIntentFlags import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.MainActivity import org.thoughtcrime.securesms.R @@ -42,7 +43,7 @@ class FcmFetchForegroundService : Service() { .setContentTitle(getString(R.string.BackgroundMessageRetriever_checking_for_messages)) .setCategory(NotificationCompat.CATEGORY_SERVICE) .setProgress(0, 0, true) - .setContentIntent(PendingIntent.getActivity(this, 0, MainActivity.clearTop(this), 0)) + .setContentIntent(PendingIntent.getActivity(this, 0, MainActivity.clearTop(this), PendingIntentFlags.mutable())) .setVibrate(longArrayOf(0)) .build() ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java index 96c020197e..dc918f2502 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import com.annimon.stream.Stream; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -52,7 +53,7 @@ public class AlarmManagerScheduler implements Scheduler { Intent intent = new Intent(context, RetryReceiver.class); intent.setAction(BuildConfig.APPLICATION_ID + UUID.randomUUID().toString()); - alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(context, 0, intent, 0)); + alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.mutable())); Log.i(TAG, "Set an alarm to retry a job in " + (time - System.currentTimeMillis()) + " ms."); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java index f1504d0ec2..fb667d5c27 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java @@ -28,6 +28,7 @@ import androidx.core.app.NotificationCompat; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.PlayServicesProblemActivity; import org.thoughtcrime.securesms.R; @@ -120,7 +121,7 @@ public class FcmRefreshJob extends BaseJob { private void notifyFcmFailure() { Intent intent = new Intent(context, PlayServicesProblemActivity.class); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 1122, intent, PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 1122, intent, PendingIntentFlags.cancelCurrent()); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.FAILURES); builder.setSmallIcon(R.drawable.ic_notification); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java index 351b85b159..8d52f35722 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.IdentityKey; import org.signal.libsignal.protocol.SignalProtocolAddress; @@ -182,7 +183,7 @@ public final class PushDecryptMessageJob extends BaseJob { .setCategory(NotificationCompat.CATEGORY_MESSAGE) .setContentTitle(context.getString(R.string.PushDecryptJob_new_locked_message)) .setContentText(context.getString(R.string.PushDecryptJob_unlock_to_view_pending_messages)) - .setContentIntent(PendingIntent.getActivity(context, 0, MainActivity.clearTop(context), 0)) + .setContentIntent(PendingIntent.getActivity(context, 0, MainActivity.clearTop(context), PendingIntentFlags.mutable())) .setDefaults(NotificationCompat.DEFAULT_SOUND | NotificationCompat.DEFAULT_VIBRATE) .build()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java index fa3305452b..4e3f9637f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java @@ -10,6 +10,7 @@ import android.telephony.SmsManager; import androidx.annotation.NonNull; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; @@ -182,7 +183,7 @@ public class SmsSendJob extends SendJob { for (String ignored : messages) { sentIntents.add(PendingIntent.getBroadcast(context, 0, constructSentIntent(context, messageId, type, isMultipart), - 0)); + PendingIntentFlags.mutable())); } return sentIntents; @@ -199,7 +200,7 @@ public class SmsSendJob extends SendJob { for (String ignored : messages) { deliveredIntents.add(PendingIntent.getBroadcast(context, 0, constructDeliveredIntent(context, messageId, type, isMultipart), - 0)); + PendingIntentFlags.mutable())); } return deliveredIntents; diff --git a/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/MessageProcessReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/MessageProcessReceiver.java index aad4c1243b..3f4d79f407 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/MessageProcessReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messageprocessingalarm/MessageProcessReceiver.java @@ -12,6 +12,7 @@ import android.os.SystemClock; import androidx.annotation.NonNull; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -71,7 +72,7 @@ public final class MessageProcessReceiver extends BroadcastReceiver { alarmIntent.setAction(MessageProcessReceiver.BROADCAST_ACTION); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 123, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 123, alarmIntent, PendingIntentFlags.updateCurrent()); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); long interval = FeatureFlags.getBackgroundMessageProcessInterval(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java index c39223f5ab..e97fa69dbf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptionUtil.java @@ -9,6 +9,7 @@ import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.signal.libsignal.metadata.InvalidMetadataMessageException; import org.signal.libsignal.metadata.InvalidMetadataVersionException; @@ -239,7 +240,7 @@ public final class MessageDecryptionUtil { .setSmallIcon(R.drawable.ic_notification) .setContentTitle(context.getString(R.string.MessageDecryptionUtil_failed_to_decrypt_message)) .setContentText(context.getString(R.string.MessageDecryptionUtil_tap_to_send_a_debug_log)) - .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, SubmitDebugLogActivity.class), 0)) + .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, SubmitDebugLogActivity.class), PendingIntentFlags.mutable())) .build()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java index 982142980a..679f0176db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.util.Util; @@ -77,7 +78,7 @@ public abstract class LollipopMmsConnection extends BroadcastReceiver { } protected PendingIntent getPendingIntent() { - return PendingIntent.getBroadcast(getContext(), 1, new Intent(action), PendingIntent.FLAG_ONE_SHOT); + return PendingIntent.getBroadcast(getContext(), 1, new Intent(action), PendingIntentFlags.oneShot()); } protected Context getContext() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt index 4717db2b34..a926d72c7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt @@ -15,6 +15,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.RemoteInput import androidx.core.content.LocusIdCompat import androidx.core.graphics.drawable.IconCompat +import org.signal.core.util.PendingIntentFlags.mutable import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.ConversationIntents import org.thoughtcrime.securesms.database.GroupDatabase @@ -341,7 +342,7 @@ sealed class NotificationBuilder(protected val context: Context) { context, 0, ConversationIntents.createBubbleIntent(context, conversation.recipient.id, conversation.thread.threadId), - 0 + mutable() ) val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder(intent, AvatarUtil.getIconCompatForShortcut(context, conversation.recipient)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationConversation.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationConversation.kt index 727d06b06b..299e9f6e56 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationConversation.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationConversation.kt @@ -136,7 +136,7 @@ data class NotificationConversation( return try { TaskStackBuilder.create(context) .addNextIntentWithParentStack(intent) - .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT) + .getPendingIntent(0, PendingIntentFlags.updateCurrent()) } catch (e: NullPointerException) { Log.w(NotificationFactory.TAG, "Vivo device quirk sometimes throws NPE", e) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt index 91fa26c7e0..dac8247adb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt @@ -15,6 +15,7 @@ import android.os.TransactionTooLargeException import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat +import org.signal.core.util.PendingIntentFlags import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.MainActivity @@ -239,7 +240,7 @@ object NotificationFactory { setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN) setChannelId(NotificationChannels.getMessagesChannel(context)) setContentTitle(context.getString(R.string.app_name)) - setContentIntent(PendingIntent.getActivity(context, 0, MainActivity.clearTop(context), 0)) + setContentIntent(PendingIntent.getActivity(context, 0, MainActivity.clearTop(context), PendingIntentFlags.mutable())) setGroupSummary(true) setSubText(context.getString(R.string.MessageNotifier_d_new_messages_in_d_conversations, state.messageCount, state.threadCount)) setContentInfo(state.messageCount.toString()) @@ -320,7 +321,7 @@ object NotificationFactory { setContentTitle(context.getString(R.string.MessageNotifier_message_delivery_failed)) setContentText(context.getString(R.string.MessageNotifier_failed_to_deliver_message)) setTicker(context.getString(R.string.MessageNotifier_error_delivering_message)) - setContentIntent(PendingIntent.getActivity(context, 0, intent, 0)) + setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntentFlags.mutable())) setAutoCancel(true) setAlarms(recipient) setChannelId(NotificationChannels.FAILURES) @@ -349,7 +350,7 @@ object NotificationFactory { setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.ic_info_outline)) setContentTitle(context.getString(R.string.MessageNotifier_message_delivery_paused)) setContentText(context.getString(R.string.MessageNotifier_verify_to_continue_messaging_on_signal)) - setContentIntent(PendingIntent.getActivity(context, 0, intent, 0)) + setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntentFlags.mutable())) setOnlyAlertOnce(true) setAutoCancel(true) setAlarms(recipient) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationState.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationState.kt index 6b615cd4a4..499080f081 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationState.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.notifications.v2 import android.app.PendingIntent import android.content.Context import android.content.Intent +import org.signal.core.util.PendingIntentFlags import org.thoughtcrime.securesms.notifications.DeleteNotificationReceiver import org.thoughtcrime.securesms.notifications.MarkReadReceiver import org.thoughtcrime.securesms.notifications.NotificationIds @@ -67,7 +68,7 @@ data class NotificationState(val conversations: List, .putParcelableArrayListExtra(DeleteNotificationReceiver.EXTRA_THREADS, ArrayList(threads)) .makeUniqueToPreventMerging() - return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + return PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.updateCurrent()) } fun getMarkAsReadIntent(context: Context): PendingIntent? { @@ -76,7 +77,7 @@ data class NotificationState(val conversations: List, .putExtra(MarkReadReceiver.NOTIFICATION_ID_EXTRA, NotificationIds.MESSAGE_SUMMARY) .makeUniqueToPreventMerging() - return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + return PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.updateCurrent()) } fun getThreadsWithMostRecentNotificationFromSelf(): Set { diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/backup/phrase/PaymentsRecoveryPhraseFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/backup/phrase/PaymentsRecoveryPhraseFragment.java index 2e74dc8f9c..7ad0f6d7e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/backup/phrase/PaymentsRecoveryPhraseFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/backup/phrase/PaymentsRecoveryPhraseFragment.java @@ -22,6 +22,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.annimon.stream.Stream; +import org.signal.core.util.PendingIntentFlags; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.payments.Mnemonic; @@ -95,7 +96,7 @@ public class PaymentsRecoveryPhraseFragment extends Fragment { AlarmManager alarmManager = ServiceUtil.getAlarmManager(requireContext()); Intent alarmIntent = new Intent(requireContext(), ClearClipboardAlarmReceiver.class); - PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(requireContext(), 0, alarmIntent, 0); + PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(requireContext(), 0, alarmIntent, PendingIntentFlags.mutable()); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(30), pendingAlarmIntent); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java b/app/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java index 8a37a7079b..180382d630 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java @@ -17,6 +17,7 @@ import android.os.PowerManager.WakeLock; import androidx.core.app.NotificationCompat; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.MainActivity; import org.thoughtcrime.securesms.R; @@ -137,7 +138,7 @@ public class ApplicationMigrationService extends Service builder.setOngoing(true); builder.setProgress(100, 0, false); // TODO [greyson] Navigation - builder.setContentIntent(PendingIntent.getActivity(this, 0, MainActivity.clearTop(this), 0)); + builder.setContentIntent(PendingIntent.getActivity(this, 0, MainActivity.clearTop(this), PendingIntentFlags.mutable())); stopForeground(true); startForeground(NotificationIds.APPLICATION_MIGRATION, builder.build()); @@ -189,7 +190,7 @@ public class ApplicationMigrationService extends Service builder.setContentTitle(context.getString(R.string.ApplicationMigrationService_import_complete)); builder.setContentText(context.getString(R.string.ApplicationMigrationService_system_database_import_is_complete)); // TODO [greyson] Navigation - builder.setContentIntent(PendingIntent.getActivity(context, 0, MainActivity.clearTop(context), 0)); + builder.setContentIntent(PendingIntent.getActivity(context, 0, MainActivity.clearTop(context), PendingIntentFlags.mutable())); builder.setWhen(System.currentTimeMillis()); builder.setDefaults(Notification.DEFAULT_VIBRATE); builder.setAutoCancel(true); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java index 77d3c0e8a4..80eb8aed8e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java @@ -6,6 +6,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import org.signal.core.util.PendingIntentFlags; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; public class ExpirationListener extends BroadcastReceiver { @@ -17,7 +18,7 @@ public class ExpirationListener extends BroadcastReceiver { public static void setAlarm(Context context, long waitTimeMillis) { Intent intent = new Intent(context, ExpirationListener.class); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.mutable()); AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java index 0d119e1cbd..22efd34f48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.MainActivity; import org.thoughtcrime.securesms.R; @@ -111,7 +112,7 @@ public final class GenericForegroundService extends Service { .setSmallIcon(active.iconRes) .setContentTitle(active.title) .setProgress(active.progressMax, active.progress, active.indeterminate) - .setContentIntent(PendingIntent.getActivity(this, 0, MainActivity.clearTop(this), 0)) + .setContentIntent(PendingIntent.getActivity(this, 0, MainActivity.clearTop(this), PendingIntentFlags.mutable())) .setVibrate(new long[]{0}) .build()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java index d50b370220..d35a3e77ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java @@ -7,6 +7,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; public abstract class PersistentAlarmManagerListener extends BroadcastReceiver { @@ -23,7 +24,8 @@ public abstract class PersistentAlarmManagerListener extends BroadcastReceiver { long scheduledTime = getNextScheduledExecutionTime(context); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent alarmIntent = new Intent(context, getClass()); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntentFlags.immutable()); + if (System.currentTimeMillis() >= scheduledTime) { scheduledTime = onAlarm(context, scheduledTime); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java index ab7bbc31b0..3dff08ec49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java @@ -13,6 +13,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; +import org.signal.core.util.PendingIntentFlags; import org.thoughtcrime.securesms.util.ServiceUtil; /** @@ -84,7 +85,7 @@ public abstract class TimedEventManager { */ protected static void setAlarm(@NonNull Context context, long delay, @NonNull Class alarmClass) { Intent intent = new Intent(context, alarmClass); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.mutable()); AlarmManager alarmManager = ServiceUtil.getAlarmManager(context); alarmManager.cancel(pendingIntent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java index 7e36109682..f6dceff405 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java @@ -13,6 +13,7 @@ import android.net.Uri; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; +import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.notifications.NotificationChannels; @@ -61,7 +62,7 @@ public class UpdateApkReadyListener extends BroadcastReceiver { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setData(uri); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntentFlags.mutable()); Notification notification = new NotificationCompat.Builder(context, NotificationChannels.APP_UPDATES) .setOngoing(true) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java index ec3d681d3f..dadd9738a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; +import org.signal.core.util.PendingIntentFlags; import org.thoughtcrime.securesms.MainActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.WebRtcCallActivity; @@ -41,7 +42,7 @@ public class CallNotificationBuilder { contentIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); contentIntent.putExtra(WebRtcCallActivity.EXTRA_STARTED_FROM_FULLSCREEN, true); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, PendingIntentFlags.mutable()); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, getNotificationChannel(type)) .setSmallIcon(R.drawable.ic_call_secure_white_24dp) @@ -86,7 +87,7 @@ public class CallNotificationBuilder { Intent contentIntent = new Intent(context, MainActivity.class); contentIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, PendingIntentFlags.mutable()); return new NotificationCompat.Builder(context, NotificationChannels.CALL_STATUS).setSmallIcon(R.drawable.ic_call_secure_white_24dp) .setContentIntent(pendingIntent) @@ -100,7 +101,7 @@ public class CallNotificationBuilder { Intent contentIntent = new Intent(context, MainActivity.class); contentIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, PendingIntentFlags.mutable()); return new NotificationCompat.Builder(context, NotificationChannels.CALL_STATUS).setSmallIcon(R.drawable.ic_call_secure_white_24dp) .setContentIntent(pendingIntent) @@ -128,8 +129,8 @@ public class CallNotificationBuilder { } private static NotificationCompat.Action getServiceNotificationAction(Context context, Intent intent, int iconResId, int titleResId) { - PendingIntent pendingIntent = Build.VERSION.SDK_INT >= 26 ? PendingIntent.getForegroundService(context, 0, intent, 0) - : PendingIntent.getService(context, 0, intent, 0); + PendingIntent pendingIntent = Build.VERSION.SDK_INT >= 26 ? PendingIntent.getForegroundService(context, 0, intent, PendingIntentFlags.mutable()) + : PendingIntent.getService(context, 0, intent, PendingIntentFlags.mutable()); return new NotificationCompat.Action(iconResId, context.getString(titleResId), pendingIntent); } @@ -140,7 +141,7 @@ public class CallNotificationBuilder { Intent intent = new Intent(context, WebRtcCallActivity.class); intent.setAction(action); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntentFlags.mutable()); return new NotificationCompat.Action(iconResId, context.getString(titleResId), pendingIntent); } diff --git a/core-util/src/main/java/org/signal/core/util/PendingIntentFlags.kt b/core-util/src/main/java/org/signal/core/util/PendingIntentFlags.kt index a9d5c9cd94..7f119405b6 100644 --- a/core-util/src/main/java/org/signal/core/util/PendingIntentFlags.kt +++ b/core-util/src/main/java/org/signal/core/util/PendingIntentFlags.kt @@ -13,18 +13,31 @@ import android.os.Build */ object PendingIntentFlags { + @JvmStatic fun updateCurrent(): Int { return mutable() or PendingIntent.FLAG_UPDATE_CURRENT } + @JvmStatic fun cancelCurrent(): Int { return mutable() or PendingIntent.FLAG_CANCEL_CURRENT } + @JvmStatic + fun oneShot(): Int { + return mutable() or PendingIntent.FLAG_ONE_SHOT + } + /** * The backwards compatible "default" value for pending intent flags. */ + @JvmStatic fun mutable(): Int { return if (Build.VERSION.SDK_INT >= 31) PendingIntent.FLAG_MUTABLE else 0 } + + @JvmStatic + fun immutable(): Int { + return if (Build.VERSION.SDK_INT >= 23) PendingIntent.FLAG_IMMUTABLE else 0 + } } diff --git a/core-util/src/main/java/org/signal/core/util/ShakeDetector.java b/core-util/src/main/java/org/signal/core/util/ShakeDetector.java index 6cbcd7f36d..299ee2d06d 100644 --- a/core-util/src/main/java/org/signal/core/util/ShakeDetector.java +++ b/core-util/src/main/java/org/signal/core/util/ShakeDetector.java @@ -50,7 +50,7 @@ public class ShakeDetector implements SensorEventListener { if (accelerometer != null) { this.sensorManager = sensorManager; - sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST); + sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); } return accelerometer != null; diff --git a/dependencies.gradle b/dependencies.gradle index 36aa2452d1..d6fbb180a8 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -56,7 +56,7 @@ dependencyResolutionManagement { alias('androidx-concurrent-futures').to('androidx.concurrent:concurrent-futures:1.0.0') alias('androidx-autofill').to('androidx.autofill:autofill:1.0.0') alias('androidx-biometric').to('androidx.biometric:biometric:1.1.0') - alias('androidx-sharetarget').to('androidx.sharetarget:sharetarget:1.1.0') + alias('androidx-sharetarget').to('androidx.sharetarget:sharetarget:1.2.0-rc02') alias('androidx-sqlite').to('androidx.sqlite:sqlite:2.1.0') alias('androidx-core-role').to('androidx.core:core-role:1.0.0') diff --git a/device-transfer/app/src/main/AndroidManifest.xml b/device-transfer/app/src/main/AndroidManifest.xml index 7bc8f9465d..7f077f857a 100644 --- a/device-transfer/app/src/main/AndroidManifest.xml +++ b/device-transfer/app/src/main/AndroidManifest.xml @@ -12,7 +12,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.DeviceTransferTest"> - + diff --git a/device-transfer/lib/src/main/AndroidManifest.xml b/device-transfer/lib/src/main/AndroidManifest.xml index d2aa7e0a6a..ad08af0860 100644 --- a/device-transfer/lib/src/main/AndroidManifest.xml +++ b/device-transfer/lib/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + diff --git a/donations/app/src/main/AndroidManifest.xml b/donations/app/src/main/AndroidManifest.xml index 51461435c7..6b9914619b 100644 --- a/donations/app/src/main/AndroidManifest.xml +++ b/donations/app/src/main/AndroidManifest.xml @@ -10,7 +10,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.DeviceTransferTest"> - + diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 37ae8a6f94..c59628d83b 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -761,6 +761,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + diff --git a/paging/app/src/main/AndroidManifest.xml b/paging/app/src/main/AndroidManifest.xml index f6cde326c7..687310857d 100644 --- a/paging/app/src/main/AndroidManifest.xml +++ b/paging/app/src/main/AndroidManifest.xml @@ -10,7 +10,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PagingTest"> - + diff --git a/reproducible-builds/Dockerfile b/reproducible-builds/Dockerfile index 3142b2e508..94aed8982f 100644 --- a/reproducible-builds/Dockerfile +++ b/reproducible-builds/Dockerfile @@ -12,7 +12,7 @@ RUN docker/print-versions.sh docker/dependencies.txt ENV ANDROID_COMMAND_LINE_TOOLS_FILENAME commandlinetools-linux-7583922_latest.zip ENV ANDROID_API_LEVELS android-32 -ENV ANDROID_BUILD_TOOLS_VERSION 31.0.0 +ENV ANDROID_BUILD_TOOLS_VERSION 32.0.0 ENV ANDROID_HOME /usr/local/android-sdk-linux ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/bin diff --git a/spinner/app/src/main/AndroidManifest.xml b/spinner/app/src/main/AndroidManifest.xml index 65ac7a2ae3..a1d79ebcfa 100644 --- a/spinner/app/src/main/AndroidManifest.xml +++ b/spinner/app/src/main/AndroidManifest.xml @@ -12,7 +12,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PagingTest"> - +