diff --git a/app/src/main/java/androidx/documentfile/provider/DocumentFileHelper.java b/app/src/main/java/androidx/documentfile/provider/DocumentFileHelper.java index 122b748ddf..806882482a 100644 --- a/app/src/main/java/androidx/documentfile/provider/DocumentFileHelper.java +++ b/app/src/main/java/androidx/documentfile/provider/DocumentFileHelper.java @@ -4,8 +4,6 @@ import android.content.Context; import android.net.Uri; import android.provider.DocumentsContract; -import androidx.annotation.RequiresApi; - import org.signal.core.util.logging.Log; /** @@ -22,7 +20,6 @@ public class DocumentFileHelper { * * @return true if rename successful */ - @RequiresApi(21) public static boolean renameTo(Context context, DocumentFile documentFile, String displayName) { if (documentFile instanceof TreeDocumentFile) { Log.d(TAG, "Renaming document directly"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 3f46cfd38f..88edafd465 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -168,11 +168,6 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr .addBlocking("lifecycle-observer", () -> ApplicationDependencies.getAppForegroundObserver().addListener(this)) .addBlocking("message-retriever", this::initializeMessageRetrieval) .addBlocking("dynamic-theme", () -> DynamicTheme.setDefaultDayNightMode(this)) - .addBlocking("vector-compat", () -> { - if (Build.VERSION.SDK_INT < 21) { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - } - }) .addBlocking("proxy-init", () -> { if (SignalStore.proxy().isProxyEnabled()) { Log.w(TAG, "Proxy detected. Enabling Conscrypt.setUseEngineSocketByDefault()"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java index 22b6f11182..3d98d8fb07 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java @@ -72,12 +72,10 @@ public final class AvatarPreviewActivity extends PassphraseRequiredActivity { setTheme(R.style.TextSecure_MediaPreview); setContentView(R.layout.contact_photo_preview_activity); - if (Build.VERSION.SDK_INT >= 21) { - postponeEnterTransition(); - TransitionInflater inflater = TransitionInflater.from(this); - getWindow().setSharedElementEnterTransition(inflater.inflateTransition(R.transition.full_screen_avatar_image_enter_transition_set)); - getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.full_screen_avatar_image_return_transition_set)); - } + postponeEnterTransition(); + TransitionInflater inflater = TransitionInflater.from(this); + getWindow().setSharedElementEnterTransition(inflater.inflateTransition(R.transition.full_screen_avatar_image_enter_transition_set)); + getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.full_screen_avatar_image_return_transition_set)); Toolbar toolbar = findViewById(R.id.toolbar); EmojiTextView title = findViewById(R.id.title); @@ -122,9 +120,7 @@ public final class AvatarPreviewActivity extends PassphraseRequiredActivity { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { avatar.setImageDrawable(RoundedBitmapDrawableFactory.create(resources, resource)); - if (Build.VERSION.SDK_INT >= 21) { - startPostponedEnterTransition(); - } + startPostponedEnterTransition(); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/BiometricDeviceAuthentication.kt b/app/src/main/java/org/thoughtcrime/securesms/BiometricDeviceAuthentication.kt index 9c08c8fa0d..e81544d0da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/BiometricDeviceAuthentication.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/BiometricDeviceAuthentication.kt @@ -5,7 +5,6 @@ import android.content.Context import android.content.Intent import android.os.Build import androidx.activity.result.contract.ActivityResultContract -import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricPrompt.PromptInfo @@ -44,7 +43,7 @@ class BiometricDeviceAuthentication( Log.i(TAG, "Skipping show system biometric or device lock dialog unless forced") } true - } else if (Build.VERSION.SDK_INT >= 21) { + } else { if (force) { Log.i(TAG, "firing intent...") showConfirmDeviceCredentialIntent() @@ -52,9 +51,6 @@ class BiometricDeviceAuthentication( Log.i(TAG, "Skipping firing intent unless forced") } true - } else { - Log.w(TAG, "Not compatible...") - false } } @@ -65,7 +61,6 @@ class BiometricDeviceAuthentication( class BiometricDeviceLockContract : ActivityResultContract() { - @RequiresApi(api = 21) override fun createIntent(context: Context, input: String): Intent { val keyguardManager = ServiceUtil.getKeyguardManager(context) return keyguardManager.createConfirmDeviceCredentialIntent(input, "") diff --git a/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java index 4125fd9a07..ca0ed109bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java @@ -140,27 +140,18 @@ public class DeviceActivity extends PassphraseRequiredActivity Uri uri = Uri.parse(data); deviceLinkFragment.setLinkClickedListener(uri, DeviceActivity.this); - if (Build.VERSION.SDK_INT >= 21) { - deviceAddFragment.setSharedElementReturnTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(R.transition.fragment_shared)); - deviceAddFragment.setExitTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(android.R.transition.fade)); + deviceAddFragment.setSharedElementReturnTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(R.transition.fragment_shared)); + deviceAddFragment.setExitTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(android.R.transition.fade)); - deviceLinkFragment.setSharedElementEnterTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(R.transition.fragment_shared)); - deviceLinkFragment.setEnterTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(android.R.transition.fade)); + deviceLinkFragment.setSharedElementEnterTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(R.transition.fragment_shared)); + deviceLinkFragment.setEnterTransition(TransitionInflater.from(DeviceActivity.this).inflateTransition(android.R.transition.fade)); - getSupportFragmentManager().beginTransaction() - .addToBackStack(null) - .addSharedElement(deviceAddFragment.getDevicesImage(), "devices") - .replace(R.id.fragment_container, deviceLinkFragment) - .commit(); + getSupportFragmentManager().beginTransaction() + .addToBackStack(null) + .addSharedElement(deviceAddFragment.getDevicesImage(), "devices") + .replace(R.id.fragment_container, deviceLinkFragment) + .commit(); - } else { - getSupportFragmentManager().beginTransaction() - .setCustomAnimations(R.anim.slide_from_bottom, R.anim.slide_to_bottom, - R.anim.slide_from_bottom, R.anim.slide_to_bottom) - .replace(R.id.fragment_container, deviceLinkFragment) - .addToBackStack(null) - .commit(); - } }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java index 596511b0d3..e44b6c9a9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java @@ -41,22 +41,19 @@ public class DeviceAddFragment extends LoggingFragment { this.devicesImage = container.findViewById(R.id.devices); ViewCompat.setTransitionName(devicesImage, "devices"); - if (Build.VERSION.SDK_INT >= 21) { - container.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { - @TargetApi(21) - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) - { - v.removeOnLayoutChangeListener(this); + container.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) + { + v.removeOnLayoutChangeListener(this); - Animator reveal = ViewAnimationUtils.createCircularReveal(v, right, bottom, 0, (int) Math.hypot(right, bottom)); - reveal.setInterpolator(new DecelerateInterpolator(2f)); - reveal.setDuration(800); - reveal.start(); - } - }); - } + Animator reveal = ViewAnimationUtils.createCircularReveal(v, right, bottom, 0, (int) Math.hypot(right, bottom)); + reveal.setInterpolator(new DecelerateInterpolator(2f)); + reveal.setDuration(800); + reveal.start(); + } + }); scannerView.start(getViewLifecycleOwner(), CameraXModelBlocklist.isBlocklisted()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java index e71d6e64ee..5b09bc613c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java @@ -307,10 +307,8 @@ public class PassphrasePromptActivity extends PassphraseActivity { public Unit showConfirmDeviceCredentialIntent() { KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); - Intent intent = null; - if (Build.VERSION.SDK_INT >= 21) { - intent = keyguardManager.createConfirmDeviceCredentialIntent(getString(R.string.PassphrasePromptActivity_unlock_signal), ""); - } + Intent intent = keyguardManager.createConfirmDeviceCredentialIntent(getString(R.string.PassphrasePromptActivity_unlock_signal), ""); + startActivityForResult(intent, AUTHENTICATE_REQUEST_CODE); return Unit.INSTANCE; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleAvatarTransition.kt b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleAvatarTransition.kt index 30a034b42f..5b24db90f7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleAvatarTransition.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CircleAvatarTransition.kt @@ -13,7 +13,6 @@ import android.view.ViewGroup import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.view.animation.Interpolator -import androidx.annotation.RequiresApi private const val POSITION_ON_SCREEN = "signal.circleavatartransition.positiononscreen" private const val WIDTH = "signal.circleavatartransition.width" @@ -22,7 +21,6 @@ private const val HEIGHT = "signal.circleavatartransition.height" /** * Custom transition for Circular avatars, because once you have multiple things animating stuff was getting broken and weird. */ -@RequiresApi(21) class CircleAvatarTransition(context: Context, attrs: AttributeSet?) : Transition(context, attrs) { override fun captureStartValues(transitionValues: TransitionValues) { captureValues(transitionValues) diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CrossfaderTransition.kt b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CrossfaderTransition.kt index 96f71f8d17..14a1e5c879 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CrossfaderTransition.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/CrossfaderTransition.kt @@ -7,11 +7,9 @@ import android.transition.Transition import android.transition.TransitionValues import android.util.AttributeSet import android.view.ViewGroup -import androidx.annotation.RequiresApi import androidx.core.animation.doOnEnd import androidx.core.animation.doOnStart -@RequiresApi(21) class CrossfaderTransition(context: Context, attrs: AttributeSet?) : Transition(context, attrs) { companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/WipeDownTransition.kt b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/WipeDownTransition.kt index 746a5feb9a..55505940cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/WipeDownTransition.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/transitions/WipeDownTransition.kt @@ -10,7 +10,6 @@ import android.transition.TransitionValues import android.util.AttributeSet import android.view.View import android.view.ViewGroup -import androidx.annotation.RequiresApi import androidx.core.animation.addListener import androidx.fragment.app.FragmentContainerView @@ -19,7 +18,6 @@ private const val BOUNDS = "signal.wipedowntransition.bottom" /** * WipeDownTransition will animate the bottom position of a view such that it "wipes" down the screen to a final position. */ -@RequiresApi(21) class WipeDownTransition(context: Context, attrs: AttributeSet?) : Transition(context, attrs) { override fun captureStartValues(transitionValues: TransitionValues) { captureValues(transitionValues) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index c5e4ee6c25..704305fab9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -248,10 +248,6 @@ public class ComposeText extends EmojiEditText { editorInfo.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; } - if (Build.VERSION.SDK_INT < 21) { - return inputConnection; - } - if (mediaListener == null) { return inputConnection; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java index ebb665665a..69a46a72c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java @@ -111,7 +111,7 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { } private void updateKeyboardState(int previousHeight) { - if (viewInset == 0 && Build.VERSION.SDK_INT >= 21) viewInset = getViewInset(); + if (viewInset == 0) viewInset = getViewInset(); getWindowVisibleDisplayFrame(rect); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt b/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt index 09971106e9..e9503f7d34 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/Material3SearchToolbar.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.components import android.content.Context import android.graphics.PointF -import android.os.Build import android.util.AttributeSet import android.view.View import android.view.ViewAnimationUtils @@ -55,10 +54,7 @@ class Material3SearchToolbar @JvmOverloads constructor( } fun display(x: Float, y: Float) { - if (Build.VERSION.SDK_INT < 21) { - visibility = VISIBLE - ViewUtil.focusAndShowKeyboard(input) - } else if (!visible) { + if (!visible) { circularRevealPoint.set(x, y) val animator = ViewAnimationUtils.createCircularReveal(this, x.toInt(), y.toInt(), 0f, width.toFloat()) @@ -75,17 +71,13 @@ class Material3SearchToolbar @JvmOverloads constructor( listener?.onSearchClosed() ViewUtil.hideKeyboard(context, input) - if (Build.VERSION.SDK_INT >= 21) { - val animator = ViewAnimationUtils.createCircularReveal(this, circularRevealPoint.x.toInt(), circularRevealPoint.y.toInt(), width.toFloat(), 0f) - animator.duration = 400 + val animator = ViewAnimationUtils.createCircularReveal(this, circularRevealPoint.x.toInt(), circularRevealPoint.y.toInt(), width.toFloat(), 0f) + animator.duration = 400 - animator.addListener(onEnd = { - visibility = INVISIBLE - }) - animator.start() - } else { + animator.addListener(onEnd = { visibility = INVISIBLE - } + }) + animator.start() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java b/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java index 4e52be5726..950edd5af4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java @@ -106,15 +106,11 @@ public class SearchToolbar extends LinearLayout { searchItem.expandActionView(); - if (Build.VERSION.SDK_INT >= 21) { - Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, 0, getWidth()); - animator.setDuration(400); + Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, 0, getWidth()); + animator.setDuration(400); - setVisibility(View.VISIBLE); - animator.start(); - } else { - setVisibility(View.VISIBLE); - } + setVisibility(View.VISIBLE); + animator.start(); } } @@ -129,19 +125,15 @@ public class SearchToolbar extends LinearLayout { if (listener != null) listener.onSearchClosed(); - if (Build.VERSION.SDK_INT >= 21) { - Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, getWidth(), 0); - animator.setDuration(400); - animator.addListener(new AnimationCompleteListener() { - @Override - public void onAnimationEnd(Animator animation) { - setVisibility(View.INVISIBLE); - } - }); - animator.start(); - } else { - setVisibility(View.INVISIBLE); - } + Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, getWidth(), 0); + animator.setDuration(400); + animator.addListener(new AnimationCompleteListener() { + @Override + public void onAnimationEnd(Animator animation) { + setVisibility(View.INVISIBLE); + } + }); + animator.start(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java index 5bdbc68bb5..c9e7c5a7e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java @@ -102,9 +102,7 @@ public class TooltipPopup extends PopupWindow { GlideApp.with(anchor.getContext()).load(iconGlideModel).into(iconView); } - if (Build.VERSION.SDK_INT >= 21) { - setElevation(10); - } + setElevation(10); getContentView().setOnClickListener(v -> dismiss()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java index c4527ae94a..6c63240923 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java @@ -31,9 +31,7 @@ public class EmojiVariationSelectorPopup extends PopupWindow { setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.emoji_variation_selector_background)); setOutsideTouchable(true); - if (Build.VERSION.SDK_INT >= 21) { - setElevation(20); - } + setElevation(20); } public void setVariations(List variations) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/menu/ContextMenuList.kt b/app/src/main/java/org/thoughtcrime/securesms/components/menu/ContextMenuList.kt index 49a5ae3035..ee9e240a54 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/menu/ContextMenuList.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/menu/ContextMenuList.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.components.menu -import android.os.Build import android.view.View import android.widget.ImageView import android.widget.TextView @@ -83,13 +82,11 @@ class ContextMenuList(recyclerView: RecyclerView, onItemClick: () -> Unit) { icon.setColorFilter(tintColor) title.setTextColor(tintColor) - if (Build.VERSION.SDK_INT >= 21) { - when (model.displayType) { - DisplayType.TOP -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_top) - DisplayType.BOTTOM -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_bottom) - DisplayType.MIDDLE -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_middle) - DisplayType.ONLY -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_only) - } + when (model.displayType) { + DisplayType.TOP -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_top) + DisplayType.BOTTOM -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_bottom) + DisplayType.MIDDLE -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_middle) + DisplayType.ONLY -> itemView.setBackgroundResource(R.drawable.signal_context_menu_item_background_only) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt index 6e588f7ada..157d08b58b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalBottomActionBar.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.components.menu import android.content.Context -import android.os.Build import android.util.AttributeSet import android.view.LayoutInflater import android.view.View @@ -42,10 +41,7 @@ class SignalBottomActionBar(context: Context, attributeSet: AttributeSet) : Line init { orientation = HORIZONTAL setBackgroundResource(R.drawable.signal_bottom_action_bar_background) - - if (Build.VERSION.SDK_INT >= 21) { - elevation = 20f - } + elevation = 20f } fun setItems(items: List) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt index 16ef2c7911..650a0d5b31 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/menu/SignalContextMenu.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.components.menu import android.content.Context import android.graphics.Rect -import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -50,9 +49,7 @@ class SignalContextMenu private constructor( setOnDismissListener { onDismiss.run() } } - if (Build.VERSION.SDK_INT >= 21) { - elevation = 20f - } + elevation = 20f contextMenuList.setItems(items) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Api19Reminder.kt b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Api19Reminder.kt deleted file mode 100644 index 5669d27306..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Api19Reminder.kt +++ /dev/null @@ -1,45 +0,0 @@ -package org.thoughtcrime.securesms.components.reminder - -import android.content.Context -import android.os.Build -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.util.Util -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale - -/** - * Shown when a user has API 19. - */ -class Api19Reminder(context: Context) : Reminder(null, context.getString(R.string.API19Reminder_banner_message, getExpireDate())) { - - init { - addAction( - Action( - context.getString(R.string.API19Reminder_learn_more), - R.id.reminder_action_api_19_learn_more - ) - ) - } - - override fun isDismissable(): Boolean { - return false - } - - override fun getImportance(): Importance { - return Importance.TERMINAL - } - - companion object { - @JvmStatic - fun isEligible(): Boolean { - return Build.VERSION.SDK_INT < 21 && !ExpiredBuildReminder.isEligible() - } - - fun getExpireDate(): String { - val formatter = SimpleDateFormat("MMMM d", Locale.getDefault()) - val expireDate = Date(System.currentTimeMillis() + Util.getTimeUntilBuildExpiry()) - return formatter.format(expireDate) - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java index 4a2f13b9e2..612aafb835 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java @@ -19,15 +19,8 @@ import java.util.List; public class ExpiredBuildReminder extends Reminder { public ExpiredBuildReminder(final Context context) { - super(null, Build.VERSION.SDK_INT < 21 - ? context.getString(R.string.ExpiredBuildReminder_api_19_message) - : context.getString(R.string.ExpiredBuildReminder_this_version_of_signal_has_expired)); - - if (Build.VERSION.SDK_INT < 21) { - addAction(new Action(context.getString(R.string.API19Reminder_learn_more), R.id.reminder_action_api_19_learn_more)); - } else { - addAction(new Action(context.getString(R.string.ExpiredBuildReminder_update_now), R.id.reminder_action_update_now)); - } + super(null, context.getString(R.string.ExpiredBuildReminder_this_version_of_signal_has_expired)); + addAction(new Action(context.getString(R.string.ExpiredBuildReminder_update_now), R.id.reminder_action_update_now)); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/sms/SmsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/sms/SmsSettingsFragment.kt index d877b202c4..4ac2752387 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/sms/SmsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/sms/SmsSettingsFragment.kt @@ -8,7 +8,6 @@ import android.provider.Settings import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider -import androidx.navigation.Navigation import androidx.navigation.fragment.findNavController import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLConfiguration @@ -23,7 +22,6 @@ import org.thoughtcrime.securesms.keyvalue.SmsExportPhase import org.thoughtcrime.securesms.util.SmsUtil import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter -import org.thoughtcrime.securesms.util.navigation.safeNavigate private const val SMS_REQUEST_CODE: Short = 1234 @@ -146,15 +144,6 @@ class SmsSettingsFragment : DSLSettingsFragment(R.string.preferences__sms_mms) { viewModel.setWifiCallingCompatibilityEnabled(!state.wifiCallingCompatibilityEnabled) } ) - - if (Build.VERSION.SDK_INT < 21) { - clickPref( - title = DSLSettingsText.from(R.string.preferences__advanced_mms_access_point_names), - onClick = { - Navigation.findNavController(requireView()).safeNavigate(R.id.action_smsSettingsFragment_to_mmsPreferencesFragment) - } - ) - } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt index 3a4d2eda3e..ee9b54e4a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt @@ -5,7 +5,6 @@ import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import android.media.AudioManager -import android.os.Build import android.os.Bundle import android.os.PowerManager import android.support.v4.media.session.MediaControllerCompat @@ -29,11 +28,7 @@ class VoiceNoteProximityWakeLockManager( private val mediaController: MediaControllerCompat ) : DefaultLifecycleObserver { - private val wakeLock: PowerManager.WakeLock? = if (Build.VERSION.SDK_INT >= 21) { - ServiceUtil.getPowerManager(activity.applicationContext).newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG) - } else { - null - } + private val wakeLock: PowerManager.WakeLock? = ServiceUtil.getPowerManager(activity.applicationContext).newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG) private val sensorManager: SensorManager = ServiceUtil.getSensorManager(activity) private val proximitySensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java index 7940e2d92e..ec2649d533 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java @@ -190,11 +190,8 @@ public final class WebRtcAnswerDeclineButton extends LinearLayout implements Acc swipeUpText.setAlpha(1); swipeDownText.setAlpha(1); answer.setRotation(0); - - if (Build.VERSION.SDK_INT >= 21) { - answer.getDrawable().setTint(getResources().getColor(R.color.green_600)); - answer.getBackground().setTint(Color.WHITE); - } + answer.getDrawable().setTint(getResources().getColor(R.color.green_600)); + answer.getBackground().setTint(Color.WHITE); animating = true; animateElements(0); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationContextMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationContextMenu.kt index eaad5e149a..82344f59a0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationContextMenu.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationContextMenu.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.conversation import android.content.Context -import android.os.Build import android.view.Gravity import android.view.LayoutInflater import android.view.MotionEvent @@ -36,9 +35,7 @@ class ConversationContextMenu(private val anchor: View, items: List) isFocusable = false isOutsideTouchable = true - if (Build.VERSION.SDK_INT >= 21) { - elevation = 20f - } + elevation = 20f setTouchInterceptor { _, event -> event.action == MotionEvent.ACTION_OUTSIDE diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index e53c023b93..5a2aeb7826 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -1936,8 +1936,6 @@ public class ConversationParentFragment extends Fragment InsightsLauncher.showInsightsDashboard(getChildFragmentManager()); } else if (reminderActionId == R.id.reminder_action_update_now) { PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(requireContext()); - } else if (reminderActionId == R.id.reminder_action_api_19_learn_more) { - CommunicationActions.openBrowserLink(requireContext(), "https://support.signal.org/hc/articles/5109141421850"); } else { throw new IllegalArgumentException("Unknown ID: " + reminderActionId); } @@ -2459,7 +2457,7 @@ public class ConversationParentFragment extends Fragment } private void showGroupCallingTooltip() { - if (Build.VERSION.SDK_INT == 19 || !SignalStore.tooltips().shouldShowGroupCallingTooltip() || callingTooltipShown) { + if (!SignalStore.tooltips().shouldShowGroupCallingTooltip() || callingTooltipShown) { return; } @@ -3203,8 +3201,6 @@ public class ConversationParentFragment extends Fragment builder.setNeutralButton(action.getTitle(), (d, i) -> { if (action.getActionId() == R.id.reminder_action_update_now) { PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(requireContext()); - } else if (action.getActionId() == R.id.reminder_action_api_19_learn_more) { - CommunicationActions.openBrowserLink(requireContext(), "https://support.signal.org/hc/articles/5109141421850"); } }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java index 73efb9bb07..954af4084b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java @@ -166,16 +166,11 @@ public final class ConversationReactionOverlay extends FrameLayout { setupSelectedEmoji(); - if (Build.VERSION.SDK_INT >= 21) { - View statusBarBackground = activity.findViewById(android.R.id.statusBarBackground); - statusBarHeight = statusBarBackground == null ? 0 : statusBarBackground.getHeight(); + View statusBarBackground = activity.findViewById(android.R.id.statusBarBackground); + statusBarHeight = statusBarBackground == null ? 0 : statusBarBackground.getHeight(); - View navigationBarBackground = activity.findViewById(android.R.id.navigationBarBackground); - bottomNavigationBarHeight = navigationBarBackground == null ? 0 : navigationBarBackground.getHeight(); - } else { - statusBarHeight = ViewUtil.getStatusBarHeight(this); - bottomNavigationBarHeight = ViewUtil.getNavigationBarHeight(this); - } + View navigationBarBackground = activity.findViewById(android.R.id.navigationBarBackground); + bottomNavigationBarHeight = navigationBarBackground == null ? 0 : navigationBarBackground.getHeight(); if (zeroNavigationBarHeightForConfiguration()) { bottomNavigationBarHeight = 0; @@ -199,10 +194,8 @@ public final class ConversationReactionOverlay extends FrameLayout { setVisibility(View.INVISIBLE); - if (Build.VERSION.SDK_INT >= 21) { - this.activity = activity; - updateSystemUiOnShow(activity); - } + this.activity = activity; + updateSystemUiOnShow(activity); ViewKt.doOnLayout(this, v -> { showAfterLayout(activity, conversationMessage, lastSeenDownPoint, isMessageOnLeft); @@ -908,7 +901,7 @@ public final class ConversationReactionOverlay extends FrameLayout { inputShadeAnim.setDuration(duration); animators.add(inputShadeAnim); - if (Build.VERSION.SDK_INT >= 21 && activity != null) { + if (activity != null) { ValueAnimator statusBarAnim = ValueAnimator.ofArgb(activity.getWindow().getStatusBarColor(), originalStatusBarColor); statusBarAnim.setDuration(duration); statusBarAnim.addUpdateListener(animation -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock.kt index dff63e60b3..59b5b801ef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.conversation -import android.os.Build import android.os.PowerManager import androidx.activity.ComponentActivity import androidx.lifecycle.DefaultLifecycleObserver @@ -30,9 +29,7 @@ class VoiceRecorderWakeLock( return } - if (Build.VERSION.SDK_INT >= 21) { - wakeLock = WakeLockUtil.acquire(activity, PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TimeUnit.HOURS.toMillis(1), "voiceRecorder") - } + wakeLock = WakeLockUtil.acquire(activity, PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TimeUnit.HOURS.toMillis(1), "voiceRecorder") } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ChatColors.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ChatColors.kt index 34a0bcd614..b2b4bffb8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ChatColors.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ChatColors.kt @@ -7,9 +7,6 @@ import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable -import android.graphics.drawable.ShapeDrawable -import android.graphics.drawable.shapes.OvalShape -import android.os.Build import android.os.Parcel import android.os.Parcelable import androidx.annotation.ColorInt @@ -35,7 +32,7 @@ class ChatColors( private val singleColor: Int? ) : Parcelable { - fun isGradient(): Boolean = Build.VERSION.SDK_INT >= 21 && linearGradient != null + fun isGradient(): Boolean = linearGradient != null /** * Returns the Drawable to render the linear gradient, or null if this ChatColors is a single color. @@ -43,9 +40,6 @@ class ChatColors( val chatBubbleMask: Drawable get() { return when { - Build.VERSION.SDK_INT < 21 -> { - ColorDrawable(Color.TRANSPARENT) - } linearGradient != null -> { RotatableGradientDrawable( linearGradient.degrees, @@ -63,11 +57,7 @@ class ChatColors( * Returns the ColorFilter to apply to a conversation bubble or other relevant piece of UI. */ @IgnoredOnParcel - val chatBubbleColorFilter: ColorFilter = if (Build.VERSION.SDK_INT >= 21) { - PorterDuffColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN) - } else { - PorterDuffColorFilter(asSingleColor(), PorterDuff.Mode.SRC_IN) - } + val chatBubbleColorFilter: ColorFilter = PorterDuffColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN) @ColorInt fun asSingleColor(): Int { @@ -115,12 +105,6 @@ class ChatColors( } fun asCircle(): Drawable { - if (Build.VERSION.SDK_INT < 21) { - return ShapeDrawable(OvalShape()).apply { - paint.color = asSingleColor() - } - } - val toWrap: Drawable = chatBubbleMask val path = Path() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatSelectionContextMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatSelectionContextMenu.kt index 92d0989b96..17bf02996c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatSelectionContextMenu.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatSelectionContextMenu.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.conversation.colors.ui import android.content.Context import android.graphics.Rect -import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -18,9 +17,7 @@ class ChatSelectionContextMenu(val context: Context) : PopupWindow(context) { init { contentView = LayoutInflater.from(context).inflate(R.layout.chat_colors_fragment_context_menu, null, false) - if (Build.VERSION.SDK_INT >= 21) { - elevation = ViewUtil.dpToPx(8).toFloat() - } + elevation = ViewUtil.dpToPx(8).toFloat() isOutsideTouchable = false isFocusable = true diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt index 6d6d02d4ef..660666be5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.conversation.colors.ui.custom -import android.os.Build import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar @@ -35,11 +34,7 @@ class CustomChatColorCreatorFragment : Fragment(R.layout.custom_chat_color_creat pager.isUserInputEnabled = false pager.adapter = adapter - if (Build.VERSION.SDK_INT < 21) { - tabLayout.visibility = View.GONE - } else { - tabLayoutMediator.attach() - } + tabLayoutMediator.attach() val startPage = CustomChatColorCreatorFragmentArgs.fromBundle(requireArguments()).startPage pager.setCurrentItem(startPage, false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt index a3b04068b2..8725f08e49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.conversation.ui.inlinequery import android.content.Context import android.graphics.Rect -import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -34,10 +33,8 @@ class InlineQueryResultsPopup( private val adapter: MappingAdapter init { - if (Build.VERSION.SDK_INT >= 21) { - contentView.outlineProvider = ViewOutlineProvider.BACKGROUND - contentView.clipToOutline = true - } + contentView.outlineProvider = ViewOutlineProvider.BACKGROUND + contentView.clipToOutline = true inputMethodMode = INPUT_METHOD_NOT_NEEDED @@ -46,9 +43,7 @@ class InlineQueryResultsPopup( callback = null } - if (Build.VERSION.SDK_INT >= 21) { - elevation = 20f - } + elevation = 20f adapter = InlineQueryAdapter { m -> callback?.onSelection(m) } list.adapter = adapter diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index eaea90bd9d..8d4175f746 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -97,7 +97,6 @@ import org.thoughtcrime.securesms.components.menu.ActionItem; import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar; import org.thoughtcrime.securesms.components.menu.SignalContextMenu; import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton; -import org.thoughtcrime.securesms.components.reminder.Api19Reminder; import org.thoughtcrime.securesms.components.reminder.CdsPermanentErrorReminder; import org.thoughtcrime.securesms.components.reminder.CdsTemporyErrorReminder; import org.thoughtcrime.securesms.components.reminder.DozeReminder; @@ -683,8 +682,6 @@ public class ConversationListFragment extends MainFragment implements ActionMode CdsTemporaryErrorBottomSheet.show(getChildFragmentManager()); } else if (reminderActionId == R.id.reminder_action_cds_permanent_error_learn_more) { CdsPermanentErrorBottomSheet.show(getChildFragmentManager()); - } else if (reminderActionId == R.id.reminder_action_api_19_learn_more) { - CommunicationActions.openBrowserLink(requireContext(), "https://support.signal.org/hc/articles/5109141421850"); } } @@ -946,8 +943,6 @@ public class ConversationListFragment extends MainFragment implements ActionMode } else if (ServiceOutageReminder.isEligible(context)) { ApplicationDependencies.getJobManager().add(new ServiceOutageDetectionJob()); return Optional.of(new ServiceOutageReminder(context)); - } else if (Api19Reminder.isEligible()) { - return Optional.of(new Api19Reminder(context)); } else if (OutdatedBuildReminder.isEligible()) { return Optional.of(new OutdatedBuildReminder(context)); } else if (PushRegistrationReminder.isEligible(context)) { @@ -1387,11 +1382,9 @@ public class ConversationListFragment extends MainFragment implements ActionMode public void onDestroyActionMode(ActionMode mode) { viewModel.endSelection(); - if (Build.VERSION.SDK_INT >= 21) { - TypedArray color = getActivity().getTheme().obtainStyledAttributes(new int[] { android.R.attr.statusBarColor }); - WindowUtil.setStatusBarColor(getActivity().getWindow(), color.getColor(0, Color.BLACK)); - color.recycle(); - } + TypedArray color = getActivity().getTheme().obtainStyledAttributes(new int[] { android.R.attr.statusBarColor }); + WindowUtil.setStatusBarColor(getActivity().getWindow(), color.getColor(0, Color.BLACK)); + color.recycle(); if (Build.VERSION.SDK_INT >= 23) { TypedArray lightStatusBarAttr = getActivity().getTheme().obtainStyledAttributes(new int[] { android.R.attr.windowLightStatusBar }); diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java index 209149ef3d..d9846787f0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/TransferOrRestoreFragment.java @@ -29,11 +29,7 @@ public final class TransferOrRestoreFragment extends LoggingFragment { .setOnClickListener(v -> SafeNavigation.safeNavigate(Navigation.findNavController(v), R.id.action_new_device_transfer_instructions)); View restoreBackup = view.findViewById(R.id.transfer_or_restore_fragment_restore); - if (Build.VERSION.SDK_INT >= 21) { - restoreBackup.setOnClickListener(v -> SafeNavigation.safeNavigate(Navigation.findNavController(v), R.id.action_choose_backup)); - } else { - restoreBackup.setVisibility(View.GONE); - } + restoreBackup.setOnClickListener(v -> SafeNavigation.safeNavigate(Navigation.findNavController(v), R.id.action_choose_backup)); String description = getString(R.string.TransferOrRestoreFragment__transfer_your_account_and_messages_from_your_old_android_device); String toBold = getString(R.string.TransferOrRestoreFragment__you_need_access_to_your_old_device); diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceExitActivity.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceExitActivity.java index 5c8e822f9a..7afc98f62d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceExitActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceExitActivity.java @@ -26,10 +26,6 @@ public class OldDeviceExitActivity extends AppCompatActivity { } private static void finishAll(@NonNull Activity activity) { - if (Build.VERSION.SDK_INT < 21) { - activity.finishAffinity(); - } else { - activity.finishAndRemoveTask(); - } + activity.finishAndRemoveTask(); } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/fonts/TypefaceHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/fonts/TypefaceHelper.kt index 548f9d0204..aeabaf5eb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/fonts/TypefaceHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/TypefaceHelper.kt @@ -14,8 +14,7 @@ object TypefaceHelper { weight.value, false ) - Build.VERSION.SDK_INT >= 21 -> Typeface.create("${family.familyName}-$weightName", Typeface.NORMAL) - else -> Typeface.create(family.familyName, if (weight.value > Weight.MEDIUM.value) Typeface.BOLD else Typeface.NORMAL) + else -> Typeface.create("${family.familyName}-$weightName", Typeface.NORMAL) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerFragment.kt index e33fd04613..6ea3850ecd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerFragment.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.keyboard -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -57,10 +56,6 @@ class KeyboardPagerFragment : Fragment() { } override fun onHiddenChanged(hidden: Boolean) { - if (Build.VERSION.SDK_INT < 21) { - return - } - if (hidden) { WindowUtil.setNavigationBarColor(requireActivity(), ThemeUtil.getThemedColor(requireContext(), android.R.attr.navigationBarColor)) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt index f42e2c4350..0a1b638014 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt @@ -4,7 +4,6 @@ import android.animation.Animator import android.animation.Animator.AnimatorListener import android.annotation.SuppressLint import android.content.Context -import android.os.Build import android.util.AttributeSet import android.view.MotionEvent import android.view.animation.PathInterpolator @@ -162,9 +161,7 @@ class AnimatedInOutImageButton @JvmOverloads constructor( .scaleX(1f) .scaleY(1f) - if (Build.VERSION.SDK_INT >= 21) { - animator.interpolator = PathInterpolator(0.4f, 0.0f, 0.2f, 1f) - } + animator.interpolator = PathInterpolator(0.4f, 0.0f, 0.2f, 1f) animator.start() } @@ -178,9 +175,7 @@ class AnimatedInOutImageButton @JvmOverloads constructor( .scaleY(0.5f) .withEndAction(endAction) - if (Build.VERSION.SDK_INT >= 21) { - animator.interpolator = PathInterpolator(0.4f, 0.0f, 0.2f, 1f) - } + animator.interpolator = PathInterpolator(0.4f, 0.0f, 0.2f, 1f) animator.start() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt index 27f168cf27..03aef514c8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.mediapreview import android.content.Context -import android.os.Build import android.os.Bundle import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat @@ -26,11 +25,10 @@ class MediaPreviewV2Activity : PassphraseRequiredActivity(), VoiceNoteMediaContr setContentView(R.layout.activity_mediapreview_v2) voiceNoteMediaController = VoiceNoteMediaController(this) - if (Build.VERSION.SDK_INT >= 21) { - val systemBarColor = ContextCompat.getColor(this, R.color.signal_dark_colorSurface) - window.statusBarColor = systemBarColor - window.navigationBarColor = systemBarColor - } + val systemBarColor = ContextCompat.getColor(this, R.color.signal_dark_colorSurface) + window.statusBarColor = systemBarColor + window.navigationBarColor = systemBarColor + if (savedInstanceState == null) { val bundle = Bundle() val args = MediaIntentFactory.requireArguments(intent.extras!!) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 4f55a37081..0c0e0d384a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -8,7 +8,6 @@ import android.content.DialogInterface import android.content.Intent import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter -import android.os.Build import android.os.Bundle import android.text.SpannableStringBuilder import android.view.LayoutInflater @@ -351,9 +350,7 @@ class MediaPreviewV2Fragment : LoggingFragment(R.layout.fragment_media_preview_v scrollAlbumRailToCurrentAdapterPosition() } } - if (Build.VERSION.SDK_INT >= 21) { - viewPropertyAnimator.interpolator = PathInterpolator(0.17f, 0.17f, 0f, 1f) - } + viewPropertyAnimator.interpolator = PathInterpolator(0.17f, 0.17f, 0f, 1f) viewPropertyAnimator.start() true } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java index ec8ba88905..7345fe279a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java @@ -45,6 +45,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.animation.AnimationCompleteListener; +import org.thoughtcrime.securesms.mediasend.camerax.CameraXModelBlocklist; import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations; import org.thoughtcrime.securesms.mediasend.v2.MediaCountIndicatorButton; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; @@ -59,7 +60,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.Disposable; /** - * Camera capture implemented with the legacy camera API's. Should only be used if sdk < 21. + * Camera capture implemented with the legacy camera API's. Should only be used if a device is on the {@link CameraXModelBlocklist}. */ public class Camera1Fragment extends LoggingFragment implements CameraFragment, TextureView.SurfaceTextureListener, diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java index e9ddd9c204..448846b3a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java @@ -73,7 +73,6 @@ import io.reactivex.rxjava3.disposables.Disposable; * preferred whenever possible. */ @ExperimentalVideo -@RequiresApi(21) public class CameraXFragment extends LoggingFragment implements CameraFragment { private static final String TAG = Log.tag(CameraXFragment.class); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXSelfieFlashHelper.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXSelfieFlashHelper.java index b9f2d3f8d6..b299d45792 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXSelfieFlashHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXSelfieFlashHelper.java @@ -5,12 +5,10 @@ import android.view.Window; import android.view.WindowManager; import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; import androidx.camera.core.CameraSelector; import androidx.camera.core.ImageCapture; import androidx.camera.view.CameraController; -@RequiresApi(21) final class CameraXSelfieFlashHelper { private static final float MAX_SCREEN_BRIGHTNESS = 1f; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXFlashToggleView.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXFlashToggleView.java index aff3d2d0e7..e1aeb43f86 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXFlashToggleView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXFlashToggleView.java @@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.R; import java.util.Arrays; import java.util.List; -@RequiresApi(21) public final class CameraXFlashToggleView extends AppCompatImageView { private static final String STATE_FLASH_INDEX = "flash.toggle.state.flash.index"; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt index a4bc5d808b..2cac197218 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXModePolicy.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.mediasend.camerax import android.content.Context import android.os.Build -import androidx.annotation.RequiresApi import androidx.camera.view.CameraController import androidx.camera.view.video.ExperimentalVideo import org.signal.core.util.asListContains @@ -13,7 +12,6 @@ import org.thoughtcrime.securesms.video.VideoUtil /** * Describes device capabilities */ -@RequiresApi(21) @ExperimentalVideo sealed class CameraXModePolicy { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java index a0abdab23e..c0657b6c9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/camerax/CameraXUtil.java @@ -41,7 +41,6 @@ public class CameraXUtil { private static final String TAG = Log.tag(CameraXUtil.class); - @RequiresApi(21) private static final int[] CAMERA_HARDWARE_LEVEL_ORDERING = new int[]{CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED, CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL}; @@ -60,7 +59,6 @@ public class CameraXUtil { CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_3}; @SuppressWarnings("SuspiciousNameCombination") - @RequiresApi(21) public static ImageResult toJpeg(@NonNull ImageProxy image, boolean flip) throws IOException { ImageProxy.PlaneProxy[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); @@ -106,10 +104,9 @@ public class CameraXUtil { } public static boolean isSupported() { - return Build.VERSION.SDK_INT >= 21 && !CameraXModelBlocklist.isBlocklisted(); + return !CameraXModelBlocklist.isBlocklisted(); } - @RequiresApi(21) public static int toCameraDirectionInt(CameraSelector cameraSelector) { if (cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA) { return Camera.CameraInfo.CAMERA_FACING_FRONT; @@ -118,7 +115,6 @@ public class CameraXUtil { } } - @RequiresApi(21) public static CameraSelector toCameraSelector(@CameraSelector.LensFacing int cameraDirectionInt) { if (cameraDirectionInt == Camera.CameraInfo.CAMERA_FACING_FRONT) { return CameraSelector.DEFAULT_FRONT_CAMERA; @@ -127,7 +123,6 @@ public class CameraXUtil { } } - @RequiresApi(21) public static @ImageCapture.CaptureMode int getOptimalCaptureMode() { return FastCameraModels.contains(Build.MODEL) ? ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY : ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY; @@ -138,7 +133,6 @@ public class CameraXUtil { return Math.max(maxDisplay, 1920); } - @TargetApi(21) public static @NonNull Size buildResolutionForRatio(int longDimension, @NonNull Rational ratio, boolean isPortrait) { int shortDimension = longDimension * ratio.getDenominator() / ratio.getNumerator(); @@ -187,7 +181,6 @@ public class CameraXUtil { return transformedData; } - @RequiresApi(21) private static boolean shouldCropImage(@NonNull ImageProxy image) { Size sourceSize = new Size(image.getWidth(), image.getHeight()); Size targetSize = new Size(image.getCropRect().width(), image.getCropRect().height()); @@ -205,12 +198,10 @@ public class CameraXUtil { return out.toByteArray(); } - @RequiresApi(21) public static boolean isMixedModeSupported(@NonNull Context context) { return getLowestSupportedHardwareLevel(context) != CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY; } - @RequiresApi(21) public static int getLowestSupportedHardwareLevel(@NonNull Context context) { @SuppressLint("RestrictedApi") CameraManager cameraManager = CameraManagerCompat.from(context).unwrap(); @@ -241,13 +232,11 @@ public class CameraXUtil { } } - @RequiresApi(21) private static int maxHardwareLevel() { if (Build.VERSION.SDK_INT >= 24) return CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_3; else return CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL; } - @RequiresApi(21) private static int smallerHardwareLevel(int levelA, int levelB) { int[] hardwareInfoOrdering = getHardwareInfoOrdering(); @@ -258,7 +247,6 @@ public class CameraXUtil { return CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY; } - @RequiresApi(21) private static int[] getHardwareInfoOrdering() { if (Build.VERSION.SDK_INT >= 28) return CAMERA_HARDWARE_LEVEL_ORDERING_28; else if (Build.VERSION.SDK_INT >= 24) return CAMERA_HARDWARE_LEVEL_ORDERING_24; diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt index c165e8e160..b31dd214b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt @@ -286,15 +286,10 @@ object NotificationFactory { return } - if (Build.VERSION.SDK_INT >= 21) { - ringtone.audioAttributes = AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) - .setUsage(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT) - .build() - } else { - @Suppress("DEPRECATION") - ringtone.streamType = AudioManager.STREAM_NOTIFICATION - } + ringtone.audioAttributes = AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) + .setUsage(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT) + .build() ringtone.play() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java index 02b313a164..07d24452f0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java @@ -309,7 +309,7 @@ public class EditProfileFragment extends LoggingFragment { private void handleUpload() { viewModel.getUploadResult().observe(getViewLifecycleOwner(), uploadResult -> { if (uploadResult == EditProfileRepository.UploadResult.SUCCESS) { - if (Build.VERSION.SDK_INT >= 21 && !viewModel.isGroup()) { + if (!viewModel.isGroup()) { handleFinishedLollipop(); } else { @@ -330,7 +330,6 @@ public class EditProfileFragment extends LoggingFragment { controller.onProfileNameUploadCompleted(); } - @RequiresApi(api = 21) private void handleFinishedLollipop() { int[] finishButtonLocation = new int[2]; int[] revealLocation = new int[2]; diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt index 0516fee868..429875c814 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.reactions.edit import android.animation.ObjectAnimator -import android.os.Build import android.os.Bundle import android.view.View import android.view.animation.Animation @@ -90,14 +89,10 @@ class EditReactionsFragment : LoggingFragment(R.layout.edit_reactions_fragment), } private fun configureToolbar() { - if (Build.VERSION.SDK_INT == 19) { - updateToolbarTopMargin(ViewUtil.getStatusBarHeight(toolbar)) - } else { - @Suppress("DEPRECATION") - ViewCompat.setOnApplyWindowInsetsListener(toolbar) { _, insets -> - updateToolbarTopMargin(insets.systemWindowInsetTop) - insets - } + @Suppress("DEPRECATION") + ViewCompat.setOnApplyWindowInsetsListener(toolbar) { _, insets -> + updateToolbarTopMargin(insets.systemWindowInsetTop) + insets } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/ScaleTransition.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/ScaleTransition.kt index e43df28306..e0f8a3113b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/ScaleTransition.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/ScaleTransition.kt @@ -10,7 +10,6 @@ import android.transition.TransitionValues import android.util.AttributeSet import android.view.View import android.view.ViewGroup -import androidx.annotation.RequiresApi import androidx.core.view.ViewCompat class ScaleTransition : Transition { @@ -36,7 +35,6 @@ class ScaleTransition : Transition { constructor() : super() - @RequiresApi(21) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) override fun getTransitionProperties(): Array { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt index bd82feaeda..2412cc9479 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt @@ -5,7 +5,6 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.media.AudioManager -import android.os.Build import android.os.Bundle import android.view.KeyEvent import android.view.View @@ -119,9 +118,7 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll } override fun onEnterAnimationComplete() { - if (Build.VERSION.SDK_INT >= 21) { - window.transitionBackgroundFadeDuration = 100 - } + window.transitionBackgroundFadeDuration = 100 } private fun replaceStoryViewerFragment() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt index 686f8be092..0389075d27 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerViewModel.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.stories.viewer -import android.os.Build import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -31,7 +30,7 @@ class StoryViewerViewModel( storyViewerArgs.storyThumbUri != null -> StoryViewerState.CrossfadeSource.ImageUri(storyViewerArgs.storyThumbUri, storyViewerArgs.storyThumbBlur) else -> StoryViewerState.CrossfadeSource.None }, - skipCrossfade = storyViewerArgs.isFromNotification || storyViewerArgs.isFromQuote || Build.VERSION.SDK_INT < 21 + skipCrossfade = storyViewerArgs.isFromNotification || storyViewerArgs.isFromQuote ) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt index 8581159102..c0e4dd1eda 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/first/StoryFirstTimeNavigationFragment.kt @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.stories.viewer.first import android.app.Dialog import android.graphics.Color import android.graphics.drawable.ColorDrawable -import android.os.Build import android.os.Bundle import android.view.View import android.view.WindowManager @@ -36,14 +35,12 @@ class StoryFirstTimeNavigationFragment : DialogFragment(R.layout.story_viewer_fi val dialog = super.onCreateDialog(savedInstanceState) dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - if (Build.VERSION.SDK_INT >= 21) { - dialog.window!!.addFlags( - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION or - WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or - WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS or - WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - ) - } + dialog.window!!.addFlags( + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION or + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or + WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + ) return dialog } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java index b625b06304..9c3bbb4bc0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java @@ -37,13 +37,6 @@ public final class FullscreenHelper { } public void configureToolbarLayout(@NonNull View spacer, @NonNull View toolbar) { - if (Build.VERSION.SDK_INT == 19) { - setSpacerHeight(spacer, ViewUtil.getStatusBarHeight(spacer)); - int[] padding = makePaddingValuesForAPI19(activity); - toolbar.setPadding(padding[0], 0, padding[1], 0); - return; - } - ViewCompat.setOnApplyWindowInsetsListener(spacer, (view, insets) -> { setSpacerHeight(view, insets.getSystemWindowInsetTop()); return insets; @@ -57,13 +50,6 @@ public final class FullscreenHelper { } public static void configureBottomBarLayout(@NonNull Activity activity, @NonNull View spacer, @NonNull View bottomBar) { - if (Build.VERSION.SDK_INT == 19) { - setSpacerHeight(spacer, ViewUtil.getNavigationBarHeight(spacer)); - int[] padding = makePaddingValuesForAPI19(activity); - bottomBar.setPadding(padding[0], 0, padding[1], 0); - return; - } - ViewCompat.setOnApplyWindowInsetsListener(spacer, (view, insets) -> { setSpacerHeight(view, insets.getSystemWindowInsetBottom()); return insets; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Projection.java b/app/src/main/java/org/thoughtcrime/securesms/util/Projection.java index 0307ea0437..c07deee231 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Projection.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Projection.java @@ -86,11 +86,7 @@ public final class Projection { if (corners == null) { path.addRect(rect, Path.Direction.CW); } else { - if (Build.VERSION.SDK_INT >= 21) { - path.addRoundRect(rect, corners.toRadii(), Path.Direction.CW); - } else { - path.op(path, Path.Op.UNION); - } + path.addRoundRect(rect, corners.toRadii(), Path.Direction.CW); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/StorageUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/StorageUtil.java index 73cb0f4265..47a5b15e39 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/StorageUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/StorageUtil.java @@ -122,27 +122,15 @@ public class StorageUtil { } public static @NonNull Uri getVideoUri() { - if (Build.VERSION.SDK_INT < 21) { - return getLegacyUri(Environment.DIRECTORY_MOVIES); - } else { - return MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } + return MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } public static @NonNull Uri getAudioUri() { - if (Build.VERSION.SDK_INT < 21) { - return getLegacyUri(Environment.DIRECTORY_MUSIC); - } else { - return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } + return MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } public static @NonNull Uri getImageUri() { - if (Build.VERSION.SDK_INT < 21) { - return getLegacyUri(Environment.DIRECTORY_PICTURES); - } else { - return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } + return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } public static @NonNull Uri getDownloadUri() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/TopToastPopup.kt b/app/src/main/java/org/thoughtcrime/securesms/util/TopToastPopup.kt index 0ac280d690..50e40f3e15 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/TopToastPopup.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/TopToastPopup.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.util -import android.os.Build import android.view.Gravity import android.view.LayoutInflater import android.view.View @@ -24,9 +23,7 @@ class TopToastPopup private constructor(parent: ViewGroup, iconResource: Int, de private val description: TextView = contentView.findViewById(R.id.top_toast_popup_description) init { - if (Build.VERSION.SDK_INT >= 21) { - elevation = ViewUtil.dpToPx(8).toFloat() - } + elevation = ViewUtil.dpToPx(8).toFloat() animationStyle = R.style.PopupAnimation icon.setImageResource(iconResource) description.text = descriptionText diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java index 2ebbf6b0ce..6f2d60cfb1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java @@ -41,9 +41,7 @@ public final class WindowUtil { } public static void setNavigationBarColor(@NonNull Context context, @NonNull Window window, @ColorInt int color) { - if (Build.VERSION.SDK_INT < 21) { - return; - } else if (Build.VERSION.SDK_INT < 27) { + if (Build.VERSION.SDK_INT < 27) { window.setNavigationBarColor(ThemeUtil.getThemedColor(context, android.R.attr.navigationBarColor)); } else { window.setNavigationBarColor(color); @@ -72,8 +70,6 @@ public final class WindowUtil { } public static void setStatusBarColor(@NonNull Window window, @ColorInt int color) { - if (Build.VERSION.SDK_INT < 21) return; - window.setStatusBarColor(color); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt b/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt index 6b047fe3bf..177cbc96a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/views/CircularProgressMaterialButton.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.util.views import android.animation.Animator import android.content.Context -import android.os.Build import android.os.Bundle import android.os.Parcelable import android.util.AttributeSet @@ -116,7 +115,7 @@ class CircularProgressMaterialButton @JvmOverloads constructor( return } - if (!animate || Build.VERSION.SDK_INT < 21) { + if (!animate) { materialButton.visibility = state.materialButtonVisibility currentState = state return diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/VideoUtil.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoUtil.java index 18a4e4ae0b..3689ab12e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoUtil.java @@ -7,7 +7,6 @@ import android.util.DisplayMetrics; import android.util.Size; import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.util.MediaUtil; @@ -28,7 +27,6 @@ public final class VideoUtil { private static final int TOTAL_BYTES_PER_SECOND = (VIDEO_BIT_RATE / 8) + (AUDIO_BIT_RATE / 8); - @RequiresApi(21) public static final String VIDEO_MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC; public static final String AUDIO_MIME_TYPE = "audio/mp4a-latm"; @@ -36,7 +34,6 @@ public final class VideoUtil { private VideoUtil() { } - @RequiresApi(21) public static Size getVideoRecordingSize() { return isPortrait(screenSize()) ? new Size(VIDEO_SHORT_WIDTH, VIDEO_LONG_WIDTH) @@ -54,13 +51,11 @@ public final class VideoUtil { return VIDEO_MAX_UPLOAD_LENGTH_S; } - @RequiresApi(21) private static Size screenSize() { DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); return new Size(metrics.widthPixels, metrics.heightPixels); } - @RequiresApi(21) private static boolean isPortrait(Size size) { return size.getWidth() < size.getHeight(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java index 9a3fabdc4d..3b3643b88b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java @@ -169,10 +169,8 @@ public abstract class AudioManagerCompat { public static AudioManagerCompat create(@NonNull Context context) { if (Build.VERSION.SDK_INT >= 26) { return new Api26AudioManagerCompat(context); - } else if (Build.VERSION.SDK_INT >= 21) { - return new Api21AudioManagerCompat(context); } else { - return new Api19AudioManagerCompat(context); + return new Api21AudioManagerCompat(context); } } @@ -242,7 +240,6 @@ public abstract class AudioManagerCompat { } } - @RequiresApi(21) private static class Api21AudioManagerCompat extends Api19AudioManagerCompat { private static AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder() diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt index 33590e839a..d35510f0c1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt @@ -158,7 +158,7 @@ class FullSignalAudioManager(context: Context, eventListener: EventListener?) : updateAudioDeviceState() wiredHeadsetReceiver = WiredHeadsetReceiver() - context.registerReceiver(wiredHeadsetReceiver, IntentFilter(if (Build.VERSION.SDK_INT >= 21) AudioManager.ACTION_HEADSET_PLUG else Intent.ACTION_HEADSET_PLUG)) + context.registerReceiver(wiredHeadsetReceiver, IntentFilter(AudioManager.ACTION_HEADSET_PLUG)) state = State.PREINITIALIZED diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 3cb431d1a9..2b7749cdf1 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -18,8 +18,6 @@ - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6c24409c6..d391d3d8b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -653,9 +653,6 @@ This version of Signal has expired. Update now to send and receive messages. Update now - - Signal no longer works on this device. To use Signal again, update your device to a newer version of Android or switch to a newer device. - %d pending member request. @@ -5485,10 +5482,4 @@ Tip: Pull down on the chat list to filter - - Signal will no longer support your device\'s version of Android soon. To keep using Signal, update your device, or switch to a newer device by %1$s. - - - Learn more - diff --git a/qr/lib/src/main/java/org/signal/qr/ImageProxyLuminanceSource.kt b/qr/lib/src/main/java/org/signal/qr/ImageProxyLuminanceSource.kt index 470b3dd60d..f9e721ff13 100644 --- a/qr/lib/src/main/java/org/signal/qr/ImageProxyLuminanceSource.kt +++ b/qr/lib/src/main/java/org/signal/qr/ImageProxyLuminanceSource.kt @@ -1,7 +1,6 @@ package org.signal.qr import android.graphics.ImageFormat -import androidx.annotation.RequiresApi import androidx.camera.core.ImageProxy import com.google.zxing.LuminanceSource import java.nio.ByteBuffer @@ -14,7 +13,6 @@ import java.nio.ByteBuffer * An image width can be reported as 1080 but the row stride may be 1088. Thus when representing a row-major * 2D array as a 1D array, the math can go sideways if width is used instead of row stride. */ -@RequiresApi(21) class ImageProxyLuminanceSource(image: ImageProxy) : LuminanceSource(image.width, image.height) { val yData: ByteArray diff --git a/qr/lib/src/main/java/org/signal/qr/QrProcessor.kt b/qr/lib/src/main/java/org/signal/qr/QrProcessor.kt index b4167448a1..6981c3efdd 100644 --- a/qr/lib/src/main/java/org/signal/qr/QrProcessor.kt +++ b/qr/lib/src/main/java/org/signal/qr/QrProcessor.kt @@ -1,6 +1,5 @@ package org.signal.qr -import androidx.annotation.RequiresApi import androidx.camera.core.ImageProxy import com.google.zxing.BinaryBitmap import com.google.zxing.ChecksumException @@ -24,7 +23,6 @@ class QrProcessor { private var previousHeight = 0 private var previousWidth = 0 - @RequiresApi(21) fun getScannedData(proxy: ImageProxy): String? { return getScannedData(ImageProxyLuminanceSource(proxy)) } diff --git a/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt b/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt index a285aa8b68..831ba57fcc 100644 --- a/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt +++ b/qr/lib/src/main/java/org/signal/qr/QrScannerView.kt @@ -1,7 +1,6 @@ package org.signal.qr import android.content.Context -import android.os.Build import android.util.AttributeSet import android.widget.FrameLayout import androidx.lifecycle.DefaultLifecycleObserver @@ -28,7 +27,7 @@ class QrScannerView @JvmOverloads constructor( val qrData: Observable = qrDataPublish private fun initScannerView(forceLegacy: Boolean) { - val scannerView: FrameLayout = if (Build.VERSION.SDK_INT >= 21 && !forceLegacy) { + val scannerView: FrameLayout = if (!forceLegacy) { ScannerView21(context) { qrDataPublish.onNext(it) } } else { ScannerView19(context) { qrDataPublish.onNext(it) } diff --git a/qr/lib/src/main/java/org/signal/qr/ScannerView21.kt b/qr/lib/src/main/java/org/signal/qr/ScannerView21.kt index d3b0835668..d876de2d8e 100644 --- a/qr/lib/src/main/java/org/signal/qr/ScannerView21.kt +++ b/qr/lib/src/main/java/org/signal/qr/ScannerView21.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.content.Context import android.util.Size import android.widget.FrameLayout -import androidx.annotation.RequiresApi import androidx.camera.core.Camera import androidx.camera.core.CameraSelector import androidx.camera.core.ImageAnalysis @@ -22,7 +21,6 @@ import java.util.concurrent.Executors * API21+ version of QR scanning view. Uses camerax APIs. */ @SuppressLint("ViewConstructor") -@RequiresApi(21) internal class ScannerView21 constructor( context: Context, private val listener: ScanListener