Skip to content

Commit 6d59379

Browse files
authored
minSdkVersion = Android 10 (API level 29).| #2941 (#2943)
1 parent 7a5b997 commit 6d59379

14 files changed

Lines changed: 15 additions & 146 deletions

File tree

FlowCrypt/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ android {
4040
versionCode = extra["appVersionCode"] as Int
4141
versionName = extra["appVersionName"] as String
4242
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
43+
buildConfigField("int", "MIN_SDK_VERSION", "$minSdk")
4344

4445
/*
4546
The following argument makes the Android Test Orchestrator run its

FlowCrypt/src/main/AndroidManifest.xml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?><!--
22
~ © 2016-present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com
3-
~ Contributors: DenBond7
3+
~ Contributors: denbond7
44
-->
55

66
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
@@ -13,11 +13,6 @@
1313
<uses-permission android:name="android.permission.INTERNET" />
1414
<!-- android.permission.ACCESS_NETWORK_STATE is used to check is internet connection available-->
1515
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
16-
<!-- android.permission.WRITE_EXTERNAL_STORAGE is used to save attachments for Build.VERSION.SDK_INT <= Build.VERSION_CODES.P -->
17-
<uses-permission
18-
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
19-
android:maxSdkVersion="28"
20-
tools:ignore="ScopedStorage" />
2116
<!-- android.permission.WAKE_LOCK will be used by classes which extend JobIntentService -->
2217
<uses-permission android:name="android.permission.WAKE_LOCK" />
2318
<!-- Request the foreground service permission. Details here

FlowCrypt/src/main/java/com/flowcrypt/email/extensions/Context.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package com.flowcrypt.email.extensions
88
import android.content.Context
99
import android.net.ConnectivityManager
1010
import android.net.NetworkCapabilities
11-
import android.os.Build
1211
import android.widget.Toast
1312
import com.flowcrypt.email.FlowCryptApplication
1413

@@ -23,18 +22,11 @@ fun Context.toast(resId: Int, duration: Int = Toast.LENGTH_SHORT) {
2322
Toast.makeText(this, resId, duration).show()
2423
}
2524

26-
@SuppressWarnings("deprecation")
27-
@Suppress("DEPRECATION")
2825
fun Context?.hasActiveConnection(): Boolean {
2926
return this?.let {
3027
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
31-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
32-
val cap = cm?.getNetworkCapabilities(cm.activeNetwork) ?: return false
33-
return cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
34-
} else {
35-
val activeNetwork: android.net.NetworkInfo? = cm?.activeNetworkInfo
36-
activeNetwork?.isConnectedOrConnecting == true
37-
}
28+
val cap = cm?.getNetworkCapabilities(cm.activeNetwork) ?: return false
29+
return cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
3830
} ?: false
3931
}
4032

FlowCrypt/src/main/java/com/flowcrypt/email/extensions/android/webkit/WebViewExt.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
/*
22
* © 2016-present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com
3-
* Contributors: DenBond7
3+
* Contributors: denbond7
44
*/
55

66
package com.flowcrypt.email.extensions.android.webkit
77

88
import android.content.res.Configuration
99
import android.graphics.Color
10-
import android.os.Build
1110
import android.webkit.WebView
1211
import androidx.webkit.WebSettingsCompat
1312
import androidx.webkit.WebViewFeature
@@ -18,9 +17,7 @@ import androidx.webkit.WebViewFeature
1817
fun WebView.setupDayNight() {
1918
setBackgroundColor(Color.TRANSPARENT)
2019
if (WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) {
21-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
22-
WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, true)
23-
}
20+
WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, true)
2421
} else {
2522
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
2623
when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {

FlowCrypt/src/main/java/com/flowcrypt/email/service/attachment/AttachmentDownloadManagerService.kt

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import android.content.Context
1010
import android.content.Intent
1111
import android.net.Uri
1212
import android.os.Binder
13-
import android.os.Build
14-
import android.os.Environment
1513
import android.os.Handler
1614
import android.os.HandlerThread
1715
import android.os.IBinder
@@ -22,11 +20,8 @@ import android.os.RemoteException
2220
import android.provider.MediaStore
2321
import android.text.TextUtils
2422
import android.widget.Toast
25-
import androidx.annotation.RequiresApi
26-
import androidx.core.content.FileProvider
2723
import androidx.lifecycle.LifecycleService
2824
import com.flowcrypt.email.BuildConfig
29-
import com.flowcrypt.email.Constants
3025
import com.flowcrypt.email.R
3126
import com.flowcrypt.email.api.email.gmail.GmailApiHelper
3227
import com.flowcrypt.email.api.email.model.AttachmentInfo
@@ -40,7 +35,6 @@ import com.flowcrypt.email.extensions.kotlin.toHex
4035
import com.flowcrypt.email.security.KeysStorageImpl
4136
import com.flowcrypt.email.security.SecurityUtils
4237
import com.flowcrypt.email.security.pgp.PgpDecryptAndOrVerify
43-
import com.flowcrypt.email.util.FileAndDirectoryUtils
4438
import com.flowcrypt.email.util.GeneralUtil
4539
import com.flowcrypt.email.util.LogsUtil
4640
import com.flowcrypt.email.util.exception.ExceptionUtil
@@ -510,7 +504,7 @@ class AttachmentDownloadManagerService : LifecycleService() {
510504
FileUtils.copyInputStreamToFile(inputStream, attTempFile)
511505
attTempFile = decryptFileIfNeeded(context, attTempFile)
512506
if (!Thread.currentThread().isInterrupted) {
513-
val uri = storeFileToSharedFolder(context, attTempFile)
507+
val uri = storeFileUsingScopedStorage(context, attTempFile)
514508
listener?.onAttDownloaded(
515509
attInfo = att.copy(
516510
name = finalFileName,
@@ -600,7 +594,7 @@ class AttachmentDownloadManagerService : LifecycleService() {
600594
if (Thread.currentThread().isInterrupted) {
601595
listener?.onCanceled(att.copy(name = finalFileName))
602596
} else {
603-
val uri = storeFileToSharedFolder(context, attTempFile)
597+
val uri = storeFileUsingScopedStorage(context, attTempFile)
604598
listener?.onAttDownloaded(
605599
attInfo = att.copy(
606600
name = finalFileName,
@@ -615,15 +609,6 @@ class AttachmentDownloadManagerService : LifecycleService() {
615609
}
616610
}
617611

618-
private fun storeFileToSharedFolder(context: Context, attFile: File): Uri {
619-
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
620-
storeFileUsingScopedStorage(context, attFile)
621-
} else {
622-
storeLegacy(attFile, context)
623-
}
624-
}
625-
626-
@RequiresApi(Build.VERSION_CODES.Q)
627612
private fun storeFileUsingScopedStorage(context: Context, attFile: File): Uri {
628613
val resolver = context.contentResolver
629614
val mimeType = finalFileName.getPossibleAndroidMimeType()
@@ -670,43 +655,6 @@ class AttachmentDownloadManagerService : LifecycleService() {
670655
return fileUri
671656
}
672657

673-
/**
674-
* We use this method to support saving files on Android 9 and less which uses an old approach.
675-
*/
676-
private fun storeLegacy(attFile: File, context: Context): Uri {
677-
val fileName = finalFileName
678-
val flowCryptDirectoryForDownloadsName = "FlowCrypt"
679-
val fileDir =
680-
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).apply {
681-
if (!exists()) {
682-
if (!mkdir()) {
683-
error("Creating ${Environment.DIRECTORY_DOWNLOADS} failed!")
684-
}
685-
}
686-
}
687-
688-
val flowCryptDirectoryForDownloads = File(fileDir, flowCryptDirectoryForDownloadsName).apply {
689-
if (!exists()) {
690-
if (!mkdir()) {
691-
error("Creating FlowCrypt directory in ${Environment.DIRECTORY_DOWNLOADS} failed!")
692-
}
693-
}
694-
}
695-
696-
var downloadedFile = File(flowCryptDirectoryForDownloads, fileName)
697-
downloadedFile = if (downloadedFile.exists()) {
698-
FileAndDirectoryUtils.createFileWithIncreasedIndex(flowCryptDirectoryForDownloads, fileName)
699-
} else {
700-
downloadedFile
701-
}
702-
703-
finalFileName = downloadedFile.name
704-
attFile.inputStream().use { srcStream ->
705-
FileUtils.openOutputStream(downloadedFile).use { outStream -> srcStream.copyTo(outStream) }
706-
}
707-
return FileProvider.getUriForFile(context, Constants.FILE_PROVIDER_AUTHORITY, downloadedFile)
708-
}
709-
710658
fun setListener(listener: OnDownloadAttachmentListener) {
711659
this.listener = listener
712660
}

FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/MessageDetailsFragment.kt

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,16 @@
55

66
package com.flowcrypt.email.ui.activity.fragment
77

8-
import android.Manifest
98
import android.accounts.AuthenticatorException
109
import android.content.ActivityNotFoundException
1110
import android.content.ComponentName
1211
import android.content.Context
1312
import android.content.Intent
1413
import android.content.ServiceConnection
15-
import android.content.pm.PackageManager
1614
import android.content.res.ColorStateList
1715
import android.graphics.Shader
1816
import android.graphics.drawable.GradientDrawable
1917
import android.graphics.drawable.LayerDrawable
20-
import android.os.Build
2118
import android.os.Bundle
2219
import android.os.IBinder
2320
import android.text.Html
@@ -33,7 +30,6 @@ import android.widget.CompoundButton
3330
import android.widget.ListView
3431
import android.widget.TextView
3532
import android.widget.Toast
36-
import androidx.activity.result.contract.ActivityResultContracts
3733
import androidx.annotation.ColorRes
3834
import androidx.appcompat.widget.PopupMenu
3935
import androidx.core.content.ContextCompat
@@ -182,15 +178,6 @@ class MessageDetailsFragment : BaseFragment<FragmentMessageDetailsBinding>(), Pr
182178
}
183179
}
184180

185-
private val requestPermissionLauncher =
186-
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
187-
if (isGranted) {
188-
downloadAttachment()
189-
} else {
190-
toast(R.string.cannot_save_attachment_without_permission, Toast.LENGTH_LONG)
191-
}
192-
}
193-
194181
private val attachmentsRecyclerViewAdapter = AttachmentsRecyclerViewAdapter(
195182
isDeleteEnabled = false,
196183
attachmentActionListener = object : AttachmentsRecyclerViewAdapter.AttachmentActionListener {
@@ -2011,16 +1998,7 @@ class MessageDetailsFragment : BaseFragment<FragmentMessageDetailsBinding>(), Pr
20111998
}
20121999
}
20132000

2014-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ||
2015-
ContextCompat.checkSelfPermission(
2016-
requireContext(),
2017-
Manifest.permission.WRITE_EXTERNAL_STORAGE
2018-
) == PackageManager.PERMISSION_GRANTED
2019-
) {
2020-
downloadAttachment()
2021-
} else {
2022-
requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
2023-
}
2001+
downloadAttachment()
20242002
}
20252003

20262004
companion object {

FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/ThreadDetailsFragment.kt

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@
55

66
package com.flowcrypt.email.ui.activity.fragment
77

8-
import android.Manifest
98
import android.content.ActivityNotFoundException
109
import android.content.Intent
11-
import android.content.pm.PackageManager
1210
import android.content.res.ColorStateList
13-
import android.os.Build
1411
import android.os.Bundle
1512
import android.view.LayoutInflater
1613
import android.view.Menu
@@ -19,8 +16,6 @@ import android.view.MenuItem
1916
import android.view.View
2017
import android.view.ViewGroup
2118
import android.widget.ListView
22-
import android.widget.Toast
23-
import androidx.activity.result.contract.ActivityResultContracts
2419
import androidx.core.content.ContextCompat
2520
import androidx.core.view.MenuHost
2621
import androidx.core.view.MenuProvider
@@ -141,16 +136,6 @@ class ThreadDetailsFragment : BaseFragment<FragmentThreadDetailsBinding>(), Prog
141136
}
142137
}
143138
}
144-
private val requestPermissionLauncher =
145-
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
146-
toast(
147-
if (isGranted) {
148-
R.string.permissions_granted_and_now_you_can_download_attachments
149-
} else {
150-
R.string.cannot_save_attachment_without_permission
151-
}, Toast.LENGTH_LONG
152-
)
153-
}
154139

155140
private val messagesInThreadListAdapter = MessagesInThreadListAdapter(
156141
object : MessagesInThreadListAdapter.AdapterListener {
@@ -1328,16 +1313,7 @@ class ThreadDetailsFragment : BaseFragment<FragmentThreadDetailsBinding>(), Prog
13281313
)
13291314
) return
13301315

1331-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ||
1332-
ContextCompat.checkSelfPermission(
1333-
requireContext(),
1334-
Manifest.permission.WRITE_EXTERNAL_STORAGE
1335-
) == PackageManager.PERMISSION_GRANTED
1336-
) {
1337-
downloadAttachment(attachmentInfo, message)
1338-
} else {
1339-
requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
1340-
}
1316+
downloadAttachment(attachmentInfo, message)
13411317
}
13421318

13431319
private fun downloadAttachment(

FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/base/BaseFragment.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
/*
22
* © 2016-present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com
3-
* Contributors: DenBond7
3+
* Contributors: denbond7
44
*/
55

66
package com.flowcrypt.email.ui.activity.fragment.base
77

88
import android.content.Context
99
import android.content.Intent
10-
import android.os.Build
1110
import android.os.Bundle
1211
import android.view.LayoutInflater
1312
import android.view.View
@@ -18,7 +17,6 @@ import androidx.viewbinding.ViewBinding
1817
import com.flowcrypt.email.R
1918
import com.flowcrypt.email.database.entity.AccountEntity
2019
import com.flowcrypt.email.extensions.androidx.fragment.app.doBaseUISetup
21-
import com.flowcrypt.email.extensions.hasActiveConnection
2220
import com.flowcrypt.email.jetpack.lifecycle.ConnectionLifecycleObserver
2321
import com.flowcrypt.email.jetpack.viewmodel.AccountViewModel
2422
import com.flowcrypt.email.jetpack.viewmodel.RoomBasicViewModel
@@ -212,11 +210,7 @@ abstract class BaseFragment<T : ViewBinding> : Fragment(), UiUxSettings, IdlingC
212210
}
213211

214212
protected fun isConnected(): Boolean {
215-
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
216-
connectionLifecycleObserver.connectionLiveData.value ?: false
217-
} else {
218-
context.hasActiveConnection()
219-
}
213+
return connectionLifecycleObserver.connectionLiveData.value ?: false
220214
}
221215

222216
protected fun showAuthIssueHint(

FlowCrypt/src/main/res/values-ru/strings.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@
139139
<string name="source_has_wrong_pgp_structure">Предоставленное вами содержимое не похоже на действительный %1$s ключ PGP.</string>
140140
<string name="file_has_wrong_pgp_structure">Содержимое Вашего файла не похоже на действительный %1$s ключ PGP.</string>
141141
<string name="attachment_not_found">Вложение не найдено</string>
142-
<string name="cannot_save_attachment_without_permission">Вложение нельзя сохранить без разрешения на запись во внешнее хранилище</string>
143142
<string name="sync">Синхронизация</string>
144143
<string name="switch_to_secure_email">Переключиться на безопасное сообщение</string>
145144
<string name="supported_public_key_not_found">Поддерживаемый открытый ключ не найден</string>
@@ -642,7 +641,6 @@
642641
<string name="make_backup_in_the_email_box">Сделайте резервную копию в почтовом ящике</string>
643642
<string name="make_backup_explanation_text">Сохранить предоставленные закрытые ключи PGP, защищенные парольной фразой, в качестве резервной копии в папке «Входящие». Это поможет Вам получить доступ к Вашим зашифрованным сообщениям с других устройств (при условии предоставление Вашей парольной фразы). Вы можете безопасно оставить его в своем почтовом ящике или заархивировать.\n\nЕсли Вам не нужна такая резервная копия, отключите эту опцию.</string>
644643
<string name="draft">Черновик</string>
645-
<string name="permissions_granted_and_now_you_can_download_attachments">Разрешения предоставлены и теперь Вы можете загружать вложения.</string>
646644
<string name="delete_draft">Удалить черновик?</string>
647645
<string name="thread_was_deleted_or_moved">Переписка удалена или перемещена</string>
648646
<plurals name="drafts_count">

FlowCrypt/src/main/res/values-uk/strings.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@
140140
<string name="source_has_wrong_pgp_structure">Наданий Вами вміст не схожий на дійсний %1$s ключ PGP.</string>
141141
<string name="file_has_wrong_pgp_structure">Вміст Вашого файлу не схожий на дійсний %1$s ключ PGP.</string>
142142
<string name="attachment_not_found">Вкладення не знайдене</string>
143-
<string name="cannot_save_attachment_without_permission">Вкладення неможливо зберегти без дозволу на запис до зовнішнього сховища</string>
144143
<string name="sync">Синхронізація</string>
145144
<string name="switch_to_secure_email">Переключитись на безпечне повідомлення</string>
146145
<string name="supported_public_key_not_found">Підтримуваний відкритий ключ не знайдено</string>
@@ -643,7 +642,6 @@
643642
<string name="make_backup_in_the_email_box">Зробіть резервну копію в електронній скриньці</string>
644643
<string name="make_backup_explanation_text">Зберегти надані секретні ключі PGP, захищені парольною фразою, як резервну копію в папці «Вхідні». Це допоможе отримати Вам доступ до Ваших зашифрованих повідомлень з інших пристроїв (за умови надання Вашої парольної фрази). Ви можете спокійно залишити його у папці "Вхідні" або заархівувати.\n\nЯкщо Вам не потрібна така резервна копія, вимкніть цю опцію.</string>
645644
<string name="draft">Чорновик</string>
646-
<string name="permissions_granted_and_now_you_can_download_attachments">Дозволи надано, і тепер ви можете завантажити вкладені файли</string>
647645
<string name="delete_draft">Видалити чернетку?</string>
648646
<string name="thread_was_deleted_or_moved">Бесіду видалено або переміщено</string>
649647
<plurals name="drafts_count">

0 commit comments

Comments
 (0)