mirror of
https://github.com/etesync/android
synced 2025-04-25 11:39:07 +00:00
Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b2f48e524d | ||
![]() |
00425eb281 | ||
![]() |
425c637ead | ||
![]() |
f62eb11bb2 | ||
![]() |
7f82eb60d6 | ||
![]() |
ddfdf3d71c | ||
![]() |
02b075e3cc | ||
![]() |
b896c7f015 | ||
![]() |
7d345ebaa0 | ||
![]() |
d59ed821ed | ||
![]() |
88daffcbaf | ||
![]() |
3f05b7fc1f |
16
ChangeLog.md
16
ChangeLog.md
@ -1,6 +1,22 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
*NOTE:* may be removed in the future in favor of the fastlane changelog.
|
*NOTE:* may be removed in the future in favor of the fastlane changelog.
|
||||||
|
|
||||||
|
## Version 2.4.4
|
||||||
|
* Fix error when importing from file in Android 13+
|
||||||
|
|
||||||
|
## Version 2.4.3
|
||||||
|
* Fix task sync adapter issues when no tasks are found
|
||||||
|
* Add required notifications permissions to app manifest
|
||||||
|
|
||||||
|
## Version 2.4.2
|
||||||
|
* Fix sync adapter crashes with Android 12 and 13
|
||||||
|
|
||||||
|
## Version 2.4.1
|
||||||
|
* Fix sync with Tasks.org and OpenTasks - many thanks to @Sch1nken!
|
||||||
|
|
||||||
|
## Version 2.4.0
|
||||||
|
* Update compile and target SDK versions
|
||||||
|
|
||||||
## Version 2.3.0
|
## Version 2.3.0
|
||||||
* Sync: add an option to sync every 30 minutes
|
* Sync: add an option to sync every 30 minutes
|
||||||
* Update translations
|
* Update translations
|
||||||
|
@ -9,20 +9,18 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlin-kapt'
|
apply plugin: 'kotlin-kapt'
|
||||||
apply plugin: 'kotlin-android-extensions'
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||||
buildToolsVersion rootProject.ext.buildToolsVersion
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.etesync.syncadapter"
|
applicationId "com.etesync.syncadapter"
|
||||||
|
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 29
|
targetSdkVersion 33
|
||||||
|
|
||||||
versionCode 20300
|
versionCode 20404
|
||||||
versionName "2.3.0"
|
versionName "2.4.4"
|
||||||
|
|
||||||
buildConfigField "boolean", "customCerts", "true"
|
buildConfigField "boolean", "customCerts", "true"
|
||||||
}
|
}
|
||||||
@ -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 {
|
packagingOptions {
|
||||||
exclude 'LICENSE'
|
resources {
|
||||||
exclude 'META-INF/LICENSE.txt'
|
excludes += ['LICENSE', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt']
|
||||||
exclude 'META-INF/NOTICE.txt'
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
testOptions {
|
testOptions {
|
||||||
unitTests.returnDefaultValues = true
|
unitTests.returnDefaultValues = true
|
||||||
}
|
}
|
||||||
@ -125,22 +102,22 @@ android {
|
|||||||
// enable because ical4android requires desugaring
|
// enable because ical4android requires desugaring
|
||||||
coreLibraryDesugaringEnabled true
|
coreLibraryDesugaringEnabled true
|
||||||
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
dataBinding = true
|
dataBinding = true
|
||||||
|
viewBinding = true
|
||||||
|
}
|
||||||
|
lint {
|
||||||
|
disable 'GoogleAppIndexingWarning', 'GradleDependency', 'GradleDynamicVersion', 'IconColors', 'IconLauncherShape', 'IconMissingDensityFolder', 'ImpliedQuantity', 'MissingQuantity', 'MissingTranslation', 'ExtraTranslation', 'Recycle', 'RtlEnabled', 'RtlHardcoded', 'Typos', 'RestrictedApi'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||||
|
|
||||||
implementation "org.jetbrains.anko:anko-commons:0.10.4"
|
implementation "org.jetbrains.anko:anko-commons:0.10.4"
|
||||||
|
|
||||||
@ -159,9 +136,9 @@ dependencies {
|
|||||||
// KTX extensions
|
// KTX extensions
|
||||||
implementation "androidx.core:core-ktx:1.3.1"
|
implementation "androidx.core:core-ktx:1.3.1"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.2.5"
|
implementation "androidx.fragment:fragment-ktx:1.2.5"
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"
|
||||||
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
|
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"
|
||||||
|
|
||||||
|
|
||||||
implementation 'com.google.android.material:material:1.2.0-beta01'
|
implementation 'com.google.android.material:material:1.2.0-beta01'
|
||||||
|
@ -48,3 +48,25 @@
|
|||||||
# Spongcastle
|
# Spongcastle
|
||||||
-dontwarn org.spongycastle.jce.provider.X509LDAPCertStoreSpi
|
-dontwarn org.spongycastle.jce.provider.X509LDAPCertStoreSpi
|
||||||
-dontwarn org.spongycastle.x509.util.LDAPStoreHelper
|
-dontwarn org.spongycastle.x509.util.LDAPStoreHelper
|
||||||
|
|
||||||
|
# Android stuff automatically generated by the Android Gradle plugin.
|
||||||
|
-dontwarn com.android.org.conscrypt.SSLParametersImpl
|
||||||
|
-dontwarn groovy.lang.GroovyObject
|
||||||
|
-dontwarn groovy.lang.MetaClass
|
||||||
|
-dontwarn groovy.transform.Generated
|
||||||
|
-dontwarn groovy.transform.Internal
|
||||||
|
-dontwarn groovy.util.AbstractFactory
|
||||||
|
-dontwarn groovy.util.FactoryBuilderSupport
|
||||||
|
-dontwarn org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
|
||||||
|
-dontwarn org.bouncycastle.jsse.BCSSLParameters
|
||||||
|
-dontwarn org.bouncycastle.jsse.BCSSLSocket
|
||||||
|
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
|
||||||
|
-dontwarn org.codehaus.groovy.reflection.ClassInfo
|
||||||
|
-dontwarn org.codehaus.groovy.runtime.ScriptBytecodeAdapter
|
||||||
|
-dontwarn org.codehaus.groovy.runtime.callsite.CallSite
|
||||||
|
-dontwarn org.codehaus.groovy.runtime.callsite.CallSiteArray
|
||||||
|
-dontwarn org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation
|
||||||
|
-dontwarn org.codehaus.groovy.runtime.typehandling.ShortTypeHandling
|
||||||
|
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
|
||||||
|
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
|
||||||
|
-dontwarn org.openjsse.net.ssl.OpenJSSE
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:installLocation="internalOnly">
|
android:installLocation="internalOnly">
|
||||||
|
<queries>
|
||||||
|
<package android:name="org.dmfs.tasks" />
|
||||||
|
<package android:name="org.tasks" />
|
||||||
|
</queries>
|
||||||
|
|
||||||
<!-- normal permissions -->
|
<!-- normal permissions -->
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
@ -19,6 +23,7 @@
|
|||||||
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
|
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
|
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
|
||||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
|
||||||
<!-- account management permissions not required for own accounts since API level 22 -->
|
<!-- account management permissions not required for own accounts since API level 22 -->
|
||||||
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" android:maxSdkVersion="22"/>
|
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" android:maxSdkVersion="22"/>
|
||||||
@ -31,8 +36,9 @@
|
|||||||
-->
|
-->
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
|
||||||
|
|
||||||
<!-- Used for external log and vcf import. -->
|
<!-- Used for external log and vcf import. Permissions changed for SDK >= 33. -->
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
|
||||||
|
|
||||||
<!-- other permissions -->
|
<!-- other permissions -->
|
||||||
<!-- android.permission-group.CONTACTS -->
|
<!-- android.permission-group.CONTACTS -->
|
||||||
@ -178,7 +184,7 @@
|
|||||||
android:enabled="true">
|
android:enabled="true">
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
<receiver android:name=".PackageChangedReceiver">
|
<receiver android:name=".PackageChangedReceiver" android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.PACKAGE_ADDED"/>
|
<action android:name="android.intent.action.PACKAGE_ADDED"/>
|
||||||
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/>
|
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/>
|
||||||
@ -189,6 +195,7 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".ui.AccountsActivity"
|
android:name=".ui.AccountsActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
android:exported="true"
|
||||||
android:theme="@style/AppTheme.NoActionBar">
|
android:theme="@style/AppTheme.NoActionBar">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
@ -95,7 +95,7 @@ object Logger : SharedPreferences.OnSharedPreferenceChangeListener {
|
|||||||
.setCategory(NotificationCompat.CATEGORY_STATUS)
|
.setCategory(NotificationCompat.CATEGORY_STATUS)
|
||||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||||
.setSubText(context.getString(R.string.logging_to_external_storage_warning))
|
.setSubText(context.getString(R.string.logging_to_external_storage_warning))
|
||||||
.setContentIntent(PendingIntent.getActivity(context, 0, prefIntent, PendingIntent.FLAG_UPDATE_CURRENT))
|
.setContentIntent(PendingIntent.getActivity(context, 0, prefIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE))
|
||||||
.setStyle(NotificationCompat.BigTextStyle()
|
.setStyle(NotificationCompat.BigTextStyle()
|
||||||
.bigText(context.getString(R.string.logging_to_external_storage, logDir.path)))
|
.bigText(context.getString(R.string.logging_to_external_storage, logDir.path)))
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
|
@ -204,7 +204,7 @@ class LocalAddressBook(
|
|||||||
if (provider != null) {
|
if (provider != null) {
|
||||||
val values = ContentValues(1)
|
val values = ContentValues(1)
|
||||||
values.put(RawContacts.ACCOUNT_NAME, newAccountName)
|
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))
|
arrayOf(account.name, account.type))
|
||||||
}
|
}
|
||||||
} catch (e: RemoteException) {
|
} catch (e: RemoteException) {
|
||||||
@ -235,7 +235,7 @@ class LocalAddressBook(
|
|||||||
if (provider != null) {
|
if (provider != null) {
|
||||||
val values = ContentValues(1)
|
val values = ContentValues(1)
|
||||||
values.put(RawContacts.ACCOUNT_NAME, newAccountName)
|
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))
|
arrayOf(account.name, account.type))
|
||||||
}
|
}
|
||||||
} catch (e: RemoteException) {
|
} catch (e: RemoteException) {
|
||||||
@ -423,7 +423,7 @@ class LocalAddressBook(
|
|||||||
|
|
||||||
val values = ContentValues(1)
|
val values = ContentValues(1)
|
||||||
values.put(Groups.TITLE, title)
|
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!!)
|
return ContentUris.parseId(uri!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package com.etesync.syncadapter.resource
|
package com.etesync.syncadapter.resource
|
||||||
|
|
||||||
|
import android.content.ContentProviderClient
|
||||||
import android.content.ContentProviderOperation
|
import android.content.ContentProviderOperation
|
||||||
import android.content.ContentUris
|
import android.content.ContentUris
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
@ -44,7 +45,7 @@ class LocalGroup : AndroidGroup, LocalAddress {
|
|||||||
"$COLUMN_PENDING_MEMBERS IS NOT NULL", null,
|
"$COLUMN_PENDING_MEMBERS IS NOT NULL", null,
|
||||||
null
|
null
|
||||||
)?.use { cursor ->
|
)?.use { cursor ->
|
||||||
val batch = BatchOperation(addressBook.provider)
|
val batch = BatchOperation(addressBook.provider as ContentProviderClient)
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
val id = cursor.getLong(0)
|
val id = cursor.getLong(0)
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ abstract class SyncAdapterService : Service() {
|
|||||||
.setLargeIcon(App.getLauncherBitmap(context))
|
.setLargeIcon(App.getLauncherBitmap(context))
|
||||||
.setContentTitle(context.getString(R.string.sync_error_permissions))
|
.setContentTitle(context.getString(R.string.sync_error_permissions))
|
||||||
.setContentText(context.getString(R.string.sync_error_permissions_text))
|
.setContentText(context.getString(R.string.sync_error_permissions_text))
|
||||||
.setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
|
.setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE))
|
||||||
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
.setCategory(NotificationCompat.CATEGORY_ERROR)
|
||||||
.build()
|
.build()
|
||||||
val nm = NotificationManagerCompat.from(context)
|
val nm = NotificationManagerCompat.from(context)
|
||||||
|
@ -105,7 +105,7 @@ class SyncNotification(internal val context: Context, internal val notificationT
|
|||||||
.setAutoCancel(true)
|
.setAutoCancel(true)
|
||||||
.setCategory(category)
|
.setCategory(category)
|
||||||
.setSmallIcon(icon)
|
.setSmallIcon(icon)
|
||||||
.setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
|
.setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE))
|
||||||
|
|
||||||
if (bigText != null)
|
if (bigText != null)
|
||||||
builder.setStyle(NotificationCompat.BigTextStyle()
|
builder.setStyle(NotificationCompat.BigTextStyle()
|
||||||
|
@ -74,7 +74,7 @@ class AboutActivity : BaseActivity() {
|
|||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
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)
|
val v = inflater.inflate(R.layout.about_component, container, false)
|
||||||
|
|
||||||
|
@ -47,6 +47,8 @@ class CollectionMembersActivity : BaseActivity(), Refreshable {
|
|||||||
CollectionInfo.Type.ADDRESS_BOOK -> {
|
CollectionInfo.Type.ADDRESS_BOOK -> {
|
||||||
colorSquare.visibility = View.GONE
|
colorSquare.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
findViewById<View>(R.id.progressBar).visibility = View.GONE
|
findViewById<View>(R.id.progressBar).visibility = View.GONE
|
||||||
|
|
||||||
|
@ -82,6 +82,8 @@ open class CreateCollectionActivity : BaseActivity() {
|
|||||||
val colorGroup = findViewById<View>(R.id.color_group)
|
val colorGroup = findViewById<View>(R.id.color_group)
|
||||||
colorGroup.visibility = View.GONE
|
colorGroup.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,6 +123,10 @@ open class CreateCollectionActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
CollectionInfo.Type.ADDRESS_BOOK -> {
|
CollectionInfo.Type.ADDRESS_BOOK -> {
|
||||||
}
|
}
|
||||||
|
CollectionInfo.Type.TASKS -> {
|
||||||
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.selected = true
|
info.selected = true
|
||||||
|
@ -42,6 +42,8 @@ class EditCollectionActivity : CreateCollectionActivity() {
|
|||||||
}
|
}
|
||||||
CollectionInfo.Type.ADDRESS_BOOK -> {
|
CollectionInfo.Type.ADDRESS_BOOK -> {
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val edit = findViewById<View>(R.id.display_name) as EditText
|
val edit = findViewById<View>(R.id.display_name) as EditText
|
||||||
|
@ -146,6 +146,8 @@ class JournalItemActivity : BaseActivity(), Refreshable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val dialog = AlertDialog.Builder(this)
|
val dialog = AlertDialog.Builder(this)
|
||||||
@ -231,6 +233,8 @@ class JournalItemActivity : BaseActivity(), Refreshable {
|
|||||||
v = inflater.inflate(R.layout.task_info, container, false)
|
v = inflater.inflate(R.layout.task_info, container, false)
|
||||||
asyncTask = loadTaskTask(v)
|
asyncTask = loadTaskTask(v)
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return v
|
return v
|
||||||
|
@ -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()) }
|
.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) }
|
.setNegativeButton(R.string.startup_dont_show_again) { dialog, which -> HintManager.setHintSeen(context!!, HINT_VENDOR_SPECIFIC_BUGS, true) }
|
||||||
.create()
|
.create()
|
||||||
|
StartupDialogFragment.Mode.GOOGLE_PLAY_ACCOUNTS_REMOVED -> {}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw IllegalArgumentException(/* illegal mode argument */)
|
throw IllegalArgumentException(/* illegal mode argument */)
|
||||||
|
@ -76,6 +76,8 @@ class ViewCollectionActivity : BaseActivity(), Refreshable {
|
|||||||
CollectionInfo.Type.ADDRESS_BOOK -> {
|
CollectionInfo.Type.ADDRESS_BOOK -> {
|
||||||
colorSquare.visibility = View.GONE
|
colorSquare.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadCountTask().execute()
|
LoadCountTask().execute()
|
||||||
@ -244,6 +246,8 @@ class ViewCollectionActivity : BaseActivity(), Refreshable {
|
|||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
@ -268,6 +272,8 @@ class ViewCollectionActivity : BaseActivity(), Refreshable {
|
|||||||
stats.text = String.format(Locale.getDefault(), "Contacts: %d, Journal Entries: %d",
|
stats.text = String.format(Locale.getDefault(), "Contacts: %d, Journal Entries: %d",
|
||||||
result, entryCount)
|
result, entryCount)
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import android.content.ActivityNotFoundException
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.os.Build.VERSION.SDK_INT
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.CalendarContract
|
import android.provider.CalendarContract
|
||||||
import android.provider.ContactsContract
|
import android.provider.ContactsContract
|
||||||
@ -63,7 +64,11 @@ class ImportFragment : DialogFragment() {
|
|||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.M)
|
@TargetApi(Build.VERSION_CODES.M)
|
||||||
private fun requestPermissions() {
|
private fun requestPermissions() {
|
||||||
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 0)
|
if (SDK_INT <= 32) {
|
||||||
|
requestPermissions(kotlin.arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 0)
|
||||||
|
} else {
|
||||||
|
requestPermissions(arrayOf(Manifest.permission.READ_MEDIA_IMAGES), 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
@ -153,6 +153,8 @@ class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener {
|
|||||||
CollectionInfo.Type.ADDRESS_BOOK -> {
|
CollectionInfo.Type.ADDRESS_BOOK -> {
|
||||||
prefix = "FN:"
|
prefix = "FN:"
|
||||||
}
|
}
|
||||||
|
null -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var content = getLine(fullContent, prefix)
|
var content = getLine(fullContent, prefix)
|
||||||
|
12
build.gradle
12
build.gradle
@ -7,16 +7,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
kotlin_version = '1.4.10'
|
kotlin_version = '1.8.21'
|
||||||
gradle_version = '4.0.1'
|
gradle_version = '8.0.2'
|
||||||
compileSdkVersion = 30
|
compileSdkVersion = 33
|
||||||
buildToolsVersion = '30.0.2'
|
buildToolsVersion = '33.0.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.4.10'
|
ext.kotlin_version = '1.8.21'
|
||||||
ext.gradle_version = '4.0.1'
|
ext.gradle_version = '7.4.2'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 47bc6842daf9b93b28ae2ad8b65754dae2bc3ece
|
Subproject commit 94df228f8bb8f8f50e26b3f4a3a9a53f0b83a4d2
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
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
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit b023c079b2a8cd2fe69360a835cf0d872b71cd53
|
Subproject commit ecd2ab875dc6807a051577670443defb83608904
|
@ -1 +1 @@
|
|||||||
Subproject commit e98a3a553511f66b9bbdb914f2d2c91176108aab
|
Subproject commit beb8ad2904bd1a46646dce0e707c54417858eaa2
|
Loading…
Reference in New Issue
Block a user