From 3f05b7fc1fcc7fea06d5dd2d863188a784ad27e9 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sat, 3 Jun 2023 07:33:41 -0700 Subject: [PATCH] Bump target SDK version, update Gradle, and adjust code I only intended to do the first, but had to deal with the fallout of doing it. --- .github/workflows/build.yml | 34 +++++++++++++ app/build.gradle | 51 +++++-------------- app/src/main/AndroidManifest.xml | 3 +- .../syncadapter/resource/LocalAddressBook.kt | 6 +-- .../syncadapter/resource/LocalGroup.kt | 3 +- .../etesync/syncadapter/ui/AboutActivity.kt | 2 +- .../ui/CollectionMembersActivity.kt | 2 + .../ui/CreateCollectionActivity.kt | 6 +++ .../syncadapter/ui/EditCollectionActivity.kt | 2 + .../syncadapter/ui/JournalItemActivity.kt | 4 ++ .../syncadapter/ui/StartupDialogFragment.kt | 1 + .../syncadapter/ui/ViewCollectionActivity.kt | 6 +++ .../ui/journalviewer/ListEntriesFragment.kt | 2 + build.gradle | 12 ++--- cert4android | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- ical4android | 2 +- vcard4android | 2 +- 18 files changed, 89 insertions(+), 53 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..07773b38 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,34 @@ +name: Android CI Workflow + +on: + push: + branches: + - master + - test + tags: + - 'v*' + +jobs: + apk: + name: Generate APK + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + # - name: Setup Android SDK + # uses: android-actions/setup-android@v2 + + - name: Build APK + run: ./gradlew --no-daemon build + + - name: Upload APK + uses: actions/upload-artifact@v1 + with: + name: apk + path: app/build/outputs/apk/release/app-release.apk diff --git a/app/build.gradle b/app/build.gradle index 55654c4f..13bec8e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,17 +9,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-android-extensions' android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.etesync.syncadapter" minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 33 versionCode 20300 versionName "2.3.0" @@ -60,35 +58,14 @@ android { } } - lintOptions { - disable 'GoogleAppIndexingWarning' // we don't need Google indexing, thanks - disable 'GradleDependency' - disable 'GradleDynamicVersion' - disable 'IconColors' - disable 'IconLauncherShape' - disable 'IconMissingDensityFolder' - disable 'ImpliedQuantity', 'MissingQuantity' - disable 'MissingTranslation', 'ExtraTranslation' // translations from Transifex are not always up to date - disable 'Recycle' // doesn't understand Lombok's @Cleanup - disable 'RtlEnabled' - disable 'RtlHardcoded' - disable 'Typos' - disable "RestrictedApi" // https://code.google.com/p/android/issues/detail?id=230387 - } - - dexOptions { - preDexLibraries = true - // dexInProcess requires much RAM, which is not available on all dev systems - dexInProcess = false - javaMaxHeapSize "2g" - } packagingOptions { - exclude 'LICENSE' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE.txt' + resources { + excludes += ['LICENSE', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt'] + } } + testOptions { unitTests.returnDefaultValues = true } @@ -125,16 +102,16 @@ android { // enable because ical4android requires desugaring coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = "1.8" + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } buildFeatures { dataBinding = true + viewBinding = true + } + lint { + disable 'GoogleAppIndexingWarning', 'GradleDependency', 'GradleDynamicVersion', 'IconColors', 'IconLauncherShape', 'IconMissingDensityFolder', 'ImpliedQuantity', 'MissingQuantity', 'MissingTranslation', 'ExtraTranslation', 'Recycle', 'RtlEnabled', 'RtlHardcoded', 'Typos', 'RestrictedApi' } } @@ -159,9 +136,9 @@ dependencies { // KTX extensions implementation "androidx.core:core-ktx:1.3.1" implementation "androidx.fragment:fragment-ktx:1.2.5" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0" implementation 'com.google.android.material:material:1.2.0-beta01' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0b5f8112..49b1ffaf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -178,7 +178,7 @@ android:enabled="true"> - + @@ -189,6 +189,7 @@ diff --git a/app/src/main/java/com/etesync/syncadapter/resource/LocalAddressBook.kt b/app/src/main/java/com/etesync/syncadapter/resource/LocalAddressBook.kt index da43839f..fe1139a9 100644 --- a/app/src/main/java/com/etesync/syncadapter/resource/LocalAddressBook.kt +++ b/app/src/main/java/com/etesync/syncadapter/resource/LocalAddressBook.kt @@ -204,7 +204,7 @@ class LocalAddressBook( if (provider != null) { val values = ContentValues(1) values.put(RawContacts.ACCOUNT_NAME, newAccountName) - provider.update(syncAdapterURI(RawContacts.CONTENT_URI), values, RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", + (provider as ContentProviderClient).update(syncAdapterURI(RawContacts.CONTENT_URI), values, RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", arrayOf(account.name, account.type)) } } catch (e: RemoteException) { @@ -235,7 +235,7 @@ class LocalAddressBook( if (provider != null) { val values = ContentValues(1) values.put(RawContacts.ACCOUNT_NAME, newAccountName) - provider.update(syncAdapterURI(RawContacts.CONTENT_URI), values, RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", + (provider as ContentProviderClient).update(syncAdapterURI(RawContacts.CONTENT_URI), values, RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", arrayOf(account.name, account.type)) } } catch (e: RemoteException) { @@ -423,7 +423,7 @@ class LocalAddressBook( val values = ContentValues(1) values.put(Groups.TITLE, title) - val uri = provider.insert(syncAdapterURI(Groups.CONTENT_URI), values) + val uri = (provider as ContentProviderClient).insert(syncAdapterURI(Groups.CONTENT_URI), values) return ContentUris.parseId(uri!!) } diff --git a/app/src/main/java/com/etesync/syncadapter/resource/LocalGroup.kt b/app/src/main/java/com/etesync/syncadapter/resource/LocalGroup.kt index eb25a461..6825125e 100644 --- a/app/src/main/java/com/etesync/syncadapter/resource/LocalGroup.kt +++ b/app/src/main/java/com/etesync/syncadapter/resource/LocalGroup.kt @@ -8,6 +8,7 @@ package com.etesync.syncadapter.resource +import android.content.ContentProviderClient import android.content.ContentProviderOperation import android.content.ContentUris import android.content.ContentValues @@ -44,7 +45,7 @@ class LocalGroup : AndroidGroup, LocalAddress { "$COLUMN_PENDING_MEMBERS IS NOT NULL", null, null )?.use { cursor -> - val batch = BatchOperation(addressBook.provider) + val batch = BatchOperation(addressBook.provider as ContentProviderClient) while (cursor.moveToNext()) { val id = cursor.getLong(0) diff --git a/app/src/main/java/com/etesync/syncadapter/ui/AboutActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/AboutActivity.kt index 9853dac8..7371dde0 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/AboutActivity.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/AboutActivity.kt @@ -74,7 +74,7 @@ class AboutActivity : BaseActivity() { @SuppressLint("SetTextI18n") override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val info = components[arguments!!.getInt(KEY_POSITION)] + val info = components[requireArguments().getInt(KEY_POSITION)] val v = inflater.inflate(R.layout.about_component, container, false) diff --git a/app/src/main/java/com/etesync/syncadapter/ui/CollectionMembersActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/CollectionMembersActivity.kt index 6b17693f..72dbff04 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/CollectionMembersActivity.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/CollectionMembersActivity.kt @@ -47,6 +47,8 @@ class CollectionMembersActivity : BaseActivity(), Refreshable { CollectionInfo.Type.ADDRESS_BOOK -> { colorSquare.visibility = View.GONE } + null -> { + } } findViewById(R.id.progressBar).visibility = View.GONE diff --git a/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionActivity.kt index bd8fa732..0c8cc156 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionActivity.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/CreateCollectionActivity.kt @@ -82,6 +82,8 @@ open class CreateCollectionActivity : BaseActivity() { val colorGroup = findViewById(R.id.color_group) colorGroup.visibility = View.GONE } + null -> { + } } } @@ -121,6 +123,10 @@ open class CreateCollectionActivity : BaseActivity() { } CollectionInfo.Type.ADDRESS_BOOK -> { } + CollectionInfo.Type.TASKS -> { + } + null -> { + } } info.selected = true diff --git a/app/src/main/java/com/etesync/syncadapter/ui/EditCollectionActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/EditCollectionActivity.kt index e4b1887a..f0516b83 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/EditCollectionActivity.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/EditCollectionActivity.kt @@ -42,6 +42,8 @@ class EditCollectionActivity : CreateCollectionActivity() { } CollectionInfo.Type.ADDRESS_BOOK -> { } + null -> { + } } val edit = findViewById(R.id.display_name) as EditText diff --git a/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt index 23e62fcc..4f974825 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/JournalItemActivity.kt @@ -146,6 +146,8 @@ class JournalItemActivity : BaseActivity(), Refreshable { } } } + null -> { + } } val dialog = AlertDialog.Builder(this) @@ -231,6 +233,8 @@ class JournalItemActivity : BaseActivity(), Refreshable { v = inflater.inflate(R.layout.task_info, container, false) asyncTask = loadTaskTask(v) } + null -> { + } } return v diff --git a/app/src/main/java/com/etesync/syncadapter/ui/StartupDialogFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/StartupDialogFragment.kt index 3b469610..7ac4037b 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/StartupDialogFragment.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/StartupDialogFragment.kt @@ -68,6 +68,7 @@ class StartupDialogFragment : DialogFragment() { .setNeutralButton(R.string.startup_vendor_specific_bugs_open_faq) { dialog, which -> WebViewActivity.openUrl(context!!, Constants.faqUri.buildUpon().encodedFragment("vendor-issues").build()) } .setNegativeButton(R.string.startup_dont_show_again) { dialog, which -> HintManager.setHintSeen(context!!, HINT_VENDOR_SPECIFIC_BUGS, true) } .create() + StartupDialogFragment.Mode.GOOGLE_PLAY_ACCOUNTS_REMOVED -> {} } throw IllegalArgumentException(/* illegal mode argument */) diff --git a/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt b/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt index 1f90ddca..65c3649b 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.kt @@ -76,6 +76,8 @@ class ViewCollectionActivity : BaseActivity(), Refreshable { CollectionInfo.Type.ADDRESS_BOOK -> { colorSquare.visibility = View.GONE } + null -> { + } } LoadCountTask().execute() @@ -244,6 +246,8 @@ class ViewCollectionActivity : BaseActivity(), Refreshable { e.printStackTrace() } } + null -> { + } } return count } @@ -268,6 +272,8 @@ class ViewCollectionActivity : BaseActivity(), Refreshable { stats.text = String.format(Locale.getDefault(), "Contacts: %d, Journal Entries: %d", result, entryCount) } + null -> { + } } } } diff --git a/app/src/main/java/com/etesync/syncadapter/ui/journalviewer/ListEntriesFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/journalviewer/ListEntriesFragment.kt index 2e4aa593..0fb40d5d 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/journalviewer/ListEntriesFragment.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/journalviewer/ListEntriesFragment.kt @@ -153,6 +153,8 @@ class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener { CollectionInfo.Type.ADDRESS_BOOK -> { prefix = "FN:" } + null -> { + } } var content = getLine(fullContent, prefix) diff --git a/build.gradle b/build.gradle index df8c0cb4..c204851b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,16 +7,16 @@ */ ext { - kotlin_version = '1.4.10' - gradle_version = '4.0.1' - compileSdkVersion = 30 - buildToolsVersion = '30.0.2' + kotlin_version = '1.8.21' + gradle_version = '8.0.2' + compileSdkVersion = 33 + buildToolsVersion = '33.0.0' } // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.10' - ext.gradle_version = '4.0.1' + ext.kotlin_version = '1.8.21' + ext.gradle_version = '7.4.2' repositories { jcenter() diff --git a/cert4android b/cert4android index 47bc6842..d01a3455 160000 --- a/cert4android +++ b/cert4android @@ -1 +1 @@ -Subproject commit 47bc6842daf9b93b28ae2ad8b65754dae2bc3ece +Subproject commit d01a3455bdb7fb49362e3e7acef043d34b7124f6 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cc093552..941e49aa 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip diff --git a/ical4android b/ical4android index b023c079..b62dfc46 160000 --- a/ical4android +++ b/ical4android @@ -1 +1 @@ -Subproject commit b023c079b2a8cd2fe69360a835cf0d872b71cd53 +Subproject commit b62dfc46f61aa310a65383e7b99f66a99959da2b diff --git a/vcard4android b/vcard4android index e98a3a55..beb8ad29 160000 --- a/vcard4android +++ b/vcard4android @@ -1 +1 @@ -Subproject commit e98a3a553511f66b9bbdb914f2d2c91176108aab +Subproject commit beb8ad2904bd1a46646dce0e707c54417858eaa2