diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 77dffb43d2..34d7b40a88 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ ### Pull Request Checklist - + - [ ] Changes has been tested on an Android device or Android emulator with API 21 - [ ] UI change has been tested on both light and dark themes diff --git a/AUTHORS.md b/AUTHORS.md index 3d9dffbef5..a85beb2d6f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,4 +1,4 @@ -A full developer contributors list can be found [here](https://github.com/vector-im/riotX-android/graphs/contributors). +A full developer contributors list can be found [here](https://github.com/vector-im/element-android/graphs/contributors). # Core team: diff --git a/README.md b/README.md index 1ec425793f..457b18d775 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ [![Buildkite](https://badge.buildkite.com/657d3db27364448d69d54f66c690f7788bc6aa80a7628e37f3.svg?branch=develop)](https://buildkite.com/matrix-dot-org/riotx-android/builds?branch=develop) [![Weblate](https://translate.riot.im/widgets/element-android/-/svg-badge.svg)](https://translate.riot.im/engage/element-android/?utm_source=widget) [![Element Android Matrix room #element-android:matrix.org](https://img.shields.io/matrix/element-android:matrix.org.svg?label=%23element-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-android:matrix.org) -[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=vector.android.riotx&metric=alert_status)](https://sonarcloud.io/dashboard?id=vector.android.riotx) -[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=vector.android.riotx&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=vector.android.riotx) -[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=vector.android.riotx&metric=bugs)](https://sonarcloud.io/dashboard?id=vector.android.riotx) +[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=im.vector.app.android&metric=alert_status)](https://sonarcloud.io/dashboard?id=im.vector.app.android) +[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=im.vector.app.android&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=im.vector.app.android) +[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=im.vector.app.android&metric=bugs)](https://sonarcloud.io/dashboard?id=im.vector.app.android) # Element Android @@ -27,6 +27,6 @@ The team will work to add them on a regular basis. ## Contributing -Please refer to [CONTRIBUTING.md](https://github.com/vector-im/riotX-android/blob/develop/CONTRIBUTING.md) if you want to contribute on Matrix Android projects! +Please refer to [CONTRIBUTING.md](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md) if you want to contribute on Matrix Android projects! Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#element-android:matrix.org). diff --git a/build.gradle b/build.gradle index fdaef6a2f7..061dd73a40 100644 --- a/build.gradle +++ b/build.gradle @@ -81,15 +81,15 @@ apply plugin: 'org.sonarqube' sonarqube { properties { - property "sonar.projectName", "RiotX-Android" - property "sonar.projectKey", "vector.android.riotx" + property "sonar.projectName", "Element-Android" + property "sonar.projectKey", "im.vector.app.android" property "sonar.host.url", "https://sonarcloud.io" property "sonar.projectVersion", project(":vector").android.defaultConfig.versionName property "sonar.sourceEncoding", "UTF-8" - property "sonar.links.homepage", "https://github.com/vector-im/riotX-android/" + property "sonar.links.homepage", "https://github.com/vector-im/element-android/" property "sonar.links.ci", "https://buildkite.com/matrix-dot-org/riotx-android" - property "sonar.links.scm", "https://github.com/vector-im/riotX-android/" - property "sonar.links.issue", "https://github.com/vector-im/riotX-android/issues" + property "sonar.links.scm", "https://github.com/vector-im/element-android/" + property "sonar.links.issue", "https://github.com/vector-im/element-android/issues" property "sonar.organization", "new_vector_ltd_organization" property "sonar.login", project.hasProperty("SONAR_LOGIN") ? SONAR_LOGIN : "invalid" } @@ -100,11 +100,18 @@ project(":vector") { properties { property "sonar.sources", project(":vector").android.sourceSets.main.java.srcDirs // exclude source code from analyses separated by a colon (:) - // property "sonar.exclusions", "**/*.*" + // Exclude Java source + property "sonar.exclusions", "**/BugReporterMultipartBody.java" } } } +project(":diff-match-patch") { + sonarqube { + skipProject = true + } +} + //project(":matrix-sdk-android") { // sonarqube { // properties { diff --git a/vector/build.gradle b/vector/build.gradle index ef2d6c3d9e..e55ad31ef3 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -122,6 +122,9 @@ android { // Other branches (master, features, etc.) will have version code based on application version. versionCode project.getVersionCode() + // Required for sonar analysis + versionName "${versionMajor}.${versionMinor}.${versionPatch}-sonar" + buildConfigField "String", "GIT_REVISION", "\"${gitRevision()}\"" resValue "string", "git_revision", "\"${gitRevision()}\"" diff --git a/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt b/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt index 855333d96b..5590e19c10 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt +++ b/vector/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt @@ -68,7 +68,7 @@ class DebugMenuActivity : VectorBaseActivity() { } private fun renderQrCode(text: String) { - debug_qr_code.setData(text, true) + debug_qr_code.setData(text) } @OnClick(R.id.debug_test_text_view_link) diff --git a/vector/src/main/java/im/vector/app/core/ui/views/QrCodeImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/QrCodeImageView.kt index 11e319ab78..f4b371bc52 100644 --- a/vector/src/main/java/im/vector/app/core/ui/views/QrCodeImageView.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/QrCodeImageView.kt @@ -18,28 +18,23 @@ package im.vector.app.core.ui.views import android.content.Context import android.graphics.Color -import android.graphics.drawable.AnimationDrawable -import android.graphics.drawable.BitmapDrawable import android.util.AttributeSet import androidx.appcompat.widget.AppCompatImageView import im.vector.app.core.qrcode.toBitMatrix import im.vector.app.core.qrcode.toBitmap -import kotlin.random.Random class QrCodeImageView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : AppCompatImageView(context, attrs, defStyleAttr) { private var data: String? = null - private var animate = false init { setBackgroundColor(Color.WHITE) } - fun setData(data: String, animate: Boolean) { + fun setData(data: String) { this.data = data - this.animate = animate render() } @@ -53,47 +48,8 @@ class QrCodeImageView @JvmOverloads constructor( data ?.takeIf { height > 0 } ?.let { - if (animate) { - // NOT SUPPORTED YET val anim = createAnimation(it) - // NOT SUPPORTED YET setImageDrawable(anim) - // NOT SUPPORTED YET anim.start() - // NOT SUPPORTED YET setImageDrawable(BitmapDrawable(resources, it.toBitMatrix(height).toBitmap())) - val bitmap = it.toBitMatrix(height).toBitmap() - post { setImageBitmap(bitmap) } - } else { - val bitmap = it.toBitMatrix(height).toBitmap() - post { setImageBitmap(bitmap) } - } + val bitmap = it.toBitMatrix(height).toBitmap() + post { setImageBitmap(bitmap) } } } - - private fun createAnimation(data: String): AnimationDrawable { - val finalQr = data.toBitMatrix(height) - - val list = mutableListOf(finalQr) - - val random = Random(System.currentTimeMillis()) - val repeatTime = 8 - repeat(repeatTime) { index -> - val alteredQr = finalQr.clone() - for (x in 0 until alteredQr.width) { - for (y in 0 until alteredQr.height) { - if (random.nextInt(repeatTime - index) == 0) { - // Pb is that it does not toggle a whole black square, but only a pixel - alteredQr.unset(x, y) - } - } - } - list.add(alteredQr) - } - - val animDrawable = AnimationDrawable() - - list.asReversed() - .forEach { - animDrawable.addFrame(BitmapDrawable(resources, it.toBitmap()), 150) - } - - return animDrawable - } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt index 953b20cb0c..0406a63bc6 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/choose/VerificationChooseMethodController.kt @@ -53,7 +53,6 @@ class VerificationChooseMethodController @Inject constructor( bottomSheetVerificationQrCodeItem { id("qr") data(state.qrCodeText) - animate(false) } dividerItem { diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationQrCodeItem.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationQrCodeItem.kt index 8d78c1c9d6..41c92fa76f 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationQrCodeItem.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/epoxy/BottomSheetVerificationQrCodeItem.kt @@ -32,12 +32,9 @@ abstract class BottomSheetVerificationQrCodeItem : VectorEpoxyModel(VectorPreferences.SETTINGS_LABS_ALLOW_EXTENDED_LOGS)?.let { - it.isChecked = vectorPreferences.labAllowedExtendedLogging() - } - - findPreference(VectorPreferences.SETTINGS_LABS_UNREAD_NOTIFICATIONS_AS_TAB)?.let { - it.isChecked = vectorPreferences.labAddNotificationTab() - } - -// val useCryptoPref = findPreference(VectorPreferences.SETTINGS_ROOM_SETTINGS_LABS_END_TO_END_PREFERENCE_KEY) as SwitchPreference -// val cryptoIsEnabledPref = findPreference(VectorPreferences.SETTINGS_ROOM_SETTINGS_LABS_END_TO_END_IS_ACTIVE_PREFERENCE_KEY) - - if (session.cryptoService().isCryptoEnabled()) { -// mLabsCategory.removePreference(useCryptoPref) -// -// cryptoIsEnabledPref.isEnabled = false - } else { -// mLabsCategory.removePreference(cryptoIsEnabledPref) -// -// useCryptoPref.isChecked = false -// -// useCryptoPref.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValueAsVoid -> -// if (TextUtils.isEmpty(mSession.sessionParams.deviceId)) { -// activity?.let { activity -> -// AlertDialog.Builder(activity) -// .setMessage(R.string.room_settings_labs_end_to_end_warnings) -// .setPositiveButton(R.string.logout) { _, _ -> -// notImplemented() -// // TODO CommonActivityUtils.logout(activity) -// } -// .setNegativeButton(R.string.cancel) { _, _ -> -// useCryptoPref.isChecked = false -// } -// .setOnCancelListener { -// useCryptoPref.isChecked = false -// } -// .show() -// } -// } else { -// val newValue = newValueAsVoid as Boolean -// -// if (mSession.isCryptoEnabled() != newValue) { -// notImplemented() -// /* TODO -// displayLoadingView() -// -// session.enableCrypto(newValue, object : MatrixCallback { -// private fun refresh() { -// activity?.runOnUiThread { -// hideLoadingView() -// useCryptoPref.isChecked = session.isCryptoEnabled -// -// if (session.isCryptoEnabled) { -// mLabsCategory.removePreference(useCryptoPref) -// mLabsCategory.addPreference(cryptoIsEnabledPref) -// } -// } -// } -// -// override fun onSuccess(info: Void?) { -// useCryptoPref.isEnabled = false -// refresh() -// } -// -// override fun onNetworkError(e: Exception) { -// useCryptoPref.isChecked = false -// } -// -// override fun onMatrixError(e: MatrixError) { -// useCryptoPref.isChecked = false -// } -// -// override fun onUnexpectedError(e: Exception) { -// useCryptoPref.isChecked = false -// } -// }) -// */ -// } -// } -// -// true -// } - } - - // SaveMode Management -// findPreference(VectorPreferences.SETTINGS_DATA_SAVE_MODE_PREFERENCE_KEY) -// .onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> -// notImplemented() -// /* TODO -// val sessions = Matrix.getMXSessions(activity) -// for (session in sessions) { -// session.setUseDataSaveMode(newValue as Boolean) -// } -// */ -// -// true -// } + // Nothing to do } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt index b33a0cb5d8..bc72f812ff 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt @@ -48,7 +48,8 @@ class VectorSettingsDevicesFragment @Inject constructor( ) : VectorBaseFragment(), DevicesController.Callback { // used to avoid requesting to enter the password for each deletion - private var mAccountPassword: String = "" + // Note: Sonar does not like to use password for member name. + private var mAccountPass: String = "" override fun getLayoutResId() = R.layout.fragment_generic_recycler @@ -91,7 +92,7 @@ class VectorSettingsDevicesFragment @Inject constructor( super.showFailure(throwable) // Password is maybe not good, for safety measure, reset it here - mAccountPassword = "" + mAccountPass = "" } override fun onDestroyView() { @@ -153,12 +154,12 @@ class VectorSettingsDevicesFragment @Inject constructor( * Show a dialog to ask for user password, or use a previously entered password. */ private fun maybeShowDeleteDeviceWithPasswordDialog() { - if (mAccountPassword.isNotEmpty()) { - viewModel.handle(DevicesAction.Password(mAccountPassword)) + if (mAccountPass.isNotEmpty()) { + viewModel.handle(DevicesAction.Password(mAccountPass)) } else { PromptPasswordDialog().show(requireActivity()) { password -> - mAccountPassword = password - viewModel.handle(DevicesAction.Password(mAccountPassword)) + mAccountPass = password + viewModel.handle(DevicesAction.Password(mAccountPass)) } } }