1
0
mirror of https://github.com/etesync/android synced 2025-04-28 21:19:19 +00:00

Compare commits

..

No commits in common. "master" and "v2.3.0" have entirely different histories.

23 changed files with 64 additions and 115 deletions

View File

@ -1,22 +1,6 @@
# 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

View File

@ -9,18 +9,20 @@
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 33 targetSdkVersion 29
versionCode 20404 versionCode 20300
versionName "2.4.4" versionName "2.3.0"
buildConfigField "boolean", "customCerts", "true" buildConfigField "boolean", "customCerts", "true"
} }
@ -58,13 +60,34 @@ android {
} }
} }
lintOptions {
packagingOptions { disable 'GoogleAppIndexingWarning' // we don't need Google indexing, thanks
resources { disable 'GradleDependency'
excludes += ['LICENSE', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt'] 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'
}
testOptions { testOptions {
unitTests.returnDefaultValues = true unitTests.returnDefaultValues = true
@ -102,22 +125,22 @@ android {
// enable because ical4android requires desugaring // enable because ical4android requires desugaring
coreLibraryDesugaringEnabled true coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_17 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_1_8
}
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.1.5' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
implementation "org.jetbrains.anko:anko-commons:0.10.4" implementation "org.jetbrains.anko:anko-commons:0.10.4"
@ -136,9 +159,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.4.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
implementation 'com.google.android.material:material:1.2.0-beta01' implementation 'com.google.android.material:material:1.2.0-beta01'

View File

@ -48,25 +48,3 @@
# 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

View File

@ -10,10 +10,6 @@
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"/>
@ -23,7 +19,6 @@
<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"/>
@ -36,9 +31,8 @@
--> -->
<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. Permissions changed for SDK >= 33. --> <!-- Used for external log and vcf import. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<!-- other permissions --> <!-- other permissions -->
<!-- android.permission-group.CONTACTS --> <!-- android.permission-group.CONTACTS -->
@ -184,7 +178,7 @@
android:enabled="true"> android:enabled="true">
</service> </service>
<receiver android:name=".PackageChangedReceiver" android:exported="true"> <receiver android:name=".PackageChangedReceiver">
<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"/>
@ -195,7 +189,6 @@
<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"/>

View File

@ -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 or PendingIntent.FLAG_IMMUTABLE)) .setContentIntent(PendingIntent.getActivity(context, 0, prefIntent, PendingIntent.FLAG_UPDATE_CURRENT))
.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)

View File

@ -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 as ContentProviderClient).update(syncAdapterURI(RawContacts.CONTENT_URI), values, RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", provider.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 as ContentProviderClient).update(syncAdapterURI(RawContacts.CONTENT_URI), values, RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?", provider.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 as ContentProviderClient).insert(syncAdapterURI(Groups.CONTENT_URI), values) val uri = provider.insert(syncAdapterURI(Groups.CONTENT_URI), values)
return ContentUris.parseId(uri!!) return ContentUris.parseId(uri!!)
} }

View File

@ -8,7 +8,6 @@
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
@ -45,7 +44,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 as ContentProviderClient) val batch = BatchOperation(addressBook.provider)
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
val id = cursor.getLong(0) val id = cursor.getLong(0)

View File

@ -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 or PendingIntent.FLAG_IMMUTABLE)) .setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
.setCategory(NotificationCompat.CATEGORY_ERROR) .setCategory(NotificationCompat.CATEGORY_ERROR)
.build() .build()
val nm = NotificationManagerCompat.from(context) val nm = NotificationManagerCompat.from(context)

View File

@ -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 or PendingIntent.FLAG_IMMUTABLE)) .setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
if (bigText != null) if (bigText != null)
builder.setStyle(NotificationCompat.BigTextStyle() builder.setStyle(NotificationCompat.BigTextStyle()

View File

@ -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[requireArguments().getInt(KEY_POSITION)] val info = components[arguments!!.getInt(KEY_POSITION)]
val v = inflater.inflate(R.layout.about_component, container, false) val v = inflater.inflate(R.layout.about_component, container, false)

View File

@ -47,8 +47,6 @@ 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

View File

@ -82,8 +82,6 @@ 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 -> {
}
} }
} }
@ -123,10 +121,6 @@ open class CreateCollectionActivity : BaseActivity() {
} }
CollectionInfo.Type.ADDRESS_BOOK -> { CollectionInfo.Type.ADDRESS_BOOK -> {
} }
CollectionInfo.Type.TASKS -> {
}
null -> {
}
} }
info.selected = true info.selected = true

View File

@ -42,8 +42,6 @@ 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

View File

@ -146,8 +146,6 @@ class JournalItemActivity : BaseActivity(), Refreshable {
} }
} }
} }
null -> {
}
} }
val dialog = AlertDialog.Builder(this) val dialog = AlertDialog.Builder(this)
@ -233,8 +231,6 @@ 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

View File

@ -68,7 +68,6 @@ 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 */)

View File

@ -76,8 +76,6 @@ 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()
@ -246,8 +244,6 @@ class ViewCollectionActivity : BaseActivity(), Refreshable {
e.printStackTrace() e.printStackTrace()
} }
} }
null -> {
}
} }
return count return count
} }
@ -272,8 +268,6 @@ 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 -> {
}
} }
} }
} }

View File

@ -10,7 +10,6 @@ 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
@ -64,11 +63,7 @@ class ImportFragment : DialogFragment() {
@TargetApi(Build.VERSION_CODES.M) @TargetApi(Build.VERSION_CODES.M)
private fun requestPermissions() { private fun requestPermissions() {
if (SDK_INT <= 32) { requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 0)
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 {

View File

@ -153,8 +153,6 @@ 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)

View File

@ -7,16 +7,16 @@
*/ */
ext { ext {
kotlin_version = '1.8.21' kotlin_version = '1.4.10'
gradle_version = '8.0.2' gradle_version = '4.0.1'
compileSdkVersion = 33 compileSdkVersion = 30
buildToolsVersion = '33.0.0' buildToolsVersion = '30.0.2'
} }
// 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.8.21' ext.kotlin_version = '1.4.10'
ext.gradle_version = '7.4.2' ext.gradle_version = '4.0.1'
repositories { repositories {
jcenter() jcenter()

@ -1 +1 @@
Subproject commit 94df228f8bb8f8f50e26b3f4a3a9a53f0b83a4d2 Subproject commit 47bc6842daf9b93b28ae2ad8b65754dae2bc3ece

View File

@ -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-8.1.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

@ -1 +1 @@
Subproject commit ecd2ab875dc6807a051577670443defb83608904 Subproject commit b023c079b2a8cd2fe69360a835cf0d872b71cd53

@ -1 +1 @@
Subproject commit beb8ad2904bd1a46646dce0e707c54417858eaa2 Subproject commit e98a3a553511f66b9bbdb914f2d2c91176108aab