From ed98613b2d9c82d6dd36b705456043f078ea2712 Mon Sep 17 00:00:00 2001 From: Tobias Preuss Date: Wed, 19 Aug 2020 22:59:57 +0200 Subject: [PATCH 1/6] Use File extension functions to make code more concise. + This change replaces a few usages of ByteArrayInputStream, FileInputStream, FileOutputStream with their equivalent Kotlin extension functions. --- CHANGES.md | 2 +- .../sdk/internal/crypto/AttachmentEncryptionTest.kt | 3 +-- .../crypto/attachments/MXEncryptedAttachments.kt | 3 +-- .../android/sdk/internal/crypto/store/db/Helper.kt | 3 +-- .../sdk/internal/session/content/UploadContentWorker.kt | 9 +++------ .../internal/session/securestorage/SecretStoringUtils.kt | 2 +- .../org/matrix/android/sdk/internal/util/FileSaver.kt | 3 +-- .../im/vector/app/core/glide/VectorGlideModelLoader.kt | 3 +-- .../im/vector/app/core/utils/ExternalApplicationsUtil.kt | 4 ++-- .../features/notifications/NotificationDrawerManager.kt | 3 +-- 10 files changed, 13 insertions(+), 22 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d3a16c9b29..a9f2e896aa 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,7 +20,7 @@ Build 🧱: - Some dependencies have been upgraded (coroutine, recyclerView, appCompat, core-ktx, firebase-messaging) Other changes: - - + - Use File extension functions to make code more concise (#1996) Changes in Element 1.0.5 (2020-08-21) =================================================== diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/AttachmentEncryptionTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/AttachmentEncryptionTest.kt index 05dbc40e1e..cb24cbb242 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/AttachmentEncryptionTest.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/AttachmentEncryptionTest.kt @@ -29,7 +29,6 @@ import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.MethodSorters -import java.io.ByteArrayInputStream import java.io.InputStream /** @@ -46,7 +45,7 @@ class AttachmentEncryptionTest { val inputStream: InputStream inputStream = if (`in`.isEmpty()) { - ByteArrayInputStream(`in`) + `in`.inputStream() } else { val memoryFile = MemoryFile("file" + System.currentTimeMillis(), `in`.size) memoryFile.outputStream.write(`in`) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt index cec1480d7b..a6d95cc87a 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt @@ -21,7 +21,6 @@ import android.util.Base64 import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileKey import timber.log.Timber -import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.InputStream import java.security.MessageDigest @@ -179,7 +178,7 @@ internal object MXEncryptedAttachments { return null } - return ByteArrayInputStream(outputStream.toByteArray()) + return outputStream.toByteArray().inputStream() .also { Timber.v("Decrypt in ${System.currentTimeMillis() - t0}ms") } } catch (oom: OutOfMemoryError) { Timber.e(oom, "## decryptAttachment() failed: OOM") diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/Helper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/Helper.kt index 978c82303e..67e06b5455 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/Helper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/Helper.kt @@ -21,7 +21,6 @@ import android.util.Base64 import io.realm.Realm import io.realm.RealmConfiguration import io.realm.RealmObject -import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.ObjectOutputStream import java.util.zip.GZIPInputStream @@ -96,7 +95,7 @@ fun deserializeFromRealm(string: String?): T? { } val decodedB64 = Base64.decode(string.toByteArray(), Base64.DEFAULT) - val bais = ByteArrayInputStream(decodedB64) + val bais = decodedB64.inputStream() val gzis = GZIPInputStream(bais) val ois = SafeObjectInputStream(gzis) return ois.use { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt index 6d354cdcbe..720269404f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt @@ -42,10 +42,7 @@ import org.matrix.android.sdk.internal.worker.SessionWorkerParams import org.matrix.android.sdk.internal.worker.WorkerParamsFactory import org.matrix.android.sdk.internal.worker.getSessionComponent import timber.log.Timber -import java.io.ByteArrayInputStream import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream import java.util.UUID import javax.inject.Inject @@ -130,7 +127,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter val contentUploadResponse = if (params.isEncrypted) { Timber.v("Encrypt thumbnail") notifyTracker(params) { contentUploadStateTracker.setEncryptingThumbnail(it) } - val encryptionResult = MXEncryptedAttachments.encryptAttachment(ByteArrayInputStream(thumbnailData.bytes), thumbnailData.mimeType) + val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream(), thumbnailData.mimeType) uploadedThumbnailEncryptedFileInfo = encryptionResult.encryptedFileInfo fileUploader.uploadByteArray(encryptionResult.encryptedByteArray, "thumb_${attachment.name}", @@ -176,7 +173,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter cacheFile.createNewFile() cacheFile.deleteOnExit() - val outputStream = FileOutputStream(cacheFile) + val outputStream = cacheFile.outputStream() outputStream.use { inputStream.copyTo(outputStream) } @@ -203,7 +200,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter Timber.v("Encrypt file") notifyTracker(params) { contentUploadStateTracker.setEncrypting(it) } - val encryptionResult = MXEncryptedAttachments.encryptAttachment(FileInputStream(cacheFile), attachment.getSafeMimeType()) + val encryptionResult = MXEncryptedAttachments.encryptAttachment(cacheFile.inputStream(), attachment.getSafeMimeType()) uploadedFileEncryptedFileInfo = encryptionResult.encryptedFileInfo fileUploader diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtils.kt index 2ae115f325..8eab44366c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtils.kt @@ -219,7 +219,7 @@ internal class SecretStoringUtils @Inject constructor(private val context: Conte @RequiresApi(Build.VERSION_CODES.M) private fun decryptStringM(encryptedChunk: ByteArray, keyAlias: String): String { - val (iv, encryptedText) = formatMExtract(ByteArrayInputStream(encryptedChunk)) + val (iv, encryptedText) = formatMExtract(encryptedChunk.inputStream()) val secretKey = getOrGenerateSymmetricKeyForAliasM(keyAlias) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/FileSaver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/FileSaver.kt index 27625d90bc..da524cc1b2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/FileSaver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/FileSaver.kt @@ -19,7 +19,6 @@ package org.matrix.android.sdk.internal.util import androidx.annotation.WorkerThread import java.io.File -import java.io.FileOutputStream import java.io.InputStream /** @@ -27,7 +26,7 @@ import java.io.InputStream */ @WorkerThread fun writeToFile(inputStream: InputStream, outputFile: File) { - FileOutputStream(outputFile).use { + outputFile.outputStream().use { inputStream.copyTo(it) } } diff --git a/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt b/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt index 295609548f..9ac8a4d3bc 100644 --- a/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt +++ b/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt @@ -31,7 +31,6 @@ import okhttp3.OkHttpClient import okhttp3.Request import timber.log.Timber import java.io.File -import java.io.FileInputStream import java.io.IOException import java.io.InputStream @@ -97,7 +96,7 @@ class VectorGlideDataFetcher(private val activeSessionHolder: ActiveSessionHolde Timber.v("Load data: $data") if (data.isLocalFile() && data.url != null) { val initialFile = File(data.url) - callback.onDataReady(FileInputStream(initialFile)) + callback.onDataReady(initialFile.inputStream()) return } val contentUrlResolver = activeSessionHolder.getActiveSession().contentUrlResolver() diff --git a/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt b/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt index b314401138..b1c63a406a 100644 --- a/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt +++ b/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt @@ -518,8 +518,8 @@ fun saveFileIntoLegacy(sourceFile: File, dstDirPath: File, outputFilename: Strin var outputStream: FileOutputStream? = null try { dstFile.createNewFile() - inputStream = FileInputStream(sourceFile) - outputStream = FileOutputStream(dstFile) + inputStream = sourceFile.inputStream() + outputStream = dstFile.outputStream() val buffer = ByteArray(1024 * 10) var len: Int while (inputStream.read(buffer).also { len = it } != -1) { diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt index 98d35dc764..e689f9df3f 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt @@ -32,7 +32,6 @@ import org.matrix.android.sdk.api.session.content.ContentUrlResolver import me.gujun.android.span.span import timber.log.Timber import java.io.File -import java.io.FileInputStream import java.io.FileOutputStream import javax.inject.Inject import javax.inject.Singleton @@ -494,7 +493,7 @@ class NotificationDrawerManager @Inject constructor(private val context: Context try { val file = File(context.applicationContext.cacheDir, ROOMS_NOTIFICATIONS_FILE_NAME) if (file.exists()) { - FileInputStream(file).use { + file.inputStream().use { val events: ArrayList? = currentSession?.loadSecureSecret(it, KEY_ALIAS_SECRET_STORAGE) if (events != null) { return events.toMutableList() From 776d892d27a8e2583b03c912f1d58bb12c7a7cdc Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Wed, 26 Aug 2020 12:27:12 +0300 Subject: [PATCH 2/6] Increase version of uCrop library which supports Android 10. --- CHANGES.md | 1 + vector/build.gradle | 2 +- .../im/vector/app/features/media/BigImageViewerActivity.kt | 4 +--- .../im/vector/app/features/roomprofile/RoomProfileFragment.kt | 4 +--- .../app/features/settings/VectorSettingsGeneralFragment.kt | 3 +-- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d3a16c9b29..0ab511820a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Improvements 🙌: Bugfix 🐛: - Display name not shown under Settings/General (#1926) + - Change user or room avatar: when selecting Gallery, I'm not proposed to crop the selected image (#1590) Translations 🗣: - diff --git a/vector/build.gradle b/vector/build.gradle index c04de62367..ef2d6c3d9e 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -378,7 +378,7 @@ dependencies { implementation "com.github.bumptech.glide:glide:$glide_version" kapt "com.github.bumptech.glide:compiler:$glide_version" implementation 'com.danikula:videocache:2.7.1' - implementation 'com.github.yalantis:ucrop:2.2.4' + implementation 'com.github.yalantis:ucrop:2.2.6' // Badge for compatibility implementation 'me.leolin:ShortcutBadger:1.1.22@aar' diff --git a/vector/src/main/java/im/vector/app/features/media/BigImageViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/BigImageViewerActivity.kt index 9d0a931a32..c619b4aa92 100644 --- a/vector/src/main/java/im/vector/app/features/media/BigImageViewerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/media/BigImageViewerActivity.kt @@ -144,9 +144,7 @@ class BigImageViewerActivity : VectorBaseActivity() { .get(MultiPicker.IMAGE) .getSelectedFiles(this, requestCode, resultCode, data) .firstOrNull()?.let { - // TODO. UCrop library cannot read from Gallery. For now, we will set avatar as it is. - // onRoomAvatarSelected(it) - onAvatarCropped(it.contentUri) + onRoomAvatarSelected(it) } } UCrop.REQUEST_CROP -> data?.let { onAvatarCropped(UCrop.getOutput(it)) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index 2722d54950..075ba1bc10 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -301,9 +301,7 @@ class RoomProfileFragment @Inject constructor( .get(MultiPicker.IMAGE) .getSelectedFiles(requireContext(), requestCode, resultCode, data) .firstOrNull()?.let { - // TODO. UCrop library cannot read from Gallery. For now, we will set avatar as it is. - // onRoomAvatarSelected(it) - onAvatarCropped(it.contentUri) + onRoomAvatarSelected(it) } } UCrop.REQUEST_CROP -> data?.let { onAvatarCropped(UCrop.getOutput(it)) } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt index 31de5ddd67..e31b81b162 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsGeneralFragment.kt @@ -356,8 +356,7 @@ class VectorSettingsGeneralFragment : VectorSettingsBaseFragment() { .get(MultiPicker.IMAGE) .getSelectedFiles(requireContext(), requestCode, resultCode, data) .firstOrNull()?.let { - // TODO. UCrop library cannot read from Gallery. For now, we will set avatar as it is. - onAvatarCropped(it.contentUri) + onAvatarSelected(it) } } UCrop.REQUEST_CROP -> data?.let { onAvatarCropped(UCrop.getOutput(it)) } From d014872e3b06c024be4005ec161b81136f637529 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Aug 2020 11:57:27 +0200 Subject: [PATCH 3/6] Add long click gesture to copy userId, user display name, room name, room topic and room alias (#1774) --- CHANGES.md | 2 +- .../im/vector/app/core/extensions/TextView.kt | 17 +++++++++++++++++ .../RoomMemberProfileFragment.kt | 11 +++++++++-- .../roomprofile/RoomProfileFragment.kt | 18 +++++++++++++----- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a9f2e896aa..2135401efb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ Features ✨: - Improvements 🙌: - - + - Add long click gesture to copy userId, user display name, room name, room topic and room alias (#1774) Bugfix 🐛: - Display name not shown under Settings/General (#1926) diff --git a/vector/src/main/java/im/vector/app/core/extensions/TextView.kt b/vector/src/main/java/im/vector/app/core/extensions/TextView.kt index cafcf6d1d8..44b85df93a 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/TextView.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/TextView.kt @@ -24,7 +24,9 @@ import android.widget.TextView import androidx.annotation.AttrRes import androidx.annotation.StringRes import androidx.core.view.isVisible +import com.google.android.material.snackbar.Snackbar import im.vector.app.R +import im.vector.app.core.utils.copyToClipboard import im.vector.app.features.themes.ThemeUtils /** @@ -68,3 +70,18 @@ fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int, } } } + +/** + * Set long click listener to copy the current text of the TextView to the clipboard and show a Snackbar + */ +fun TextView.copyOnLongClick() { + setOnLongClickListener { view -> + (view as? TextView) + ?.text + ?.let { text -> + copyToClipboard(view.context, text, false) + Snackbar.make(view, view.resources.getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT).show() + } + true + } +} diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt index 9c6e813f0b..cda2d83e3d 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt @@ -35,6 +35,7 @@ import im.vector.app.core.animations.MatrixItemAppBarStateChangeListener import im.vector.app.core.dialogs.ConfirmationDialogBuilder import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith +import im.vector.app.core.extensions.copyOnLongClick import im.vector.app.core.extensions.exhaustive import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.platform.StateView @@ -44,11 +45,11 @@ import im.vector.app.features.crypto.verification.VerificationBottomSheet import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.roommemberprofile.devices.DeviceListBottomSheet import im.vector.app.features.roommemberprofile.powerlevel.EditPowerLevelDialogs -import org.matrix.android.sdk.api.session.room.powerlevels.Role -import org.matrix.android.sdk.api.util.MatrixItem import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_matrix_profile.* import kotlinx.android.synthetic.main.view_stub_room_member_profile_header.* +import org.matrix.android.sdk.api.session.room.powerlevels.Role +import org.matrix.android.sdk.api.util.MatrixItem import javax.inject.Inject @Parcelize @@ -110,6 +111,12 @@ class RoomMemberProfileFragment @Inject constructor( is RoomMemberProfileViewEvents.OnInviteActionSuccess -> Unit }.exhaustive } + setupLongClicks() + } + + private fun setupLongClicks() { + memberProfileNameView.copyOnLongClick() + memberProfileIdView.copyOnLongClick() } private fun handleShowPowerLevelDemoteWarning(event: RoomMemberProfileViewEvents.ShowPowerLevelDemoteWarning) { diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index 2722d54950..518932fdcb 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -34,16 +34,12 @@ import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.yalantis.ucrop.UCrop -import im.vector.lib.multipicker.MultiPicker -import im.vector.lib.multipicker.entity.MultiPickerImageType -import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState -import org.matrix.android.sdk.api.util.MatrixItem -import org.matrix.android.sdk.api.util.toMatrixItem import im.vector.app.R import im.vector.app.core.animations.AppBarStateChangeListener import im.vector.app.core.animations.MatrixItemAppBarStateChangeListener import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith +import im.vector.app.core.extensions.copyOnLongClick import im.vector.app.core.extensions.exhaustive import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.intent.getFilenameFromUri @@ -62,9 +58,14 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel import im.vector.app.features.media.BigImageViewerActivity import im.vector.app.features.media.createUCropWithDefaultSettings +import im.vector.lib.multipicker.MultiPicker +import im.vector.lib.multipicker.entity.MultiPickerImageType import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_matrix_profile.* import kotlinx.android.synthetic.main.view_stub_room_profile_header.* +import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState +import org.matrix.android.sdk.api.util.MatrixItem +import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber import java.io.File import javax.inject.Inject @@ -120,6 +121,13 @@ class RoomProfileFragment @Inject constructor( .observe() .subscribe { handleQuickActions(it) } .disposeOnDestroyView() + setupLongClicks() + } + + private fun setupLongClicks() { + roomProfileNameView.copyOnLongClick() + roomProfileAliasView.copyOnLongClick() + roomProfileTopicView.copyOnLongClick() } override fun onOptionsItemSelected(item: MenuItem): Boolean { From ef912e066bafabc909d17a10dcb6d0d18d3f6953 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Aug 2020 12:29:46 +0200 Subject: [PATCH 4/6] Remove unused resource --- .../disclaimer_top_banner_foreground.xml | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml diff --git a/vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml b/vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml deleted file mode 100644 index c031da1e5b..0000000000 --- a/vector/src/main/res/drawable/disclaimer_top_banner_foreground.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - From 9f3f981ab07fdf0813b860415949a459cc585a09 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Aug 2020 12:30:26 +0200 Subject: [PATCH 5/6] Use cached Views --- .../im/vector/app/core/preference/PushRulePreference.kt | 3 +-- .../app/core/preference/VectorEditTextPreference.kt | 2 +- .../im/vector/app/core/preference/VectorPreference.kt | 8 ++++---- .../app/core/preference/VectorPreferenceCategory.kt | 2 +- .../vector/app/core/preference/VectorSwitchPreference.kt | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt b/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt index 87584a9db0..9c4878ef06 100755 --- a/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt @@ -20,7 +20,6 @@ import android.content.Context import android.util.AttributeSet import android.view.View import android.widget.RadioGroup -import android.widget.TextView import androidx.preference.PreferenceViewHolder import im.vector.app.R import org.matrix.android.sdk.api.pushrules.RuleSetKey @@ -162,7 +161,7 @@ class PushRulePreference : VectorPreference { override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) - holder.itemView.findViewById(android.R.id.summary)?.visibility = View.GONE + holder.findViewById(android.R.id.summary)?.visibility = View.GONE holder.itemView.setOnClickListener(null) holder.itemView.setOnLongClickListener(null) diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorEditTextPreference.kt b/vector/src/main/java/im/vector/app/core/preference/VectorEditTextPreference.kt index 840e5fa510..348fcffc9b 100644 --- a/vector/src/main/java/im/vector/app/core/preference/VectorEditTextPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/VectorEditTextPreference.kt @@ -45,7 +45,7 @@ class VectorEditTextPreference : EditTextPreference { override fun onBindViewHolder(holder: PreferenceViewHolder) { // display the title in multi-line to avoid ellipsis. try { - holder.itemView.findViewById(android.R.id.title)?.isSingleLine = false + (holder.findViewById(android.R.id.title) as? TextView)?.isSingleLine = false } catch (e: Exception) { Timber.e(e, "onBindView") } diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt b/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt index 4a9bb6a6f5..dd887dba67 100755 --- a/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt @@ -84,15 +84,15 @@ open class VectorPreference : Preference { // display the title in multi-line to avoid ellipsis. try { - val title = itemView.findViewById(android.R.id.title) - val summary = itemView.findViewById(android.R.id.summary) + val title = holder.findViewById(android.R.id.title) as? TextView + val summary = holder.findViewById(android.R.id.summary) as? TextView if (title != null) { title.isSingleLine = false title.setTypeface(null, mTypeface) } - if (title !== summary) { - summary.setTypeface(null, mTypeface) + summary?.setTypeface(null, mTypeface) + } // cancel existing animation (find a way to resume if happens during anim?) diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorPreferenceCategory.kt b/vector/src/main/java/im/vector/app/core/preference/VectorPreferenceCategory.kt index e61cde8ebd..eb59da640d 100644 --- a/vector/src/main/java/im/vector/app/core/preference/VectorPreferenceCategory.kt +++ b/vector/src/main/java/im/vector/app/core/preference/VectorPreferenceCategory.kt @@ -45,7 +45,7 @@ class VectorPreferenceCategory : PreferenceCategory { override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) - val titleTextView = holder.itemView.findViewById(android.R.id.title) + val titleTextView = holder.findViewById(android.R.id.title) as? TextView titleTextView?.setTypeface(null, Typeface.BOLD) titleTextView?.setTextColor(ThemeUtils.getColor(context, R.attr.riotx_text_primary)) diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorSwitchPreference.kt b/vector/src/main/java/im/vector/app/core/preference/VectorSwitchPreference.kt index c97991bfcb..346e8488b9 100644 --- a/vector/src/main/java/im/vector/app/core/preference/VectorSwitchPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/VectorSwitchPreference.kt @@ -58,7 +58,7 @@ class VectorSwitchPreference : SwitchPreference { override fun onBindViewHolder(holder: PreferenceViewHolder) { // display the title in multi-line to avoid ellipsis. - holder.itemView.findViewById(android.R.id.title)?.isSingleLine = false + (holder.findViewById(android.R.id.title) as? TextView)?.isSingleLine = false // cancel existing animation (find a way to resume if happens during anim?) currentHighlightAnimator?.cancel() From 249f268fb52b949926a1dad4089b8d27547453bb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 26 Aug 2020 12:55:49 +0200 Subject: [PATCH 6/6] Fix bad color for settings icon on Android < 24 (#1786) --- CHANGES.md | 1 + .../app/core/preference/VectorPreference.kt | 17 +++++++++++++++++ .../settings/VectorSettingsRootFragment.kt | 13 ++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index a9f2e896aa..f7682028e1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Improvements 🙌: Bugfix 🐛: - Display name not shown under Settings/General (#1926) + - Fix bad color for settings icon on Android < 24 (#1786) Translations 🗣: - diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt b/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt index dd887dba67..a40ddef6ab 100755 --- a/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/VectorPreference.kt @@ -20,12 +20,15 @@ import android.animation.Animator import android.animation.ArgbEvaluator import android.animation.ValueAnimator import android.content.Context +import android.content.res.ColorStateList import android.graphics.Color import android.graphics.Typeface import android.util.AttributeSet import android.view.View +import android.widget.ImageView import android.widget.TextView import androidx.core.animation.doOnEnd +import androidx.core.widget.ImageViewCompat import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import im.vector.app.R @@ -76,6 +79,12 @@ open class VectorPreference : Preference { notifyChanged() } + var tintIcon = false + set(value) { + field = value + notifyChanged() + } + var currentHighlightAnimator: Animator? = null override fun onBindViewHolder(holder: PreferenceViewHolder) { @@ -93,6 +102,14 @@ open class VectorPreference : Preference { summary?.setTypeface(null, mTypeface) + if (tintIcon) { + // Tint icons (See #1786) + val icon = holder.findViewById(android.R.id.icon) as? ImageView + + icon?.let { + val color = ThemeUtils.getColor(context, R.attr.riotx_header_panel_text_secondary) + ImageViewCompat.setImageTintList(it, ColorStateList.valueOf(color)) + } } // cancel existing animation (find a way to resume if happens during anim?) diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsRootFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsRootFragment.kt index d2ec1a1543..3f3811ce76 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsRootFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsRootFragment.kt @@ -16,7 +16,9 @@ package im.vector.app.features.settings +import android.os.Build import im.vector.app.R +import im.vector.app.core.preference.VectorPreference import javax.inject.Inject class VectorSettingsRootFragment @Inject constructor() : VectorSettingsBaseFragment() { @@ -25,6 +27,15 @@ class VectorSettingsRootFragment @Inject constructor() : VectorSettingsBaseFragm override val preferenceXmlRes = R.xml.vector_settings_root override fun bindPref() { - // Nothing to do + // Tint icon on API < 24 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + tintIcons() + } + } + + private fun tintIcons() { + for (i in 0 until preferenceScreen.preferenceCount) { + (preferenceScreen.getPreference(i) as? VectorPreference)?.let { it.tintIcon = true } + } } }