From be9a91e3feeb2b804f9b0f680eb17c0fc8ef992b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Sun, 6 Sep 2020 00:58:00 +0200 Subject: [PATCH 1/2] Android 6: App crash when read Contact permission is granted (#2064) --- CHANGES.md | 1 + .../vector/app/core/platform/VectorBaseActivity.kt | 8 ++++++++ .../createdirect/CreateDirectRoomActivity.kt | 10 +++++++++- .../app/features/invite/InviteUsersToRoomActivity.kt | 12 ++++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b7cda86878..7eecb0ee3a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -26,6 +26,7 @@ Bugfix 🐛: - Login with Matrix-Id | Autodiscovery fails if identity server is invalid and Homeserver ok (#2027) - Support for image compression on Android 10 - Verification popup won't show + - Android 6: App crash when read Contact permission is granted (#2064) Translations 🗣: - The SDK is now using SAS string translations from [Weblate Matrix-doc project](https://translate.riot.im/projects/matrix-doc/) (#1909) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index bedb02949f..b9d8924be1 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -345,6 +345,14 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector { } } + protected var postResumeScheduledAction: Runnable? = null + + override fun onPostResume() { + super.onPostResume() + postResumeScheduledAction?.run() + postResumeScheduledAction = null + } + override fun onPause() { super.onPause() Timber.i("onPause Activity ${this.javaClass.simpleName}") diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt index 41260b06c8..d602b5f1f2 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt @@ -49,8 +49,10 @@ import im.vector.app.features.userdirectory.UserDirectorySharedAction import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel import im.vector.app.features.userdirectory.UserDirectoryViewModel import kotlinx.android.synthetic.main.activity.* +import org.matrix.android.sdk.api.extensions.tryThis import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure +import timber.log.Timber import java.net.HttpURLConnection import javax.inject.Inject @@ -113,7 +115,13 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { if (allGranted(grantResults)) { if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) { - addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) + try { + addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) + } catch (throwable: Throwable) { + Timber.w(throwable) + // Bug on API23 + postResumeScheduledAction = Runnable { tryThis { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) } } + } } } } diff --git a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt index 096579091f..94a0ac75be 100644 --- a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt @@ -45,9 +45,11 @@ import im.vector.app.features.userdirectory.UserDirectoryFragment import im.vector.app.features.userdirectory.UserDirectorySharedAction import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel import im.vector.app.features.userdirectory.UserDirectoryViewModel -import org.matrix.android.sdk.api.failure.Failure import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.activity.* +import org.matrix.android.sdk.api.extensions.tryThis +import org.matrix.android.sdk.api.failure.Failure +import timber.log.Timber import java.net.HttpURLConnection import javax.inject.Inject @@ -114,7 +116,13 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { if (allGranted(grantResults)) { if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) { - addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) + try { + addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) + } catch (throwable: Throwable) { + Timber.w(throwable) + // Bug on API23 + postResumeScheduledAction = Runnable { tryThis { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) } } + } } } } From 4654e3941798e1e35c85f4b96f5b914a7685191f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 7 Sep 2020 17:14:09 +0200 Subject: [PATCH 2/2] Update after Ganfra's review --- .../app/core/platform/VectorBaseActivity.kt | 21 ++++++++++++++++--- .../createdirect/CreateDirectRoomActivity.kt | 10 +-------- .../invite/InviteUsersToRoomActivity.kt | 10 +-------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index b9d8924be1..4835ce5af5 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -84,6 +84,7 @@ import im.vector.app.receivers.DebugReceiver import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable +import org.matrix.android.sdk.api.extensions.tryThis import org.matrix.android.sdk.api.failure.GlobalError import timber.log.Timber import kotlin.system.measureTimeMillis @@ -345,12 +346,26 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector { } } - protected var postResumeScheduledAction: Runnable? = null + private val postResumeScheduledActions = mutableListOf<() -> Unit>() + + /** + * Schedule action to be done in the next call of onPostResume() + * It fixes bug observed on Android 6 (API 23) + */ + protected fun doOnPostResume(action: () -> Unit) { + synchronized(postResumeScheduledActions) { + postResumeScheduledActions.add(action) + } + } override fun onPostResume() { super.onPostResume() - postResumeScheduledAction?.run() - postResumeScheduledAction = null + synchronized(postResumeScheduledActions) { + postResumeScheduledActions.forEach { + tryThis { it.invoke() } + } + postResumeScheduledActions.clear() + } } override fun onPause() { diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt index d602b5f1f2..27ca636142 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt @@ -49,10 +49,8 @@ import im.vector.app.features.userdirectory.UserDirectorySharedAction import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel import im.vector.app.features.userdirectory.UserDirectoryViewModel import kotlinx.android.synthetic.main.activity.* -import org.matrix.android.sdk.api.extensions.tryThis import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure -import timber.log.Timber import java.net.HttpURLConnection import javax.inject.Inject @@ -115,13 +113,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { if (allGranted(grantResults)) { if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) { - try { - addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) - } catch (throwable: Throwable) { - Timber.w(throwable) - // Bug on API23 - postResumeScheduledAction = Runnable { tryThis { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) } } - } + doOnPostResume { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) } } } } diff --git a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt index 94a0ac75be..b4f0aabea5 100644 --- a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt @@ -47,9 +47,7 @@ import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel import im.vector.app.features.userdirectory.UserDirectoryViewModel import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.activity.* -import org.matrix.android.sdk.api.extensions.tryThis import org.matrix.android.sdk.api.failure.Failure -import timber.log.Timber import java.net.HttpURLConnection import javax.inject.Inject @@ -116,13 +114,7 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { if (allGranted(grantResults)) { if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) { - try { - addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) - } catch (throwable: Throwable) { - Timber.w(throwable) - // Bug on API23 - postResumeScheduledAction = Runnable { tryThis { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) } } - } + doOnPostResume { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) } } } }