kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix a bunch of random lint warnings.
rodzic
ce4b7c2d7f
commit
6922886395
|
@ -177,22 +177,23 @@ public class NewConversationActivity extends ContactSelectionActivity
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
super.onOptionsItemSelected(item);
|
super.onOptionsItemSelected(item);
|
||||||
|
|
||||||
switch (item.getItemId()) {
|
int itemId = 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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() {
|
private void handleManualRefresh() {
|
||||||
|
|
|
@ -13,7 +13,6 @@ import android.widget.ImageView;
|
||||||
|
|
||||||
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
|
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
|
||||||
|
|
||||||
@TargetApi(21)
|
|
||||||
abstract class CircleSquareImageViewTransition extends Transition {
|
abstract class CircleSquareImageViewTransition extends Transition {
|
||||||
|
|
||||||
private static final String CIRCLE_RATIO = "CIRCLE_RATIO";
|
private static final String CIRCLE_RATIO = "CIRCLE_RATIO";
|
||||||
|
|
|
@ -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}.
|
* 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 final class CircleToSquareImageViewTransition extends CircleSquareImageViewTransition {
|
||||||
public CircleToSquareImageViewTransition(Context context, AttributeSet attrs) {
|
public CircleToSquareImageViewTransition(Context context, AttributeSet attrs) {
|
||||||
super(false);
|
super(false);
|
||||||
|
|
|
@ -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}.
|
* 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 final class SquareToCircleImageViewTransition extends CircleSquareImageViewTransition {
|
||||||
public SquareToCircleImageViewTransition(Context context, AttributeSet attrs) {
|
public SquareToCircleImageViewTransition(Context context, AttributeSet attrs) {
|
||||||
super(true);
|
super(true);
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.thoughtcrime.securesms.avatar
|
package org.thoughtcrime.securesms.avatar
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class which encapsulates reading and writing Avatar objects to and from Bundles.
|
* 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(
|
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),
|
size = bundle.getLong(SIZE),
|
||||||
databaseId = bundle.getDatabaseId()
|
databaseId = bundle.getDatabaseId()
|
||||||
)
|
)
|
||||||
|
|
|
@ -16,6 +16,7 @@ import androidx.fragment.app.viewModels
|
||||||
import androidx.navigation.Navigation
|
import androidx.navigation.Navigation
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.signal.core.util.ThreadUtil
|
import org.signal.core.util.ThreadUtil
|
||||||
|
import org.signal.core.util.getParcelableExtraCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.avatar.Avatar
|
import org.thoughtcrime.securesms.avatar.Avatar
|
||||||
import org.thoughtcrime.securesms.avatar.AvatarBundler
|
import org.thoughtcrime.securesms.avatar.AvatarBundler
|
||||||
|
@ -147,10 +148,9 @@ class AvatarPickerFragment : Fragment(R.layout.avatar_picker_fragment) {
|
||||||
ViewUtil.hideKeyboard(requireContext(), requireView())
|
ViewUtil.hideKeyboard(requireContext(), requireView())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == Activity.RESULT_OK && data != null) {
|
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)
|
viewModel.onAvatarPhotoSelectionCompleted(media)
|
||||||
} else {
|
} else {
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
|
|
|
@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.badges.gifts
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.badges.gifts.ExpiredGiftSheetConfiguration.forExpiredBadge
|
import org.thoughtcrime.securesms.badges.gifts.ExpiredGiftSheetConfiguration.forExpiredBadge
|
||||||
import org.thoughtcrime.securesms.badges.models.Badge
|
import org.thoughtcrime.securesms.badges.models.Badge
|
||||||
import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
|
import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
|
||||||
|
@ -28,7 +29,7 @@ class ExpiredGiftSheet : DSLSettingsBottomSheetFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private val badge: Badge
|
private val badge: Badge
|
||||||
get() = requireArguments().getParcelable(ARG_BADGE)!!
|
get() = requireArguments().getParcelableCompat(ARG_BADGE, Badge::class.java)!!
|
||||||
|
|
||||||
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
||||||
ExpiredGiftSheetConfiguration.register(adapter)
|
ExpiredGiftSheetConfiguration.register(adapter)
|
||||||
|
|
|
@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import org.signal.core.util.getParcelableArrayListCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
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 onSearchInputFocused() = Unit
|
||||||
|
|
||||||
override fun setResult(bundle: Bundle) {
|
override fun setResult(bundle: Bundle) {
|
||||||
val contacts: List<ContactSearchKey.RecipientSearchKey> = bundle.getParcelableArrayList(MultiselectForwardFragment.RESULT_SELECTION)!!
|
val contacts: List<ContactSearchKey.RecipientSearchKey> = bundle.getParcelableArrayListCompat(MultiselectForwardFragment.RESULT_SELECTION, ContactSearchKey.RecipientSearchKey::class.java)!!
|
||||||
|
|
||||||
if (contacts.isNotEmpty()) {
|
if (contacts.isNotEmpty()) {
|
||||||
viewModel.setSelectedContact(contacts.first())
|
viewModel.setSelectedContact(contacts.first())
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.os.Bundle
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.badges.models.Badge
|
import org.thoughtcrime.securesms.badges.models.Badge
|
||||||
import org.thoughtcrime.securesms.badges.models.BadgePreview
|
import org.thoughtcrime.securesms.badges.models.BadgePreview
|
||||||
|
@ -41,10 +42,10 @@ class GiftThanksSheet : DSLSettingsBottomSheetFragment() {
|
||||||
private val lifecycleDisposable = LifecycleDisposable()
|
private val lifecycleDisposable = LifecycleDisposable()
|
||||||
|
|
||||||
private val recipientId: RecipientId
|
private val recipientId: RecipientId
|
||||||
get() = requireArguments().getParcelable(ARGS_RECIPIENT_ID)!!
|
get() = requireArguments().getParcelableCompat(ARGS_RECIPIENT_ID, RecipientId::class.java)!!
|
||||||
|
|
||||||
private val badge: Badge
|
private val badge: Badge
|
||||||
get() = requireArguments().getParcelable(ARGS_BADGE)!!
|
get() = requireArguments().getParcelableCompat(ARGS_BADGE, Badge::class.java)!!
|
||||||
|
|
||||||
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
||||||
BadgePreview.register(adapter)
|
BadgePreview.register(adapter)
|
||||||
|
|
|
@ -11,6 +11,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.kotlin.subscribeBy
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.libsignal.zkgroup.InvalidInputException
|
import org.signal.libsignal.zkgroup.InvalidInputException
|
||||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation
|
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation
|
||||||
|
@ -73,7 +74,7 @@ class ViewReceivedGiftBottomSheet : DSLSettingsBottomSheetFragment() {
|
||||||
private val lifecycleDisposable = LifecycleDisposable()
|
private val lifecycleDisposable = LifecycleDisposable()
|
||||||
|
|
||||||
private val sentFrom: RecipientId
|
private val sentFrom: RecipientId
|
||||||
get() = requireArguments().getParcelable(ARG_SENT_FROM)!!
|
get() = requireArguments().getParcelableCompat(ARG_SENT_FROM, RecipientId::class.java)!!
|
||||||
|
|
||||||
private val messageId: Long
|
private val messageId: Long
|
||||||
get() = requireArguments().getLong(ARG_MESSAGE_ID)
|
get() = requireArguments().getLong(ARG_MESSAGE_ID)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import androidx.fragment.app.FragmentManager
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.badges.gifts.viewgift.ViewGiftRepository
|
import org.thoughtcrime.securesms.badges.gifts.viewgift.ViewGiftRepository
|
||||||
import org.thoughtcrime.securesms.badges.models.BadgeDisplay112
|
import org.thoughtcrime.securesms.badges.models.BadgeDisplay112
|
||||||
|
@ -41,7 +42,7 @@ class ViewSentGiftBottomSheet : DSLSettingsBottomSheetFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private val sentTo: RecipientId
|
private val sentTo: RecipientId
|
||||||
get() = requireArguments().getParcelable(ARG_SENT_TO)!!
|
get() = requireArguments().getParcelableCompat(ARG_SENT_TO, RecipientId::class.java)!!
|
||||||
|
|
||||||
private val giftBadge: GiftBadge
|
private val giftBadge: GiftBadge
|
||||||
get() = GiftBadge.parseFrom(requireArguments().getByteArray(ARG_GIFT_BADGE))
|
get() = GiftBadge.parseFrom(requireArguments().getByteArray(ARG_GIFT_BADGE))
|
||||||
|
|
|
@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentManager
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
import com.google.android.material.tabs.TabLayoutMediator
|
import com.google.android.material.tabs.TabLayoutMediator
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.badges.BadgeRepository
|
import org.thoughtcrime.securesms.badges.BadgeRepository
|
||||||
import org.thoughtcrime.securesms.badges.models.Badge
|
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 {
|
companion object {
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ public class AlertView extends LinearLayout {
|
||||||
initialize(attrs);
|
initialize(attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(VERSION_CODES.HONEYCOMB)
|
|
||||||
public AlertView(final Context context, AttributeSet attrs, int defStyle) {
|
public AlertView(final Context context, AttributeSet attrs, int defStyle) {
|
||||||
super(context, attrs, defStyle);
|
super(context, attrs, defStyle);
|
||||||
initialize(attrs);
|
initialize(attrs);
|
||||||
|
|
|
@ -12,6 +12,7 @@ import androidx.annotation.Px
|
||||||
import androidx.annotation.UiThread
|
import androidx.annotation.UiThread
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import org.signal.core.util.dp
|
import org.signal.core.util.dp
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
||||||
import org.thoughtcrime.securesms.mms.Slide
|
import org.thoughtcrime.securesms.mms.Slide
|
||||||
|
@ -95,8 +96,8 @@ class ConversationItemThumbnail @JvmOverloads constructor(
|
||||||
|
|
||||||
override fun onRestoreInstanceState(state: Parcelable) {
|
override fun onRestoreInstanceState(state: Parcelable) {
|
||||||
if (state is Bundle && state.containsKey(STATE_STATE)) {
|
if (state is Bundle && state.containsKey(STATE_STATE)) {
|
||||||
val root = state.getParcelable<Parcelable>(STATE_ROOT)
|
val root: Parcelable? = state.getParcelableCompat(STATE_ROOT, Parcelable::class.java)
|
||||||
this.state = state.getParcelable(STATE_STATE)!!
|
this.state = state.getParcelableCompat(STATE_STATE, ConversationItemThumbnailState::class.java)!!
|
||||||
super.onRestoreInstanceState(root)
|
super.onRestoreInstanceState(root)
|
||||||
} else {
|
} else {
|
||||||
super.onRestoreInstanceState(state)
|
super.onRestoreInstanceState(state)
|
||||||
|
|
|
@ -22,7 +22,6 @@ public class HidingLinearLayout extends LinearLayout {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
|
||||||
public HidingLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
|
public HidingLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ public class InsetAwareConstraintLayout extends ConstraintLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@TargetApi(20)
|
|
||||||
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
|
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
|
||||||
if (Build.VERSION.SDK_INT < 30) {
|
if (Build.VERSION.SDK_INT < 30) {
|
||||||
return super.onApplyWindowInsets(insets);
|
return super.onApplyWindowInsets(insets);
|
||||||
|
|
|
@ -133,14 +133,12 @@ public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.Lo
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(16)
|
|
||||||
@SuppressWarnings("SuspiciousNameCombination")
|
@SuppressWarnings("SuspiciousNameCombination")
|
||||||
private String getWidthColumn(int orientation) {
|
private String getWidthColumn(int orientation) {
|
||||||
if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.WIDTH;
|
if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.WIDTH;
|
||||||
else return MediaStore.Images.ImageColumns.HEIGHT;
|
else return MediaStore.Images.ImageColumns.HEIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(16)
|
|
||||||
@SuppressWarnings("SuspiciousNameCombination")
|
@SuppressWarnings("SuspiciousNameCombination")
|
||||||
private String getHeightColumn(int orientation) {
|
private String getHeightColumn(int orientation) {
|
||||||
if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.HEIGHT;
|
if (orientation == 0 || orientation == 180) return MediaStore.Images.ImageColumns.HEIGHT;
|
||||||
|
|
|
@ -23,7 +23,7 @@ public class SquareFrameLayout extends FrameLayout {
|
||||||
this(context, attrs, 0);
|
this(context, attrs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(VERSION_CODES.HONEYCOMB) @SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public SquareFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
|
public SquareFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -36,7 +36,6 @@ public class SignalMapView extends LinearLayout {
|
||||||
initialize(context);
|
initialize(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
|
||||||
public SignalMapView(Context context, AttributeSet attrs, int defStyleAttr) {
|
public SignalMapView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
initialize(context);
|
initialize(context);
|
||||||
|
|
|
@ -439,7 +439,7 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter
|
||||||
SignalStore.donationsValues().subscriptionEndOfPeriodRedemptionStarted = 0L
|
SignalStore.donationsValues().subscriptionEndOfPeriodRedemptionStarted = 0L
|
||||||
SignalStore.donationsValues().subscriptionEndOfPeriodConversionStarted = 0L
|
SignalStore.donationsValues().subscriptionEndOfPeriodConversionStarted = 0L
|
||||||
SignalStore.donationsValues().setLastEndOfPeriod(0L)
|
SignalStore.donationsValues().setLastEndOfPeriod(0L)
|
||||||
Toast.makeText(context, "Cleared", Toast.LENGTH_SHORT)
|
Toast.makeText(context, "Cleared", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
|
import org.signal.core.util.getParcelableExtraCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
|
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?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
if (requestCode == MESSAGE_SOUND_SELECT && resultCode == Activity.RESULT_OK && data != null) {
|
if (requestCode == MESSAGE_SOUND_SELECT && resultCode == Activity.RESULT_OK && data != null) {
|
||||||
val uri = data.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
|
val uri: Uri? = data.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java)
|
||||||
viewModel.setMessageNotificationsSound(uri)
|
viewModel.setMessageNotificationsSound(uri)
|
||||||
} else if (requestCode == CALL_RINGTONE_SELECT && resultCode == Activity.RESULT_OK && data != null) {
|
} else if (requestCode == CALL_RINGTONE_SELECT && resultCode == Activity.RESULT_OK && data != null) {
|
||||||
val uri = data.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
|
val uri: Uri? = data.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java)
|
||||||
viewModel.setCallRingtone(uri)
|
viewModel.setCallRingtone(uri)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import com.google.android.material.snackbar.Snackbar
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.disposables.Disposable
|
import io.reactivex.rxjava3.disposables.Disposable
|
||||||
import io.reactivex.rxjava3.kotlin.subscribeBy
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.core.util.money.FiatMoney
|
import org.signal.core.util.money.FiatMoney
|
||||||
import org.signal.donations.GooglePayApi
|
import org.signal.donations.GooglePayApi
|
||||||
|
@ -73,22 +74,22 @@ class DonationCheckoutDelegate(
|
||||||
registerGooglePayCallback()
|
registerGooglePayCallback()
|
||||||
|
|
||||||
fragment.setFragmentResultListener(GatewaySelectorBottomSheet.REQUEST_KEY) { _, bundle ->
|
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)
|
handleGatewaySelectionResponse(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment.setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle ->
|
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)
|
handleDonationProcessorActionResult(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment.setFragmentResultListener(CreditCardFragment.REQUEST_KEY) { _, bundle ->
|
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)
|
handleDonationProcessorActionResult(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment.setFragmentResultListener(PayPalPaymentInProgressFragment.REQUEST_KEY) { _, bundle ->
|
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)
|
handleDonationProcessorActionResult(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import androidx.fragment.app.viewModels
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import androidx.navigation.navGraphViewModels
|
import androidx.navigation.navGraphViewModels
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||||
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentComponent
|
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)
|
DonationCheckoutDelegate.ErrorHandler().attach(this, null, errorSource)
|
||||||
|
|
||||||
setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle ->
|
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) {
|
if (result.status == DonationProcessorActionResult.Status.SUCCESS) {
|
||||||
findNavController().popBackStack()
|
findNavController().popBackStack()
|
||||||
setFragmentResult(REQUEST_KEY, bundle)
|
setFragmentResult(REQUEST_KEY, bundle)
|
||||||
|
|
|
@ -17,6 +17,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.core.Single
|
import io.reactivex.rxjava3.core.Single
|
||||||
import io.reactivex.rxjava3.kotlin.subscribeBy
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||||
|
@ -122,7 +123,7 @@ class PayPalPaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog
|
||||||
private fun routeToOneTimeConfirmation(createPaymentIntentResponse: PayPalCreatePaymentIntentResponse): Single<PayPalConfirmationResult> {
|
private fun routeToOneTimeConfirmation(createPaymentIntentResponse: PayPalCreatePaymentIntentResponse): Single<PayPalConfirmationResult> {
|
||||||
return Single.create<PayPalConfirmationResult> { emitter ->
|
return Single.create<PayPalConfirmationResult> { emitter ->
|
||||||
val listener = FragmentResultListener { _, bundle ->
|
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) {
|
if (result != null) {
|
||||||
emitter.onSuccess(result)
|
emitter.onSuccess(result)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.core.Single
|
import io.reactivex.rxjava3.core.Single
|
||||||
import io.reactivex.rxjava3.kotlin.subscribeBy
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.donations.StripeApi
|
import org.signal.donations.StripeApi
|
||||||
import org.signal.donations.StripeIntentAccessor
|
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...")
|
Log.d(TAG, "3DS action required. Displaying dialog...")
|
||||||
Single.create<StripeIntentAccessor> { emitter ->
|
Single.create<StripeIntentAccessor> { emitter ->
|
||||||
val listener = FragmentResultListener { _, bundle ->
|
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) {
|
if (result != null) {
|
||||||
emitter.onSuccess(result)
|
emitter.onSuccess(result)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import com.google.android.flexbox.FlexboxLayoutManager
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
|
import org.signal.core.util.getParcelableArrayListExtraCompat
|
||||||
import org.thoughtcrime.securesms.AvatarPreviewActivity
|
import org.thoughtcrime.securesms.AvatarPreviewActivity
|
||||||
import org.thoughtcrime.securesms.BlockUnblockDialog
|
import org.thoughtcrime.securesms.BlockUnblockDialog
|
||||||
import org.thoughtcrime.securesms.InviteActivity
|
import org.thoughtcrime.securesms.InviteActivity
|
||||||
|
@ -172,7 +173,7 @@ class ConversationSettingsFragment : DSLSettingsFragment(
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
when (requestCode) {
|
when (requestCode) {
|
||||||
REQUEST_CODE_ADD_MEMBERS_TO_GROUP -> if (data != null) {
|
REQUEST_CODE_ADD_MEMBERS_TO_GROUP -> if (data != null) {
|
||||||
val selected: List<RecipientId> = requireNotNull(data.getParcelableArrayListExtra(PushContactSelectionActivity.KEY_SELECTED_RECIPIENTS))
|
val selected: List<RecipientId> = requireNotNull(data.getParcelableArrayListExtraCompat(PushContactSelectionActivity.KEY_SELECTED_RECIPIENTS, RecipientId::class.java))
|
||||||
val progress: SimpleProgressDialog.DismissibleDialog = SimpleProgressDialog.showDelayed(requireContext())
|
val progress: SimpleProgressDialog.DismissibleDialog = SimpleProgressDialog.showDelayed(requireContext())
|
||||||
|
|
||||||
viewModel.onAddToGroupComplete(selected) {
|
viewModel.onAddToGroupComplete(selected) {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import androidx.activity.result.ActivityResult
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
import org.signal.core.util.getParcelableExtraCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
|
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
|
||||||
|
@ -67,7 +68,7 @@ class CustomNotificationsSettingsFragment : DSLSettingsFragment(R.string.CustomN
|
||||||
val data = result.data
|
val data = result.data
|
||||||
|
|
||||||
if (resultCode == Activity.RESULT_OK && data != null) {
|
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)
|
resultHandler(uri)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1313,7 +1313,6 @@ public class ConversationParentFragment extends Fragment
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.KITKAT)
|
|
||||||
private void handleMakeDefaultSms() {
|
private void handleMakeDefaultSms() {
|
||||||
startActivityForResult(SmsUtil.getSmsRoleIntent(requireContext()), SMS_DEFAULT);
|
startActivityForResult(SmsUtil.getSmsRoleIntent(requireContext()), SMS_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ import androidx.appcompat.widget.Toolbar
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.fragment.app.Fragment
|
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.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FragmentWrapperActivity
|
import org.thoughtcrime.securesms.components.FragmentWrapperActivity
|
||||||
|
@ -22,7 +24,7 @@ open class MultiselectForwardActivity : FragmentWrapperActivity(), MultiselectFo
|
||||||
private const val ARGS = "args"
|
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
|
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)) {
|
} else if (intent == null || !intent.hasExtra(RESULT_SELECTION)) {
|
||||||
throw IllegalStateException("Selection contract requires a selection.")
|
throw IllegalStateException("Selection contract requires a selection.")
|
||||||
} else {
|
} else {
|
||||||
val selection: List<ContactSearchKey.RecipientSearchKey> = intent.getParcelableArrayListExtra(RESULT_SELECTION)!!
|
val selection: List<ContactSearchKey.RecipientSearchKey> = intent.getParcelableArrayListExtraCompat(RESULT_SELECTION, ContactSearchKey.RecipientSearchKey::class.java)!!
|
||||||
selection
|
selection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,8 @@ import androidx.fragment.app.setFragmentResultListener
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
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.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.color.ViewColorSet
|
import org.thoughtcrime.securesms.color.ViewColorSet
|
||||||
|
@ -103,7 +105,7 @@ class MultiselectForwardFragment :
|
||||||
}
|
}
|
||||||
|
|
||||||
private val args: MultiselectForwardFragmentArgs by lazy {
|
private val args: MultiselectForwardFragmentArgs by lazy {
|
||||||
requireArguments().getParcelable(ARGS)!!
|
requireArguments().getParcelableCompat(ARGS, MultiselectForwardFragmentArgs::class.java)!!
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater {
|
override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater {
|
||||||
|
@ -251,13 +253,13 @@ class MultiselectForwardFragment :
|
||||||
}
|
}
|
||||||
|
|
||||||
setFragmentResultListener(CreateStoryWithViewersFragment.REQUEST_KEY) { _, bundle ->
|
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)))
|
contactSearchMediator.setKeysSelected(setOf(ContactSearchKey.RecipientSearchKey(recipientId, true)))
|
||||||
contactFilterView.clear()
|
contactFilterView.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
setFragmentResultListener(ChooseGroupStoryBottomSheet.GROUP_STORY) { _, bundle ->
|
setFragmentResultListener(ChooseGroupStoryBottomSheet.GROUP_STORY) { _, bundle ->
|
||||||
val groups: Set<RecipientId> = bundle.getParcelableArrayList<RecipientId>(ChooseGroupStoryBottomSheet.RESULT_SET)?.toSet() ?: emptySet()
|
val groups: Set<RecipientId> = bundle.getParcelableArrayListCompat(ChooseGroupStoryBottomSheet.RESULT_SET, RecipientId::class.java)?.toSet() ?: emptySet()
|
||||||
val keys: Set<ContactSearchKey.RecipientSearchKey> = groups.map { ContactSearchKey.RecipientSearchKey(it, true) }.toSet()
|
val keys: Set<ContactSearchKey.RecipientSearchKey> = groups.map { ContactSearchKey.RecipientSearchKey(it, true) }.toSet()
|
||||||
contactSearchMediator.addToVisibleGroupStories(keys)
|
contactSearchMediator.addToVisibleGroupStories(keys)
|
||||||
contactSearchMediator.setKeysSelected(keys)
|
contactSearchMediator.setKeysSelected(keys)
|
||||||
|
|
|
@ -575,28 +575,38 @@ public class ConversationListFragment extends MainFragment implements ActionMode
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
super.onOptionsItemSelected(item);
|
super.onOptionsItemSelected(item);
|
||||||
|
|
||||||
switch (item.getItemId()) {
|
int itemId = 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
@Override
|
||||||
|
|
|
@ -14,6 +14,7 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.view.doOnNextLayout
|
import androidx.core.view.doOnNextLayout
|
||||||
import com.google.android.material.animation.ArgbEvaluatorCompat
|
import com.google.android.material.animation.ArgbEvaluatorCompat
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.animation.AnimationCompleteListener
|
import org.thoughtcrime.securesms.animation.AnimationCompleteListener
|
||||||
import org.thoughtcrime.securesms.databinding.ConversationListFilterPullViewBinding
|
import org.thoughtcrime.securesms.databinding.ConversationListFilterPullViewBinding
|
||||||
|
@ -89,7 +90,7 @@ class ConversationListFilterPullView @JvmOverloads constructor(
|
||||||
|
|
||||||
override fun onRestoreInstanceState(state: Parcelable?) {
|
override fun onRestoreInstanceState(state: Parcelable?) {
|
||||||
val bundle = state as Bundle
|
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)
|
super.onRestoreInstanceState(root)
|
||||||
|
|
||||||
val restoredState: FilterPullState = FilterPullState.valueOf(bundle.getString(INSTANCE_STATE_STATE)!!)
|
val restoredState: FilterPullState = FilterPullState.valueOf(bundle.getString(INSTANCE_STATE_STATE)!!)
|
||||||
|
|
|
@ -34,7 +34,6 @@ import org.signal.core.util.withinTransaction
|
||||||
import org.signal.libsignal.zkgroup.groups.GroupMasterKey
|
import org.signal.libsignal.zkgroup.groups.GroupMasterKey
|
||||||
import org.signal.storageservice.protos.groups.Member
|
import org.signal.storageservice.protos.groups.Member
|
||||||
import org.signal.storageservice.protos.groups.local.DecryptedGroup
|
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.ContactSearchSortOrder
|
||||||
import org.thoughtcrime.securesms.contacts.paged.collections.ContactSearchIterator
|
import org.thoughtcrime.securesms.contacts.paged.collections.ContactSearchIterator
|
||||||
import org.thoughtcrime.securesms.crypto.SenderKeyUtil
|
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
|
* 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.
|
* 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)
|
val groupId = GroupId.v2(groupMasterKey)
|
||||||
if (getGroupV1ByExpectedV2(groupId).isPresent) {
|
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.")
|
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()) {
|
if (memberLevel.isAbsent()) {
|
||||||
memberLevel = DecryptedGroupUtil.findRequestingByUuid(decryptedGroup.requestingMembersList, serviceId.get().uuid())
|
memberLevel = DecryptedGroupUtil.findRequestingByUuid(decryptedGroup.requestingMembersList, serviceId.get().uuid())
|
||||||
.map { m: DecryptedRequestingMember? -> MemberLevel.REQUESTING_MEMBER }
|
.map { _ -> MemberLevel.REQUESTING_MEMBER }
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (memberLevel.isPresent) {
|
return if (memberLevel.isPresent) {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.thoughtcrime.securesms.keyvalue
|
package org.thoughtcrime.securesms.keyvalue
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.preference.PreferenceManager
|
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. */
|
/** Do not alter. If you need to migrate more stuff, create a new method. */
|
||||||
|
@SuppressLint("ApplySharedPref")
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
private fun migrateFromSharedPrefsV2(context: Context) {
|
private fun migrateFromSharedPrefsV2(context: Context) {
|
||||||
Log.i(TAG, "[V2] Migrating account values from shared prefs.")
|
Log.i(TAG, "[V2] Migrating account values from shared prefs.")
|
||||||
|
|
||||||
|
|
|
@ -87,16 +87,15 @@ public final class KbsSplashFragment extends Fragment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
if (item.getItemId() == R.id.menu_pin_learn_more) {
|
||||||
case R.id.menu_pin_learn_more:
|
onLearnMore();
|
||||||
onLearnMore();
|
return true;
|
||||||
return true;
|
} else if (item.getItemId() == R.id.menu_pin_skip) {
|
||||||
case R.id.menu_pin_skip:
|
onPinSkipped();
|
||||||
onPinSkipped();
|
return true;
|
||||||
return true;
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpRegLockEnabled() {
|
private void setUpRegLockEnabled() {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.os.Bundle
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import org.signal.core.util.dp
|
import org.signal.core.util.dp
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
|
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
|
||||||
import org.thoughtcrime.securesms.database.MediaTable
|
import org.thoughtcrime.securesms.database.MediaTable
|
||||||
import org.thoughtcrime.securesms.database.MediaTable.MediaRecord
|
import org.thoughtcrime.securesms.database.MediaTable.MediaRecord
|
||||||
|
@ -45,7 +46,7 @@ object MediaIntentFactory {
|
||||||
) : Parcelable
|
) : Parcelable
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun requireArguments(bundle: Bundle): MediaPreviewArgs = bundle.getParcelable(ARGS_KEY)!!
|
fun requireArguments(bundle: Bundle): MediaPreviewArgs = bundle.getParcelableCompat(ARGS_KEY, MediaPreviewArgs::class.java)!!
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun create(context: Context, args: MediaPreviewArgs): Intent {
|
fun create(context: Context, args: MediaPreviewArgs): Intent {
|
||||||
|
|
|
@ -308,14 +308,12 @@ public class MediaRepository {
|
||||||
return media.size() > 0 ? Optional.of(media.get(0)) : Optional.empty();
|
return media.size() > 0 ? Optional.of(media.get(0)) : Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(16)
|
|
||||||
@SuppressWarnings("SuspiciousNameCombination")
|
@SuppressWarnings("SuspiciousNameCombination")
|
||||||
private String getWidthColumn(int orientation) {
|
private String getWidthColumn(int orientation) {
|
||||||
if (orientation == 0 || orientation == 180) return Images.Media.WIDTH;
|
if (orientation == 0 || orientation == 180) return Images.Media.WIDTH;
|
||||||
else return Images.Media.HEIGHT;
|
else return Images.Media.HEIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(16)
|
|
||||||
@SuppressWarnings("SuspiciousNameCombination")
|
@SuppressWarnings("SuspiciousNameCombination")
|
||||||
private String getHeightColumn(int orientation) {
|
private String getHeightColumn(int orientation) {
|
||||||
if (orientation == 0 || orientation == 180) return Images.Media.HEIGHT;
|
if (orientation == 0 || orientation == 180) return Images.Media.HEIGHT;
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.os.Parcelable
|
||||||
import kotlinx.parcelize.Parceler
|
import kotlinx.parcelize.Parceler
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import kotlinx.parcelize.TypeParceler
|
import kotlinx.parcelize.TypeParceler
|
||||||
|
import org.signal.core.util.getParcelableExtraCompat
|
||||||
import org.thoughtcrime.securesms.conversation.MessageSendType
|
import org.thoughtcrime.securesms.conversation.MessageSendType
|
||||||
import org.thoughtcrime.securesms.database.model.Mention
|
import org.thoughtcrime.securesms.database.model.Mention
|
||||||
import org.thoughtcrime.securesms.database.model.StoryType
|
import org.thoughtcrime.securesms.database.model.StoryType
|
||||||
|
@ -43,7 +44,7 @@ class MediaSendActivityResult(
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun fromData(data: Intent): MediaSendActivityResult {
|
fun fromData(data: Intent): MediaSendActivityResult {
|
||||||
return data.getParcelableExtra(EXTRA_RESULT) ?: throw IllegalArgumentException()
|
return data.getParcelableExtraCompat(EXTRA_RESULT, MediaSendActivityResult::class.java) ?: throw IllegalArgumentException()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ import androidx.transition.AutoTransition
|
||||||
import androidx.transition.TransitionManager
|
import androidx.transition.TransitionManager
|
||||||
import com.google.android.material.animation.ArgbEvaluatorCompat
|
import com.google.android.material.animation.ArgbEvaluatorCompat
|
||||||
import org.signal.core.util.BreakIteratorCompat
|
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.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActivity
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
|
@ -89,8 +91,8 @@ class MediaSelectionActivity :
|
||||||
WindowUtil.setNavigationBarColor(this, 0x01000000)
|
WindowUtil.setNavigationBarColor(this, 0x01000000)
|
||||||
WindowUtil.setStatusBarColor(window, Color.TRANSPARENT)
|
WindowUtil.setStatusBarColor(window, Color.TRANSPARENT)
|
||||||
|
|
||||||
val sendType: MessageSendType = requireNotNull(intent.getParcelableExtra(MESSAGE_SEND_TYPE))
|
val sendType: MessageSendType = requireNotNull(intent.getParcelableExtraCompat(MESSAGE_SEND_TYPE, MessageSendType::class.java))
|
||||||
val initialMedia: List<Media> = intent.getParcelableArrayListExtra(MEDIA) ?: listOf()
|
val initialMedia: List<Media> = intent.getParcelableArrayListExtraCompat(MEDIA, Media::class.java) ?: listOf()
|
||||||
val message: CharSequence? = if (shareToTextStory) null else draftText
|
val message: CharSequence? = if (shareToTextStory) null else draftText
|
||||||
val isReply: Boolean = intent.getBooleanExtra(IS_REPLY, false)
|
val isReply: Boolean = intent.getBooleanExtra(IS_REPLY, false)
|
||||||
val isAddToGroupStoryFlow: Boolean = intent.getBooleanExtra(IS_ADD_TO_GROUP_STORY_FLOW, false)
|
val isAddToGroupStoryFlow: Boolean = intent.getBooleanExtra(IS_ADD_TO_GROUP_STORY_FLOW, false)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.thoughtcrime.securesms.mediasend.v2
|
package org.thoughtcrime.securesms.mediasend.v2
|
||||||
|
|
||||||
import android.os.Bundle
|
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.contacts.paged.ContactSearchKey
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
|
|
||||||
|
@ -89,9 +91,9 @@ sealed class MediaSelectionDestination {
|
||||||
return when {
|
return when {
|
||||||
bundle.containsKey(WALLPAPER) -> Wallpaper
|
bundle.containsKey(WALLPAPER) -> Wallpaper
|
||||||
bundle.containsKey(AVATAR) -> Avatar
|
bundle.containsKey(AVATAR) -> Avatar
|
||||||
bundle.containsKey(RECIPIENT) -> SingleRecipient(requireNotNull(bundle.getParcelable(RECIPIENT)))
|
bundle.containsKey(RECIPIENT) -> SingleRecipient(requireNotNull(bundle.getParcelableCompat(RECIPIENT, RecipientId::class.java)))
|
||||||
bundle.containsKey(STORY) -> SingleStory(requireNotNull(bundle.getParcelable(STORY)))
|
bundle.containsKey(STORY) -> SingleStory(requireNotNull(bundle.getParcelableCompat(STORY, RecipientId::class.java)))
|
||||||
bundle.containsKey(RECIPIENT_LIST) -> MultipleRecipients.fromParcel(requireNotNull(bundle.getParcelableArrayList(RECIPIENT_LIST)))
|
bundle.containsKey(RECIPIENT_LIST) -> MultipleRecipients.fromParcel(requireNotNull(bundle.getParcelableArrayListCompat(RECIPIENT_LIST, ContactSearchKey.RecipientSearchKey::class.java)))
|
||||||
else -> ChooseAfterMediaSelection
|
else -> ChooseAfterMediaSelection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject
|
||||||
import io.reactivex.rxjava3.subjects.PublishSubject
|
import io.reactivex.rxjava3.subjects.PublishSubject
|
||||||
import io.reactivex.rxjava3.subjects.Subject
|
import io.reactivex.rxjava3.subjects.Subject
|
||||||
import org.signal.core.util.BreakIteratorCompat
|
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.components.mention.MentionAnnotation
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
||||||
import org.thoughtcrime.securesms.conversation.MessageSendType
|
import org.thoughtcrime.securesms.conversation.MessageSendType
|
||||||
|
@ -408,16 +410,16 @@ class MediaSelectionViewModel(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onRestoreState(savedInstanceState: Bundle) {
|
fun onRestoreState(savedInstanceState: Bundle) {
|
||||||
val selection: List<Media> = savedInstanceState.getParcelableArrayList(STATE_SELECTION) ?: emptyList()
|
val selection: List<Media> = savedInstanceState.getParcelableArrayListCompat(STATE_SELECTION, Media::class.java) ?: emptyList()
|
||||||
val focused: Media? = savedInstanceState.getParcelable(STATE_FOCUSED)
|
val focused: Media? = savedInstanceState.getParcelableCompat(STATE_FOCUSED, Media::class.java)
|
||||||
val quality: SentMediaQuality = SentMediaQuality.fromCode(savedInstanceState.getInt(STATE_QUALITY))
|
val quality: SentMediaQuality = SentMediaQuality.fromCode(savedInstanceState.getInt(STATE_QUALITY))
|
||||||
val message: CharSequence? = savedInstanceState.getCharSequence(STATE_MESSAGE)
|
val message: CharSequence? = savedInstanceState.getCharSequence(STATE_MESSAGE)
|
||||||
val viewOnce: MediaSelectionState.ViewOnceToggleState = MediaSelectionState.ViewOnceToggleState.fromCode(savedInstanceState.getInt(STATE_VIEW_ONCE))
|
val viewOnce: MediaSelectionState.ViewOnceToggleState = MediaSelectionState.ViewOnceToggleState.fromCode(savedInstanceState.getInt(STATE_VIEW_ONCE))
|
||||||
val touchEnabled: Boolean = savedInstanceState.getBoolean(STATE_TOUCH_ENABLED)
|
val touchEnabled: Boolean = savedInstanceState.getBoolean(STATE_TOUCH_ENABLED)
|
||||||
val sent: Boolean = savedInstanceState.getBoolean(STATE_SENT)
|
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<Bundle> = savedInstanceState.getParcelableArrayList(STATE_EDITORS) ?: emptyList()
|
val editorStates: List<Bundle> = savedInstanceState.getParcelableArrayListCompat(STATE_EDITORS, Bundle::class.java) ?: emptyList()
|
||||||
val editorStateMap = editorStates.associate { it.toAssociation() }
|
val editorStateMap = editorStates.associate { it.toAssociation() }
|
||||||
|
|
||||||
selectedMediaSubject.onNext(selection)
|
selectedMediaSubject.onNext(selection)
|
||||||
|
@ -438,7 +440,7 @@ class MediaSelectionViewModel(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Bundle.toAssociation(): Pair<Uri, Any> {
|
private fun Bundle.toAssociation(): Pair<Uri, Any> {
|
||||||
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)) {
|
val value: Any = if (getBoolean(BUNDLE_IS_IMAGE)) {
|
||||||
ImageEditorFragment.Data(this)
|
ImageEditorFragment.Data(this)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.mediasend.MediaSendGifFragment
|
import org.thoughtcrime.securesms.mediasend.MediaSendGifFragment
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
|
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 {
|
companion object {
|
||||||
private const val ARG_URI = "arg.uri"
|
private const val ARG_URI = "arg.uri"
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.view.View
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import io.reactivex.rxjava3.disposables.Disposable
|
import io.reactivex.rxjava3.disposables.Disposable
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
|
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel
|
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) {
|
override fun onTouchEventsNeeded(needed: Boolean) {
|
||||||
if (isResumed) {
|
if (isResumed) {
|
||||||
|
|
|
@ -13,6 +13,7 @@ import androidx.core.widget.doAfterTextChanged
|
||||||
import androidx.fragment.app.setFragmentResult
|
import androidx.fragment.app.setFragmentResult
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
|
import org.signal.core.util.getParcelableArrayListCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchAdapter
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchAdapter
|
||||||
|
@ -159,7 +160,7 @@ class ChooseGroupStoryBottomSheet : FixedRoundedCornerBottomSheetDialogFragment(
|
||||||
|
|
||||||
object ResultContract {
|
object ResultContract {
|
||||||
fun getRecipientIds(bundle: Bundle): List<RecipientId> {
|
fun getRecipientIds(bundle: Bundle): List<RecipientId> {
|
||||||
return bundle.getParcelableArrayList(RESULT_SET)!!
|
return bundle.getParcelableArrayListCompat(RESULT_SET, RecipientId::class.java)!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import androidx.activity.result.contract.ActivityResultContract
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
import org.signal.core.util.getParcelableArrayListExtraCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
||||||
|
@ -34,7 +35,7 @@ class StoriesMultiselectForwardActivity : MultiselectForwardActivity() {
|
||||||
|
|
||||||
val preview1View: ImageView = findViewById(R.id.preview_media_1)
|
val preview1View: ImageView = findViewById(R.id.preview_media_1)
|
||||||
val preview2View: ImageView = findViewById(R.id.preview_media_2)
|
val preview2View: ImageView = findViewById(R.id.preview_media_2)
|
||||||
val previewMedia: List<Uri> = intent.getParcelableArrayListExtra(PREVIEW_MEDIA)!!
|
val previewMedia: List<Uri> = intent.getParcelableArrayListExtraCompat(PREVIEW_MEDIA, Uri::class.java)!!
|
||||||
|
|
||||||
preview1View.visible = previewMedia.isNotEmpty()
|
preview1View.visible = previewMedia.isNotEmpty()
|
||||||
preview2View.visible = previewMedia.size > 1
|
preview2View.visible = previewMedia.size > 1
|
||||||
|
|
|
@ -15,6 +15,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
import io.reactivex.rxjava3.subjects.BehaviorSubject
|
import io.reactivex.rxjava3.subjects.BehaviorSubject
|
||||||
import io.reactivex.rxjava3.subjects.Subject
|
import io.reactivex.rxjava3.subjects.Subject
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
|
@ -67,7 +68,7 @@ class TextStoryPostCreationViewModel(private val repository: TextStoryPostSendRe
|
||||||
|
|
||||||
fun restoreFromInstanceState(inState: Bundle) {
|
fun restoreFromInstanceState(inState: Bundle) {
|
||||||
if (inState.containsKey(TEXT_STORY_INSTANCE_STATE)) {
|
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)
|
textFontSubject.onNext(store.state.textFont)
|
||||||
store.update { state }
|
store.update { state }
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.mediasend.VideoEditorFragment
|
import org.thoughtcrime.securesms.mediasend.VideoEditorFragment
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
|
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 requireMaxCompressedVideoSize(): Long = sharedViewModel.getMediaConstraints().getCompressedVideoMaxSize(requireContext()).toLong()
|
||||||
private fun requireMaxAttachmentSize(): Long = sharedViewModel.getMediaConstraints().getVideoMaxSize(requireContext()).toLong()
|
private fun requireMaxAttachmentSize(): Long = sharedViewModel.getMediaConstraints().getVideoMaxSize(requireContext()).toLong()
|
||||||
private fun requireIsVideoGif(): Boolean = requireNotNull(requireArguments().getBoolean(ARG_IS_VIDEO_GIF))
|
private fun requireIsVideoGif(): Boolean = requireNotNull(requireArguments().getBoolean(ARG_IS_VIDEO_GIF))
|
||||||
|
|
|
@ -825,7 +825,7 @@ public final class MessageContentProcessor {
|
||||||
warn(content.getTimestamp(), "Group message missing destination uuid, defaulting to ACI");
|
warn(content.getTimestamp(), "Group message missing destination uuid, defaulting to ACI");
|
||||||
authServiceId = SignalStore.account().requireAci();
|
authServiceId = SignalStore.account().requireAci();
|
||||||
}
|
}
|
||||||
SignalDatabase.groups().fixMissingMasterKey(authServiceId, group.getMasterKey());
|
SignalDatabase.groups().fixMissingMasterKey(group.getMasterKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,17 +55,15 @@ public class IncomingLollipopMmsConnection extends LollipopMmsConnection impleme
|
||||||
super(context, ACTION);
|
super(context, ACTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(VERSION_CODES.LOLLIPOP)
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void onResult(Context context, Intent intent) {
|
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, "HTTP status: " + intent.getIntExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, -1));
|
||||||
}
|
}
|
||||||
Log.i(TAG, "code: " + getResultCode() + ", result string: " + getResultData());
|
Log.i(TAG, "code: " + getResultCode() + ", result string: " + getResultData());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@TargetApi(VERSION_CODES.LOLLIPOP)
|
|
||||||
public synchronized @Nullable RetrieveConf retrieve(@NonNull String contentLocation,
|
public synchronized @Nullable RetrieveConf retrieve(@NonNull String contentLocation,
|
||||||
byte[] transactionId,
|
byte[] transactionId,
|
||||||
int subscriptionId) throws MmsException
|
int subscriptionId) throws MmsException
|
||||||
|
|
|
@ -50,10 +50,10 @@ public class OutgoingLollipopMmsConnection extends LollipopMmsConnection impleme
|
||||||
super(context, ACTION);
|
super(context, ACTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(VERSION_CODES.LOLLIPOP_MR1)
|
@TargetApi(22)
|
||||||
@Override
|
@Override
|
||||||
public synchronized void onResult(Context context, Intent intent) {
|
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, "HTTP status: " + intent.getIntExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, -1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +61,6 @@ public class OutgoingLollipopMmsConnection extends LollipopMmsConnection impleme
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@TargetApi(VERSION_CODES.LOLLIPOP)
|
|
||||||
public @Nullable synchronized SendConf send(@NonNull byte[] pduBytes, int subscriptionId)
|
public @Nullable synchronized SendConf send(@NonNull byte[] pduBytes, int subscriptionId)
|
||||||
throws UndeliverableMessageException
|
throws UndeliverableMessageException
|
||||||
{
|
{
|
||||||
|
|
|
@ -204,7 +204,6 @@ public class Camera implements CameraControl, CameraVideoCapturer.CameraSwitchHa
|
||||||
cameraEventListener.onCameraSwitchCompleted(new CameraState(getActiveDirection(), getCount()));
|
cameraEventListener.onCameraSwitchCompleted(new CameraState(getActiveDirection(), getCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(21)
|
|
||||||
private static class FilteredCamera2Enumerator extends Camera2Enumerator {
|
private static class FilteredCamera2Enumerator extends Camera2Enumerator {
|
||||||
|
|
||||||
private static final String TAG = Log.tag(Camera2Enumerator.class);
|
private static final String TAG = Log.tag(Camera2Enumerator.class);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.safety
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
||||||
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
|
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
|
||||||
import org.thoughtcrime.securesms.database.model.IdentityRecord
|
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.
|
* @throws IllegalArgumentException if the bundle does not contain the correct parcelized arguments.
|
||||||
*/
|
*/
|
||||||
fun getArgsFromBundle(bundle: Bundle): SafetyNumberBottomSheetArgs {
|
fun getArgsFromBundle(bundle: Bundle): SafetyNumberBottomSheetArgs {
|
||||||
val args = bundle.getParcelable<SafetyNumberBottomSheetArgs>(ARGS)
|
val args: SafetyNumberBottomSheetArgs? = bundle.getParcelableCompat(ARGS, SafetyNumberBottomSheetArgs::class.java)
|
||||||
Preconditions.checkArgument(args != null)
|
Preconditions.checkArgument(args != null)
|
||||||
return args!!
|
return args!!
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.appcompat.widget.AppCompatSeekBar
|
import androidx.appcompat.widget.AppCompatSeekBar
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import com.airbnb.lottie.SimpleColorFilter
|
import com.airbnb.lottie.SimpleColorFilter
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.imageeditor.core.HiddenEditText
|
import org.signal.imageeditor.core.HiddenEditText
|
||||||
import org.signal.imageeditor.core.model.EditorElement
|
import org.signal.imageeditor.core.model.EditorElement
|
||||||
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer
|
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer
|
||||||
|
@ -42,7 +43,7 @@ class TextEntryDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_im
|
||||||
dismissAllowingStateLoss()
|
dismissAllowingStateLoss()
|
||||||
}
|
}
|
||||||
|
|
||||||
val element: EditorElement = requireNotNull(requireArguments().getParcelable("element"))
|
val element: EditorElement = requireNotNull(requireArguments().getParcelableCompat("element", EditorElement::class.java))
|
||||||
val incognito = requireArguments().getBoolean("incognito")
|
val incognito = requireArguments().getBoolean("incognito")
|
||||||
val selectAll = requireArguments().getBoolean("selectAll")
|
val selectAll = requireArguments().getBoolean("selectAll")
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,9 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.core.content.pm.ShortcutManagerCompat
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import org.signal.core.util.Result
|
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.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.MainActivity
|
import org.thoughtcrime.securesms.MainActivity
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActivity
|
||||||
|
@ -135,7 +138,7 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C
|
||||||
throw AssertionError("Expected a recipient selection!")
|
throw AssertionError("Expected a recipient selection!")
|
||||||
}
|
}
|
||||||
|
|
||||||
val contactSearchKeys: List<ContactSearchKey.RecipientSearchKey> = bundle.getParcelableArrayList(MultiselectForwardFragment.RESULT_SELECTION)!!
|
val contactSearchKeys: List<ContactSearchKey.RecipientSearchKey> = bundle.getParcelableArrayListCompat(MultiselectForwardFragment.RESULT_SELECTION, ContactSearchKey.RecipientSearchKey::class.java)!!
|
||||||
|
|
||||||
viewModel.onContactSelectionConfirmed(contactSearchKeys)
|
viewModel.onContactSelectionConfirmed(contactSearchKeys)
|
||||||
}
|
}
|
||||||
|
@ -161,12 +164,12 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C
|
||||||
} ?: Result.failure(IntentError.SEND_MULTIPLE_TEXT)
|
} ?: Result.failure(IntentError.SEND_MULTIPLE_TEXT)
|
||||||
}
|
}
|
||||||
intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_STREAM) -> {
|
intent.action == Intent.ACTION_SEND_MULTIPLE && intent.hasExtra(Intent.EXTRA_STREAM) -> {
|
||||||
intent.getParcelableArrayListExtra<Uri>(Intent.EXTRA_STREAM)?.let {
|
intent.getParcelableArrayListExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)?.let {
|
||||||
Result.success(UnresolvedShareData.ExternalMultiShare(it))
|
Result.success(UnresolvedShareData.ExternalMultiShare(it))
|
||||||
} ?: Result.failure(IntentError.SEND_MULTIPLE_STREAM)
|
} ?: Result.failure(IntentError.SEND_MULTIPLE_STREAM)
|
||||||
}
|
}
|
||||||
intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_STREAM) -> {
|
intent.action == Intent.ACTION_SEND && intent.hasExtra(Intent.EXTRA_STREAM) -> {
|
||||||
intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)?.let {
|
intent.getParcelableExtraCompat(Intent.EXTRA_STREAM, Uri::class.java)?.let {
|
||||||
Result.success(UnresolvedShareData.ExternalSingleShare(it, intent.type))
|
Result.success(UnresolvedShareData.ExternalSingleShare(it, intent.type))
|
||||||
} ?: extractSingleExtraTextFromIntent(IntentError.SEND_STREAM)
|
} ?: extractSingleExtraTextFromIntent(IntentError.SEND_STREAM)
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ public final class GroupV2RecordProcessor extends DefaultStorageRecordProcessor<
|
||||||
return StorageSyncModels.localToRemoteRecord(settings);
|
return StorageSyncModels.localToRemoteRecord(settings);
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "No local master key. Assuming it matches remote since the groupIds match. Enqueuing a fetch to fix the bad state.");
|
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());
|
return StorageSyncModels.localToRemoteRecord(settings, record.getMasterKeyOrThrow());
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -8,6 +8,7 @@ import android.view.View
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.blurhash.BlurHash
|
import org.thoughtcrime.securesms.blurhash.BlurHash
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
|
@ -135,7 +136,7 @@ class StorySlateView @JvmOverloads constructor(
|
||||||
|
|
||||||
override fun onRestoreInstanceState(state: Parcelable?) {
|
override fun onRestoreInstanceState(state: Parcelable?) {
|
||||||
if (state is Bundle) {
|
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.state = State.fromCode(state.getInt("STATE", State.HIDDEN.code))
|
||||||
this.postId = state.getLong("ID")
|
this.postId = state.getLong("ID")
|
||||||
super.onRestoreInstanceState(rootState)
|
super.onRestoreInstanceState(rootState)
|
||||||
|
|
|
@ -16,6 +16,7 @@ import com.bumptech.glide.load.ResourceDecoder
|
||||||
import com.bumptech.glide.load.engine.Resource
|
import com.bumptech.glide.load.engine.Resource
|
||||||
import com.bumptech.glide.load.resource.SimpleResource
|
import com.bumptech.glide.load.resource.SimpleResource
|
||||||
import org.signal.core.util.concurrent.safeBlockingGet
|
import org.signal.core.util.concurrent.safeBlockingGet
|
||||||
|
import org.signal.core.util.readParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.conversation.colors.ChatColors
|
import org.thoughtcrime.securesms.conversation.colors.ChatColors
|
||||||
import org.thoughtcrime.securesms.database.SignalDatabase
|
import org.thoughtcrime.securesms.database.SignalDatabase
|
||||||
|
@ -80,7 +81,7 @@ data class StoryTextPostModel(
|
||||||
return StoryTextPostModel(
|
return StoryTextPostModel(
|
||||||
storyTextPost = StoryTextPost.parseFrom(ParcelUtil.readByteArray(parcel)),
|
storyTextPost = StoryTextPost.parseFrom(ParcelUtil.readByteArray(parcel)),
|
||||||
storySentAtMillis = parcel.readLong(),
|
storySentAtMillis = parcel.readLong(),
|
||||||
storyAuthor = parcel.readParcelable(RecipientId::class.java.classLoader)!!,
|
storyAuthor = parcel.readParcelableCompat(RecipientId::class.java)!!,
|
||||||
bodyRanges = ParcelUtil.readByteArray(parcel)?.let { BodyRangeList.parseFrom(it) }
|
bodyRanges = ParcelUtil.readByteArray(parcel)?.let { BodyRangeList.parseFrom(it) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,8 @@ import androidx.window.layout.WindowMetricsCalculator
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.MemoryCategory
|
import com.bumptech.glide.MemoryCategory
|
||||||
import org.signal.core.util.dp
|
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.signal.core.util.sp
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActivity
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
|
@ -45,7 +47,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
|
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
val cache: StoryViewStateCache? = savedInstanceState.getParcelable(DATA_CACHE)
|
val cache: StoryViewStateCache? = savedInstanceState.getParcelableCompat(DATA_CACHE, StoryViewStateCache::class.java)
|
||||||
if (cache != null) {
|
if (cache != null) {
|
||||||
storyViewStateViewModel.storyViewStateCache.putAll(cache)
|
storyViewStateViewModel.storyViewStateCache.putAll(cache)
|
||||||
}
|
}
|
||||||
|
@ -125,7 +127,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
|
||||||
supportFragmentManager.beginTransaction()
|
supportFragmentManager.beginTransaction()
|
||||||
.replace(
|
.replace(
|
||||||
R.id.fragment_container,
|
R.id.fragment_container,
|
||||||
StoryViewerFragment.create(intent.getParcelableExtra(ARGS)!!)
|
StoryViewerFragment.create(intent.getParcelableExtraCompat(ARGS, StoryViewerArgs::class.java)!!)
|
||||||
)
|
)
|
||||||
.commit()
|
.commit()
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,8 @@ import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
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.R
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
|
@ -42,7 +44,7 @@ class StoryViewerFragment :
|
||||||
|
|
||||||
private val lifecycleDisposable = LifecycleDisposable()
|
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
|
private lateinit var storyCrossfader: StoriesSharedElementCrossFaderView
|
||||||
|
|
||||||
|
@ -120,7 +122,7 @@ class StoryViewerFragment :
|
||||||
}
|
}
|
||||||
|
|
||||||
if (savedInstanceState != null && savedInstanceState.containsKey(HIDDEN)) {
|
if (savedInstanceState != null && savedInstanceState.containsKey(HIDDEN)) {
|
||||||
val ids: List<RecipientId> = savedInstanceState.getParcelableArrayList(HIDDEN)!!
|
val ids: List<RecipientId> = savedInstanceState.getParcelableArrayListCompat(HIDDEN, RecipientId::class.java)!!
|
||||||
viewModel.addHiddenAndRefresh(ids.toSet())
|
viewModel.addHiddenAndRefresh(ids.toSet())
|
||||||
} else {
|
} else {
|
||||||
viewModel.refresh()
|
viewModel.refresh()
|
||||||
|
|
|
@ -36,6 +36,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.core.Observable
|
import io.reactivex.rxjava3.core.Observable
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
import org.signal.core.util.dp
|
import org.signal.core.util.dp
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.animation.AnimationCompleteListener
|
import org.thoughtcrime.securesms.animation.AnimationCompleteListener
|
||||||
|
@ -153,7 +154,9 @@ class StoryViewerPageFragment :
|
||||||
|
|
||||||
private var sendingProgressDrawable: IndeterminateDrawable<CircularProgressIndicatorSpec>? = null
|
private var sendingProgressDrawable: IndeterminateDrawable<CircularProgressIndicatorSpec>? = 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")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import androidx.fragment.app.DialogFragment
|
||||||
import androidx.fragment.app.setFragmentResult
|
import androidx.fragment.app.setFragmentResult
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.KeyboardEntryDialogFragment
|
import org.thoughtcrime.securesms.components.KeyboardEntryDialogFragment
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiEventListener
|
import org.thoughtcrime.securesms.components.emoji.EmojiEventListener
|
||||||
|
@ -60,7 +61,7 @@ class StoryDirectReplyDialogFragment :
|
||||||
get() = requireArguments().getLong(ARG_STORY_ID)
|
get() = requireArguments().getLong(ARG_STORY_ID)
|
||||||
|
|
||||||
private val recipientId: RecipientId?
|
private val recipientId: RecipientId?
|
||||||
get() = requireArguments().getParcelable(ARG_RECIPIENT_ID)
|
get() = requireArguments().getParcelableCompat(ARG_RECIPIENT_ID, RecipientId::class.java)
|
||||||
|
|
||||||
override val withDim: Boolean = true
|
override val withDim: Boolean = true
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ import androidx.fragment.app.DialogFragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
|
@ -34,7 +35,7 @@ class StoryGroupReplyBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDi
|
||||||
get() = requireArguments().getLong(ARG_STORY_ID)
|
get() = requireArguments().getLong(ARG_STORY_ID)
|
||||||
|
|
||||||
private val groupRecipientId: RecipientId
|
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
|
private val isFromNotification: Boolean
|
||||||
get() = requireArguments().getBoolean(ARG_IS_FROM_NOTIFICATION, false)
|
get() = requireArguments().getBoolean(ARG_IS_FROM_NOTIFICATION, false)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.kotlin.subscribeBy
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
||||||
import org.signal.core.util.concurrent.SignalExecutors
|
import org.signal.core.util.concurrent.SignalExecutors
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
||||||
|
@ -132,7 +133,7 @@ class StoryGroupReplyFragment :
|
||||||
get() = requireArguments().getLong(ARG_STORY_ID)
|
get() = requireArguments().getLong(ARG_STORY_ID)
|
||||||
|
|
||||||
private val groupRecipientId: RecipientId
|
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
|
private val isFromNotification: Boolean
|
||||||
get() = requireArguments().getBoolean(ARG_IS_FROM_NOTIFICATION, false)
|
get() = requireArguments().getBoolean(ARG_IS_FROM_NOTIFICATION, false)
|
||||||
|
|
|
@ -15,6 +15,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.google.android.material.tabs.TabLayout
|
import com.google.android.material.tabs.TabLayout
|
||||||
import com.google.android.material.tabs.TabLayoutMediator
|
import com.google.android.material.tabs.TabLayoutMediator
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialogFragment
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
|
@ -41,7 +42,7 @@ class StoryViewsAndRepliesDialogFragment : FixedRoundedCornerBottomSheetDialogFr
|
||||||
get() = requireArguments().getLong(ARG_STORY_ID)
|
get() = requireArguments().getLong(ARG_STORY_ID)
|
||||||
|
|
||||||
private val groupRecipientId: RecipientId
|
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
|
private val startPageIndex: Int
|
||||||
get() = requireArguments().getInt(ARG_START_PAGE)
|
get() = requireArguments().getInt(ARG_START_PAGE)
|
||||||
|
|
|
@ -392,7 +392,6 @@ public class Util {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(VERSION_CODES.LOLLIPOP)
|
|
||||||
public static boolean isMmsCapable(Context context) {
|
public static boolean isMmsCapable(Context context) {
|
||||||
return (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) || OutgoingLegacyMmsConnection.isConnectionPossible(context);
|
return (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) || OutgoingLegacyMmsConnection.isConnectionPossible(context);
|
||||||
}
|
}
|
||||||
|
@ -418,12 +417,10 @@ public class Util {
|
||||||
else return Uri.parse(uri);
|
else return Uri.parse(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(VERSION_CODES.KITKAT)
|
|
||||||
public static boolean isLowMemory(Context context) {
|
public static boolean isLowMemory(Context context) {
|
||||||
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
|
|
||||||
return (VERSION.SDK_INT >= VERSION_CODES.KITKAT && activityManager.isLowRamDevice()) ||
|
return activityManager.isLowRamDevice() || activityManager.getLargeMemoryClass() <= 64;
|
||||||
activityManager.getLargeMemoryClass() <= 64;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int clamp(int value, int min, int max) {
|
public static int clamp(int value, int min, int max) {
|
||||||
|
|
|
@ -14,6 +14,7 @@ import androidx.core.content.withStyledAttributes
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.google.android.material.progressindicator.CircularProgressIndicator
|
import com.google.android.material.progressindicator.CircularProgressIndicator
|
||||||
import com.google.android.material.theme.overlay.MaterialThemeOverlay
|
import com.google.android.material.theme.overlay.MaterialThemeOverlay
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.util.visible
|
import org.thoughtcrime.securesms.util.visible
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
|
@ -76,7 +77,7 @@ class CircularProgressMaterialButton @JvmOverloads constructor(
|
||||||
|
|
||||||
override fun onRestoreInstanceState(state: Parcelable) {
|
override fun onRestoreInstanceState(state: Parcelable) {
|
||||||
val stateBundle = state as Bundle
|
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)
|
super.onRestoreInstanceState(superState)
|
||||||
|
|
||||||
currentState = if (materialButton.visibility == INVISIBLE) State.PROGRESS else State.BUTTON
|
currentState = if (materialButton.visibility == INVISIBLE) State.PROGRESS else State.BUTTON
|
||||||
|
|
|
@ -284,15 +284,14 @@ public class VerifyDisplayFragment extends Fragment implements ViewTreeObserver.
|
||||||
public boolean onContextItemSelected(MenuItem item) {
|
public boolean onContextItemSelected(MenuItem item) {
|
||||||
if (fingerprint == null) return super.onContextItemSelected(item);
|
if (fingerprint == null) return super.onContextItemSelected(item);
|
||||||
|
|
||||||
switch (item.getItemId()) {
|
if (item.getItemId() == R.id.menu_copy) {
|
||||||
case R.id.menu_copy:
|
handleCopyToClipboard(fingerprint, codes.length);
|
||||||
handleCopyToClipboard(fingerprint, codes.length);
|
return true;
|
||||||
return true;
|
} else if (item.getItemId() == R.id.menu_compare) {
|
||||||
case R.id.menu_compare:
|
handleCompareWithClipboard(fingerprint);
|
||||||
handleCompareWithClipboard(fingerprint);
|
return true;
|
||||||
return true;
|
} else {
|
||||||
default:
|
return super.onContextItemSelected(item);
|
||||||
return super.onContextItemSelected(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.widget.Toast
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import org.signal.core.util.ThreadUtil
|
import org.signal.core.util.ThreadUtil
|
||||||
|
import org.signal.core.util.getParcelableCompat
|
||||||
import org.signal.qr.kitkat.ScanListener
|
import org.signal.qr.kitkat.ScanListener
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.WrapperDialogFragment
|
import org.thoughtcrime.securesms.components.WrapperDialogFragment
|
||||||
|
@ -84,10 +85,10 @@ class VerifyIdentityFragment : Fragment(R.layout.fragment_container), ScanListen
|
||||||
}
|
}
|
||||||
|
|
||||||
private val recipientId: RecipientId
|
private val recipientId: RecipientId
|
||||||
get() = requireArguments().getParcelable(EXTRA_RECIPIENT)!!
|
get() = requireArguments().getParcelableCompat(EXTRA_RECIPIENT, RecipientId::class.java)!!
|
||||||
|
|
||||||
private val remoteIdentity: IdentityKeyParcelable
|
private val remoteIdentity: IdentityKeyParcelable
|
||||||
get() = requireArguments().getParcelable(EXTRA_IDENTITY)!!
|
get() = requireArguments().getParcelableCompat(EXTRA_IDENTITY, IdentityKeyParcelable::class.java)!!
|
||||||
|
|
||||||
private val isVerified: Boolean
|
private val isVerified: Boolean
|
||||||
get() = requireArguments().getBoolean(EXTRA_VERIFIED)
|
get() = requireArguments().getBoolean(EXTRA_VERIFIED)
|
||||||
|
|
|
@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.webrtc.audio
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Parcel
|
import android.os.Parcel
|
||||||
import android.os.Parcelable
|
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.recipients.RecipientId
|
||||||
import org.thoughtcrime.securesms.util.ParcelUtil
|
import org.thoughtcrime.securesms.util.ParcelUtil
|
||||||
|
|
||||||
|
@ -36,7 +38,7 @@ sealed class AudioManagerCommand : Parcelable {
|
||||||
@JvmField
|
@JvmField
|
||||||
val CREATOR: Parcelable.Creator<StartIncomingRinger> = ParcelCheat { parcel ->
|
val CREATOR: Parcelable.Creator<StartIncomingRinger> = ParcelCheat { parcel ->
|
||||||
StartIncomingRinger(
|
StartIncomingRinger(
|
||||||
ringtoneUri = parcel.readParcelable(Uri::class.java.classLoader)!!,
|
ringtoneUri = parcel.readParcelableCompat(Uri::class.java)!!,
|
||||||
vibrate = ParcelUtil.readBoolean(parcel)
|
vibrate = ParcelUtil.readBoolean(parcel)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -83,7 +85,12 @@ sealed class AudioManagerCommand : Parcelable {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmField
|
@JvmField
|
||||||
val CREATOR: Parcelable.Creator<SetUserDevice> = ParcelCheat { SetUserDevice(it.readParcelable(RecipientId::class.java.classLoader), it.readSerializable() as SignalAudioManager.AudioDevice) }
|
val CREATOR: Parcelable.Creator<SetUserDevice> = ParcelCheat {
|
||||||
|
SetUserDevice(
|
||||||
|
it.readParcelableCompat(RecipientId::class.java),
|
||||||
|
it.readSerializableCompat(SignalAudioManager.AudioDevice::class.java)!!
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,8 +105,8 @@ sealed class AudioManagerCommand : Parcelable {
|
||||||
@JvmField
|
@JvmField
|
||||||
val CREATOR: Parcelable.Creator<SetDefaultDevice> = ParcelCheat { parcel ->
|
val CREATOR: Parcelable.Creator<SetDefaultDevice> = ParcelCheat { parcel ->
|
||||||
SetDefaultDevice(
|
SetDefaultDevice(
|
||||||
recipientId = parcel.readParcelable(RecipientId::class.java.classLoader),
|
recipientId = parcel.readParcelableCompat(RecipientId::class.java),
|
||||||
device = parcel.readSerializable() as SignalAudioManager.AudioDevice,
|
device = parcel.readSerializableCompat(SignalAudioManager.AudioDevice::class.java)!!,
|
||||||
clearUserEarpieceSelection = ParcelUtil.readBoolean(parcel)
|
clearUserEarpieceSelection = ParcelUtil.readBoolean(parcel)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.stories.dialogs
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.test.core.app.ApplicationProvider
|
import androidx.test.core.app.ApplicationProvider
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
|
@ -15,6 +16,7 @@ import org.mockito.kotlin.mock
|
||||||
import org.mockito.kotlin.verify
|
import org.mockito.kotlin.verify
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
import org.robolectric.annotation.Config
|
import org.robolectric.annotation.Config
|
||||||
|
import org.signal.core.util.getParcelableExtraCompat
|
||||||
import org.thoughtcrime.securesms.attachments.AttachmentId
|
import org.thoughtcrime.securesms.attachments.AttachmentId
|
||||||
import org.thoughtcrime.securesms.database.FakeMessageRecords
|
import org.thoughtcrime.securesms.database.FakeMessageRecords
|
||||||
import org.thoughtcrime.securesms.database.model.StoryType
|
import org.thoughtcrime.securesms.database.model.StoryType
|
||||||
|
@ -61,8 +63,8 @@ class StoryContextMenuTest {
|
||||||
// THEN
|
// THEN
|
||||||
verify(fragment).startActivity(intentCaptor.capture())
|
verify(fragment).startActivity(intentCaptor.capture())
|
||||||
val chooserIntent: Intent = intentCaptor.firstValue
|
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(PartAuthority.getAttachmentPublicUri(PartAuthority.getAttachmentDataUri(attachmentId)), targetIntent.getParcelableExtra(Intent.EXTRA_STREAM))
|
assertEquals(PartAuthority.getAttachmentPublicUri(PartAuthority.getAttachmentDataUri(attachmentId)), targetIntent.getParcelableExtraCompat(Intent.EXTRA_STREAM, Uri::class.java))
|
||||||
assertEquals(MediaUtil.IMAGE_JPEG, targetIntent.type)
|
assertEquals(MediaUtil.IMAGE_JPEG, targetIntent.type)
|
||||||
assertTrue(Intent.FLAG_GRANT_READ_URI_PERMISSION and chooserIntent.flags == Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
assertTrue(Intent.FLAG_GRANT_READ_URI_PERMISSION and chooserIntent.flags == Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +84,7 @@ class StoryContextMenuTest {
|
||||||
// THEN
|
// THEN
|
||||||
verify(fragment).startActivity(intentCaptor.capture())
|
verify(fragment).startActivity(intentCaptor.capture())
|
||||||
val chooserIntent: Intent = intentCaptor.firstValue
|
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))
|
assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +104,7 @@ class StoryContextMenuTest {
|
||||||
// THEN
|
// THEN
|
||||||
verify(fragment).startActivity(intentCaptor.capture())
|
verify(fragment).startActivity(intentCaptor.capture())
|
||||||
val chooserIntent: Intent = intentCaptor.firstValue
|
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))
|
assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +126,7 @@ class StoryContextMenuTest {
|
||||||
// THEN
|
// THEN
|
||||||
verify(fragment).startActivity(intentCaptor.capture())
|
verify(fragment).startActivity(intentCaptor.capture())
|
||||||
val chooserIntent: Intent = intentCaptor.firstValue
|
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))
|
assertEquals(expected, targetIntent.getStringExtra(Intent.EXTRA_TEXT))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.signal.core.util
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Parcelable
|
||||||
|
|
||||||
|
fun <T : Parcelable> Bundle.getParcelableCompat(key: String, clazz: Class<T>): T? {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
this.getParcelable(key, clazz)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
this.getParcelable(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : Parcelable> Bundle.getParcelableArrayListCompat(key: String, clazz: Class<T>): ArrayList<T>? {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
this.getParcelableArrayList(key, clazz)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
this.getParcelableArrayList(key)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.signal.core.util
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Parcelable
|
||||||
|
|
||||||
|
fun <T : Parcelable> Intent.getParcelableExtraCompat(key: String, clazz: Class<T>): T? {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
this.getParcelableExtra(key, clazz)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
this.getParcelableExtra(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : Parcelable> Intent.getParcelableArrayListExtraCompat(key: String, clazz: Class<T>): ArrayList<T>? {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
this.getParcelableArrayListExtra(key, clazz)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
this.getParcelableArrayListExtra(key)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.signal.core.util
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Parcel
|
||||||
|
import android.os.Parcelable
|
||||||
|
|
||||||
|
fun <T : Parcelable> Parcel.readParcelableCompat(clazz: Class<T>): T? {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
this.readParcelable(clazz.classLoader, clazz)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
this.readParcelable(clazz.classLoader)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : java.io.Serializable> Parcel.readSerializableCompat(clazz: Class<T>): T? {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
this.readSerializable(clazz.classLoader, clazz)
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION", "UNCHECKED_CAST")
|
||||||
|
this.readSerializable() as T
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,15 +1,23 @@
|
||||||
package org.signal.lint;
|
package org.signal.lint;
|
||||||
|
|
||||||
import com.android.tools.lint.client.api.IssueRegistry;
|
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.ApiKt;
|
||||||
import com.android.tools.lint.detector.api.Issue;
|
import com.android.tools.lint.detector.api.Issue;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@SuppressWarnings("UnstableApiUsage")
|
@SuppressWarnings("UnstableApiUsage")
|
||||||
public final class Registry extends IssueRegistry {
|
public final class Registry extends IssueRegistry {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vendor getVendor() {
|
||||||
|
return new Vendor("Signal", "Signal", "Signal", "Signal");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Issue> getIssues() {
|
public List<Issue> getIssues() {
|
||||||
return Arrays.asList(SignalLogDetector.LOG_NOT_SIGNAL,
|
return Arrays.asList(SignalLogDetector.LOG_NOT_SIGNAL,
|
||||||
|
|
Ładowanie…
Reference in New Issue