diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 5283307b0..8ec57f140 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -177,22 +177,23 @@ public class NewConversationActivity extends ContactSelectionActivity public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); - switch (item.getItemId()) { - case android.R.id.home: - super.onBackPressed(); - return true; - case R.id.menu_refresh: - handleManualRefresh(); - return true; - case R.id.menu_new_group: - handleCreateGroup(); - return true; - case R.id.menu_invite: - handleInvite(); - return true; - } + int itemId = item.getItemId(); - return false; + if (itemId == android.R.id.home) { + super.onBackPressed(); + return true; + } else if (itemId == R.id.menu_refresh) { + handleManualRefresh(); + return true; + } else if (itemId == R.id.menu_new_group) { + handleCreateGroup(); + return true; + } else if (itemId == R.id.menu_invite) { + handleInvite(); + return true; + } else { + return false; + } } private void handleManualRefresh() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleSquareImageViewTransition.java b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleSquareImageViewTransition.java index add2d2388..05e893c18 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleSquareImageViewTransition.java +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleSquareImageViewTransition.java @@ -13,7 +13,6 @@ import android.widget.ImageView; import androidx.core.graphics.drawable.RoundedBitmapDrawable; -@TargetApi(21) abstract class CircleSquareImageViewTransition extends Transition { private static final String CIRCLE_RATIO = "CIRCLE_RATIO"; diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleToSquareImageViewTransition.java b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleToSquareImageViewTransition.java index 4c07fa0d0..959481081 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleToSquareImageViewTransition.java +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleToSquareImageViewTransition.java @@ -7,7 +7,6 @@ import android.util.AttributeSet; /** * Will only transition {@link android.widget.ImageView}s that contain a {@link androidx.core.graphics.drawable.RoundedBitmapDrawable}. */ -@TargetApi(21) public final class CircleToSquareImageViewTransition extends CircleSquareImageViewTransition { public CircleToSquareImageViewTransition(Context context, AttributeSet attrs) { super(false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/SquareToCircleImageViewTransition.java b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/SquareToCircleImageViewTransition.java index 42b513396..8849f0cad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/SquareToCircleImageViewTransition.java +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/SquareToCircleImageViewTransition.java @@ -7,7 +7,6 @@ import android.util.AttributeSet; /** * Will only transition {@link android.widget.ImageView}s that contain a {@link androidx.core.graphics.drawable.RoundedBitmapDrawable}. */ -@TargetApi(21) public final class SquareToCircleImageViewTransition extends CircleSquareImageViewTransition { public SquareToCircleImageViewTransition(Context context, AttributeSet attrs) { super(true); diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarBundler.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarBundler.kt index 786e2d70b..32bcdd66d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarBundler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarBundler.kt @@ -1,6 +1,8 @@ package org.thoughtcrime.securesms.avatar +import android.net.Uri import android.os.Bundle +import org.signal.core.util.getParcelableCompat /** * Utility class which encapsulates reading and writing Avatar objects to and from Bundles. @@ -33,7 +35,7 @@ object AvatarBundler { } fun extractPhoto(bundle: Bundle): Avatar.Photo = Avatar.Photo( - uri = requireNotNull(bundle.getParcelable(URI)), + uri = requireNotNull(bundle.getParcelableCompat(URI, Uri::class.java)), size = bundle.getLong(SIZE), databaseId = bundle.getDatabaseId() ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt index 1dd660c9e..1cae56e71 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt @@ -16,6 +16,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.Navigation import androidx.recyclerview.widget.RecyclerView import org.signal.core.util.ThreadUtil +import org.signal.core.util.getParcelableExtraCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.avatar.Avatar import org.thoughtcrime.securesms.avatar.AvatarBundler @@ -147,10 +148,9 @@ class AvatarPickerFragment : Fragment(R.layout.avatar_picker_fragment) { ViewUtil.hideKeyboard(requireContext(), requireView()) } - @Suppress("DEPRECATION") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == Activity.RESULT_OK && data != null) { - val media: Media = requireNotNull(data.getParcelableExtra(AvatarSelectionActivity.EXTRA_MEDIA)) + val media: Media = requireNotNull(data.getParcelableExtraCompat(AvatarSelectionActivity.EXTRA_MEDIA, Media::class.java)) viewModel.onAvatarPhotoSelectionCompleted(media) } else { super.onActivityResult(requestCode, resultCode, data) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/ExpiredGiftSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/ExpiredGiftSheet.kt index 47a8bdf57..44f4d7d6c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/ExpiredGiftSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/ExpiredGiftSheet.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.badges.gifts import android.os.Bundle import androidx.fragment.app.FragmentManager +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.badges.gifts.ExpiredGiftSheetConfiguration.forExpiredBadge import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter @@ -28,7 +29,7 @@ class ExpiredGiftSheet : DSLSettingsBottomSheetFragment() { } private val badge: Badge - get() = requireArguments().getParcelable(ARG_BADGE)!! + get() = requireArguments().getParcelableCompat(ARG_BADGE, Badge::class.java)!! override fun bindAdapter(adapter: DSLSettingsAdapter) { ExpiredGiftSheetConfiguration.register(adapter) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt index 1daee4a81..84f049d06 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRecipientSelectionFragment.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import org.signal.core.util.getParcelableArrayListCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey @@ -79,7 +80,7 @@ class GiftFlowRecipientSelectionFragment : Fragment(R.layout.gift_flow_recipient override fun onSearchInputFocused() = Unit override fun setResult(bundle: Bundle) { - val contacts: List = bundle.getParcelableArrayList(MultiselectForwardFragment.RESULT_SELECTION)!! + val contacts: List = bundle.getParcelableArrayListCompat(MultiselectForwardFragment.RESULT_SELECTION, ContactSearchKey.RecipientSearchKey::class.java)!! if (contacts.isNotEmpty()) { viewModel.setSelectedContact(contacts.first()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt index 30a875d1d..5f298b39a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.fragment.app.FragmentManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.DimensionUnit +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.badges.models.BadgePreview @@ -41,10 +42,10 @@ class GiftThanksSheet : DSLSettingsBottomSheetFragment() { private val lifecycleDisposable = LifecycleDisposable() private val recipientId: RecipientId - get() = requireArguments().getParcelable(ARGS_RECIPIENT_ID)!! + get() = requireArguments().getParcelableCompat(ARGS_RECIPIENT_ID, RecipientId::class.java)!! private val badge: Badge - get() = requireArguments().getParcelable(ARGS_BADGE)!! + get() = requireArguments().getParcelableCompat(ARGS_BADGE, Badge::class.java)!! override fun bindAdapter(adapter: DSLSettingsAdapter) { BadgePreview.register(adapter) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt index 144083b96..b1f27e072 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt @@ -11,6 +11,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.DimensionUnit +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.signal.libsignal.zkgroup.InvalidInputException import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation @@ -73,7 +74,7 @@ class ViewReceivedGiftBottomSheet : DSLSettingsBottomSheetFragment() { private val lifecycleDisposable = LifecycleDisposable() private val sentFrom: RecipientId - get() = requireArguments().getParcelable(ARG_SENT_FROM)!! + get() = requireArguments().getParcelableCompat(ARG_SENT_FROM, RecipientId::class.java)!! private val messageId: Long get() = requireArguments().getLong(ARG_MESSAGE_ID) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt index 650cd6c5e..63c4cbba5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt @@ -5,6 +5,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.DimensionUnit +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.gifts.viewgift.ViewGiftRepository import org.thoughtcrime.securesms.badges.models.BadgeDisplay112 @@ -41,7 +42,7 @@ class ViewSentGiftBottomSheet : DSLSettingsBottomSheetFragment() { } private val sentTo: RecipientId - get() = requireArguments().getParcelable(ARG_SENT_TO)!! + get() = requireArguments().getParcelableCompat(ARG_SENT_TO, RecipientId::class.java)!! private val giftBadge: GiftBadge get() = GiftBadge.parseFrom(requireArguments().getByteArray(ARG_GIFT_BADGE)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt index 951366bad..08f2b02bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/view/ViewBadgeBottomSheetDialogFragment.kt @@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.BadgeRepository import org.thoughtcrime.securesms.badges.models.Badge @@ -122,9 +123,9 @@ class ViewBadgeBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFr } } - private fun getStartBadge(): Badge? = requireArguments().getParcelable(ARG_START_BADGE) + private fun getStartBadge(): Badge? = requireArguments().getParcelableCompat(ARG_START_BADGE, Badge::class.java) - private fun getRecipientId(): RecipientId = requireNotNull(requireArguments().getParcelable(ARG_RECIPIENT_ID)) + private fun getRecipientId(): RecipientId = requireNotNull(requireArguments().getParcelableCompat(ARG_RECIPIENT_ID, RecipientId::class.java)) companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java index d57af4ae6..3e41116c1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java @@ -28,7 +28,6 @@ public class AlertView extends LinearLayout { initialize(attrs); } - @TargetApi(VERSION_CODES.HONEYCOMB) public AlertView(final Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialize(attrs); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt index 097733e27..67f97895e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt @@ -12,6 +12,7 @@ import androidx.annotation.Px import androidx.annotation.UiThread import androidx.core.os.bundleOf import org.signal.core.util.dp +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.mms.Slide @@ -95,8 +96,8 @@ class ConversationItemThumbnail @JvmOverloads constructor( override fun onRestoreInstanceState(state: Parcelable) { if (state is Bundle && state.containsKey(STATE_STATE)) { - val root = state.getParcelable(STATE_ROOT) - this.state = state.getParcelable(STATE_STATE)!! + val root: Parcelable? = state.getParcelableCompat(STATE_ROOT, Parcelable::class.java) + this.state = state.getParcelableCompat(STATE_STATE, ConversationItemThumbnailState::class.java)!! super.onRestoreInstanceState(root) } else { super.onRestoreInstanceState(state) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java index 92d42e898..8f24938d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java @@ -22,7 +22,6 @@ public class HidingLinearLayout extends LinearLayout { super(context, attrs); } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) public HidingLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/InsetAwareConstraintLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/InsetAwareConstraintLayout.java index 40e9c6ba6..a3405ebc3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/InsetAwareConstraintLayout.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/InsetAwareConstraintLayout.java @@ -31,7 +31,6 @@ public class InsetAwareConstraintLayout extends ConstraintLayout { } @Override - @TargetApi(20) public WindowInsets onApplyWindowInsets(WindowInsets insets) { if (Build.VERSION.SDK_INT < 30) { return super.onApplyWindowInsets(insets); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java index dda8d30d7..03b464c2f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java @@ -133,14 +133,12 @@ public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.Lo } - @TargetApi(16) @SuppressWarnings("SuspiciousNameCombination") private String getWidthColumn(int orientation) { if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.WIDTH; else return MediaStore.Images.ImageColumns.HEIGHT; } - @TargetApi(16) @SuppressWarnings("SuspiciousNameCombination") private String getHeightColumn(int orientation) { if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.HEIGHT; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java index f2cfe5f16..94be5f1e0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java @@ -23,7 +23,7 @@ public class SquareFrameLayout extends FrameLayout { this(context, attrs, 0); } - @TargetApi(VERSION_CODES.HONEYCOMB) @SuppressWarnings("unused") + @SuppressWarnings("unused") public SquareFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java b/app/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java deleted file mode 100644 index 0fd2a2329..000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.thoughtcrime.securesms.components; - -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build; -import android.util.AttributeSet; - -import androidx.preference.CheckBoxPreference; -import androidx.preference.Preference; - -import org.thoughtcrime.securesms.R; - -public class SwitchPreferenceCompat extends CheckBoxPreference { - - private Preference.OnPreferenceClickListener listener; - - public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - setLayoutRes(); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setLayoutRes(); - } - - public SwitchPreferenceCompat(Context context, AttributeSet attrs) { - super(context, attrs); - setLayoutRes(); - } - - public SwitchPreferenceCompat(Context context) { - super(context); - setLayoutRes(); - } - - private void setLayoutRes() { - setWidgetLayoutResource(R.layout.switch_compat_preference); - } - - @Override - public void setOnPreferenceClickListener(Preference.OnPreferenceClickListener listener) { - this.listener = listener; - } - - @Override - protected void onClick() { - if (listener == null || !listener.onPreferenceClick(this)) { - super.onClick(); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java b/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java index ccdd64ff2..99bf79bd5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java @@ -36,7 +36,6 @@ public class SignalMapView extends LinearLayout { initialize(context); } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) public SignalMapView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initialize(context); 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 502c46dc7..b5e08c38c 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 @@ -439,7 +439,7 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter SignalStore.donationsValues().subscriptionEndOfPeriodRedemptionStarted = 0L SignalStore.donationsValues().subscriptionEndOfPeriodConversionStarted = 0L SignalStore.donationsValues().setLastEndOfPeriod(0L) - Toast.makeText(context, "Cleared", Toast.LENGTH_SHORT) + Toast.makeText(context, "Cleared", Toast.LENGTH_SHORT).show() } ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt index ba57df3ed..355a4b909 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/NotificationsSettingsFragment.kt @@ -19,6 +19,7 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager +import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLConfiguration @@ -62,10 +63,10 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == MESSAGE_SOUND_SELECT && resultCode == Activity.RESULT_OK && data != null) { - val uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + val uri: Uri? = data.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java) viewModel.setMessageNotificationsSound(uri) } else if (requestCode == CALL_RINGTONE_SELECT && resultCode == Activity.RESULT_OK && data != null) { - val uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + val uri: Uri? = data.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java) viewModel.setCallRingtone(uri) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt index 043fa2935..d434ed235 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt @@ -15,6 +15,7 @@ import com.google.android.material.snackbar.Snackbar import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.signal.core.util.money.FiatMoney import org.signal.donations.GooglePayApi @@ -73,22 +74,22 @@ class DonationCheckoutDelegate( registerGooglePayCallback() fragment.setFragmentResultListener(GatewaySelectorBottomSheet.REQUEST_KEY) { _, bundle -> - val response: GatewayResponse = bundle.getParcelable(GatewaySelectorBottomSheet.REQUEST_KEY)!! + val response: GatewayResponse = bundle.getParcelableCompat(GatewaySelectorBottomSheet.REQUEST_KEY, GatewayResponse::class.java)!! handleGatewaySelectionResponse(response) } fragment.setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle -> - val result: DonationProcessorActionResult = bundle.getParcelable(StripePaymentInProgressFragment.REQUEST_KEY)!! + val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! handleDonationProcessorActionResult(result) } fragment.setFragmentResultListener(CreditCardFragment.REQUEST_KEY) { _, bundle -> - val result: DonationProcessorActionResult = bundle.getParcelable(StripePaymentInProgressFragment.REQUEST_KEY)!! + val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! handleDonationProcessorActionResult(result) } fragment.setFragmentResultListener(PayPalPaymentInProgressFragment.REQUEST_KEY) { _, bundle -> - val result: DonationProcessorActionResult = bundle.getParcelable(PayPalPaymentInProgressFragment.REQUEST_KEY)!! + val result: DonationProcessorActionResult = bundle.getParcelableCompat(PayPalPaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! handleDonationProcessorActionResult(result) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt index 144f1ecfe..6bad6c286 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt @@ -15,6 +15,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.navigation.navGraphViewModels +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ViewBinderDelegate import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentComponent @@ -56,7 +57,7 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { DonationCheckoutDelegate.ErrorHandler().attach(this, null, errorSource) setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle -> - val result: DonationProcessorActionResult = bundle.getParcelable(StripePaymentInProgressFragment.REQUEST_KEY)!! + val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! if (result.status == DonationProcessorActionResult.Status.SUCCESS) { findNavController().popBackStack() setFragmentResult(REQUEST_KEY, bundle) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt index 4a00cd2ac..f29165bcb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt @@ -17,6 +17,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ViewBinderDelegate @@ -122,7 +123,7 @@ class PayPalPaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog private fun routeToOneTimeConfirmation(createPaymentIntentResponse: PayPalCreatePaymentIntentResponse): Single { return Single.create { emitter -> val listener = FragmentResultListener { _, bundle -> - val result: PayPalConfirmationResult? = bundle.getParcelable(PayPalConfirmationDialogFragment.REQUEST_KEY) + val result: PayPalConfirmationResult? = bundle.getParcelableCompat(PayPalConfirmationDialogFragment.REQUEST_KEY, PayPalConfirmationResult::class.java) if (result != null) { emitter.onSuccess(result) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt index 6861a31bb..9ef58d5d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt @@ -16,6 +16,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.signal.donations.StripeApi import org.signal.donations.StripeIntentAccessor @@ -125,7 +126,7 @@ class StripePaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog Log.d(TAG, "3DS action required. Displaying dialog...") Single.create { emitter -> val listener = FragmentResultListener { _, bundle -> - val result: StripeIntentAccessor? = bundle.getParcelable(Stripe3DSDialogFragment.REQUEST_KEY) + val result: StripeIntentAccessor? = bundle.getParcelableCompat(Stripe3DSDialogFragment.REQUEST_KEY, StripeIntentAccessor::class.java) if (result != null) { emitter.onSuccess(result) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 5eec0e595..22783d4a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -26,6 +26,7 @@ import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.signal.core.util.DimensionUnit +import org.signal.core.util.getParcelableArrayListExtraCompat import org.thoughtcrime.securesms.AvatarPreviewActivity import org.thoughtcrime.securesms.BlockUnblockDialog import org.thoughtcrime.securesms.InviteActivity @@ -172,7 +173,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { REQUEST_CODE_ADD_MEMBERS_TO_GROUP -> if (data != null) { - val selected: List = requireNotNull(data.getParcelableArrayListExtra(PushContactSelectionActivity.KEY_SELECTED_RECIPIENTS)) + val selected: List = requireNotNull(data.getParcelableArrayListExtraCompat(PushContactSelectionActivity.KEY_SELECTED_RECIPIENTS, RecipientId::class.java)) val progress: SimpleProgressDialog.DismissibleDialog = SimpleProgressDialog.showDelayed(requireContext()) viewModel.onAddToGroupComplete(selected) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt index d218e0f70..a03ebb4e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/sounds/custom/CustomNotificationsSettingsFragment.kt @@ -11,6 +11,7 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.viewModels +import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLConfiguration @@ -67,7 +68,7 @@ class CustomNotificationsSettingsFragment : DSLSettingsFragment(R.string.CustomN val data = result.data if (resultCode == Activity.RESULT_OK && data != null) { - val uri: Uri? = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + val uri: Uri? = data.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java) resultHandler(uri) } } 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 46fb4ae40..5e4112e67 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -1313,7 +1313,6 @@ public class ConversationParentFragment extends Fragment }); } - @TargetApi(Build.VERSION_CODES.KITKAT) private void handleMakeDefaultSms() { startActivityForResult(SmsUtil.getSmsRoleIntent(requireContext()), SMS_DEFAULT); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt index dada7a511..9d3badbb2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardActivity.kt @@ -9,6 +9,8 @@ import androidx.appcompat.widget.Toolbar import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import org.signal.core.util.getParcelableArrayListExtraCompat +import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FragmentWrapperActivity @@ -22,7 +24,7 @@ open class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectFo private const val ARGS = "args" } - private val args: MultiselectForwardFragmentArgs get() = intent.getParcelableExtra(ARGS)!! + private val args: MultiselectForwardFragmentArgs get() = intent.getParcelableExtraCompat(ARGS, MultiselectForwardFragmentArgs::class.java)!! override val contentViewId: Int = R.layout.multiselect_forward_activity @@ -73,7 +75,7 @@ open class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectFo } else if (intent == null || !intent.hasExtra(RESULT_SELECTION)) { throw IllegalStateException("Selection contract requires a selection.") } else { - val selection: List = intent.getParcelableArrayListExtra(RESULT_SELECTION)!! + val selection: List = intent.getParcelableArrayListExtraCompat(RESULT_SELECTION, ContactSearchKey.RecipientSearchKey::class.java)!! selection } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt index a8c6fe8f0..7898abc15 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt @@ -27,6 +27,8 @@ import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.signal.core.util.getParcelableArrayListCompat +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.color.ViewColorSet @@ -103,7 +105,7 @@ class MultiselectForwardFragment : } private val args: MultiselectForwardFragmentArgs by lazy { - requireArguments().getParcelable(ARGS)!! + requireArguments().getParcelableCompat(ARGS, MultiselectForwardFragmentArgs::class.java)!! } override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater { @@ -251,13 +253,13 @@ class MultiselectForwardFragment : } setFragmentResultListener(CreateStoryWithViewersFragment.REQUEST_KEY) { _, bundle -> - val recipientId: RecipientId = bundle.getParcelable(CreateStoryWithViewersFragment.STORY_RECIPIENT)!! + val recipientId: RecipientId = bundle.getParcelableCompat(CreateStoryWithViewersFragment.STORY_RECIPIENT, RecipientId::class.java)!! contactSearchMediator.setKeysSelected(setOf(ContactSearchKey.RecipientSearchKey(recipientId, true))) contactFilterView.clear() } setFragmentResultListener(ChooseGroupStoryBottomSheet.GROUP_STORY) { _, bundle -> - val groups: Set = bundle.getParcelableArrayList(ChooseGroupStoryBottomSheet.RESULT_SET)?.toSet() ?: emptySet() + val groups: Set = bundle.getParcelableArrayListCompat(ChooseGroupStoryBottomSheet.RESULT_SET, RecipientId::class.java)?.toSet() ?: emptySet() val keys: Set = groups.map { ContactSearchKey.RecipientSearchKey(it, true) }.toSet() contactSearchMediator.addToVisibleGroupStories(keys) contactSearchMediator.setKeysSelected(keys) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index ca593df23..05c57c3ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -575,28 +575,38 @@ public class ConversationListFragment extends MainFragment implements ActionMode public boolean onOptionsItemSelected(@NonNull MenuItem item) { super.onOptionsItemSelected(item); - switch (item.getItemId()) { - case R.id.menu_new_group: - handleCreateGroup(); return true; - case R.id.menu_settings: - handleDisplaySettings(); return true; - case R.id.menu_clear_passphrase: - handleClearPassphrase(); return true; - case R.id.menu_mark_all_read: - handleMarkAllRead(); return true; - case R.id.menu_invite: - handleInvite(); return true; - case R.id.menu_insights: - handleInsights(); return true; - case R.id.menu_notification_profile: - handleNotificationProfile(); return true; - case R.id.menu_filter_unread_chats: - handleFilterUnreadChats(); return true; - case R.id.menu_clear_unread_filter: - onClearFilterClick(); return true; - } + int itemId = item.getItemId(); - return false; + if (itemId == R.id.menu_new_group) { + handleCreateGroup(); + return true; + } else if (itemId == R.id.menu_settings) { + handleDisplaySettings(); + return true; + } else if (itemId == R.id.menu_clear_passphrase) { + handleClearPassphrase(); + return true; + } else if (itemId == R.id.menu_mark_all_read) { + handleMarkAllRead(); + return true; + } else if (itemId == R.id.menu_invite) { + handleInvite(); + return true; + } else if (itemId == R.id.menu_insights) { + handleInsights(); + return true; + } else if (itemId == R.id.menu_notification_profile) { + handleNotificationProfile(); + return true; + } else if (itemId == R.id.menu_filter_unread_chats) { + handleFilterUnreadChats(); + return true; + } else if (itemId == R.id.menu_clear_unread_filter) { + onClearFilterClick(); + return true; + } else { + return false; + } } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView.kt index 55c93bb04..286aab95a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView.kt @@ -14,6 +14,7 @@ import androidx.core.content.ContextCompat import androidx.core.os.bundleOf import androidx.core.view.doOnNextLayout import com.google.android.material.animation.ArgbEvaluatorCompat +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.animation.AnimationCompleteListener import org.thoughtcrime.securesms.databinding.ConversationListFilterPullViewBinding @@ -89,7 +90,7 @@ class ConversationListFilterPullView @JvmOverloads constructor( override fun onRestoreInstanceState(state: Parcelable?) { val bundle = state as Bundle - val root: Parcelable? = bundle.getParcelable(INSTANCE_STATE_ROOT) + val root: Parcelable? = bundle.getParcelableCompat(INSTANCE_STATE_ROOT, Parcelable::class.java) super.onRestoreInstanceState(root) val restoredState: FilterPullState = FilterPullState.valueOf(bundle.getString(INSTANCE_STATE_STATE)!!) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt index 6ab9adb57..6f2c08422 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt @@ -34,7 +34,6 @@ import org.signal.core.util.withinTransaction import org.signal.libsignal.zkgroup.groups.GroupMasterKey import org.signal.storageservice.protos.groups.Member import org.signal.storageservice.protos.groups.local.DecryptedGroup -import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember import org.thoughtcrime.securesms.contacts.paged.ContactSearchSortOrder import org.thoughtcrime.securesms.contacts.paged.collections.ContactSearchIterator import org.thoughtcrime.securesms.crypto.SenderKeyUtil @@ -670,7 +669,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT * There was a point in time where we weren't properly responding to group creates on linked devices. This would result in us having a Recipient entry for the * group, but we'd either be missing the group entry, or that entry would be missing a master key. This method fixes this scenario. */ - fun fixMissingMasterKey(authServiceId: ServiceId?, groupMasterKey: GroupMasterKey) { + fun fixMissingMasterKey(groupMasterKey: GroupMasterKey) { val groupId = GroupId.v2(groupMasterKey) if (getGroupV1ByExpectedV2(groupId).isPresent) { Log.w(TAG, "There already exists a V1 group that should be migrated into this group. But if the recipient already exists, there's not much we can do here.") @@ -1206,7 +1205,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT if (memberLevel.isAbsent()) { memberLevel = DecryptedGroupUtil.findRequestingByUuid(decryptedGroup.requestingMembersList, serviceId.get().uuid()) - .map { m: DecryptedRequestingMember? -> MemberLevel.REQUESTING_MEMBER } + .map { _ -> MemberLevel.REQUESTING_MEMBER } } return if (memberLevel.isPresent) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt index 1a50595f4..c127dadab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.keyvalue +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.preference.PreferenceManager @@ -358,6 +359,8 @@ internal class AccountValues internal constructor(store: KeyValueStore) : Signal } /** Do not alter. If you need to migrate more stuff, create a new method. */ + @SuppressLint("ApplySharedPref") + @Suppress("DEPRECATION") private fun migrateFromSharedPrefsV2(context: Context) { Log.i(TAG, "[V2] Migrating account values from shared prefs.") diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java index 2afd6b86f..464ed30fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/KbsSplashFragment.java @@ -87,16 +87,15 @@ public final class KbsSplashFragment extends Fragment { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_pin_learn_more: - onLearnMore(); - return true; - case R.id.menu_pin_skip: - onPinSkipped(); - return true; + if (item.getItemId() == R.id.menu_pin_learn_more) { + onLearnMore(); + return true; + } else if (item.getItemId() == R.id.menu_pin_skip) { + onPinSkipped(); + return true; + } else { + return false; } - - return false; } private void setUpRegLockEnabled() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt index 021579f60..339f7a907 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaIntentFactory.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.os.Parcelable import kotlinx.parcelize.Parcelize import org.signal.core.util.dp +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.database.MediaTable import org.thoughtcrime.securesms.database.MediaTable.MediaRecord @@ -45,7 +46,7 @@ object MediaIntentFactory { ) : Parcelable @JvmStatic - fun requireArguments(bundle: Bundle): MediaPreviewArgs = bundle.getParcelable(ARGS_KEY)!! + fun requireArguments(bundle: Bundle): MediaPreviewArgs = bundle.getParcelableCompat(ARGS_KEY, MediaPreviewArgs::class.java)!! @JvmStatic fun create(context: Context, args: MediaPreviewArgs): Intent { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java index 3764f8a85..455d55368 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java @@ -308,14 +308,12 @@ public class MediaRepository { return media.size() > 0 ? Optional.of(media.get(0)) : Optional.empty(); } - @TargetApi(16) @SuppressWarnings("SuspiciousNameCombination") private String getWidthColumn(int orientation) { if (orientation == 0 || orientation == 180) return Images.Media.WIDTH; else return Images.Media.HEIGHT; } - @TargetApi(16) @SuppressWarnings("SuspiciousNameCombination") private String getHeightColumn(int orientation) { if (orientation == 0 || orientation == 180) return Images.Media.HEIGHT; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt index 5581dde6f..10219168e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt @@ -6,6 +6,7 @@ import android.os.Parcelable import kotlinx.parcelize.Parceler import kotlinx.parcelize.Parcelize import kotlinx.parcelize.TypeParceler +import org.signal.core.util.getParcelableExtraCompat import org.thoughtcrime.securesms.conversation.MessageSendType import org.thoughtcrime.securesms.database.model.Mention import org.thoughtcrime.securesms.database.model.StoryType @@ -43,7 +44,7 @@ class MediaSendActivityResult( @JvmStatic fun fromData(data: Intent): MediaSendActivityResult { - return data.getParcelableExtra(EXTRA_RESULT) ?: throw IllegalArgumentException() + return data.getParcelableExtraCompat(EXTRA_RESULT, MediaSendActivityResult::class.java) ?: throw IllegalArgumentException() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt index 6c81af3e0..93ebc5290 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt @@ -22,6 +22,8 @@ import androidx.transition.AutoTransition import androidx.transition.TransitionManager import com.google.android.material.animation.ArgbEvaluatorCompat import org.signal.core.util.BreakIteratorCompat +import org.signal.core.util.getParcelableArrayListExtraCompat +import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.PassphraseRequiredActivity import org.thoughtcrime.securesms.R @@ -89,8 +91,8 @@ class MediaSelectionActivity : WindowUtil.setNavigationBarColor(this, 0x01000000) WindowUtil.setStatusBarColor(window, Color.TRANSPARENT) - val sendType: MessageSendType = requireNotNull(intent.getParcelableExtra(MESSAGE_SEND_TYPE)) - val initialMedia: List = intent.getParcelableArrayListExtra(MEDIA) ?: listOf() + val sendType: MessageSendType = requireNotNull(intent.getParcelableExtraCompat(MESSAGE_SEND_TYPE, MessageSendType::class.java)) + val initialMedia: List = intent.getParcelableArrayListExtraCompat(MEDIA, Media::class.java) ?: listOf() val message: CharSequence? = if (shareToTextStory) null else draftText val isReply: Boolean = intent.getBooleanExtra(IS_REPLY, false) val isAddToGroupStoryFlow: Boolean = intent.getBooleanExtra(IS_ADD_TO_GROUP_STORY_FLOW, false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionDestination.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionDestination.kt index 414603cec..362cc2a54 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionDestination.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionDestination.kt @@ -1,6 +1,8 @@ package org.thoughtcrime.securesms.mediasend.v2 import android.os.Bundle +import org.signal.core.util.getParcelableArrayListCompat +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.recipients.RecipientId @@ -89,9 +91,9 @@ sealed class MediaSelectionDestination { return when { bundle.containsKey(WALLPAPER) -> Wallpaper bundle.containsKey(AVATAR) -> Avatar - bundle.containsKey(RECIPIENT) -> SingleRecipient(requireNotNull(bundle.getParcelable(RECIPIENT))) - bundle.containsKey(STORY) -> SingleStory(requireNotNull(bundle.getParcelable(STORY))) - bundle.containsKey(RECIPIENT_LIST) -> MultipleRecipients.fromParcel(requireNotNull(bundle.getParcelableArrayList(RECIPIENT_LIST))) + bundle.containsKey(RECIPIENT) -> SingleRecipient(requireNotNull(bundle.getParcelableCompat(RECIPIENT, RecipientId::class.java))) + bundle.containsKey(STORY) -> SingleStory(requireNotNull(bundle.getParcelableCompat(STORY, RecipientId::class.java))) + bundle.containsKey(RECIPIENT_LIST) -> MultipleRecipients.fromParcel(requireNotNull(bundle.getParcelableArrayListCompat(RECIPIENT_LIST, ContactSearchKey.RecipientSearchKey::class.java))) else -> ChooseAfterMediaSelection } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt index 6ca26a2a2..9e28b0f30 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt @@ -19,6 +19,8 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject import org.signal.core.util.BreakIteratorCompat +import org.signal.core.util.getParcelableArrayListCompat +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.components.mention.MentionAnnotation import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversation.MessageSendType @@ -408,16 +410,16 @@ class MediaSelectionViewModel( } fun onRestoreState(savedInstanceState: Bundle) { - val selection: List = savedInstanceState.getParcelableArrayList(STATE_SELECTION) ?: emptyList() - val focused: Media? = savedInstanceState.getParcelable(STATE_FOCUSED) + val selection: List = savedInstanceState.getParcelableArrayListCompat(STATE_SELECTION, Media::class.java) ?: emptyList() + val focused: Media? = savedInstanceState.getParcelableCompat(STATE_FOCUSED, Media::class.java) val quality: SentMediaQuality = SentMediaQuality.fromCode(savedInstanceState.getInt(STATE_QUALITY)) val message: CharSequence? = savedInstanceState.getCharSequence(STATE_MESSAGE) val viewOnce: MediaSelectionState.ViewOnceToggleState = MediaSelectionState.ViewOnceToggleState.fromCode(savedInstanceState.getInt(STATE_VIEW_ONCE)) val touchEnabled: Boolean = savedInstanceState.getBoolean(STATE_TOUCH_ENABLED) val sent: Boolean = savedInstanceState.getBoolean(STATE_SENT) - val cameraFirstCapture: Media? = savedInstanceState.getParcelable(STATE_CAMERA_FIRST_CAPTURE) + val cameraFirstCapture: Media? = savedInstanceState.getParcelableCompat(STATE_CAMERA_FIRST_CAPTURE, Media::class.java) - val editorStates: List = savedInstanceState.getParcelableArrayList(STATE_EDITORS) ?: emptyList() + val editorStates: List = savedInstanceState.getParcelableArrayListCompat(STATE_EDITORS, Bundle::class.java) ?: emptyList() val editorStateMap = editorStates.associate { it.toAssociation() } selectedMediaSubject.onNext(selection) @@ -438,7 +440,7 @@ class MediaSelectionViewModel( } private fun Bundle.toAssociation(): Pair { - val key: Uri = requireNotNull(getParcelable(BUNDLE_URI)) + val key: Uri = requireNotNull(getParcelableCompat(BUNDLE_URI, Uri::class.java)) val value: Any = if (getBoolean(BUNDLE_IS_IMAGE)) { ImageEditorFragment.Data(this) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gif/MediaReviewGifPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gif/MediaReviewGifPageFragment.kt index 28470095f..2aece3bfa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gif/MediaReviewGifPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gif/MediaReviewGifPageFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mediasend.MediaSendGifFragment import org.thoughtcrime.securesms.mediasend.v2.HudCommand @@ -49,7 +50,7 @@ class MediaReviewGifPageFragment : Fragment(R.layout.fragment_container) { } } - private fun requireUri(): Uri = requireNotNull(requireArguments().getParcelable(ARG_URI)) + private fun requireUri(): Uri = requireNotNull(requireArguments().getParcelableCompat(ARG_URI, Uri::class.java)) companion object { private const val ARG_URI = "arg.uri" diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/images/MediaReviewImagePageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/images/MediaReviewImagePageFragment.kt index 4032f9c89..f7c56ad59 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/images/MediaReviewImagePageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/images/MediaReviewImagePageFragment.kt @@ -6,6 +6,7 @@ import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import io.reactivex.rxjava3.disposables.Disposable +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mediasend.v2.HudCommand import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel @@ -97,7 +98,7 @@ class MediaReviewImagePageFragment : Fragment(R.layout.fragment_container), Imag } } - private fun requireUri(): Uri = requireNotNull(requireArguments().getParcelable(ARG_URI)) + private fun requireUri(): Uri = requireNotNull(requireArguments().getParcelableCompat(ARG_URI, Uri::class.java)) override fun onTouchEventsNeeded(needed: Boolean) { if (isResumed) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt index aceba590e..79ba7a32b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/ChooseGroupStoryBottomSheet.kt @@ -13,6 +13,7 @@ import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.setFragmentResult import androidx.recyclerview.widget.RecyclerView import org.signal.core.util.DimensionUnit +import org.signal.core.util.getParcelableArrayListCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment import org.thoughtcrime.securesms.contacts.paged.ContactSearchAdapter @@ -159,7 +160,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment( object ResultContract { fun getRecipientIds(bundle: Bundle): List { - return bundle.getParcelableArrayList(RESULT_SET)!! + return bundle.getParcelableArrayListCompat(RESULT_SET, RecipientId::class.java)!! } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/StoriesMultiselectForwardActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/StoriesMultiselectForwardActivity.kt index 879e21b49..cc2597455 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/StoriesMultiselectForwardActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/stories/StoriesMultiselectForwardActivity.kt @@ -11,6 +11,7 @@ import androidx.activity.result.contract.ActivityResultContract import androidx.fragment.app.FragmentManager import com.bumptech.glide.Glide import kotlinx.parcelize.Parcelize +import org.signal.core.util.getParcelableArrayListExtraCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey @@ -34,7 +35,7 @@ class StoriesMultiselectForwardActivity : MultiselectForwardActivity() { val preview1View: ImageView = findViewById(R.id.preview_media_1) val preview2View: ImageView = findViewById(R.id.preview_media_2) - val previewMedia: List = intent.getParcelableArrayListExtra(PREVIEW_MEDIA)!! + val previewMedia: List = intent.getParcelableArrayListExtraCompat(PREVIEW_MEDIA, Uri::class.java)!! preview1View.visible = previewMedia.isNotEmpty() preview2View.visible = previewMedia.size > 1 diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationViewModel.kt index 0079155c5..305427097 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationViewModel.kt @@ -15,6 +15,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import io.reactivex.rxjava3.subjects.Subject +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.dependencies.ApplicationDependencies @@ -67,7 +68,7 @@ class TextStoryPostCreationViewModel(private val repository: TextStoryPostSendRe fun restoreFromInstanceState(inState: Bundle) { if (inState.containsKey(TEXT_STORY_INSTANCE_STATE)) { - val state: TextStoryPostCreationState = inState.getParcelable(TEXT_STORY_INSTANCE_STATE)!! + val state: TextStoryPostCreationState = inState.getParcelableCompat(TEXT_STORY_INSTANCE_STATE, TextStoryPostCreationState::class.java)!! textFontSubject.onNext(store.state.textFont) store.update { state } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/videos/MediaReviewVideoPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/videos/MediaReviewVideoPageFragment.kt index 3afb821ff..5a462c249 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/videos/MediaReviewVideoPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/videos/MediaReviewVideoPageFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mediasend.VideoEditorFragment import org.thoughtcrime.securesms.mediasend.v2.HudCommand @@ -99,7 +100,7 @@ class MediaReviewVideoPageFragment : Fragment(R.layout.fragment_container), Vide } } - private fun requireUri(): Uri = requireNotNull(requireArguments().getParcelable(ARG_URI)) + private fun requireUri(): Uri = requireNotNull(requireArguments().getParcelableCompat(ARG_URI, Uri::class.java)) private fun requireMaxCompressedVideoSize(): Long = sharedViewModel.getMediaConstraints().getCompressedVideoMaxSize(requireContext()).toLong() private fun requireMaxAttachmentSize(): Long = sharedViewModel.getMediaConstraints().getVideoMaxSize(requireContext()).toLong() private fun requireIsVideoGif(): Boolean = requireNotNull(requireArguments().getBoolean(ARG_IS_VIDEO_GIF)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index 94421b6b6..1c06a8c71 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -825,7 +825,7 @@ public final class MessageContentProcessor { warn(content.getTimestamp(), "Group message missing destination uuid, defaulting to ACI"); authServiceId = SignalStore.account().requireAci(); } - SignalDatabase.groups().fixMissingMasterKey(authServiceId, group.getMasterKey()); + SignalDatabase.groups().fixMissingMasterKey(group.getMasterKey()); } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java index 44df11a52..645cac286 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java @@ -55,17 +55,15 @@ public class IncomingLollipopMmsConnection extends LollipopMmsConnection impleme super(context, ACTION); } - @TargetApi(VERSION_CODES.LOLLIPOP) @Override public synchronized void onResult(Context context, Intent intent) { - if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP_MR1) { + if (VERSION.SDK_INT >= 22) { Log.i(TAG, "HTTP status: " + intent.getIntExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, -1)); } Log.i(TAG, "code: " + getResultCode() + ", result string: " + getResultData()); } @Override - @TargetApi(VERSION_CODES.LOLLIPOP) public synchronized @Nullable RetrieveConf retrieve(@NonNull String contentLocation, byte[] transactionId, int subscriptionId) throws MmsException diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java index a2371cae7..8ba7ce58e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java @@ -50,10 +50,10 @@ public class OutgoingLollipopMmsConnection extends LollipopMmsConnection impleme super(context, ACTION); } - @TargetApi(VERSION_CODES.LOLLIPOP_MR1) + @TargetApi(22) @Override public synchronized void onResult(Context context, Intent intent) { - if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP_MR1) { + if (VERSION.SDK_INT >= 22) { Log.i(TAG, "HTTP status: " + intent.getIntExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, -1)); } @@ -61,7 +61,6 @@ public class OutgoingLollipopMmsConnection extends LollipopMmsConnection impleme } @Override - @TargetApi(VERSION_CODES.LOLLIPOP) public @Nullable synchronized SendConf send(@NonNull byte[] pduBytes, int subscriptionId) throws UndeliverableMessageException { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/Camera.java b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/Camera.java index 30f67b0f3..055165310 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/Camera.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/Camera.java @@ -204,7 +204,6 @@ public class Camera implements CameraControl, CameraVideoCapturer.CameraSwitchHa cameraEventListener.onCameraSwitchCompleted(new CameraState(getActiveDirection(), getCount())); } - @TargetApi(21) private static class FilteredCamera2Enumerator extends Camera2Enumerator { private static final String TAG = Log.tag(Camera2Enumerator.class); diff --git a/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheet.kt index e96593781..ef4864305 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/safety/SafetyNumberBottomSheet.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.safety import android.content.Context import android.os.Bundle import androidx.fragment.app.FragmentManager +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog import org.thoughtcrime.securesms.database.model.IdentityRecord @@ -126,7 +127,7 @@ object SafetyNumberBottomSheet { * @throws IllegalArgumentException if the bundle does not contain the correct parcelized arguments. */ fun getArgsFromBundle(bundle: Bundle): SafetyNumberBottomSheetArgs { - val args = bundle.getParcelable(ARGS) + val args: SafetyNumberBottomSheetArgs? = bundle.getParcelableCompat(ARGS, SafetyNumberBottomSheetArgs::class.java) Preconditions.checkArgument(args != null) return args!! } diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/TextEntryDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/scribbles/TextEntryDialogFragment.kt index b37e7f704..e6635763b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/TextEntryDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/TextEntryDialogFragment.kt @@ -12,6 +12,7 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.AppCompatSeekBar import androidx.fragment.app.FragmentManager import com.airbnb.lottie.SimpleColorFilter +import org.signal.core.util.getParcelableCompat import org.signal.imageeditor.core.HiddenEditText import org.signal.imageeditor.core.model.EditorElement import org.signal.imageeditor.core.renderers.MultiLineTextRenderer @@ -42,7 +43,7 @@ class TextEntryDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_im dismissAllowingStateLoss() } - val element: EditorElement = requireNotNull(requireArguments().getParcelable("element")) + val element: EditorElement = requireNotNull(requireArguments().getParcelableCompat("element", EditorElement::class.java)) val incognito = requireArguments().getBoolean("incognito") val selectAll = requireArguments().getBoolean("selectAll") diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt index 7fbfb0fdf..2c1c21075 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt @@ -14,6 +14,9 @@ import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutManagerCompat import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.Result +import org.signal.core.util.getParcelableArrayListCompat +import org.signal.core.util.getParcelableArrayListExtraCompat +import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.MainActivity import org.thoughtcrime.securesms.PassphraseRequiredActivity @@ -135,7 +138,7 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C throw AssertionError("Expected a recipient selection!") } - val contactSearchKeys: List = bundle.getParcelableArrayList(MultiselectForwardFragment.RESULT_SELECTION)!! + val contactSearchKeys: List = bundle.getParcelableArrayListCompat(MultiselectForwardFragment.RESULT_SELECTION, ContactSearchKey.RecipientSearchKey::class.java)!! viewModel.onContactSelectionConfirmed(contactSearchKeys) } @@ -161,12 +164,12 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C } ?: Result.failure(IntentError.SEND_MULTIPLE_TEXT) } intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_STREAM) -> { - intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM)?.let { + intent.getParcelableArrayListExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)?.let { Result.success(UnresolvedShareData.ExternalMultiShare(it)) } ?: Result.failure(IntentError.SEND_MULTIPLE_STREAM) } intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_STREAM) -> { - intent.getParcelableExtra(Intent.EXTRA_STREAM)?.let { + intent.getParcelableExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)?.let { Result.success(UnresolvedShareData.ExternalSingleShare(it, intent.type)) } ?: extractSingleExtraTextFromIntent(IntentError.SEND_STREAM) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/GroupV2RecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/GroupV2RecordProcessor.java index 188759f5a..dedfcc169 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/GroupV2RecordProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/GroupV2RecordProcessor.java @@ -58,7 +58,7 @@ public final class GroupV2RecordProcessor extends DefaultStorageRecordProcessor< return StorageSyncModels.localToRemoteRecord(settings); } else { Log.w(TAG, "No local master key. Assuming it matches remote since the groupIds match. Enqueuing a fetch to fix the bad state."); - groupDatabase.fixMissingMasterKey(null, record.getMasterKeyOrThrow()); + groupDatabase.fixMissingMasterKey(record.getMasterKeyOrThrow()); return StorageSyncModels.localToRemoteRecord(settings, record.getMasterKeyOrThrow()); } }) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt index f9af7118b..35a50f223 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt @@ -8,6 +8,7 @@ import android.view.View import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.blurhash.BlurHash import org.thoughtcrime.securesms.dependencies.ApplicationDependencies @@ -135,7 +136,7 @@ class StorySlateView @JvmOverloads constructor( override fun onRestoreInstanceState(state: Parcelable?) { if (state is Bundle) { - val rootState: Parcelable? = state.getParcelable("ROOT") + val rootState: Parcelable? = state.getParcelableCompat("ROOT", Parcelable::class.java) this.state = State.fromCode(state.getInt("STATE", State.HIDDEN.code)) this.postId = state.getLong("ID") super.onRestoreInstanceState(rootState) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt index 8696a57c1..eb570126f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt @@ -16,6 +16,7 @@ import com.bumptech.glide.load.ResourceDecoder import com.bumptech.glide.load.engine.Resource import com.bumptech.glide.load.resource.SimpleResource import org.signal.core.util.concurrent.safeBlockingGet +import org.signal.core.util.readParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.database.SignalDatabase @@ -80,7 +81,7 @@ data class StoryTextPostModel( return StoryTextPostModel( storyTextPost = StoryTextPost.parseFrom(ParcelUtil.readByteArray(parcel)), storySentAtMillis = parcel.readLong(), - storyAuthor = parcel.readParcelable(RecipientId::class.java.classLoader)!!, + storyAuthor = parcel.readParcelableCompat(RecipientId::class.java)!!, bodyRanges = ParcelUtil.readByteArray(parcel)?.let { BodyRangeList.parseFrom(it) } ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt index 2412cc947..d20b86030 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt @@ -15,6 +15,8 @@ import androidx.window.layout.WindowMetricsCalculator import com.bumptech.glide.Glide import com.bumptech.glide.MemoryCategory import org.signal.core.util.dp +import org.signal.core.util.getParcelableCompat +import org.signal.core.util.getParcelableExtraCompat import org.signal.core.util.sp import org.thoughtcrime.securesms.PassphraseRequiredActivity import org.thoughtcrime.securesms.R @@ -45,7 +47,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { if (savedInstanceState != null) { - val cache: StoryViewStateCache? = savedInstanceState.getParcelable(DATA_CACHE) + val cache: StoryViewStateCache? = savedInstanceState.getParcelableCompat(DATA_CACHE, StoryViewStateCache::class.java) if (cache != null) { storyViewStateViewModel.storyViewStateCache.putAll(cache) } @@ -125,7 +127,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll supportFragmentManager.beginTransaction() .replace( R.id.fragment_container, - StoryViewerFragment.create(intent.getParcelableExtra(ARGS)!!) + StoryViewerFragment.create(intent.getParcelableExtraCompat(ARGS, StoryViewerArgs::class.java)!!) ) .commit() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt index 21c65ea23..417fb9e26 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerFragment.kt @@ -11,6 +11,8 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.viewpager2.widget.ViewPager2 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import org.signal.core.util.getParcelableArrayListCompat +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient @@ -42,7 +44,7 @@ class StoryViewerFragment : private val lifecycleDisposable = LifecycleDisposable() - private val storyViewerArgs: StoryViewerArgs by lazy { requireArguments().getParcelable(ARGS)!! } + private val storyViewerArgs: StoryViewerArgs by lazy { requireArguments().getParcelableCompat(ARGS, StoryViewerArgs::class.java)!! } private lateinit var storyCrossfader: StoriesSharedElementCrossFaderView @@ -120,7 +122,7 @@ class StoryViewerFragment : } if (savedInstanceState != null && savedInstanceState.containsKey(HIDDEN)) { - val ids: List = savedInstanceState.getParcelableArrayList(HIDDEN)!! + val ids: List = savedInstanceState.getParcelableArrayListCompat(HIDDEN, RecipientId::class.java)!! viewModel.addHiddenAndRefresh(ids.toSet()) } else { viewModel.refresh() diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index 24203c808..0ceeca9e2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -36,6 +36,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import org.signal.core.util.DimensionUnit import org.signal.core.util.dp +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.animation.AnimationCompleteListener @@ -153,7 +154,9 @@ class StoryViewerPageFragment : private var sendingProgressDrawable: IndeterminateDrawable? = null - private val storyViewerPageArgs: StoryViewerPageArgs by lazy(LazyThreadSafetyMode.NONE) { requireArguments().getParcelable(ARGS)!! } + private val storyViewerPageArgs: StoryViewerPageArgs by lazy(LazyThreadSafetyMode.NONE) { + requireArguments().getParcelableCompat(ARGS, StoryViewerPageArgs::class.java)!! + } @SuppressLint("ClickableViewAccessibility") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt index b019e2235..766d47fa7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.KeyboardEntryDialogFragment import org.thoughtcrime.securesms.components.emoji.EmojiEventListener @@ -60,7 +61,7 @@ class StoryDirectReplyDialogFragment : get() = requireArguments().getLong(ARG_STORY_ID) private val recipientId: RecipientId? - get() = requireArguments().getParcelable(ARG_RECIPIENT_ID) + get() = requireArguments().getParcelableCompat(ARG_RECIPIENT_ID, RecipientId::class.java) override val withDim: Boolean = true diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt index 260788c14..892a11c65 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt @@ -11,6 +11,7 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.viewModels import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment import org.thoughtcrime.securesms.recipients.RecipientId @@ -34,7 +35,7 @@ class StoryGroupReplyBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDi get() = requireArguments().getLong(ARG_STORY_ID) private val groupRecipientId: RecipientId - get() = requireArguments().getParcelable(ARG_GROUP_RECIPIENT_ID)!! + get() = requireArguments().getParcelableCompat(ARG_GROUP_RECIPIENT_ID, RecipientId::class.java)!! private val isFromNotification: Boolean get() = requireArguments().getBoolean(ARG_IS_FROM_NOTIFICATION, false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt index a33afd388..0948ba27f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt @@ -18,6 +18,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.concurrent.SignalExecutors +import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment @@ -132,7 +133,7 @@ class StoryGroupReplyFragment : get() = requireArguments().getLong(ARG_STORY_ID) private val groupRecipientId: RecipientId - get() = requireArguments().getParcelable(ARG_GROUP_RECIPIENT_ID)!! + get() = requireArguments().getParcelableCompat(ARG_GROUP_RECIPIENT_ID, RecipientId::class.java)!! private val isFromNotification: Boolean get() = requireArguments().getBoolean(ARG_IS_FROM_NOTIFICATION, false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt index 111270972..7d3492a55 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt @@ -15,6 +15,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment import org.thoughtcrime.securesms.recipients.RecipientId @@ -41,7 +42,7 @@ class StoryViewsAndRepliesDialogFragment : FixedRoundedCornerBottomSheetDialogFr get() = requireArguments().getLong(ARG_STORY_ID) private val groupRecipientId: RecipientId - get() = requireArguments().getParcelable(ARG_GROUP_RECIPIENT_ID)!! + get() = requireArguments().getParcelableCompat(ARG_GROUP_RECIPIENT_ID, RecipientId::class.java)!! private val startPageIndex: Int get() = requireArguments().getInt(ARG_START_PAGE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java index f6ec2f18c..0b5c43f75 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java @@ -392,7 +392,6 @@ public class Util { } } - @TargetApi(VERSION_CODES.LOLLIPOP) public static boolean isMmsCapable(Context context) { return (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) || OutgoingLegacyMmsConnection.isConnectionPossible(context); } @@ -418,12 +417,10 @@ public class Util { else return Uri.parse(uri); } - @TargetApi(VERSION_CODES.KITKAT) public static boolean isLowMemory(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - return (VERSION.SDK_INT >= VERSION_CODES.KITKAT && activityManager.isLowRamDevice()) || - activityManager.getLargeMemoryClass() <= 64; + return activityManager.isLowRamDevice() || activityManager.getLargeMemoryClass() <= 64; } public static int clamp(int value, int min, int max) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt b/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt index 177cbc96a..e3ee567d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt @@ -14,6 +14,7 @@ import androidx.core.content.withStyledAttributes import com.google.android.material.button.MaterialButton import com.google.android.material.progressindicator.CircularProgressIndicator import com.google.android.material.theme.overlay.MaterialThemeOverlay +import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.util.visible import kotlin.math.max @@ -76,7 +77,7 @@ class CircularProgressMaterialButton @JvmOverloads constructor( override fun onRestoreInstanceState(state: Parcelable) { val stateBundle = state as Bundle - val superState: Parcelable? = stateBundle.getParcelable(SUPER_STATE) + val superState: Parcelable? = stateBundle.getParcelableCompat(SUPER_STATE, Parcelable::class.java) super.onRestoreInstanceState(superState) currentState = if (materialButton.visibility == INVISIBLE) State.PROGRESS else State.BUTTON diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.java b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.java index d62ab30ae..553eab8c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyDisplayFragment.java @@ -284,15 +284,14 @@ public class VerifyDisplayFragment extends Fragment implements ViewTreeObserver. public boolean onContextItemSelected(MenuItem item) { if (fingerprint == null) return super.onContextItemSelected(item); - switch (item.getItemId()) { - case R.id.menu_copy: - handleCopyToClipboard(fingerprint, codes.length); - return true; - case R.id.menu_compare: - handleCompareWithClipboard(fingerprint); - return true; - default: - return super.onContextItemSelected(item); + if (item.getItemId() == R.id.menu_copy) { + handleCopyToClipboard(fingerprint, codes.length); + return true; + } else if (item.getItemId() == R.id.menu_compare) { + handleCompareWithClipboard(fingerprint); + return true; + } else { + return super.onContextItemSelected(item); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt index eff57957c..7b38adeff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyIdentityFragment.kt @@ -7,6 +7,7 @@ import android.widget.Toast import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import org.signal.core.util.ThreadUtil +import org.signal.core.util.getParcelableCompat import org.signal.qr.kitkat.ScanListener import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.WrapperDialogFragment @@ -84,10 +85,10 @@ class VerifyIdentityFragment : Fragment(R.layout.fragment_container), ScanListen } private val recipientId: RecipientId - get() = requireArguments().getParcelable(EXTRA_RECIPIENT)!! + get() = requireArguments().getParcelableCompat(EXTRA_RECIPIENT, RecipientId::class.java)!! private val remoteIdentity: IdentityKeyParcelable - get() = requireArguments().getParcelable(EXTRA_IDENTITY)!! + get() = requireArguments().getParcelableCompat(EXTRA_IDENTITY, IdentityKeyParcelable::class.java)!! private val isVerified: Boolean get() = requireArguments().getBoolean(EXTRA_VERIFIED) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCommand.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCommand.kt index bb828303a..5584ce669 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCommand.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCommand.kt @@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.webrtc.audio import android.net.Uri import android.os.Parcel import android.os.Parcelable +import org.signal.core.util.readParcelableCompat +import org.signal.core.util.readSerializableCompat import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.ParcelUtil @@ -36,7 +38,7 @@ sealed class AudioManagerCommand : Parcelable { @JvmField val CREATOR: Parcelable.Creator = ParcelCheat { parcel -> StartIncomingRinger( - ringtoneUri = parcel.readParcelable(Uri::class.java.classLoader)!!, + ringtoneUri = parcel.readParcelableCompat(Uri::class.java)!!, vibrate = ParcelUtil.readBoolean(parcel) ) } @@ -83,7 +85,12 @@ sealed class AudioManagerCommand : Parcelable { companion object { @JvmField - val CREATOR: Parcelable.Creator = ParcelCheat { SetUserDevice(it.readParcelable(RecipientId::class.java.classLoader), it.readSerializable() as SignalAudioManager.AudioDevice) } + val CREATOR: Parcelable.Creator = ParcelCheat { + SetUserDevice( + it.readParcelableCompat(RecipientId::class.java), + it.readSerializableCompat(SignalAudioManager.AudioDevice::class.java)!! + ) + } } } @@ -98,8 +105,8 @@ sealed class AudioManagerCommand : Parcelable { @JvmField val CREATOR: Parcelable.Creator = ParcelCheat { parcel -> SetDefaultDevice( - recipientId = parcel.readParcelable(RecipientId::class.java.classLoader), - device = parcel.readSerializable() as SignalAudioManager.AudioDevice, + recipientId = parcel.readParcelableCompat(RecipientId::class.java), + device = parcel.readSerializableCompat(SignalAudioManager.AudioDevice::class.java)!!, clearUserEarpieceSelection = ParcelUtil.readBoolean(parcel) ) } diff --git a/app/src/test/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenuTest.kt b/app/src/test/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenuTest.kt index 627f7bdef..4a6cbd587 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenuTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/stories/dialogs/StoryContextMenuTest.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.stories.dialogs import android.app.Application import android.content.Context import android.content.Intent +import android.net.Uri import androidx.fragment.app.Fragment import androidx.test.core.app.ApplicationProvider import org.junit.Assert.assertEquals @@ -15,6 +16,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import org.signal.core.util.getParcelableExtraCompat import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.database.FakeMessageRecords import org.thoughtcrime.securesms.database.model.StoryType @@ -61,8 +63,8 @@ class StoryContextMenuTest { // THEN verify(fragment).startActivity(intentCaptor.capture()) val chooserIntent: Intent = intentCaptor.firstValue - val targetIntent: Intent = chooserIntent.getParcelableExtra(Intent.EXTRA_INTENT)!! - assertEquals(PartAuthority.getAttachmentPublicUri(PartAuthority.getAttachmentDataUri(attachmentId)), targetIntent.getParcelableExtra(Intent.EXTRA_STREAM)) + val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!! + assertEquals(PartAuthority.getAttachmentPublicUri(PartAuthority.getAttachmentDataUri(attachmentId)), targetIntent.getParcelableExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)) assertEquals(MediaUtil.IMAGE_JPEG, targetIntent.type) assertTrue(Intent.FLAG_GRANT_READ_URI_PERMISSION and chooserIntent.flags == Intent.FLAG_GRANT_READ_URI_PERMISSION) } @@ -82,7 +84,7 @@ class StoryContextMenuTest { // THEN verify(fragment).startActivity(intentCaptor.capture()) val chooserIntent: Intent = intentCaptor.firstValue - val targetIntent: Intent = chooserIntent.getParcelableExtra(Intent.EXTRA_INTENT)!! + val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!! assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT)) } @@ -102,7 +104,7 @@ class StoryContextMenuTest { // THEN verify(fragment).startActivity(intentCaptor.capture()) val chooserIntent: Intent = intentCaptor.firstValue - val targetIntent: Intent = chooserIntent.getParcelableExtra(Intent.EXTRA_INTENT)!! + val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!! assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT)) } @@ -124,7 +126,7 @@ class StoryContextMenuTest { // THEN verify(fragment).startActivity(intentCaptor.capture()) val chooserIntent: Intent = intentCaptor.firstValue - val targetIntent: Intent = chooserIntent.getParcelableExtra(Intent.EXTRA_INTENT)!! + val targetIntent: Intent = chooserIntent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java)!! assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT)) } } diff --git a/core-util/src/main/java/org/signal/core/util/BundleExtensions.kt b/core-util/src/main/java/org/signal/core/util/BundleExtensions.kt new file mode 100644 index 000000000..564888cd3 --- /dev/null +++ b/core-util/src/main/java/org/signal/core/util/BundleExtensions.kt @@ -0,0 +1,23 @@ +package org.signal.core.util + +import android.os.Build +import android.os.Bundle +import android.os.Parcelable + +fun Bundle.getParcelableCompat(key: String, clazz: Class): T? { + return if (Build.VERSION.SDK_INT >= 33) { + this.getParcelable(key, clazz) + } else { + @Suppress("DEPRECATION") + this.getParcelable(key) + } +} + +fun Bundle.getParcelableArrayListCompat(key: String, clazz: Class): ArrayList? { + return if (Build.VERSION.SDK_INT >= 33) { + this.getParcelableArrayList(key, clazz) + } else { + @Suppress("DEPRECATION") + this.getParcelableArrayList(key) + } +} diff --git a/core-util/src/main/java/org/signal/core/util/IntentExtensions.kt b/core-util/src/main/java/org/signal/core/util/IntentExtensions.kt new file mode 100644 index 000000000..8ee2295d0 --- /dev/null +++ b/core-util/src/main/java/org/signal/core/util/IntentExtensions.kt @@ -0,0 +1,23 @@ +package org.signal.core.util + +import android.content.Intent +import android.os.Build +import android.os.Parcelable + +fun Intent.getParcelableExtraCompat(key: String, clazz: Class): T? { + return if (Build.VERSION.SDK_INT >= 33) { + this.getParcelableExtra(key, clazz) + } else { + @Suppress("DEPRECATION") + this.getParcelableExtra(key) + } +} + +fun Intent.getParcelableArrayListExtraCompat(key: String, clazz: Class): ArrayList? { + return if (Build.VERSION.SDK_INT >= 33) { + this.getParcelableArrayListExtra(key, clazz) + } else { + @Suppress("DEPRECATION") + this.getParcelableArrayListExtra(key) + } +} diff --git a/core-util/src/main/java/org/signal/core/util/ParcelExtensions.kt b/core-util/src/main/java/org/signal/core/util/ParcelExtensions.kt new file mode 100644 index 000000000..1fd2d4f3e --- /dev/null +++ b/core-util/src/main/java/org/signal/core/util/ParcelExtensions.kt @@ -0,0 +1,23 @@ +package org.signal.core.util + +import android.os.Build +import android.os.Parcel +import android.os.Parcelable + +fun Parcel.readParcelableCompat(clazz: Class): T? { + return if (Build.VERSION.SDK_INT >= 33) { + this.readParcelable(clazz.classLoader, clazz) + } else { + @Suppress("DEPRECATION") + this.readParcelable(clazz.classLoader) + } +} + +fun Parcel.readSerializableCompat(clazz: Class): T? { + return if (Build.VERSION.SDK_INT >= 33) { + this.readSerializable(clazz.classLoader, clazz) + } else { + @Suppress("DEPRECATION", "UNCHECKED_CAST") + this.readSerializable() as T + } +} diff --git a/lintchecks/src/main/java/org/signal/lint/Registry.java b/lintchecks/src/main/java/org/signal/lint/Registry.java index 3fdc026a3..6152e3a5a 100644 --- a/lintchecks/src/main/java/org/signal/lint/Registry.java +++ b/lintchecks/src/main/java/org/signal/lint/Registry.java @@ -1,15 +1,23 @@ package org.signal.lint; import com.android.tools.lint.client.api.IssueRegistry; +import com.android.tools.lint.client.api.Vendor; import com.android.tools.lint.detector.api.ApiKt; import com.android.tools.lint.detector.api.Issue; +import org.jetbrains.annotations.Nullable; + import java.util.Arrays; import java.util.List; @SuppressWarnings("UnstableApiUsage") public final class Registry extends IssueRegistry { + @Override + public Vendor getVendor() { + return new Vendor("Signal", "Signal", "Signal", "Signal"); + } + @Override public List getIssues() { return Arrays.asList(SignalLogDetector.LOG_NOT_SIGNAL,