Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 3da48ab3 authored by Sunik Kupfer's avatar Sunik Kupfer Committed by Ricki Hirner
Browse files

362 increase minimum api level to android 7 (bitfireAT/davx5#363)



* Increase minSdkVersion to 24 (Android 7.0)

* Remove obsolete api level checks

* Use latest dnsjava

* Use latest apache commons

* Minor formatting

* Unify getSystemService() calls

* Remove further unnecessary calls

* Remove noinspection GradleDependency for Apache Commons libs

---------

Co-authored-by: default avatarRicki Hirner <hirner@bitfire.at>
parent 0ba00d7b
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ android {

        setProperty "archivesBaseName", "davx5-ose-" + getVersionName()

        minSdkVersion 21        // Android 5
        minSdkVersion 24        // Android 7.0
        targetSdkVersion 33     // Android 13

        buildConfigField "String", "userAgent", "\"DAVx5\""
@@ -182,14 +182,10 @@ dependencies {
    implementation "com.squareup.okhttp3:logging-interceptor:${versions.okhttp}"
    //noinspection GradleDependency - don't update until API level 26 (Android 8) is the minimum API [https://github.com/bitfireAT/davx5/issues/130]
    implementation 'commons-io:commons-io:2.8.0'
    //noinspection GradleDependency - dnsjava 3+ needs Java 8/Android 7
    implementation 'dnsjava:dnsjava:2.1.9'
    implementation 'dnsjava:dnsjava:3.5.2'
    implementation 'net.openid:appauth:0.11.1'
    //noinspection GradleDependency
    implementation "org.apache.commons:commons-collections4:${versions.commonsCollections}"
    //noinspection GradleDependency
    implementation "org.apache.commons:commons-lang3:${versions.commonsLang}"
    //noinspection GradleDependency
    implementation "org.apache.commons:commons-text:${versions.commonsText}"

    // for tests
+3 −6
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ import android.os.Build
import android.os.PowerManager
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.getSystemService
import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.settings.SettingsManager
import at.bitfire.davdroid.ui.AppSettingsActivity
@@ -62,12 +63,8 @@ class ForegroundService : Service() {
         * Whether the app is currently exempted from battery optimization.
         * @return true if battery optimization is not applied to the current app; false if battery optimization is applied
         */
        fun batteryOptimizationWhitelisted(context: Context) =
            if (Build.VERSION.SDK_INT >= 23) {  // battery optimization exists since Android 6 (SDK level 23)
                val powerManager = context.getSystemService(PowerManager::class.java)
                powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
            } else
                true
        private fun batteryOptimizationWhitelisted(context: Context) =
            context.getSystemService<PowerManager>()!!.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)

        /**
         * Whether the foreground service is enabled (checked) in the app settings.
+15 −1
Original line number Diff line number Diff line
@@ -11,10 +11,12 @@ import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.runBlocking
import org.xbill.DNS.EDNSOption
import org.xbill.DNS.Message
import org.xbill.DNS.Resolver
import org.xbill.DNS.ResolverListener
import org.xbill.DNS.TSIG
import java.time.Duration

/**
 * dnsjava Resolver that uses Android's [DnsResolver] API, which is available since Android 10.
@@ -42,6 +44,7 @@ object Android10Resolver: Resolver {
        future.await()
    }

    @Deprecated("Deprecated in dnsjava")
    override fun sendAsync(query: Message, listener: ResolverListener) =
        // currently not used by dnsjava, so no need to implement it
        throw NotImplementedError()
@@ -63,7 +66,12 @@ object Android10Resolver: Resolver {
        // not applicable
    }

    override fun setEDNS(level: Int, payloadSize: Int, flags: Int, options: MutableList<Any?>?) {
    override fun setEDNS(
        version: Int,
        payloadSize: Int,
        flags: Int,
        options: MutableList<EDNSOption>?
    ) {
        // not applicable
    }

@@ -71,12 +79,18 @@ object Android10Resolver: Resolver {
        // not applicable
    }

    @Deprecated("Deprecated in dnsjava")
    override fun setTimeout(secs: Int, msecs: Int) {
        // not applicable
    }

    @Deprecated("Deprecated in dnsjava")
    override fun setTimeout(secs: Int) {
        // not applicable
    }

    override fun setTimeout(timeout: Duration?) {
       // not applicable
    }

}
 No newline at end of file
+14 −10
Original line number Diff line number Diff line
@@ -5,7 +5,11 @@ package at.bitfire.davdroid.resource

import android.accounts.Account
import android.accounts.AccountManager
import android.content.*
import android.content.ContentProviderClient
import android.content.ContentResolver
import android.content.ContentUris
import android.content.ContentValues
import android.content.Context
import android.os.Build
import android.os.Bundle
import android.os.RemoteException
@@ -22,9 +26,13 @@ import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.syncadapter.AccountUtils
import at.bitfire.davdroid.util.DavUtils
import at.bitfire.davdroid.util.setAndVerifyUserData
import at.bitfire.vcard4android.*
import at.bitfire.vcard4android.AndroidAddressBook
import at.bitfire.vcard4android.AndroidContact
import at.bitfire.vcard4android.AndroidGroup
import at.bitfire.vcard4android.Constants
import at.bitfire.vcard4android.GroupMethod
import java.io.ByteArrayOutputStream
import java.util.*
import java.util.LinkedList
import java.util.logging.Level

/**
@@ -266,11 +274,7 @@ open class LocalAddressBook(

    fun delete() {
        val accountManager = AccountManager.get(context)
        @Suppress("DEPRECATION")
        if (Build.VERSION.SDK_INT >= 22)
        accountManager.removeAccount(account, null, null, null)
        else
            accountManager.removeAccount(account, null, null)
    }


@@ -375,8 +379,8 @@ open class LocalAddressBook(
     * @throws RemoteException on content provider errors
     */
    fun verifyDirty(): Int {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            throw IllegalStateException("verifyDirty() should not be called on Android != 7")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            throw IllegalStateException("verifyDirty() should not be called on Android != 7.0")

        var reallyDirty = 0
        for (contact in findDirtyContacts()) {
+16 −7
Original line number Diff line number Diff line
@@ -12,12 +12,21 @@ import android.provider.ContactsContract.CommonDataKinds.GroupMembership
import android.provider.ContactsContract.RawContacts.Data
import at.bitfire.davdroid.BuildConfig
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.resource.contactrow.*
import at.bitfire.vcard4android.*
import at.bitfire.davdroid.resource.contactrow.CachedGroupMembershipHandler
import at.bitfire.davdroid.resource.contactrow.GroupMembershipBuilder
import at.bitfire.davdroid.resource.contactrow.GroupMembershipHandler
import at.bitfire.davdroid.resource.contactrow.UnknownPropertiesBuilder
import at.bitfire.davdroid.resource.contactrow.UnknownPropertiesHandler
import at.bitfire.vcard4android.AndroidAddressBook
import at.bitfire.vcard4android.AndroidContact
import at.bitfire.vcard4android.AndroidContactFactory
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.CachedGroupMembership
import at.bitfire.vcard4android.Contact
import ezvcard.Ezvcard
import org.apache.commons.lang3.StringUtils
import java.io.FileNotFoundException
import java.util.*
import java.util.UUID

class LocalContact: AndroidContact, LocalAddress {

@@ -91,7 +100,7 @@ class LocalContact: AndroidContact, LocalAddress {
        values.put(COLUMN_ETAG, eTag)
        values.put(ContactsContract.RawContacts.DIRTY, 0)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            // workaround for Android 7 which sets DIRTY flag when only meta-data is changed
            val hashCode = dataHashCode()
            values.put(COLUMN_HASHCODE, hashCode)
@@ -132,7 +141,7 @@ class LocalContact: AndroidContact, LocalAddress {
     * @return hash code of contact data (including group memberships)
     */
    internal fun dataHashCode(): Int {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            throw IllegalStateException("dataHashCode() should not be called on Android != 7")

        // reset contact so that getContact() reads from database
@@ -146,7 +155,7 @@ class LocalContact: AndroidContact, LocalAddress {
    }

    fun updateHashCode(batch: BatchOperation?) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            throw IllegalStateException("updateHashCode() should not be called on Android != 7")

        val hashCode = dataHashCode()
@@ -163,7 +172,7 @@ class LocalContact: AndroidContact, LocalAddress {
    }

    fun getLastHashCode(): Int {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            throw IllegalStateException("getLastHashCode() should not be called on Android != 7")

        addressBook.provider!!.query(rawContactSyncURI(), arrayOf(COLUMN_HASHCODE), null, null, null)?.use { c ->
Loading