mirror of
https://github.com/element-hq/element-android
synced 2024-11-24 10:25:35 +03:00
Merge branch 'develop' into feature/fga/account_data_rework
This commit is contained in:
commit
dfcffb9464
686 changed files with 3538 additions and 3646 deletions
|
@ -37,6 +37,7 @@
|
|||
<w>threepid</w>
|
||||
<w>unpublish</w>
|
||||
<w>unwedging</w>
|
||||
<w>vctr</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
|
@ -44,6 +44,9 @@ Other changes:
|
|||
- Add documentation on LoginWizard and RegistrationWizard (#3303)
|
||||
- Setup towncrier tool (#3293)
|
||||
|
||||
Security:
|
||||
- Element Android shares name of E2EE files with homeserver (#3387)
|
||||
|
||||
Changes in Element 1.1.7 (2021-05-12)
|
||||
===================================================
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ To install the template (to be done only once):
|
|||
|
||||
To create a new screen:
|
||||
- First create a new package in your code.
|
||||
- Then right click on the package, and select `New/New Vector/RiotX Feature`.
|
||||
- Then right click on the package, and select `New/New Vector/Element Feature`.
|
||||
- Follow the Wizard, especially replace `Main` by something more relevant to your feature.
|
||||
- Click on `Finish`.
|
||||
- Remaining steps are described as TODO in the generated files, or will be pointed out by the compiler, or at runtime :)
|
||||
|
|
|
@ -55,7 +55,7 @@ dependencies {
|
|||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
implementation 'androidx.core:core-ktx:1.5.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.3.0'
|
||||
implementation "androidx.recyclerview:recyclerview:1.2.0"
|
||||
implementation "androidx.recyclerview:recyclerview:1.2.1"
|
||||
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
}
|
85
docs/color_migration_guide.md
Normal file
85
docs/color_migration_guide.md
Normal file
|
@ -0,0 +1,85 @@
|
|||
# Color migration
|
||||
|
||||
### Changes
|
||||
|
||||
- use colors defined in https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=557%3A0
|
||||
- remove unused resources and code (ex: PercentView)
|
||||
- split some resource files into smaller file
|
||||
- rework the theme files
|
||||
- ensure material theme is used everywhere in the theme and in the layout
|
||||
- add default style for some views in the theme (ex: Toolbar, etc.)
|
||||
- add some debug screen in the debug menu, to test the themes and the button style
|
||||
- rework the button style to use `materialThemeOverlay` attribute
|
||||
- custom tint icon for menu management has been removed
|
||||
- comment with `riotx` has been updated
|
||||
|
||||
### Main change for developers
|
||||
|
||||
- Read migration guide: https://github.com/vector-im/element-android/pull/3459/files#diff-f0e52729d5e4f6eccbcf72246807aa34ed19c4ef5625ca669df998cd1022874b
|
||||
- Use MaterialAlertDialogBuilder instead of AlertDialog.Builder
|
||||
- some Epoxy Item included a divider. This has been removed. Use a `dividerItem` or `bottomSheetDividerItem` Epoxy items to add a divider
|
||||
- RecyclerView.configureWith now take a divider drawable instead of a divider color
|
||||
|
||||
### Remaining work
|
||||
|
||||
- Cleanup some vector drawables and ensure a tint is always used instead of hard coded color.
|
||||
|
||||
### Migration guide
|
||||
|
||||
Some colors and color attribute has been removed, here is the list and what has to be used now.
|
||||
|
||||
It can help Element Android forks maintainers to migrate their code.
|
||||
|
||||
- riotx_text_primary -> ?vctr_content_primary
|
||||
- riotx_text_secondary -> ?vctr_content_secondary
|
||||
- riotx_text_tertiary -> ?vctr_content_tertiary
|
||||
|
||||
- ?riotx_background -> ?android:colorBackground
|
||||
- riotx_background_light -> element_background_light
|
||||
- riotx_background_dark -> element_background_dark
|
||||
- riotx_background_black -> element_background_black
|
||||
|
||||
- riotx_accent -> ?colorPrimary
|
||||
- riotx_positive_accent -> ?colorPrimary
|
||||
- riotx_accent_alpha25 -> color_primary_alpha25
|
||||
- riotx_notice -> ?colorError
|
||||
- riotx_destructive_accent -> ?colorError
|
||||
- vector_error_color -> ?colorError
|
||||
- vector_warning_color -> ?colorError
|
||||
|
||||
- riotx_bottom_sheet_background -> ?colorSurface
|
||||
- riotx_alerter_background -> ?colorSurface
|
||||
|
||||
- riotx_username_1 -> element_name_01
|
||||
- riotx_username_2 -> element_name_02
|
||||
- riotx_username_3 -> element_name_03
|
||||
- riotx_username_4 -> element_name_04
|
||||
- riotx_username_5 -> element_name_05
|
||||
- riotx_username_6 -> element_name_06
|
||||
- riotx_username_7 -> element_name_07
|
||||
- riotx_username_8 -> element_name_08
|
||||
|
||||
- riotx_avatar_fill_1 -> element_room_01
|
||||
- riotx_avatar_fill_2 -> element_room_02
|
||||
- riotx_avatar_fill_3 -> element_room_03
|
||||
|
||||
- white -> @android:color/white
|
||||
- black -> @android:color/black or emoji_color
|
||||
|
||||
- riotx_list_header_background_color -> ?vctr_header_background
|
||||
- riotx_header_panel_background -> ?vctr_header_background
|
||||
- riotx_list_bottom_sheet_divider_color -> ?vctr_list_separator_on_surface
|
||||
- riotx_list_divider_color -> ?vctr_list_separator
|
||||
- list_divider_color -> ?vctr_list_separator
|
||||
- riotx_header_panel_border_mobile -> ?vctr_list_separator
|
||||
- riotx_bottom_nav_background_border_color -> ?vctr_list_separator
|
||||
- riotx_header_panel_text_secondary -> ?vctr_content_primary
|
||||
|
||||
- link_color_light -> element_link_light
|
||||
- link_color_dark -> element_link_dark
|
||||
|
||||
- riotx_toolbar_primary_text_color -> vctr_content_primary
|
||||
- riotx_toolbar_secondary_text_color -> vctr_content_primary
|
||||
- riot_primary_text_color -> vctr_content_primary
|
||||
|
||||
- riotx_android_secondary -> vctr_content_secondary
|
|
@ -42,7 +42,6 @@ import org.matrix.android.sdk.internal.crypto.model.event.RoomKeyWithHeldContent
|
|||
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.DevicesListResponse
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody
|
||||
import kotlin.jvm.Throws
|
||||
|
||||
interface CryptoService {
|
||||
|
||||
|
@ -82,9 +81,11 @@ interface CryptoService {
|
|||
|
||||
fun getDeviceTrackingStatus(userId: String): Int
|
||||
|
||||
fun importRoomKeys(roomKeysAsArray: ByteArray, password: String, progressListener: ProgressListener?, callback: MatrixCallback<ImportRoomKeysResult>)
|
||||
suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
|
||||
password: String,
|
||||
progressListener: ProgressListener?): ImportRoomKeysResult
|
||||
|
||||
fun exportRoomKeys(password: String, callback: MatrixCallback<ByteArray>)
|
||||
suspend fun exportRoomKeys(password: String): ByteArray
|
||||
|
||||
fun setRoomBlacklistUnverifiedDevices(roomId: String)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ interface IdentityService {
|
|||
/**
|
||||
* Check if the identity server is valid
|
||||
* See https://matrix.org/docs/spec/identity_service/latest#status-check
|
||||
* RiotX SDK only supports identity server API v2
|
||||
* Matrix Android SDK2 only supports identity server API v2
|
||||
*/
|
||||
suspend fun isValidIdentityServer(url: String)
|
||||
|
||||
|
|
|
@ -388,7 +388,7 @@ internal class DefaultCryptoService @Inject constructor(
|
|||
cryptoStore.close()
|
||||
}
|
||||
|
||||
// Aways enabled on RiotX
|
||||
// Always enabled on Matrix Android SDK2
|
||||
override fun isCryptoEnabled() = true
|
||||
|
||||
/**
|
||||
|
@ -928,14 +928,10 @@ internal class DefaultCryptoService @Inject constructor(
|
|||
* Export the crypto keys
|
||||
*
|
||||
* @param password the password
|
||||
* @param callback the exported keys
|
||||
* @return the exported keys
|
||||
*/
|
||||
override fun exportRoomKeys(password: String, callback: MatrixCallback<ByteArray>) {
|
||||
cryptoCoroutineScope.launch(coroutineDispatchers.main) {
|
||||
runCatching {
|
||||
exportRoomKeys(password, MXMegolmExportEncryption.DEFAULT_ITERATION_COUNT)
|
||||
}.foldToCallback(callback)
|
||||
}
|
||||
override suspend fun exportRoomKeys(password: String): ByteArray {
|
||||
return exportRoomKeys(password, MXMegolmExportEncryption.DEFAULT_ITERATION_COUNT)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -963,42 +959,37 @@ internal class DefaultCryptoService @Inject constructor(
|
|||
* @param roomKeysAsArray the room keys as array.
|
||||
* @param password the password
|
||||
* @param progressListener the progress listener
|
||||
* @param callback the asynchronous callback.
|
||||
* @return the result ImportRoomKeysResult
|
||||
*/
|
||||
override fun importRoomKeys(roomKeysAsArray: ByteArray,
|
||||
password: String,
|
||||
progressListener: ProgressListener?,
|
||||
callback: MatrixCallback<ImportRoomKeysResult>) {
|
||||
cryptoCoroutineScope.launch(coroutineDispatchers.main) {
|
||||
runCatching {
|
||||
withContext(coroutineDispatchers.crypto) {
|
||||
Timber.v("## CRYPTO | importRoomKeys starts")
|
||||
override suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
|
||||
password: String,
|
||||
progressListener: ProgressListener?): ImportRoomKeysResult {
|
||||
return withContext(coroutineDispatchers.crypto) {
|
||||
Timber.v("## CRYPTO | importRoomKeys starts")
|
||||
|
||||
val t0 = System.currentTimeMillis()
|
||||
val roomKeys = MXMegolmExportEncryption.decryptMegolmKeyFile(roomKeysAsArray, password)
|
||||
val t1 = System.currentTimeMillis()
|
||||
val t0 = System.currentTimeMillis()
|
||||
val roomKeys = MXMegolmExportEncryption.decryptMegolmKeyFile(roomKeysAsArray, password)
|
||||
val t1 = System.currentTimeMillis()
|
||||
|
||||
Timber.v("## CRYPTO | importRoomKeys : decryptMegolmKeyFile done in ${t1 - t0} ms")
|
||||
Timber.v("## CRYPTO | importRoomKeys : decryptMegolmKeyFile done in ${t1 - t0} ms")
|
||||
|
||||
val importedSessions = MoshiProvider.providesMoshi()
|
||||
.adapter<List<MegolmSessionData>>(Types.newParameterizedType(List::class.java, MegolmSessionData::class.java))
|
||||
.fromJson(roomKeys)
|
||||
val importedSessions = MoshiProvider.providesMoshi()
|
||||
.adapter<List<MegolmSessionData>>(Types.newParameterizedType(List::class.java, MegolmSessionData::class.java))
|
||||
.fromJson(roomKeys)
|
||||
|
||||
val t2 = System.currentTimeMillis()
|
||||
val t2 = System.currentTimeMillis()
|
||||
|
||||
Timber.v("## CRYPTO | importRoomKeys : JSON parsing ${t2 - t1} ms")
|
||||
Timber.v("## CRYPTO | importRoomKeys : JSON parsing ${t2 - t1} ms")
|
||||
|
||||
if (importedSessions == null) {
|
||||
throw Exception("Error")
|
||||
}
|
||||
if (importedSessions == null) {
|
||||
throw Exception("Error")
|
||||
}
|
||||
|
||||
megolmSessionDataImporter.handle(
|
||||
megolmSessionsData = importedSessions,
|
||||
fromBackup = false,
|
||||
progressListener = progressListener
|
||||
)
|
||||
}
|
||||
}.foldToCallback(callback)
|
||||
megolmSessionDataImporter.handle(
|
||||
megolmSessionsData = importedSessions,
|
||||
fromBackup = false,
|
||||
progressListener = progressListener
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ internal class MXMegolmDecryption(private val userId: String,
|
|||
withHeldInfo.code?.value ?: "",
|
||||
withHeldInfo.reason)
|
||||
} else {
|
||||
// This is un-used in riotX SDK, not sure if needed
|
||||
// This is un-used in Matrix Android SDK2, not sure if needed
|
||||
// addEventToPendingList(event, timeline)
|
||||
if (requestKeysOnFail) {
|
||||
requestKeysForEvent(event, false)
|
||||
|
|
|
@ -153,7 +153,7 @@ internal class DefaultLegacySessionImporter @Inject constructor(
|
|||
}
|
||||
|
||||
private fun importCryptoDb(legacyConfig: LegacyHomeServerConnectionConfig) {
|
||||
// Here we migrate the DB, we copy the crypto DB to the location specific to RiotX, and we encrypt it.
|
||||
// Here we migrate the DB, we copy the crypto DB to the location specific to Matrix SDK2, and we encrypt it.
|
||||
val userMd5 = legacyConfig.credentials.userId.md5()
|
||||
|
||||
val sessionId = legacyConfig.credentials.let { (if (it.deviceId.isNullOrBlank()) it.userId else "${it.userId}|${it.deviceId}").md5() }
|
||||
|
@ -177,12 +177,12 @@ internal class DefaultLegacySessionImporter @Inject constructor(
|
|||
|
||||
Timber.d("Migration: copy DB to encrypted DB")
|
||||
Realm.getInstance(realmConfiguration).use {
|
||||
// Move the DB to the new location, handled by RiotX
|
||||
// Move the DB to the new location, handled by Matrix SDK2
|
||||
it.writeEncryptedCopyTo(File(newLocation, realmConfiguration.realmFileName), realmKeysUtils.getRealmEncryptionKey(keyAlias))
|
||||
}
|
||||
}
|
||||
|
||||
// Delete all the files created by Riot Android which will not be used anymore by RiotX
|
||||
// Delete all the files created by Riot Android which will not be used anymore by Element
|
||||
private fun clearFileSystem(legacyConfig: LegacyHomeServerConnectionConfig) {
|
||||
val cryptoFolder = legacyConfig.credentials.userId.md5()
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ internal class UserAgentHolder @Inject constructor(private val context: Context,
|
|||
|
||||
/**
|
||||
* Create an user agent with the application version.
|
||||
* Ex: RiotX/1.0.0 (Linux; U; Android 6.0.1; SM-A510F Build/MMB29; Flavour GPlay; MatrixAndroidSDK_X 1.0)
|
||||
* Ex: Element/1.0.0 (Linux; U; Android 6.0.1; SM-A510F Build/MMB29; Flavour GPlay; MatrixAndroidSDK_X 1.0)
|
||||
*
|
||||
* @param flavorDescription the flavor description
|
||||
*/
|
||||
|
|
|
@ -24,7 +24,6 @@ import io.realm.RealmQuery
|
|||
import io.realm.RealmResults
|
||||
import io.realm.Sort
|
||||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import org.matrix.android.sdk.api.NoOpMatrixCallback
|
||||
import org.matrix.android.sdk.api.extensions.orFalse
|
||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||
|
@ -168,9 +167,7 @@ internal class DefaultTimeline(
|
|||
timelineEvents.addChangeListener(eventsChangeListener)
|
||||
handleInitialLoad()
|
||||
loadRoomMembersTask
|
||||
.configureWith(LoadRoomMembersTask.Params(roomId)) {
|
||||
this.callback = NoOpMatrixCallback()
|
||||
}
|
||||
.configureWith(LoadRoomMembersTask.Params(roomId))
|
||||
.executeBy(taskExecutor)
|
||||
|
||||
// Ensure ReadReceipt from init sync are loaded
|
||||
|
|
|
@ -18,13 +18,13 @@ package org.matrix.android.sdk.internal.session.room.typing
|
|||
|
||||
import android.os.SystemClock
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedInject
|
||||
import dagger.assisted.AssistedFactory
|
||||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import dagger.assisted.AssistedInject
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import org.matrix.android.sdk.api.session.room.typing.TypingService
|
||||
import org.matrix.android.sdk.api.util.Cancelable
|
||||
import org.matrix.android.sdk.internal.task.TaskExecutor
|
||||
import org.matrix.android.sdk.internal.task.configureWith
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
|
@ -35,7 +35,6 @@ import timber.log.Timber
|
|||
*/
|
||||
internal class DefaultTypingService @AssistedInject constructor(
|
||||
@Assisted private val roomId: String,
|
||||
private val taskExecutor: TaskExecutor,
|
||||
private val sendTypingTask: SendTypingTask
|
||||
) : TypingService {
|
||||
|
||||
|
@ -44,8 +43,8 @@ internal class DefaultTypingService @AssistedInject constructor(
|
|||
fun create(roomId: String): DefaultTypingService
|
||||
}
|
||||
|
||||
private var currentTask: Cancelable? = null
|
||||
private var currentAutoStopTask: Cancelable? = null
|
||||
private val coroutineScope = CoroutineScope(Job())
|
||||
private var currentTask: Job? = null
|
||||
|
||||
// What the homeserver knows
|
||||
private var userIsTyping = false
|
||||
|
@ -53,26 +52,24 @@ internal class DefaultTypingService @AssistedInject constructor(
|
|||
// Last time the user is typing event has been sent
|
||||
private var lastRequestTimestamp: Long = 0
|
||||
|
||||
/**
|
||||
* Notify to the server that the user is typing and schedule the auto typing off
|
||||
*/
|
||||
override fun userIsTyping() {
|
||||
scheduleAutoStop()
|
||||
|
||||
val now = SystemClock.elapsedRealtime()
|
||||
|
||||
if (userIsTyping && now < lastRequestTimestamp + MIN_DELAY_BETWEEN_TWO_USER_IS_TYPING_REQUESTS_MILLIS) {
|
||||
Timber.d("Typing: Skip start request")
|
||||
return
|
||||
}
|
||||
|
||||
Timber.d("Typing: Send start request")
|
||||
userIsTyping = true
|
||||
lastRequestTimestamp = now
|
||||
|
||||
currentTask?.cancel()
|
||||
|
||||
val params = SendTypingTask.Params(roomId, true)
|
||||
currentTask = sendTypingTask
|
||||
.configureWith(params)
|
||||
.executeBy(taskExecutor)
|
||||
currentTask = coroutineScope.launch {
|
||||
if (userIsTyping && now < lastRequestTimestamp + MIN_DELAY_BETWEEN_TWO_USER_IS_TYPING_REQUESTS_MILLIS) {
|
||||
Timber.d("Typing: Skip start request")
|
||||
} else {
|
||||
Timber.d("Typing: Send start request")
|
||||
lastRequestTimestamp = now
|
||||
sendRequest(true)
|
||||
}
|
||||
delay(MIN_DELAY_TO_SEND_STOP_TYPING_REQUEST_WHEN_NO_USER_ACTIVITY_MILLIS)
|
||||
Timber.d("Typing: auto stop")
|
||||
sendRequest(false)
|
||||
}
|
||||
}
|
||||
|
||||
override fun userStopsTyping() {
|
||||
|
@ -82,35 +79,22 @@ internal class DefaultTypingService @AssistedInject constructor(
|
|||
}
|
||||
|
||||
Timber.d("Typing: Send stop request")
|
||||
userIsTyping = false
|
||||
lastRequestTimestamp = 0
|
||||
|
||||
currentAutoStopTask?.cancel()
|
||||
currentTask?.cancel()
|
||||
|
||||
val params = SendTypingTask.Params(roomId, false)
|
||||
currentTask = sendTypingTask
|
||||
.configureWith(params)
|
||||
.executeBy(taskExecutor)
|
||||
currentTask = coroutineScope.launch {
|
||||
sendRequest(false)
|
||||
}
|
||||
}
|
||||
|
||||
private fun scheduleAutoStop() {
|
||||
Timber.d("Typing: Schedule auto stop")
|
||||
currentAutoStopTask?.cancel()
|
||||
|
||||
val params = SendTypingTask.Params(
|
||||
roomId,
|
||||
false,
|
||||
delay = MIN_DELAY_TO_SEND_STOP_TYPING_REQUEST_WHEN_NO_USER_ACTIVITY_MILLIS)
|
||||
currentAutoStopTask = sendTypingTask
|
||||
.configureWith(params) {
|
||||
callback = object : MatrixCallback<Unit> {
|
||||
override fun onSuccess(data: Unit) {
|
||||
userIsTyping = false
|
||||
}
|
||||
}
|
||||
}
|
||||
.executeBy(taskExecutor)
|
||||
private suspend fun sendRequest(isTyping: Boolean) {
|
||||
try {
|
||||
sendTypingTask.execute(SendTypingTask.Params(roomId, isTyping))
|
||||
userIsTyping = isTyping
|
||||
} catch (failure: Throwable) {
|
||||
// Ignore network error, etc...
|
||||
Timber.w(failure, "Unable to send typing request")
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
|
|
@ -17,11 +17,10 @@
|
|||
package org.matrix.android.sdk.internal.session.room.typing
|
||||
|
||||
import org.matrix.android.sdk.internal.di.UserId
|
||||
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
|
||||
import org.matrix.android.sdk.internal.network.executeRequest
|
||||
import org.matrix.android.sdk.internal.session.room.RoomAPI
|
||||
import org.matrix.android.sdk.internal.task.Task
|
||||
import kotlinx.coroutines.delay
|
||||
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
|
||||
import javax.inject.Inject
|
||||
|
||||
internal interface SendTypingTask : Task<SendTypingTask.Params, Unit> {
|
||||
|
@ -29,9 +28,7 @@ internal interface SendTypingTask : Task<SendTypingTask.Params, Unit> {
|
|||
data class Params(
|
||||
val roomId: String,
|
||||
val isTyping: Boolean,
|
||||
val typingTimeoutMillis: Int? = 30_000,
|
||||
// Optional delay before sending the request to the homeserver
|
||||
val delay: Long? = null
|
||||
val typingTimeoutMillis: Int? = 30_000
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -42,8 +39,6 @@ internal class DefaultSendTypingTask @Inject constructor(
|
|||
) : SendTypingTask {
|
||||
|
||||
override suspend fun execute(params: SendTypingTask.Params) {
|
||||
delay(params.delay ?: -1)
|
||||
|
||||
executeRequest(globalErrorReceiver) {
|
||||
roomAPI.sendTypingState(
|
||||
params.roomId,
|
||||
|
|
1
newsfragment/2449.feature
Normal file
1
newsfragment/2449.feature
Normal file
|
@ -0,0 +1 @@
|
|||
Migrate DefaultTypingService, KeysImporter and KeysExporter to coroutines
|
1
newsfragment/3182.feature
Normal file
1
newsfragment/3182.feature
Normal file
|
@ -0,0 +1 @@
|
|||
Update Message Composer design
|
2
newsfragment/3459.feature
Normal file
2
newsfragment/3459.feature
Normal file
|
@ -0,0 +1,2 @@
|
|||
Migrate to new colors and cleanup the style and theme
|
||||
Ref: https://material.io/blog/migrate-android-material-components
|
|
@ -136,8 +136,9 @@ android\.R\.id\.home===2
|
|||
### Kotlin conversion tools introduce this, but is can be replace by trim()
|
||||
trim \{ it \<\= \' \' \}
|
||||
|
||||
### Use AlertDialog form v7 compat lib
|
||||
### Use MaterialAlertDialogBuilder
|
||||
android\.app\.AlertDialog
|
||||
androidx\.appcompat\.app\.AlertDialog===4
|
||||
|
||||
### Put the operator at the beginning of next line
|
||||
&&$
|
||||
|
|
|
@ -84,3 +84,22 @@ layout_constraintLeft_
|
|||
|
||||
### Use androidx.recyclerview.widget.RecyclerView because EpoxyRecyclerViews add behavior we do not want to
|
||||
<com\.airbnb\.epoxy\.EpoxyRecyclerView
|
||||
|
||||
### Use Button instead of MaterialButton, the inflater will automatically inflate MaterialButton.
|
||||
<com\.google\.android\.material\.button\.MaterialButton
|
||||
<androidx\.appcompat\.widget\.AppCompatButton
|
||||
|
||||
### Use CheckBox instead of MaterialCheckBox, the inflater will automatically inflate MaterialCheckBox.
|
||||
<com\.google\.android\.material\.checkbox\.MaterialCheckBox
|
||||
|
||||
### Use RadioButton instead of MaterialRadioButton, the inflater will automatically inflate Material Views.
|
||||
<com\.google\.android\.material\.radiobutton\.MaterialRadioButton
|
||||
|
||||
### Use com.google.android.material.switchmaterial.SwitchMaterial instead of Switch, the inflater will not automatically inflate Material Views for Switch.
|
||||
<Switch
|
||||
|
||||
### Use colorSecondary
|
||||
colorAccent
|
||||
|
||||
### Use MaterialCardView
|
||||
<androidx\.cardview\.widget\.CardView
|
|
@ -326,7 +326,7 @@ dependencies {
|
|||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
||||
|
||||
implementation "androidx.recyclerview:recyclerview:1.2.0"
|
||||
implementation "androidx.recyclerview:recyclerview:1.2.1"
|
||||
implementation 'androidx.appcompat:appcompat:1.3.0'
|
||||
implementation "androidx.fragment:fragment-ktx:$fragment_version"
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
|
|
|
@ -6,11 +6,26 @@
|
|||
<activity android:name=".features.debug.TestLinkifyActivity" />
|
||||
<activity android:name=".features.debug.sas.DebugSasEmojiActivity" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugMaterialThemeLightActivity"
|
||||
android:name=".features.debug.DebugMaterialThemeLightDefaultActivity"
|
||||
android:theme="@style/VectorMaterialThemeDebugLight" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugMaterialThemeDarkActivity"
|
||||
android:name=".features.debug.DebugMaterialThemeLightTestActivity"
|
||||
android:theme="@style/VectorMaterialThemeDebugLight.Test" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugMaterialThemeLightVectorActivity"
|
||||
android:theme="@style/AppTheme.Light" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugMaterialThemeDarkDefaultActivity"
|
||||
android:theme="@style/VectorMaterialThemeDebugDark" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugMaterialThemeDarkTestActivity"
|
||||
android:theme="@style/VectorMaterialThemeDebugDark.Test" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugMaterialThemeDarkVectorActivity"
|
||||
android:theme="@style/AppTheme.Dark" />
|
||||
<activity
|
||||
android:name=".features.debug.DebugVectorButtonStylesActivity"
|
||||
android:theme="@style/AppTheme.Light" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (c) 2021 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import im.vector.app.databinding.ActivityTestMaterialThemeBinding
|
||||
|
||||
class DebugBottomSheet : BottomSheetDialogFragment() {
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||
// Reuse tha Activity layout
|
||||
val binding = ActivityTestMaterialThemeBinding.inflate(inflater, container, false)
|
||||
return binding.root
|
||||
}
|
||||
}
|
|
@ -18,9 +18,8 @@ package im.vector.app.features.debug
|
|||
|
||||
import android.os.Bundle
|
||||
import android.view.Menu
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.utils.toast
|
||||
|
@ -45,7 +44,8 @@ abstract class DebugMaterialThemeActivity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
views.debugShowDialog.setOnClickListener {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle("Dialog title")
|
||||
.setMessage("Dialog content")
|
||||
.setIcon(R.drawable.ic_settings_x)
|
||||
.setPositiveButton("Positive", null)
|
||||
|
@ -55,7 +55,7 @@ abstract class DebugMaterialThemeActivity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
views.debugShowBottomSheet.setOnClickListener {
|
||||
BottomSheetDialogFragment().show(supportFragmentManager, "TAG")
|
||||
DebugBottomSheet().show(supportFragmentManager, "TAG")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright 2019 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
class DebugMaterialThemeDarkDefaultActivity : DebugMaterialThemeActivity()
|
|
@ -16,4 +16,4 @@
|
|||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
class DebugMaterialThemeDarkActivity : DebugMaterialThemeActivity()
|
||||
class DebugMaterialThemeDarkTestActivity : DebugMaterialThemeActivity()
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright 2019 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
class DebugMaterialThemeDarkVectorActivity : DebugMaterialThemeActivity()
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright 2019 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
class DebugMaterialThemeLightDefaultActivity : DebugMaterialThemeActivity()
|
|
@ -16,4 +16,4 @@
|
|||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
class DebugMaterialThemeLightActivity : DebugMaterialThemeActivity()
|
||||
class DebugMaterialThemeLightTestActivity : DebugMaterialThemeActivity()
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright 2019 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
class DebugMaterialThemeLightVectorActivity : DebugMaterialThemeActivity()
|
|
@ -71,10 +71,29 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
|||
|
||||
private fun setupViews() {
|
||||
views.debugTestTextViewLink.setOnClickListener { testTextViewLink() }
|
||||
views.debugOpenButtonStyles.setOnClickListener {
|
||||
startActivity(Intent(this, DebugVectorButtonStylesActivity::class.java))
|
||||
}
|
||||
views.debugShowSasEmoji.setOnClickListener { showSasEmoji() }
|
||||
views.debugTestNotification.setOnClickListener { testNotification() }
|
||||
views.debugTestMaterialThemeLight.setOnClickListener { testMaterialThemeLight() }
|
||||
views.debugTestMaterialThemeDark.setOnClickListener { testMaterialThemeDark() }
|
||||
views.debugTestMaterialThemeLightDefault.setOnClickListener {
|
||||
startActivity(Intent(this, DebugMaterialThemeLightDefaultActivity::class.java))
|
||||
}
|
||||
views.debugTestMaterialThemeLightTest.setOnClickListener {
|
||||
startActivity(Intent(this, DebugMaterialThemeLightTestActivity::class.java))
|
||||
}
|
||||
views.debugTestMaterialThemeLightVector.setOnClickListener {
|
||||
startActivity(Intent(this, DebugMaterialThemeLightVectorActivity::class.java))
|
||||
}
|
||||
views.debugTestMaterialThemeDarkDefault.setOnClickListener {
|
||||
startActivity(Intent(this, DebugMaterialThemeDarkDefaultActivity::class.java))
|
||||
}
|
||||
views.debugTestMaterialThemeDarkTest.setOnClickListener {
|
||||
startActivity(Intent(this, DebugMaterialThemeDarkTestActivity::class.java))
|
||||
}
|
||||
views.debugTestMaterialThemeDarkVector.setOnClickListener {
|
||||
startActivity(Intent(this, DebugMaterialThemeDarkVectorActivity::class.java))
|
||||
}
|
||||
views.debugTestCrash.setOnClickListener { testCrash() }
|
||||
views.debugScanQrCode.setOnClickListener { scanQRCode() }
|
||||
}
|
||||
|
@ -174,14 +193,6 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
|||
)
|
||||
}
|
||||
|
||||
private fun testMaterialThemeLight() {
|
||||
startActivity(Intent(this, DebugMaterialThemeLightActivity::class.java))
|
||||
}
|
||||
|
||||
private fun testMaterialThemeDark() {
|
||||
startActivity(Intent(this, DebugMaterialThemeDarkActivity::class.java))
|
||||
}
|
||||
|
||||
private fun testCrash() {
|
||||
throw RuntimeException("Application crashed from user demand")
|
||||
}
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright 2021 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
|
||||
import im.vector.app.core.platform.VectorBaseActivity
|
||||
import im.vector.app.databinding.ActivityDebugButtonStylesBinding
|
||||
|
||||
class DebugVectorButtonStylesActivity : VectorBaseActivity<ActivityDebugButtonStylesBinding>() {
|
||||
override fun getBinding() = ActivityDebugButtonStylesBinding.inflate(layoutInflater)
|
||||
}
|
131
vector/src/debug/res/layout/activity_debug_button_styles.xml
Normal file
131
vector/src/debug/res/layout/activity_debug_button_styles.xml
Normal file
|
@ -0,0 +1,131 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".features.debug.DebugVectorButtonStylesActivity"
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Default" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Default disabled" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Text" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Text disabled" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyle.Positive"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Positive" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyle.Positive"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Positive disabled" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyle.Destructive"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Destructive" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyle.Destructive"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Destructive disabled" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleUnelevated.Bot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Bot" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleUnelevated.Bot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Bot disabled" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleOutlined"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="Outline" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleOutlined"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Outline disabled" />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleOutlined.Poll"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Poll " />
|
||||
|
||||
<Button
|
||||
style="@style/VectorButtonStyleOutlined.Poll"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Poll disabled" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/palette_azure"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp">
|
||||
|
||||
<Button
|
||||
style="@style/AlerterButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="Alerter" />
|
||||
|
||||
<Button
|
||||
style="@style/AlerterButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Alerter disabled" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
|
@ -20,51 +20,106 @@
|
|||
android:padding="@dimen/layout_horizontal_margin"
|
||||
android:showDividers="middle">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debug_test_text_view_link"
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Test linkification" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debug_test_notification"
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Test Notification" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/debug_test_material_theme_light"
|
||||
style="@style/VectorButtonStyle"
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Test Material theme Light" />
|
||||
android:text="Light theme" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/debug_test_material_theme_dark"
|
||||
style="@style/VectorButtonStyle"
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_material_theme_light_default"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:text="Default" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_material_theme_light_test"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:text="Test" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_material_theme_light_vector"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:text="Vector" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Test Material theme Dark" />
|
||||
android:text="Dark theme" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_material_theme_dark_default"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:text="Default" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_material_theme_dark_test"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:text="Test" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_material_theme_dark_vector"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:text="Vector" />
|
||||
</LinearLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_open_button_styles"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="See button styles" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_show_sas_emoji"
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Display all SAS emoji" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debug_test_crash"
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Crash the app" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debug_scan_qr_code"
|
||||
style="@style/VectorButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Scan QR-code" />
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
android:id="@+id/coordinatorLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
tools:context=".features.debug.DebugMaterialThemeActivity"
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
|
@ -28,6 +27,229 @@
|
|||
app:subtitle="Toolbar Subtitle"
|
||||
app:title="Toolbar Title" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:baselineAligned="false"
|
||||
android:divider="@drawable/linear_divider"
|
||||
android:showDividers="middle">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:background="#FFFFFF"
|
||||
android:divider="@drawable/linear_divider"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp"
|
||||
android:showDividers="middle">
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorPrimary"
|
||||
android:text="colorPrimary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorPrimaryVariant"
|
||||
android:text="colorPrimaryVariant" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorOnPrimary"
|
||||
android:text="colorOnPrimary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorSecondary"
|
||||
android:text="colorSecondary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorSecondaryVariant"
|
||||
android:text="colorSecondaryVariant" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorOnSecondary"
|
||||
android:text="colorOnSecondary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorError"
|
||||
android:text="colorError" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorOnError"
|
||||
android:text="colorOnError" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorSurface"
|
||||
android:text="colorSurface" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorOnSurface"
|
||||
android:text="colorOnSurface" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:colorBackground"
|
||||
android:text="android:colorBackground" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorOnBackground"
|
||||
android:text="colorOnBackground" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?colorAccent"
|
||||
android:text="colorAccent" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:statusBarColor"
|
||||
android:text="android:statusBarColor" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:navigationBarColor"
|
||||
android:text="android:navigationBarColor" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:textColorPrimary"
|
||||
android:text="android:textColorPrimary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:textColorSecondary"
|
||||
android:text="android:textColorSecondary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:textColorTertiary"
|
||||
android:text="android:textColorTertiary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.White"
|
||||
android:background="?android:textColorLink"
|
||||
android:text="android:textColorLink" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:background="#000000"
|
||||
android:divider="@drawable/linear_divider"
|
||||
android:dividerPadding="8dp"
|
||||
android:orientation="vertical"
|
||||
android:padding="8dp"
|
||||
android:showDividers="middle">
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorPrimary"
|
||||
android:text="colorPrimary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorPrimaryVariant"
|
||||
android:text="colorPrimaryVariant" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorOnPrimary"
|
||||
android:text="colorOnPrimary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorSecondary"
|
||||
android:text="colorSecondary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorSecondaryVariant"
|
||||
android:text="colorSecondaryVariant" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorOnSecondary"
|
||||
android:text="colorOnSecondary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorError"
|
||||
android:text="colorError" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorOnError"
|
||||
android:text="colorOnError" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorSurface"
|
||||
android:text="colorSurface" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorOnSurface"
|
||||
android:text="colorOnSurface" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:colorBackground"
|
||||
android:text="android:colorBackground" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorOnBackground"
|
||||
android:text="colorOnBackground" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?colorAccent"
|
||||
android:text="colorAccent" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:statusBarColor"
|
||||
android:text="android:statusBarColor" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:navigationBarColor"
|
||||
android:text="android:navigationBarColor" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:textColorPrimary"
|
||||
android:text="android:textColorPrimary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:textColorSecondary"
|
||||
android:text="android:textColorSecondary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:textColorTertiary"
|
||||
android:text="android:textColorTertiary" />
|
||||
|
||||
<TextView
|
||||
style="@style/DebugTextColorDemo.Black"
|
||||
android:background="?android:textColorLink"
|
||||
android:text="android:textColorLink" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -81,60 +303,105 @@
|
|||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Buttons" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Material Button Classic"
|
||||
android:text="Classic"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="Classic Disabled"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Material Button OutlinedButton"
|
||||
android:text="OutlinedButton"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="OutlinedButton Disabled"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button.TextButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Material Button TextButton"
|
||||
android:text="TextButton"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button.TextButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="TextButton Disabled"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Material Button UnelevatedButton"
|
||||
android:text="UnelevatedButton"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="UnelevatedButton Disabled"
|
||||
app:icon="@drawable/ic_settings_x" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Actions" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debugShowSnackbar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="Show Snackbar" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debugShowToast"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="Show Toast" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debugShowDialog"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="Show Dialog" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
<Button
|
||||
android:id="@+id/debugShowBottomSheet"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="Show Bottom Sheet" />
|
||||
|
||||
<com.google.android.material.checkbox.MaterialCheckBox
|
||||
<CheckBox
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Material CheckBox" />
|
||||
|
@ -146,7 +413,8 @@
|
|||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -159,9 +427,16 @@
|
|||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:layout_margin="16dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:src="@drawable/ic_settings_x" />
|
||||
|
||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:menu="@menu/home_bottom_navigation" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
|
|
@ -8,8 +8,7 @@
|
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
|
||||
android:orientation="vertical">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:textColor="@color/black"
|
||||
android:textColor="@color/emoji_color"
|
||||
android:textSize="22sp"
|
||||
tools:text="🔧" />
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -38,4 +38,4 @@
|
|||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.cardview.widget.CardView>
|
||||
</com.google.android.material.card.MaterialCardView>
|
|
@ -7,6 +7,10 @@
|
|||
|
||||
|
||||
<style name="VectorMaterialThemeDebugLight" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||
<!-- Keep all default value -->
|
||||
</style>
|
||||
|
||||
<style name="VectorMaterialThemeDebugLight.Test">
|
||||
<item name="colorPrimary">#7F7F00</item>
|
||||
<item name="colorPrimaryVariant">#00FF00</item>
|
||||
<item name="colorOnPrimary">#0000FF</item>
|
||||
|
@ -24,14 +28,17 @@
|
|||
<item name="android:colorBackground">#FF7777</item>
|
||||
<item name="colorOnBackground">#077700</item>
|
||||
|
||||
<!-- TODO is it still required? -->
|
||||
<item name="colorAccent">#03b381</item>
|
||||
|
||||
<item name="android:statusBarColor">#1188FF</item>
|
||||
<item name="android:navigationBarColor">#FF8811</item>
|
||||
|
||||
<item name="android:textColorLink">#000FFF</item>
|
||||
</style>
|
||||
|
||||
<style name="VectorMaterialThemeDebugDark" parent="Theme.MaterialComponents.NoActionBar">
|
||||
<!-- Keep all default value -->
|
||||
</style>
|
||||
|
||||
<style name="VectorMaterialThemeDebugDark.Test">
|
||||
<item name="colorPrimary">#7F7F00</item>
|
||||
<item name="colorPrimaryVariant">#00FF00</item>
|
||||
<item name="colorOnPrimary">#0000FF</item>
|
||||
|
@ -49,11 +56,26 @@
|
|||
<item name="android:colorBackground">#FF7777</item>
|
||||
<item name="colorOnBackground">#077700</item>
|
||||
|
||||
<!-- TODO is it still required? -->
|
||||
<item name="colorAccent">#03b381</item>
|
||||
|
||||
<item name="android:statusBarColor">#1188FF</item>
|
||||
<item name="android:navigationBarColor">#FF8811</item>
|
||||
|
||||
<item name="android:textColorLink">#000FFF</item>
|
||||
</style>
|
||||
|
||||
<style name="DebugTextColorDemo">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:padding">4dp</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:textSize">16sp</item>
|
||||
</style>
|
||||
|
||||
<style name="DebugTextColorDemo.White">
|
||||
<item name="android:textColor">#FFFFFF</item>
|
||||
</style>
|
||||
|
||||
<style name="DebugTextColorDemo.Black">
|
||||
<item name="android:textColor">#000000</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
|
@ -1,222 +0,0 @@
|
|||
/*
|
||||
* Copyright 2020 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.core.animations.behavior
|
||||
|
||||
import android.animation.ArgbEvaluator
|
||||
import android.content.Context
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.core.content.withStyledAttributes
|
||||
|
||||
import im.vector.app.R
|
||||
import kotlin.math.abs
|
||||
|
||||
private const val UNSPECIFIED_INT = Integer.MAX_VALUE
|
||||
private val UNSPECIFIED_FLOAT = Float.MAX_VALUE
|
||||
private const val DEPEND_TYPE_HEIGHT = 0
|
||||
private const val DEPEND_TYPE_WIDTH = 1
|
||||
private const val DEPEND_TYPE_X = 2
|
||||
private const val DEPEND_TYPE_Y = 3
|
||||
|
||||
class PercentViewBehavior<V : View>(context: Context, attrs: AttributeSet) : CoordinatorLayout.Behavior<V>(context, attrs) {
|
||||
|
||||
private var dependType: Int = 0
|
||||
private var dependViewId: Int = 0
|
||||
private var dependTarget: Int = 0
|
||||
private var dependStartX: Int = 0
|
||||
private var dependStartY: Int = 0
|
||||
private var dependStartWidth: Int = 0
|
||||
private var dependStartHeight: Int = 0
|
||||
|
||||
private var startX: Int = 0
|
||||
private var startY: Int = 0
|
||||
private var startWidth: Int = 0
|
||||
private var startHeight: Int = 0
|
||||
private var startBackgroundColor: Int = 0
|
||||
private var startAlpha: Float = 0f
|
||||
private var startRotateX: Float = 0f
|
||||
private var startRotateY: Float = 0f
|
||||
|
||||
private var targetX: Int = 0
|
||||
private var targetY: Int = 0
|
||||
private var targetWidth: Int = 0
|
||||
private var targetHeight: Int = 0
|
||||
private var targetBackgroundColor: Int = 0
|
||||
private var targetAlpha: Float = 0f
|
||||
private var targetRotateX: Float = 0f
|
||||
private var targetRotateY: Float = 0f
|
||||
|
||||
/**
|
||||
* Is the values prepared to be use
|
||||
*/
|
||||
private var isPrepared: Boolean = false
|
||||
|
||||
init {
|
||||
context.withStyledAttributes(attrs, R.styleable.PercentViewBehavior) {
|
||||
dependViewId = getResourceId(R.styleable.PercentViewBehavior_behavior_dependsOn, 0)
|
||||
dependType = getInt(R.styleable.PercentViewBehavior_behavior_dependType, DEPEND_TYPE_WIDTH)
|
||||
dependTarget = getDimensionPixelOffset(R.styleable.PercentViewBehavior_behavior_dependTarget, UNSPECIFIED_INT)
|
||||
targetX = getDimensionPixelOffset(R.styleable.PercentViewBehavior_behavior_targetX, UNSPECIFIED_INT)
|
||||
targetY = getDimensionPixelOffset(R.styleable.PercentViewBehavior_behavior_targetY, UNSPECIFIED_INT)
|
||||
targetWidth = getDimensionPixelOffset(R.styleable.PercentViewBehavior_behavior_targetWidth, UNSPECIFIED_INT)
|
||||
targetHeight = getDimensionPixelOffset(R.styleable.PercentViewBehavior_behavior_targetHeight, UNSPECIFIED_INT)
|
||||
targetBackgroundColor = getColor(R.styleable.PercentViewBehavior_behavior_targetBackgroundColor, UNSPECIFIED_INT)
|
||||
targetAlpha = getFloat(R.styleable.PercentViewBehavior_behavior_targetAlpha, UNSPECIFIED_FLOAT)
|
||||
targetRotateX = getFloat(R.styleable.PercentViewBehavior_behavior_targetRotateX, UNSPECIFIED_FLOAT)
|
||||
targetRotateY = getFloat(R.styleable.PercentViewBehavior_behavior_targetRotateY, UNSPECIFIED_FLOAT)
|
||||
}
|
||||
}
|
||||
|
||||
private fun prepare(parent: CoordinatorLayout, child: View, dependency: View) {
|
||||
dependStartX = dependency.x.toInt()
|
||||
dependStartY = dependency.y.toInt()
|
||||
dependStartWidth = dependency.width
|
||||
dependStartHeight = dependency.height
|
||||
startX = child.x.toInt()
|
||||
startY = child.y.toInt()
|
||||
startWidth = child.width
|
||||
startHeight = child.height
|
||||
startAlpha = child.alpha
|
||||
startRotateX = child.rotationX
|
||||
startRotateY = child.rotationY
|
||||
|
||||
// only set the start background color when the background is color drawable
|
||||
val background = child.background
|
||||
if (background is ColorDrawable) {
|
||||
startBackgroundColor = background.color
|
||||
}
|
||||
|
||||
// if parent fitsSystemWindows is true, add status bar height to target y if specified
|
||||
if (parent.fitsSystemWindows && targetY != UNSPECIFIED_INT) {
|
||||
var result = 0
|
||||
val resources = parent.context.resources
|
||||
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
|
||||
if (resourceId > 0) {
|
||||
result = resources.getDimensionPixelSize(resourceId)
|
||||
}
|
||||
targetY += result
|
||||
}
|
||||
isPrepared = true
|
||||
}
|
||||
|
||||
override fun layoutDependsOn(parent: CoordinatorLayout, child: V, dependency: View): Boolean {
|
||||
return dependency.id == dependViewId
|
||||
}
|
||||
|
||||
override fun onDependentViewChanged(parent: CoordinatorLayout, child: V, dependency: View): Boolean {
|
||||
// first time, prepare values before continue
|
||||
if (!isPrepared) {
|
||||
prepare(parent, child, dependency)
|
||||
}
|
||||
updateView(child, dependency)
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onLayoutChild(parent: CoordinatorLayout, child: V, layoutDirection: Int): Boolean {
|
||||
val bool = super.onLayoutChild(parent, child, layoutDirection)
|
||||
if (isPrepared) {
|
||||
updateView(child, parent.getDependencies(child)[0])
|
||||
}
|
||||
return bool
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the child view from the dependency states
|
||||
*
|
||||
* @param child child view
|
||||
* @param dependency dependency view
|
||||
*/
|
||||
private fun updateView(child: V, dependency: View) {
|
||||
var percent = 0f
|
||||
var start = 0f
|
||||
var current = 0f
|
||||
var end = UNSPECIFIED_INT.toFloat()
|
||||
when (dependType) {
|
||||
DEPEND_TYPE_WIDTH -> {
|
||||
start = dependStartWidth.toFloat()
|
||||
current = dependency.width.toFloat()
|
||||
end = dependTarget.toFloat()
|
||||
}
|
||||
DEPEND_TYPE_HEIGHT -> {
|
||||
start = dependStartHeight.toFloat()
|
||||
current = dependency.height.toFloat()
|
||||
end = dependTarget.toFloat()
|
||||
}
|
||||
DEPEND_TYPE_X -> {
|
||||
start = dependStartX.toFloat()
|
||||
current = dependency.x
|
||||
end = dependTarget.toFloat()
|
||||
}
|
||||
DEPEND_TYPE_Y -> {
|
||||
start = dependStartY.toFloat()
|
||||
current = dependency.y
|
||||
end = dependTarget.toFloat()
|
||||
}
|
||||
}
|
||||
|
||||
// need to define target value according to the depend type, if not then skip
|
||||
if (end != UNSPECIFIED_INT.toFloat()) {
|
||||
percent = abs(current - start) / abs(end - start)
|
||||
}
|
||||
updateViewWithPercent(child, if (percent > 1f) 1f else percent)
|
||||
}
|
||||
|
||||
private fun updateViewWithPercent(child: View, percent: Float) {
|
||||
var newX = if (targetX == UNSPECIFIED_INT) 0f else (targetX - startX) * percent
|
||||
var newY = if (targetY == UNSPECIFIED_INT) 0f else (targetY - startY) * percent
|
||||
|
||||
// set scale
|
||||
if (targetWidth != UNSPECIFIED_INT) {
|
||||
val newWidth = startWidth + (targetWidth - startWidth) * percent
|
||||
child.scaleX = newWidth / startWidth
|
||||
newX -= (startWidth - newWidth) / 2
|
||||
}
|
||||
if (targetHeight != UNSPECIFIED_INT) {
|
||||
val newHeight = startHeight + (targetHeight - startHeight) * percent
|
||||
child.scaleY = newHeight / startHeight
|
||||
newY -= (startHeight - newHeight) / 2
|
||||
}
|
||||
|
||||
// set new position
|
||||
child.translationX = newX
|
||||
child.translationY = newY
|
||||
|
||||
// set alpha
|
||||
if (targetAlpha != UNSPECIFIED_FLOAT) {
|
||||
child.alpha = startAlpha + (targetAlpha - startAlpha) * percent
|
||||
}
|
||||
|
||||
// set background color
|
||||
if (targetBackgroundColor != UNSPECIFIED_INT && startBackgroundColor != 0) {
|
||||
val evaluator = ArgbEvaluator()
|
||||
val color = evaluator.evaluate(percent, startBackgroundColor, targetBackgroundColor) as Int
|
||||
child.setBackgroundColor(color)
|
||||
}
|
||||
|
||||
// set rotation
|
||||
if (targetRotateX != UNSPECIFIED_FLOAT) {
|
||||
child.rotationX = startRotateX + (targetRotateX - startRotateX) * percent
|
||||
}
|
||||
if (targetRotateY != UNSPECIFIED_FLOAT) {
|
||||
child.rotationY = startRotateY + (targetRotateY - startRotateY) * percent
|
||||
}
|
||||
|
||||
child.requestLayout()
|
||||
}
|
||||
}
|
|
@ -32,6 +32,7 @@ import im.vector.app.features.call.conference.VectorJitsiActivity
|
|||
import im.vector.app.features.call.transfer.CallTransferActivity
|
||||
import im.vector.app.features.createdirect.CreateDirectRoomActivity
|
||||
import im.vector.app.features.crypto.keysbackup.settings.KeysBackupManageActivity
|
||||
import im.vector.app.features.crypto.keysbackup.setup.KeysBackupSetupActivity
|
||||
import im.vector.app.features.crypto.quads.SharedSecureStorageActivity
|
||||
import im.vector.app.features.crypto.recover.BootstrapBottomSheet
|
||||
import im.vector.app.features.crypto.verification.VerificationBottomSheet
|
||||
|
@ -138,6 +139,7 @@ interface ScreenComponent {
|
|||
fun inject(activity: LinkHandlerActivity)
|
||||
fun inject(activity: MainActivity)
|
||||
fun inject(activity: RoomDirectoryActivity)
|
||||
fun inject(activity: KeysBackupSetupActivity)
|
||||
fun inject(activity: BugReportActivity)
|
||||
fun inject(activity: FilteredRoomsActivity)
|
||||
fun inject(activity: CreateRoomActivity)
|
||||
|
|
|
@ -18,8 +18,8 @@ package im.vector.app.core.dialogs
|
|||
|
||||
import android.app.Activity
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isVisible
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.databinding.DialogConfirmationWithReasonBinding
|
||||
|
||||
|
@ -46,7 +46,7 @@ object ConfirmationDialogBuilder {
|
|||
views.dialogReasonInput.setHint(reasonHintRes)
|
||||
}
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(titleRes)
|
||||
.setView(layout)
|
||||
.setPositiveButton(positiveRes) { _, _ ->
|
||||
|
|
|
@ -18,6 +18,7 @@ package im.vector.app.core.dialogs
|
|||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.core.platform.Restorable
|
||||
import timber.log.Timber
|
||||
|
||||
|
@ -38,7 +39,7 @@ class DialogLocker(savedInstanceState: Bundle?) : Restorable {
|
|||
isDialogDisplayed = true
|
||||
}
|
||||
|
||||
fun displayDialog(builder: () -> AlertDialog.Builder): AlertDialog? {
|
||||
fun displayDialog(builder: () -> MaterialAlertDialogBuilder): AlertDialog? {
|
||||
return if (isDialogDisplayed) {
|
||||
Timber.w("Filtered dialog request")
|
||||
null
|
||||
|
|
|
@ -18,7 +18,7 @@ package im.vector.app.core.dialogs
|
|||
|
||||
import android.app.Activity
|
||||
import android.text.Editable
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.showPassword
|
||||
import im.vector.app.core.platform.SimpleTextWatcher
|
||||
|
@ -31,7 +31,7 @@ class ExportKeysDialog {
|
|||
fun show(activity: Activity, exportKeyDialogListener: ExportKeyDialogListener) {
|
||||
val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_export_e2e_keys, null)
|
||||
val views = DialogExportE2eKeysBinding.bind(dialogLayout)
|
||||
val builder = AlertDialog.Builder(activity)
|
||||
val builder = MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.encryption_export_room_keys)
|
||||
.setView(dialogLayout)
|
||||
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
|
||||
package im.vector.app.core.dialogs
|
||||
|
||||
import androidx.annotation.ColorRes
|
||||
import androidx.annotation.AttrRes
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import im.vector.app.R
|
||||
import im.vector.app.features.themes.ThemeUtils
|
||||
|
||||
fun AlertDialog.withColoredButton(whichButton: Int, @ColorRes color: Int = R.color.vector_error_color): AlertDialog {
|
||||
getButton(whichButton)?.setTextColor(ContextCompat.getColor(context, color))
|
||||
fun AlertDialog.withColoredButton(whichButton: Int, @AttrRes color: Int = R.attr.colorError): AlertDialog {
|
||||
getButton(whichButton)?.setTextColor(ThemeUtils.getColor(context, color))
|
||||
return this
|
||||
}
|
||||
|
|
|
@ -18,11 +18,12 @@ package im.vector.app.core.dialogs
|
|||
|
||||
import android.app.Activity
|
||||
import android.net.Uri
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.net.toUri
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.yalantis.ucrop.UCrop
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper.Listener
|
||||
import im.vector.app.core.extensions.insertBeforeLast
|
||||
import im.vector.app.core.extensions.registerStartForActivityResult
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
|
@ -101,7 +102,7 @@ class GalleryOrCameraDialogHelper(
|
|||
}
|
||||
|
||||
fun show() {
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.attachment_type_dialog_title)
|
||||
.setItems(arrayOf(
|
||||
fragment.getString(R.string.attachment_type_camera),
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
package im.vector.app.core.dialogs
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.databinding.DialogDeviceVerifyBinding
|
||||
import org.matrix.android.sdk.api.extensions.getFingerprintHumanReadable
|
||||
|
@ -28,7 +28,7 @@ object ManuallyVerifyDialog {
|
|||
fun show(activity: Activity, cryptoDeviceInfo: CryptoDeviceInfo, onVerified: (() -> Unit)) {
|
||||
val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_device_verify, null)
|
||||
val views = DialogDeviceVerifyBinding.bind(dialogLayout)
|
||||
val builder = AlertDialog.Builder(activity)
|
||||
val builder = MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.cross_signing_verify_by_text)
|
||||
.setView(dialogLayout)
|
||||
.setPositiveButton(R.string.encryption_information_verify) { _, _ ->
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
package im.vector.app.core.dialogs
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isVisible
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.databinding.DialogPhotoOrVideoBinding
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
|
@ -51,7 +51,7 @@ class PhotoOrVideoDialog(
|
|||
// Always default to photo
|
||||
views.dialogPhotoOrVideoPhoto.isChecked = true
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.option_take_photo_video)
|
||||
.setView(dialogLayout)
|
||||
.setPositiveButton(R.string._continue) { _, _ ->
|
||||
|
@ -95,7 +95,7 @@ class PhotoOrVideoDialog(
|
|||
views.dialogPhotoOrVideoVideo.isChecked = currentMode == VectorPreferences.TAKE_PHOTO_VIDEO_MODE_VIDEO
|
||||
views.dialogPhotoOrVideoAlwaysAsk.isChecked = currentMode == VectorPreferences.TAKE_PHOTO_VIDEO_MODE_ALWAYS_ASK
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.option_take_photo_video)
|
||||
.setView(dialogLayout)
|
||||
.setPositiveButton(R.string.save) { _, _ ->
|
||||
|
|
|
@ -21,6 +21,7 @@ import android.content.DialogInterface
|
|||
import android.text.Editable
|
||||
import android.view.KeyEvent
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.hideKeyboard
|
||||
import im.vector.app.core.extensions.showPassword
|
||||
|
@ -47,7 +48,7 @@ class PromptPasswordDialog {
|
|||
views.promptPasswordPasswordReveal.render(passwordVisible)
|
||||
}
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
.setTitle(R.string.devices_delete_dialog_title)
|
||||
.setView(dialogLayout)
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
package im.vector.app.core.dialogs
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
|
@ -92,7 +92,7 @@ class UnrecognizedCertificateDialog @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
val builder = AlertDialog.Builder(activity)
|
||||
val builder = MaterialAlertDialogBuilder(activity)
|
||||
val inflater = activity.layoutInflater
|
||||
val layout = inflater.inflate(R.layout.dialog_ssl_fingerprint, null)
|
||||
val views = DialogSslFingerprintBinding.bind(layout)
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright 2019 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package im.vector.app.core.epoxy
|
||||
|
||||
import com.airbnb.epoxy.EpoxyModelClass
|
||||
import im.vector.app.R
|
||||
|
||||
@EpoxyModelClass(layout = R.layout.item_divider_on_surface)
|
||||
abstract class BottomSheetDividerItem : VectorEpoxyModel<BottomSheetDividerItem.Holder>() {
|
||||
class Holder : VectorEpoxyHolder()
|
||||
}
|
|
@ -15,25 +15,10 @@
|
|||
*/
|
||||
package im.vector.app.core.epoxy
|
||||
|
||||
import com.airbnb.epoxy.EpoxyAttribute
|
||||
import com.airbnb.epoxy.EpoxyModelClass
|
||||
import im.vector.app.R
|
||||
|
||||
/**
|
||||
* Default background color is for the bottom sheets (R.attr.vctr_list_bottom_sheet_divider_color).
|
||||
* To use in fragment, set color using R.attr.riotx_list_divider_color
|
||||
*/
|
||||
@EpoxyModelClass(layout = R.layout.item_divider)
|
||||
abstract class DividerItem : VectorEpoxyModel<DividerItem.Holder>() {
|
||||
|
||||
@EpoxyAttribute var color: Int = -1
|
||||
|
||||
override fun bind(holder: Holder) {
|
||||
super.bind(holder)
|
||||
if (color != -1) {
|
||||
holder.view.setBackgroundColor(color)
|
||||
}
|
||||
}
|
||||
|
||||
class Holder : VectorEpoxyHolder()
|
||||
}
|
||||
|
|
|
@ -79,9 +79,9 @@ abstract class BottomSheetActionItem : VectorEpoxyModel<BottomSheetActionItem.Ho
|
|||
holder.view.onClick(listener)
|
||||
holder.startSpace.isVisible = subMenuItem
|
||||
val tintColor = if (destructive) {
|
||||
ContextCompat.getColor(holder.view.context, R.color.riotx_notice)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.colorError)
|
||||
} else {
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
|
||||
}
|
||||
holder.icon.isVisible = showIcon
|
||||
holder.icon.setImageResource(iconRes)
|
||||
|
@ -95,9 +95,9 @@ abstract class BottomSheetActionItem : VectorEpoxyModel<BottomSheetActionItem.Ho
|
|||
holder.selected.isInvisible = !selected
|
||||
if (showExpand) {
|
||||
val expandDrawable = if (expanded) {
|
||||
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_material_expand_less_black)
|
||||
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_expand_less)
|
||||
} else {
|
||||
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_material_expand_more_black)
|
||||
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_expand_more)
|
||||
}
|
||||
expandDrawable?.also {
|
||||
DrawableCompat.setTint(it, tintColor)
|
||||
|
|
|
@ -21,7 +21,6 @@ import android.view.View
|
|||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.widget.TooltipCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.widget.ImageViewCompat
|
||||
import com.airbnb.epoxy.EpoxyAttribute
|
||||
import com.airbnb.epoxy.EpoxyModelClass
|
||||
|
@ -31,6 +30,7 @@ import im.vector.app.core.epoxy.VectorEpoxyHolder
|
|||
import im.vector.app.core.epoxy.VectorEpoxyModel
|
||||
import im.vector.app.core.epoxy.onClick
|
||||
import im.vector.app.core.extensions.setTextOrHide
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.features.home.AvatarRenderer
|
||||
import im.vector.app.features.themes.ThemeUtils
|
||||
|
@ -45,6 +45,7 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev
|
|||
@EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer
|
||||
@EpoxyAttribute lateinit var matrixItem: MatrixItem
|
||||
@EpoxyAttribute lateinit var stringProvider: StringProvider
|
||||
@EpoxyAttribute lateinit var colorProvider: ColorProvider
|
||||
@EpoxyAttribute var izLowPriority: Boolean = false
|
||||
@EpoxyAttribute var izFavorite: Boolean = false
|
||||
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var settingsClickListener: ClickListener? = null
|
||||
|
@ -90,10 +91,10 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev
|
|||
val tintColor: Int
|
||||
if (isLowPriority) {
|
||||
description = stringProvider.getString(R.string.room_list_quick_actions_low_priority_remove)
|
||||
tintColor = ContextCompat.getColor(holder.view.context, R.color.riotx_accent)
|
||||
tintColor = colorProvider.getColorFromAttribute(R.attr.colorPrimary)
|
||||
} else {
|
||||
description = stringProvider.getString(R.string.room_list_quick_actions_low_priority_add)
|
||||
tintColor = ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
tintColor = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
|
||||
}
|
||||
holder.roomLowPriority.apply {
|
||||
contentDescription = description
|
||||
|
@ -108,11 +109,11 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev
|
|||
if (isFavorite) {
|
||||
description = stringProvider.getString(R.string.room_list_quick_actions_favorite_remove)
|
||||
holder.roomFavorite.setImageResource(R.drawable.ic_star_green_24dp)
|
||||
tintColor = ContextCompat.getColor(holder.view.context, R.color.riotx_accent)
|
||||
tintColor = colorProvider.getColorFromAttribute(R.attr.colorPrimary)
|
||||
} else {
|
||||
description = stringProvider.getString(R.string.room_list_quick_actions_favorite_add)
|
||||
holder.roomFavorite.setImageResource(R.drawable.ic_star_24dp)
|
||||
tintColor = ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
tintColor = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
|
||||
}
|
||||
holder.roomFavorite.apply {
|
||||
contentDescription = description
|
||||
|
|
|
@ -19,7 +19,6 @@ package im.vector.app.core.epoxy.profiles
|
|||
import android.content.res.ColorStateList
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.widget.ImageViewCompat
|
||||
import com.airbnb.epoxy.EpoxyAttribute
|
||||
|
@ -78,14 +77,14 @@ abstract class ProfileActionItem : VectorEpoxyModel<ProfileActionItem.Holder>()
|
|||
}
|
||||
holder.title.text = title
|
||||
val titleTintColor = if (destructive) {
|
||||
ContextCompat.getColor(holder.view.context, R.color.riotx_notice)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.colorError)
|
||||
} else {
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_primary)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_primary)
|
||||
}
|
||||
val iconTintColor = if (destructive) {
|
||||
ContextCompat.getColor(holder.view.context, R.color.riotx_notice)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.colorError)
|
||||
} else {
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
|
||||
}
|
||||
holder.title.setTextColor(titleTintColor)
|
||||
holder.subtitle.setTextOrHide(subtitle)
|
||||
|
@ -119,7 +118,7 @@ abstract class ProfileActionItem : VectorEpoxyModel<ProfileActionItem.Holder>()
|
|||
val tintColorSecondary = if (destructive) {
|
||||
titleTintColor
|
||||
} else {
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
|
||||
}
|
||||
holder.editable.setImageResource(editableRes)
|
||||
ImageViewCompat.setImageTintList(holder.editable, ColorStateList.valueOf(tintColorSecondary))
|
||||
|
|
|
@ -34,7 +34,6 @@ fun EpoxyController.buildProfileSection(title: String) {
|
|||
fun EpoxyController.buildProfileAction(
|
||||
id: String,
|
||||
title: String,
|
||||
dividerColor: Int,
|
||||
subtitle: String? = null,
|
||||
editable: Boolean = true,
|
||||
@DrawableRes icon: Int = 0,
|
||||
|
@ -65,7 +64,6 @@ fun EpoxyController.buildProfileAction(
|
|||
if (divider) {
|
||||
dividerItem {
|
||||
id("divider_$title")
|
||||
color(dividerColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,13 +16,13 @@
|
|||
|
||||
package im.vector.app.core.extensions
|
||||
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.recyclerview.widget.DividerItemDecoration
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.airbnb.epoxy.EpoxyController
|
||||
import com.airbnb.epoxy.EpoxyVisibilityTracker
|
||||
import im.vector.app.R
|
||||
|
||||
/**
|
||||
* Apply a Vertical LinearLayout Manager to the recyclerView and set the adapter from the epoxy controller
|
||||
|
@ -30,7 +30,8 @@ import im.vector.app.R
|
|||
fun RecyclerView.configureWith(epoxyController: EpoxyController,
|
||||
itemAnimator: RecyclerView.ItemAnimator? = null,
|
||||
viewPool: RecyclerView.RecycledViewPool? = null,
|
||||
showDivider: Boolean = false,
|
||||
@DrawableRes
|
||||
dividerDrawable: Int? = null,
|
||||
hasFixedSize: Boolean = true,
|
||||
disableItemAnimation: Boolean = false) {
|
||||
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false).apply {
|
||||
|
@ -42,10 +43,10 @@ fun RecyclerView.configureWith(epoxyController: EpoxyController,
|
|||
} else {
|
||||
itemAnimator?.let { this.itemAnimator = it }
|
||||
}
|
||||
if (showDivider) {
|
||||
dividerDrawable?.let { divider ->
|
||||
addItemDecoration(
|
||||
DividerItemDecoration(context, DividerItemDecoration.VERTICAL).apply {
|
||||
ContextCompat.getDrawable(context, R.drawable.divider_horizontal)?.let {
|
||||
ContextCompat.getDrawable(context, divider)?.let {
|
||||
setDrawable(it)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ import android.text.style.UnderlineSpan
|
|||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.AttrRes
|
||||
import androidx.annotation.ColorRes
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.content.ContextCompat
|
||||
|
@ -54,13 +53,13 @@ fun TextView.setTextOrHide(newText: CharSequence?, hideWhenBlank: Boolean = true
|
|||
* Set text with a colored part
|
||||
* @param fullTextRes the resource id of the full text. Value MUST contains a parameter for string, which will be replaced by the colored part
|
||||
* @param coloredTextRes the resource id of the colored part of the text
|
||||
* @param colorAttribute attribute of the color. Default to colorAccent
|
||||
* @param colorAttribute attribute of the color. Default to colorPrimary
|
||||
* @param underline true to also underline the text. Default to false
|
||||
* @param onClick attributes to handle click on the colored part if needed
|
||||
*/
|
||||
fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int,
|
||||
@StringRes coloredTextRes: Int,
|
||||
@AttrRes colorAttribute: Int = R.attr.colorAccent,
|
||||
@AttrRes colorAttribute: Int = R.attr.colorPrimary,
|
||||
underline: Boolean = false,
|
||||
onClick: (() -> Unit)? = null) {
|
||||
val coloredPart = resources.getString(coloredTextRes)
|
||||
|
@ -95,9 +94,9 @@ fun TextView.setTextWithColoredPart(@StringRes fullTextRes: Int,
|
|||
}
|
||||
}
|
||||
|
||||
fun TextView.setLeftDrawable(@DrawableRes iconRes: Int, @ColorRes tintColor: Int? = null) {
|
||||
fun TextView.setLeftDrawable(@DrawableRes iconRes: Int, @AttrRes tintColor: Int? = null) {
|
||||
val icon = if (tintColor != null) {
|
||||
val tint = ContextCompat.getColor(context, tintColor)
|
||||
val tint = ThemeUtils.getColor(context, tintColor)
|
||||
ContextCompat.getDrawable(context, iconRes)?.also {
|
||||
DrawableCompat.setTint(it.mutate(), tint)
|
||||
}
|
||||
|
|
|
@ -122,6 +122,10 @@ class BadgeFloatingActionButton @JvmOverloads constructor(
|
|||
}
|
||||
|
||||
init {
|
||||
if (isInEditMode) {
|
||||
count = 3
|
||||
}
|
||||
|
||||
countStr = countStr(count)
|
||||
textPaint.getTextBounds(countStr, 0, countStr.length, counterTextBounds)
|
||||
countMaxStr = "$maxCount+"
|
||||
|
|
|
@ -27,7 +27,6 @@ import android.view.View
|
|||
import android.view.WindowInsetsController
|
||||
import android.view.WindowManager
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.AttrRes
|
||||
import androidx.annotation.CallSuper
|
||||
import androidx.annotation.MainThread
|
||||
import androidx.annotation.MenuRes
|
||||
|
@ -456,7 +455,6 @@ abstract class VectorBaseActivity<VB: ViewBinding> : AppCompatActivity(), HasScr
|
|||
|
||||
if (menuRes != -1) {
|
||||
menuInflater.inflate(menuRes, menu)
|
||||
ThemeUtils.tintMenuIcons(menu, ThemeUtils.getColor(this, getMenuTint()))
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -584,9 +582,6 @@ abstract class VectorBaseActivity<VB: ViewBinding> : AppCompatActivity(), HasScr
|
|||
@MenuRes
|
||||
open fun getMenuRes() = -1
|
||||
|
||||
@AttrRes
|
||||
open fun getMenuTint() = R.attr.vctr_icon_tint_on_light_action_bar_color
|
||||
|
||||
/**
|
||||
* Return a object containing other themes for this activity
|
||||
*/
|
||||
|
|
|
@ -29,12 +29,12 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import androidx.annotation.CallSuper
|
||||
import androidx.annotation.MainThread
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.airbnb.mvrx.BaseMvRxFragment
|
||||
import com.bumptech.glide.util.Util.assertMainThread
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.jakewharton.rxbinding3.view.clicks
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.DaggerScreenComponent
|
||||
|
@ -290,7 +290,7 @@ abstract class VectorBaseFragment<VB: ViewBinding> : BaseMvRxFragment(), HasScre
|
|||
* ========================================================================================== */
|
||||
|
||||
protected fun displayErrorDialog(throwable: Throwable) {
|
||||
AlertDialog.Builder(requireActivity())
|
||||
MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.dialog_title_error)
|
||||
.setMessage(errorFormatter.toHumanReadable(throwable))
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
|
|
|
@ -107,7 +107,7 @@ open class VectorPreference : Preference {
|
|||
val icon = holder.findViewById(android.R.id.icon) as? ImageView
|
||||
|
||||
icon?.let {
|
||||
val color = ThemeUtils.getColor(context, R.attr.riotx_header_panel_text_secondary)
|
||||
val color = ThemeUtils.getColor(context, R.attr.vctr_content_secondary)
|
||||
ImageViewCompat.setImageTintList(it, ColorStateList.valueOf(color))
|
||||
}
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ open class VectorPreference : Preference {
|
|||
currentHighlightAnimator?.cancel()
|
||||
if (isHighlighted) {
|
||||
val colorFrom = Color.TRANSPARENT
|
||||
val colorTo = ThemeUtils.getColor(itemView.context, R.attr.colorAccent)
|
||||
val colorTo = ThemeUtils.getColor(itemView.context, R.attr.colorPrimary)
|
||||
currentHighlightAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo).apply {
|
||||
duration = 250 // milliseconds
|
||||
addUpdateListener { animator ->
|
||||
|
|
|
@ -48,7 +48,7 @@ class VectorPreferenceCategory : PreferenceCategory {
|
|||
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))
|
||||
titleTextView?.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_primary))
|
||||
|
||||
// "isIconSpaceReserved = false" does not work for preference category, so remove the padding
|
||||
if (!isIconSpaceReserved) {
|
||||
|
|
|
@ -42,7 +42,7 @@ abstract class BottomSheetGenericController<State : BottomSheetGenericState, Act
|
|||
subTitle(host.getSubTitle())
|
||||
}
|
||||
|
||||
// dividerItem {
|
||||
// bottomSheetDividerItem {
|
||||
// id("title_separator")
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ abstract class GenericButtonItem : VectorEpoxyModel<GenericButtonItem.Holder>()
|
|||
override fun bind(holder: Holder) {
|
||||
super.bind(holder)
|
||||
holder.button.text = text
|
||||
val textColor = textColor ?: ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_primary)
|
||||
val textColor = textColor ?: ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_primary)
|
||||
holder.button.setTextColor(textColor)
|
||||
if (iconRes != null) {
|
||||
holder.button.setIconResource(iconRes!!)
|
||||
|
|
|
@ -64,7 +64,7 @@ abstract class GenericFooterItem : VectorEpoxyModel<GenericFooterItem.Holder>()
|
|||
if (textColor != null) {
|
||||
holder.text.setTextColor(textColor!!)
|
||||
} else {
|
||||
holder.text.setTextColor(ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary))
|
||||
holder.text.setTextColor(ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary))
|
||||
}
|
||||
|
||||
holder.view.onClick(itemClickAction)
|
||||
|
|
|
@ -72,7 +72,7 @@ abstract class GenericPillItem : VectorEpoxyModel<GenericPillItem.Holder>() {
|
|||
holder.imageView.isVisible = false
|
||||
}
|
||||
if (tintIcon) {
|
||||
val iconTintColor = ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
val iconTintColor = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
|
||||
ImageViewCompat.setImageTintList(holder.imageView, ColorStateList.valueOf(iconTintColor))
|
||||
} else {
|
||||
ImageViewCompat.setImageTintList(holder.imageView, null)
|
||||
|
|
|
@ -76,7 +76,7 @@ abstract class GenericWithValueItem : VectorEpoxyModel<GenericWithValueItem.Hold
|
|||
if (valueColorInt != null) {
|
||||
holder.valueText.setTextColor(valueColorInt!!)
|
||||
} else {
|
||||
holder.valueText.setTextColor(ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_primary))
|
||||
holder.valueText.setTextColor(ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_primary))
|
||||
}
|
||||
|
||||
holder.view.onClick(itemClickAction)
|
||||
|
|
|
@ -21,7 +21,6 @@ import android.content.res.ColorStateList
|
|||
import android.graphics.drawable.Drawable
|
||||
import android.util.AttributeSet
|
||||
import android.widget.FrameLayout
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.withStyledAttributes
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isInvisible
|
||||
|
@ -109,7 +108,7 @@ class BottomSheetActionButton @JvmOverloads constructor(
|
|||
rightIcon = getDrawable(R.styleable.BottomSheetActionButton_rightIcon)
|
||||
|
||||
tint = getColor(R.styleable.BottomSheetActionButton_tint, ThemeUtils.getColor(context, android.R.attr.textColor))
|
||||
titleTextColor = getColor(R.styleable.BottomSheetActionButton_titleTextColor, ContextCompat.getColor(context, R.color.riotx_accent))
|
||||
titleTextColor = getColor(R.styleable.BottomSheetActionButton_titleTextColor, ThemeUtils.getColor(context, R.attr.colorPrimary))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package im.vector.app.core.ui.views
|
||||
|
||||
import androidx.cardview.widget.CardView
|
||||
import androidx.core.view.isVisible
|
||||
import com.google.android.material.card.MaterialCardView
|
||||
import im.vector.app.core.epoxy.onClick
|
||||
import im.vector.app.features.call.utils.EglUtils
|
||||
import im.vector.app.features.call.webrtc.WebRtcCall
|
||||
|
@ -29,7 +29,7 @@ class KnownCallsViewHolder {
|
|||
|
||||
private var activeCallPiP: SurfaceViewRenderer? = null
|
||||
private var currentCallsView: CurrentCallsView? = null
|
||||
private var pipWrapper: CardView? = null
|
||||
private var pipWrapper: MaterialCardView? = null
|
||||
private var currentCall: WebRtcCall? = null
|
||||
private var calls: List<WebRtcCall> = emptyList()
|
||||
|
||||
|
@ -83,7 +83,10 @@ class KnownCallsViewHolder {
|
|||
}
|
||||
}
|
||||
|
||||
fun bind(activeCallPiP: SurfaceViewRenderer, activeCallView: CurrentCallsView, pipWrapper: CardView, interactionListener: CurrentCallsView.Callback) {
|
||||
fun bind(activeCallPiP: SurfaceViewRenderer,
|
||||
activeCallView: CurrentCallsView,
|
||||
pipWrapper: MaterialCardView,
|
||||
interactionListener: CurrentCallsView.Callback) {
|
||||
this.activeCallPiP = activeCallPiP
|
||||
this.currentCallsView = activeCallView
|
||||
this.pipWrapper = pipWrapper
|
||||
|
|
|
@ -102,7 +102,7 @@ class NotificationAreaView @JvmOverloads constructor(
|
|||
}
|
||||
}
|
||||
views.roomNotificationMessage.text = message
|
||||
views.roomNotificationMessage.setTextColor(ThemeUtils.getColor(context, R.attr.riotx_text_secondary))
|
||||
views.roomNotificationMessage.setTextColor(ThemeUtils.getColor(context, R.attr.vctr_content_secondary))
|
||||
}
|
||||
|
||||
private fun renderResourceLimitExceededError(state: State.ResourceLimitExceededError) {
|
||||
|
|
|
@ -41,13 +41,13 @@ class SendStateImageView @JvmOverloads constructor(
|
|||
isVisible = when (sendState) {
|
||||
SendStateDecoration.SENDING_NON_MEDIA -> {
|
||||
setImageResource(R.drawable.ic_sending_message)
|
||||
imageTintList = ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.riotx_text_tertiary))
|
||||
imageTintList = ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.vctr_content_tertiary))
|
||||
contentDescription = context.getString(R.string.event_status_a11y_sending)
|
||||
true
|
||||
}
|
||||
SendStateDecoration.SENT -> {
|
||||
setImageResource(R.drawable.ic_message_sent)
|
||||
imageTintList = ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.riotx_text_tertiary))
|
||||
imageTintList = ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.vctr_content_tertiary))
|
||||
contentDescription = context.getString(R.string.event_status_a11y_sent)
|
||||
true
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ package im.vector.app.core.utils
|
|||
import android.content.Context
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
|
||||
/**
|
||||
* Open a web view above the current activity.
|
||||
|
@ -33,7 +33,7 @@ fun Context.displayInWebView(url: String) {
|
|||
wv.webViewClient = WebViewClient()
|
||||
|
||||
wv.loadUrl(url)
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setView(wv)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show()
|
||||
|
|
|
@ -56,7 +56,6 @@ import timber.log.Timber
|
|||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileOutputStream
|
||||
import java.lang.IllegalStateException
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
@ -100,8 +99,8 @@ fun openUrlInChromeCustomTab(context: Context,
|
|||
CustomTabsIntent.Builder()
|
||||
.setDefaultColorSchemeParams(
|
||||
CustomTabColorSchemeParams.Builder()
|
||||
.setToolbarColor(ThemeUtils.getColor(context, R.attr.riotx_background))
|
||||
.setNavigationBarColor(ThemeUtils.getColor(context, R.attr.riotx_background))
|
||||
.setToolbarColor(ThemeUtils.getColor(context, android.R.attr.colorBackground))
|
||||
.setNavigationBarColor(ThemeUtils.getColor(context, android.R.attr.colorBackground))
|
||||
.build()
|
||||
)
|
||||
.setColorScheme(
|
||||
|
|
|
@ -22,10 +22,10 @@ import org.billcarsonfr.jsonviewer.JSonViewerStyleProvider
|
|||
|
||||
fun createJSonViewerStyleProvider(colorProvider: ColorProvider): JSonViewerStyleProvider {
|
||||
return JSonViewerStyleProvider(
|
||||
keyColor = colorProvider.getColor(R.color.riotx_accent),
|
||||
secondaryColor = colorProvider.getColorFromAttribute(R.attr.riotx_text_secondary),
|
||||
keyColor = colorProvider.getColorFromAttribute(R.attr.colorPrimary),
|
||||
secondaryColor = colorProvider.getColorFromAttribute(R.attr.vctr_content_secondary),
|
||||
stringColor = colorProvider.getColorFromAttribute(R.attr.vctr_notice_text_color),
|
||||
baseColor = colorProvider.getColorFromAttribute(R.attr.riotx_text_primary),
|
||||
baseColor = colorProvider.getColorFromAttribute(R.attr.vctr_content_primary),
|
||||
booleanColor = colorProvider.getColorFromAttribute(R.attr.vctr_notice_text_color),
|
||||
numberColor = colorProvider.getColorFromAttribute(R.attr.vctr_notice_text_color)
|
||||
)
|
||||
|
|
|
@ -25,10 +25,10 @@ import android.widget.Toast
|
|||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.platform.VectorBaseActivity
|
||||
import timber.log.Timber
|
||||
|
@ -222,7 +222,7 @@ private fun checkPermissions(permissionsToBeGrantedBitMap: Int,
|
|||
// if some permissions were already denied: display a dialog to the user before asking again.
|
||||
if (permissionListAlreadyDenied.isNotEmpty() && rationaleMessage != 0) {
|
||||
// display the dialog with the info text
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.permissions_rationale_popup_title)
|
||||
.setMessage(rationaleMessage)
|
||||
.setOnCancelListener { Toast.makeText(activity, R.string.missing_permissions_warning, Toast.LENGTH_SHORT).show() }
|
||||
|
@ -246,7 +246,7 @@ private fun checkPermissions(permissionsToBeGrantedBitMap: Int,
|
|||
&& Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
TODO()
|
||||
/*
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setIcon(android.R.drawable.ic_dialog_info)
|
||||
.setTitle(R.string.permissions_rationale_popup_title)
|
||||
.setMessage(R.string.permissions_msg_contacts_warning_other_androids)
|
||||
|
|
|
@ -20,10 +20,10 @@ import android.app.Activity
|
|||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.bumptech.glide.Glide
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
|
@ -208,7 +208,7 @@ class MainActivity : VectorBaseActivity<ActivityMainBinding>(), UnlockedActivity
|
|||
|
||||
private fun displayError(failure: Throwable) {
|
||||
if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.dialog_title_error)
|
||||
.setMessage(errorFormatter.toHumanReadable(failure))
|
||||
.setPositiveButton(R.string.global_retry) { _, _ -> doCleanUp() }
|
||||
|
|
|
@ -20,10 +20,10 @@ import android.os.Bundle
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.isVisible
|
||||
import com.airbnb.mvrx.activityViewModel
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
|
||||
import im.vector.app.databinding.BottomSheetCallControlsBinding
|
||||
|
@ -105,7 +105,7 @@ class CallControlsBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetC
|
|||
}
|
||||
}
|
||||
}
|
||||
AlertDialog.Builder(requireContext())
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
.setItems(soundDevices.toTypedArray()) { d, n ->
|
||||
d.cancel()
|
||||
when (soundDevices[n].toString()) {
|
||||
|
|
|
@ -26,7 +26,6 @@ import android.os.Bundle
|
|||
import android.os.Parcelable
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.core.view.isInvisible
|
||||
|
@ -35,6 +34,7 @@ import com.airbnb.mvrx.Fail
|
|||
import com.airbnb.mvrx.MvRx
|
||||
import com.airbnb.mvrx.viewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.platform.VectorBaseActivity
|
||||
|
@ -359,8 +359,7 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro
|
|||
private fun onErrorTimoutConnect(turn: TurnServerResponse?) {
|
||||
Timber.d("## VOIP onErrorTimoutConnect $turn")
|
||||
// TODO ask to use default stun, etc...
|
||||
AlertDialog
|
||||
.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.call_failed_no_connection)
|
||||
.setMessage(getString(R.string.call_failed_no_connection_description))
|
||||
.setNegativeButton(R.string.ok) { _, _ ->
|
||||
|
|
|
@ -26,7 +26,6 @@ import android.os.Bundle
|
|||
import android.os.Parcelable
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||
import com.airbnb.mvrx.Fail
|
||||
|
@ -34,6 +33,7 @@ import com.airbnb.mvrx.MvRx
|
|||
import com.airbnb.mvrx.Success
|
||||
import com.airbnb.mvrx.viewModel
|
||||
import com.facebook.react.modules.core.PermissionListener
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.extensions.exhaustive
|
||||
|
@ -103,7 +103,7 @@ class VectorJitsiActivity : VectorBaseActivity<ActivityJitsiBinding>(), JitsiMee
|
|||
}
|
||||
|
||||
private fun handleConfirmSwitching(action: JitsiCallViewEvents.ConfirmSwitchingConference) {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.dialog_title_warning)
|
||||
.setMessage(R.string.jitsi_leave_conf_to_join_another_one_content)
|
||||
.setPositiveButton(R.string.action_switch) { _, _ ->
|
||||
|
|
|
@ -57,7 +57,7 @@ class DialPadFragment : Fragment() {
|
|||
dialpadView.findViewById<View>(R.id.dialpad_key_voicemail).isVisible = false
|
||||
digits = dialpadView.digits as? DigitsEditText
|
||||
digits?.isCursorVisible = cursorVisible
|
||||
digits?.setTextColor(ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.riotx_text_primary))
|
||||
digits?.setTextColor(ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.vctr_content_primary))
|
||||
dialpadView.findViewById<View>(R.id.zero).setOnClickListener { append('0') }
|
||||
if (enablePlus) {
|
||||
dialpadView.findViewById<View>(R.id.zero).setOnLongClickListener {
|
||||
|
@ -91,7 +91,7 @@ class DialPadFragment : Fragment() {
|
|||
clear()
|
||||
true
|
||||
}
|
||||
val tintColor = ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.riotx_text_secondary)
|
||||
val tintColor = ThemeUtils.getColor(requireContext(), im.vector.app.R.attr.vctr_content_secondary)
|
||||
ImageViewCompat.setImageTintList(dialpadView.deleteButton, ColorStateList.valueOf(tintColor))
|
||||
} else {
|
||||
dialpadView.deleteButton.isVisible = false
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
package im.vector.app.features.consent
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.dialogs.DialogLocker
|
||||
import im.vector.app.core.platform.Restorable
|
||||
|
@ -37,7 +37,7 @@ class ConsentNotGivenHelper(private val activity: Activity,
|
|||
*/
|
||||
fun displayDialog(consentUri: String, homeServerHost: String) {
|
||||
dialogLocker.displayDialog {
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.settings_app_term_conditions)
|
||||
.setMessage(activity.getString(R.string.dialog_user_consent_content, homeServerHost))
|
||||
.setPositiveButton(R.string.dialog_user_consent_submit) { _, _ ->
|
||||
|
|
|
@ -20,10 +20,10 @@ import android.os.Bundle
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isVisible
|
||||
import com.airbnb.mvrx.activityViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.jakewharton.rxbinding3.widget.checkedChanges
|
||||
import com.jakewharton.rxbinding3.widget.textChanges
|
||||
import im.vector.app.R
|
||||
|
@ -76,7 +76,7 @@ class ContactsBookFragment @Inject constructor(
|
|||
private fun setupConsentView() {
|
||||
views.phoneBookSearchForMatrixContacts.setOnClickListener {
|
||||
withState(contactsBookViewModel) { state ->
|
||||
AlertDialog.Builder(requireActivity())
|
||||
MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.identity_server_consent_dialog_title)
|
||||
.setMessage(getString(R.string.identity_server_consent_dialog_content, state.identityServerUrl ?: ""))
|
||||
.setPositiveButton(R.string.yes) { _, _ ->
|
||||
|
|
|
@ -22,12 +22,12 @@ import android.content.Context
|
|||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.airbnb.mvrx.Async
|
||||
import com.airbnb.mvrx.Fail
|
||||
import com.airbnb.mvrx.Loading
|
||||
import com.airbnb.mvrx.Success
|
||||
import com.airbnb.mvrx.viewModel
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.error.ErrorFormatter
|
||||
|
@ -171,7 +171,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity(), UserListViewModel.Fac
|
|||
finish()
|
||||
}
|
||||
is CreateRoomFailure.CreatedWithFederationFailure -> {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setMessage(getString(R.string.create_room_federation_error, error.matrixError.message))
|
||||
.setCancelable(false)
|
||||
.setPositiveButton(R.string.ok) { _, _ -> finish() }
|
||||
|
@ -184,7 +184,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity(), UserListViewModel.Fac
|
|||
} else {
|
||||
errorFormatter.toHumanReadable(error)
|
||||
}
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.show()
|
||||
|
|
|
@ -18,35 +18,24 @@ package im.vector.app.features.crypto.keys
|
|||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import im.vector.app.features.session.coroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import org.matrix.android.sdk.internal.extensions.foldToCallback
|
||||
import org.matrix.android.sdk.internal.util.awaitCallback
|
||||
|
||||
class KeysExporter(private val session: Session) {
|
||||
import javax.inject.Inject
|
||||
|
||||
class KeysExporter @Inject constructor(
|
||||
private val session: Session,
|
||||
private val context: Context
|
||||
) {
|
||||
/**
|
||||
* Export keys and return the file path with the callback
|
||||
* Export keys and write them to the provided uri
|
||||
*/
|
||||
fun export(context: Context, password: String, uri: Uri, callback: MatrixCallback<Boolean>) {
|
||||
session.coroutineScope.launch(Dispatchers.Main) {
|
||||
runCatching {
|
||||
withContext(Dispatchers.IO) {
|
||||
val data = awaitCallback<ByteArray> { session.cryptoService().exportRoomKeys(password, it) }
|
||||
val os = context.contentResolver?.openOutputStream(uri)
|
||||
if (os == null) {
|
||||
false
|
||||
} else {
|
||||
os.write(data)
|
||||
os.flush()
|
||||
true
|
||||
}
|
||||
}
|
||||
}.foldToCallback(callback)
|
||||
suspend fun export(password: String, uri: Uri) {
|
||||
return withContext(Dispatchers.IO) {
|
||||
val data = session.cryptoService().exportRoomKeys(password)
|
||||
context.contentResolver.openOutputStream(uri)
|
||||
?.use { it.write(data) }
|
||||
?: throw IllegalStateException("Unable to open file for writting")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,49 +20,27 @@ import android.content.Context
|
|||
import android.net.Uri
|
||||
import im.vector.app.core.intent.getMimeTypeFromUri
|
||||
import im.vector.app.core.resources.openResource
|
||||
import im.vector.app.features.session.coroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult
|
||||
import org.matrix.android.sdk.internal.extensions.foldToCallback
|
||||
import org.matrix.android.sdk.internal.util.awaitCallback
|
||||
import timber.log.Timber
|
||||
|
||||
class KeysImporter(private val session: Session) {
|
||||
import javax.inject.Inject
|
||||
|
||||
class KeysImporter @Inject constructor(
|
||||
private val context: Context,
|
||||
private val session: Session
|
||||
) {
|
||||
/**
|
||||
* Import keys from provided Uri
|
||||
*/
|
||||
fun import(context: Context,
|
||||
uri: Uri,
|
||||
mimetype: String?,
|
||||
password: String,
|
||||
callback: MatrixCallback<ImportRoomKeysResult>) {
|
||||
session.coroutineScope.launch(Dispatchers.Main) {
|
||||
runCatching {
|
||||
withContext(Dispatchers.IO) {
|
||||
val resource = openResource(context, uri, mimetype ?: getMimeTypeFromUri(context, uri))
|
||||
|
||||
if (resource?.mContentStream == null) {
|
||||
throw Exception("Error")
|
||||
}
|
||||
|
||||
val data: ByteArray
|
||||
try {
|
||||
data = resource.mContentStream!!.use { it.readBytes() }
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "## importKeys()")
|
||||
throw e
|
||||
}
|
||||
|
||||
awaitCallback<ImportRoomKeysResult> {
|
||||
session.cryptoService().importRoomKeys(data, password, null, it)
|
||||
}
|
||||
}
|
||||
}.foldToCallback(callback)
|
||||
suspend fun import(uri: Uri,
|
||||
mimetype: String?,
|
||||
password: String): ImportRoomKeysResult {
|
||||
return withContext(Dispatchers.IO) {
|
||||
val resource = openResource(context, uri, mimetype ?: getMimeTypeFromUri(context, uri))
|
||||
val stream = resource?.mContentStream ?: throw Exception("Error")
|
||||
val data = stream.use { it.readBytes() }
|
||||
session.cryptoService().importRoomKeys(data, password, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ package im.vector.app.features.crypto.keysbackup.restore
|
|||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.addFragmentToBackstack
|
||||
import im.vector.app.core.extensions.observeEvent
|
||||
|
@ -66,7 +66,7 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() {
|
|||
}
|
||||
|
||||
viewModel.keyVersionResultError.observeEvent(this) { message ->
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.unknown_error)
|
||||
.setMessage(message)
|
||||
.setCancelable(false)
|
||||
|
@ -97,7 +97,7 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() {
|
|||
launch4SActivity()
|
||||
}
|
||||
KeysBackupRestoreSharedViewModel.NAVIGATE_FAILED_TO_LOAD_4S -> {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.unknown_error)
|
||||
.setMessage(R.string.error_failed_to_import_keys)
|
||||
.setCancelable(false)
|
||||
|
|
|
@ -17,10 +17,10 @@ package im.vector.app.features.crypto.keysbackup.settings
|
|||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.airbnb.mvrx.Fail
|
||||
import com.airbnb.mvrx.Loading
|
||||
import com.airbnb.mvrx.viewModel
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.extensions.replaceFragment
|
||||
|
@ -60,7 +60,7 @@ class KeysBackupManageActivity : SimpleFragmentActivity() {
|
|||
is Fail -> {
|
||||
updateWaitingView(null)
|
||||
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.unknown_error)
|
||||
.setMessage(getString(R.string.keys_backup_get_version_error, asyncDelete.error.localizedMessage))
|
||||
.setCancelable(false)
|
||||
|
|
|
@ -19,9 +19,9 @@ import android.os.Bundle
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.airbnb.mvrx.activityViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.cleanup
|
||||
import im.vector.app.core.extensions.configureWith
|
||||
|
@ -72,7 +72,7 @@ class KeysBackupSettingsFragment @Inject constructor(private val keysBackupSetti
|
|||
|
||||
override fun didSelectDeleteSetupMessageRecovery() {
|
||||
activity?.let {
|
||||
AlertDialog.Builder(it)
|
||||
MaterialAlertDialogBuilder(it)
|
||||
.setTitle(R.string.keys_backup_settings_delete_confirm_title)
|
||||
.setMessage(R.string.keys_backup_settings_delete_confirm_message)
|
||||
.setCancelable(false)
|
||||
|
|
|
@ -18,10 +18,13 @@ package im.vector.app.features.crypto.keysbackup.setup
|
|||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import android.net.Uri
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.dialogs.ExportKeysDialog
|
||||
import im.vector.app.core.extensions.observeEvent
|
||||
import im.vector.app.core.extensions.queryExportKeys
|
||||
|
@ -30,7 +33,8 @@ import im.vector.app.core.extensions.replaceFragment
|
|||
import im.vector.app.core.platform.SimpleFragmentActivity
|
||||
import im.vector.app.core.utils.toast
|
||||
import im.vector.app.features.crypto.keys.KeysExporter
|
||||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
||||
|
||||
|
@ -38,6 +42,13 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
|||
|
||||
private lateinit var viewModel: KeysBackupSetupSharedViewModel
|
||||
|
||||
@Inject lateinit var keysExporter: KeysExporter
|
||||
|
||||
override fun injectWith(injector: ScreenComponent) {
|
||||
super.injectWith(injector)
|
||||
injector.inject(this)
|
||||
}
|
||||
|
||||
override fun initUiAndData() {
|
||||
super.initUiAndData()
|
||||
if (isFirstCreation()) {
|
||||
|
@ -82,7 +93,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
|||
finish()
|
||||
}
|
||||
KeysBackupSetupSharedViewModel.NAVIGATE_PROMPT_REPLACE -> {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.keys_backup_setup_override_backup_prompt_tile)
|
||||
.setMessage(R.string.keys_backup_setup_override_backup_prompt_description)
|
||||
.setPositiveButton(R.string.keys_backup_setup_override_replace) { _, _ ->
|
||||
|
@ -100,7 +111,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
|||
|
||||
viewModel.prepareRecoverFailError.observe(this) { error ->
|
||||
if (error != null) {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.unknown_error)
|
||||
.setMessage(error.localizedMessage)
|
||||
.setPositiveButton(R.string.ok) { _, _ ->
|
||||
|
@ -113,7 +124,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
|||
|
||||
viewModel.creatingBackupError.observe(this) { error ->
|
||||
if (error != null) {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.unexpected_error)
|
||||
.setMessage(error.localizedMessage)
|
||||
.setPositiveButton(R.string.ok) { _, _ ->
|
||||
|
@ -132,30 +143,7 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
|||
ExportKeysDialog().show(this, object : ExportKeysDialog.ExportKeyDialogListener {
|
||||
override fun onPassphrase(passphrase: String) {
|
||||
showWaitingView()
|
||||
|
||||
KeysExporter(session)
|
||||
.export(this@KeysBackupSetupActivity,
|
||||
passphrase,
|
||||
uri,
|
||||
object : MatrixCallback<Boolean> {
|
||||
override fun onSuccess(data: Boolean) {
|
||||
if (data) {
|
||||
toast(getString(R.string.encryption_exported_successfully))
|
||||
Intent().apply {
|
||||
putExtra(MANUAL_EXPORT, true)
|
||||
}.let {
|
||||
setResult(Activity.RESULT_OK, it)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
hideWaitingView()
|
||||
}
|
||||
|
||||
override fun onFailure(failure: Throwable) {
|
||||
toast(failure.localizedMessage ?: getString(R.string.unexpected_error))
|
||||
hideWaitingView()
|
||||
}
|
||||
})
|
||||
export(passphrase, uri)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
|
@ -165,12 +153,26 @@ class KeysBackupSetupActivity : SimpleFragmentActivity() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun export(passphrase: String, uri: Uri) {
|
||||
lifecycleScope.launch {
|
||||
try {
|
||||
keysExporter.export(passphrase, uri)
|
||||
toast(getString(R.string.encryption_exported_successfully))
|
||||
setResult(Activity.RESULT_OK, Intent().apply { putExtra(MANUAL_EXPORT, true) })
|
||||
finish()
|
||||
} catch (failure: Throwable) {
|
||||
toast(failure.localizedMessage ?: getString(R.string.unexpected_error))
|
||||
}
|
||||
hideWaitingView()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (viewModel.shouldPromptOnBack) {
|
||||
if (waitingView?.isVisible == true) {
|
||||
return
|
||||
}
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.keys_backup_setup_skip_title)
|
||||
.setMessage(R.string.keys_backup_setup_skip_msg)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
|
|
|
@ -23,11 +23,11 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import arrow.core.Try
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.registerStartForActivityResult
|
||||
import im.vector.app.core.platform.VectorBaseFragment
|
||||
|
@ -177,7 +177,7 @@ class KeysBackupSetupStep3Fragment @Inject constructor() : VectorBaseFragment<Fr
|
|||
.fold(
|
||||
{ throwable ->
|
||||
activity?.let {
|
||||
AlertDialog.Builder(it)
|
||||
MaterialAlertDialogBuilder(it)
|
||||
.setTitle(R.string.dialog_title_error)
|
||||
.setMessage(errorFormatter.toHumanReadable(throwable))
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ class KeysBackupSetupStep3Fragment @Inject constructor() : VectorBaseFragment<Fr
|
|||
{
|
||||
viewModel.copyHasBeenMade = true
|
||||
activity?.let {
|
||||
AlertDialog.Builder(it)
|
||||
MaterialAlertDialogBuilder(it)
|
||||
.setTitle(R.string.dialog_title_success)
|
||||
.setMessage(R.string.recovery_key_export_saved)
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ class KeyRequestHandler @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onSecretShareRequest(request: IncomingSecretShareRequest): Boolean {
|
||||
// By default riotX will not prompt if the SDK has decided that the request should not be fulfilled
|
||||
// By default Element will not prompt if the SDK has decided that the request should not be fulfilled
|
||||
Timber.v("## onSecretShareRequest() : Ignoring $request")
|
||||
request.ignore?.run()
|
||||
return true
|
||||
|
|
|
@ -22,12 +22,12 @@ import android.content.Intent
|
|||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentOnAttachListener
|
||||
import com.airbnb.mvrx.MvRx
|
||||
import com.airbnb.mvrx.viewModel
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.error.ErrorFormatter
|
||||
|
@ -98,7 +98,7 @@ class SharedSecureStorageActivity :
|
|||
finish()
|
||||
}
|
||||
is SharedSecureStorageViewEvent.Error -> {
|
||||
AlertDialog.Builder(this)
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(getString(R.string.dialog_title_error))
|
||||
.setMessage(it.message)
|
||||
.setCancelable(false)
|
||||
|
|
|
@ -26,13 +26,13 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.extensions.commitTransaction
|
||||
|
@ -96,7 +96,7 @@ class BootstrapBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetBoot
|
|||
dismiss()
|
||||
}
|
||||
is BootstrapViewEvents.ModalError -> {
|
||||
AlertDialog.Builder(requireActivity())
|
||||
MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.dialog_title_error)
|
||||
.setMessage(event.error)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
|
@ -121,7 +121,7 @@ class BootstrapBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetBoot
|
|||
}
|
||||
|
||||
private fun promptSkip() {
|
||||
AlertDialog.Builder(requireContext())
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(R.string.are_you_sure)
|
||||
.setMessage(R.string.bootstrap_cancel_text)
|
||||
.setPositiveButton(R.string._continue, null)
|
||||
|
|
|
@ -19,8 +19,8 @@ package im.vector.app.features.crypto.recover
|
|||
import android.app.Activity
|
||||
import android.content.DialogInterface
|
||||
import android.view.KeyEvent
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.databinding.DialogRecoveryKeySavedInfoBinding
|
||||
import me.gujun.android.span.image
|
||||
|
@ -49,7 +49,7 @@ class KeepItSafeDialog {
|
|||
}
|
||||
}
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
MaterialAlertDialogBuilder(activity)
|
||||
// .setIcon(android.R.drawable.ic_dialog_alert)
|
||||
// .setTitle(R.string.devices_delete_dialog_title)
|
||||
.setView(dialogLayout)
|
||||
|
|
|
@ -25,18 +25,18 @@ class SupportedVerificationMethodsProvider @Inject constructor(
|
|||
private val hardwareInfo: HardwareInfo
|
||||
) {
|
||||
/**
|
||||
* Provide the list of supported method by RiotX, with or without the QR_CODE_SCAN, depending if a back camera
|
||||
* Provide the list of supported method by Element, with or without the QR_CODE_SCAN, depending if a back camera
|
||||
* is available
|
||||
*/
|
||||
fun provide(): List<VerificationMethod> {
|
||||
return mutableListOf(
|
||||
// RiotX supports SAS verification
|
||||
// Element supports SAS verification
|
||||
VerificationMethod.SAS,
|
||||
// RiotX is able to show QR codes
|
||||
// Element is able to show QR codes
|
||||
VerificationMethod.QR_CODE_SHOW)
|
||||
.apply {
|
||||
if (hardwareInfo.hasBackCamera()) {
|
||||
// RiotX is able to scan QR codes, and a Camera is available
|
||||
// Element is able to scan QR codes, and a Camera is available
|
||||
add(VerificationMethod.QR_CODE_SCAN)
|
||||
} else {
|
||||
// This quite uncommon
|
||||
|
|
|
@ -23,11 +23,11 @@ import android.view.KeyEvent
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.airbnb.mvrx.MvRx
|
||||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.extensions.commitTransaction
|
||||
|
@ -109,7 +109,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetV
|
|||
))
|
||||
}
|
||||
is VerificationBottomSheetViewEvents.ModalError -> {
|
||||
AlertDialog.Builder(requireContext())
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(getString(R.string.dialog_title_error))
|
||||
.setMessage(it.errorMessage)
|
||||
.setCancelable(false)
|
||||
|
|
|
@ -19,7 +19,7 @@ package im.vector.app.features.crypto.verification.cancel
|
|||
import androidx.core.text.toSpannable
|
||||
import com.airbnb.epoxy.EpoxyController
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.epoxy.dividerItem
|
||||
import im.vector.app.core.epoxy.bottomSheetDividerItem
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.core.utils.colorizeMatchingText
|
||||
|
@ -70,29 +70,29 @@ class VerificationCancelController @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep0")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("cancel")
|
||||
title(host.stringProvider.getString(R.string.skip))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_destructive_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColor(R.color.riotx_destructive_accent))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorError))
|
||||
listener { host.listener?.onTapCancel() }
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep1")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("continue")
|
||||
title(host.stringProvider.getString(R.string._continue))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_positive_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColor(R.color.riotx_positive_accent))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
listener { host.listener?.onTapContinue() }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ package im.vector.app.features.crypto.verification.cancel
|
|||
|
||||
import com.airbnb.epoxy.EpoxyController
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.epoxy.dividerItem
|
||||
import im.vector.app.core.epoxy.bottomSheetDividerItem
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.features.crypto.verification.VerificationBottomSheetViewState
|
||||
|
@ -49,29 +49,29 @@ class VerificationNotMeController @Inject constructor(
|
|||
notice(host.eventHtmlRenderer.render(host.stringProvider.getString(R.string.verify_not_me_self_verification)))
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep0")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("skip")
|
||||
title(host.stringProvider.getString(R.string.skip))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
listener { host.listener?.onTapSkip() }
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep1")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("settings")
|
||||
title(host.stringProvider.getString(R.string.settings))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_positive_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColor(R.color.riotx_positive_accent))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
listener { host.listener?.onTapSettings() }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ package im.vector.app.features.crypto.verification.choose
|
|||
|
||||
import com.airbnb.epoxy.EpoxyController
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.epoxy.dividerItem
|
||||
import im.vector.app.core.epoxy.bottomSheetDividerItem
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem
|
||||
|
@ -56,7 +56,7 @@ class VerificationChooseMethodController @Inject constructor(
|
|||
data(state.qrCodeText)
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep0")
|
||||
}
|
||||
}
|
||||
|
@ -65,13 +65,13 @@ class VerificationChooseMethodController @Inject constructor(
|
|||
bottomSheetVerificationActionItem {
|
||||
id("openCamera")
|
||||
title(host.stringProvider.getString(R.string.verification_scan_their_code))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
iconRes(R.drawable.ic_camera)
|
||||
iconColor(host.colorProvider.getColor(R.color.riotx_accent))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
listener { host.listener?.openCamera() }
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep1")
|
||||
}
|
||||
}
|
||||
|
@ -79,35 +79,35 @@ class VerificationChooseMethodController @Inject constructor(
|
|||
bottomSheetVerificationActionItem {
|
||||
id("openEmoji")
|
||||
title(host.stringProvider.getString(R.string.verification_scan_emoji_title))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
subTitle(host.stringProvider.getString(R.string.verification_scan_emoji_subtitle))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
listener { host.listener?.doVerifyBySas() }
|
||||
}
|
||||
} else if (state.sasModeAvailable) {
|
||||
bottomSheetVerificationActionItem {
|
||||
id("openEmoji")
|
||||
title(host.stringProvider.getString(R.string.verification_no_scan_emoji_title))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
listener { host.listener?.doVerifyBySas() }
|
||||
}
|
||||
}
|
||||
|
||||
if (state.isMe && state.canCrossSign) {
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep_notMe")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("wasnote")
|
||||
title(host.stringProvider.getString(R.string.verify_new_session_was_not_me))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_destructive_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorError))
|
||||
subTitle(host.stringProvider.getString(R.string.verify_new_session_compromized))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
listener { host.listener?.onClickOnWasNotMe() }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ package im.vector.app.features.crypto.verification.conclusion
|
|||
|
||||
import com.airbnb.epoxy.EpoxyController
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.epoxy.dividerItem
|
||||
import im.vector.app.core.epoxy.bottomSheetDividerItem
|
||||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem
|
||||
|
@ -87,16 +87,16 @@ class VerificationConclusionController @Inject constructor(
|
|||
notice(host.stringProvider.getString(R.string.verify_cancelled_notice))
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep0")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("got_it")
|
||||
title(host.stringProvider.getString(R.string.sas_got_it))
|
||||
titleColor(host.colorProvider.getColor(R.color.riotx_accent))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColor(R.color.riotx_accent))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary))
|
||||
listener { host.listener?.onButtonTapped() }
|
||||
}
|
||||
}
|
||||
|
@ -105,16 +105,16 @@ class VerificationConclusionController @Inject constructor(
|
|||
|
||||
private fun bottomDone() {
|
||||
val host = this
|
||||
dividerItem {
|
||||
bottomSheetDividerItem {
|
||||
id("sep0")
|
||||
}
|
||||
|
||||
bottomSheetVerificationActionItem {
|
||||
id("done")
|
||||
title(host.stringProvider.getString(R.string.done))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
titleColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
iconRes(R.drawable.ic_arrow_right)
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.riotx_text_primary))
|
||||
iconColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary))
|
||||
listener { host.listener?.onButtonTapped() }
|
||||
}
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue