Merge remote-tracking branch 'origin/develop' into feature/eric/new-chat-bottom-sheet
# Conflicts: # vector/src/main/res/values/strings.xml
This commit is contained in:
commit
ce8939a092
2
.github/workflows/danger.yml
vendored
2
.github/workflows/danger.yml
vendored
@ -16,3 +16,5 @@ jobs:
|
||||
args: "--dangerfile tools/danger/dangerfile.js"
|
||||
env:
|
||||
DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
|
||||
# Fallback for forks
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
2
.github/workflows/quality.yml
vendored
2
.github/workflows/quality.yml
vendored
@ -71,6 +71,8 @@ jobs:
|
||||
args: "--dangerfile tools/danger/dangerfile-lint.js"
|
||||
env:
|
||||
DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
|
||||
# Fallback for forks
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Gradle dependency analysis using https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin
|
||||
dependency-analysis:
|
||||
|
35
CHANGES.md
35
CHANGES.md
@ -1,3 +1,38 @@
|
||||
Changes in Element v1.4.32 (2022-08-10)
|
||||
=======================================
|
||||
|
||||
Features ✨
|
||||
----------
|
||||
- [Location Share] Render fallback UI when map fails to load ([#6711](https://github.com/vector-im/element-android/issues/6711))
|
||||
|
||||
Bugfixes 🐛
|
||||
----------
|
||||
- Fix message content sometimes appearing in the log ([#6706](https://github.com/vector-im/element-android/issues/6706))
|
||||
- Disable 'Enable biometrics' option if there are not biometric authenticators enrolled. ([#6713](https://github.com/vector-im/element-android/issues/6713))
|
||||
- Fix crash when biometric key is used when coming back to foreground and KeyStore reports that the device is still locked. ([#6768](https://github.com/vector-im/element-android/issues/6768))
|
||||
- Catch all exceptions on lockscreen system key migrations. ([#6769](https://github.com/vector-im/element-android/issues/6769))
|
||||
- Fixes crash when entering non ascii characters during account creation ([#6735](https://github.com/vector-im/element-android/issues/6735))
|
||||
- Fixes onboarding login/account creation errors showing after navigation ([#6737](https://github.com/vector-im/element-android/issues/6737))
|
||||
- [Location sharing] Invisible text on map symbol ([#6687](https://github.com/vector-im/element-android/issues/6687))
|
||||
|
||||
In development 🚧
|
||||
----------------
|
||||
- Adds new app layout toolbar ([#6655](https://github.com/vector-im/element-android/issues/6655))
|
||||
|
||||
Other changes
|
||||
-------------
|
||||
- [Modularization] Provides abstraction to avoid direct usages of BuildConfig ([#6406](https://github.com/vector-im/element-android/issues/6406))
|
||||
- Refactors SpaceStateHandler (previously AppStateHandler) and adds unit tests for it ([#6598](https://github.com/vector-im/element-android/issues/6598))
|
||||
- Setup Danger to the project ([#6637](https://github.com/vector-im/element-android/issues/6637))
|
||||
- [Location Share] Open maximized map on tapping on live sharing notification ([#6642](https://github.com/vector-im/element-android/issues/6642))
|
||||
- [Location sharing] Align naming of components for live location feature ([#6647](https://github.com/vector-im/element-android/issues/6647))
|
||||
- [Location share] Update minimum sending period to 5 seconds for a live ([#6653](https://github.com/vector-im/element-android/issues/6653))
|
||||
- [Location sharing] - Fix the memory leaks ([#6674](https://github.com/vector-im/element-android/issues/6674))
|
||||
- [Timeline] Memory leak in audio message playback tracker ([#6678](https://github.com/vector-im/element-android/issues/6678))
|
||||
- [FTUE] Memory leak on FtueAuthSplashCarouselFragment ([#6680](https://github.com/vector-im/element-android/issues/6680))
|
||||
- Link directly to DCO docs from danger message. ([#6739](https://github.com/vector-im/element-android/issues/6739))
|
||||
|
||||
|
||||
Changes in Element v1.4.31 (2022-08-01)
|
||||
=======================================
|
||||
|
||||
|
@ -24,7 +24,7 @@ buildscript {
|
||||
classpath libs.gradle.gradlePlugin
|
||||
classpath libs.gradle.kotlinPlugin
|
||||
classpath libs.gradle.hiltPlugin
|
||||
classpath 'com.google.firebase:firebase-appdistribution-gradle:3.0.2'
|
||||
classpath 'com.google.firebase:firebase-appdistribution-gradle:3.0.3'
|
||||
classpath 'com.google.gms:google-services:4.3.13'
|
||||
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513'
|
||||
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
|
||||
@ -44,7 +44,7 @@ plugins {
|
||||
id "io.gitlab.arturbosch.detekt" version "1.21.0"
|
||||
|
||||
// Dependency Analysis
|
||||
id 'com.autonomousapps.dependency-analysis' version "1.11.2"
|
||||
id 'com.autonomousapps.dependency-analysis' version "1.12.0"
|
||||
}
|
||||
|
||||
// https://github.com/jeremylong/DependencyCheck
|
||||
@ -151,6 +151,8 @@ allprojects {
|
||||
"experimental:comment-wrapping",
|
||||
// - A KDoc comment after any other element on the same line must be separated by a new line
|
||||
"experimental:kdoc-wrapping",
|
||||
// Ignore error "Redundant curly braces", since we use it to fix false positives, for instance in "elementLogs.${i}.txt"
|
||||
"string-template",
|
||||
]
|
||||
}
|
||||
|
||||
|
1
changelog.d/5974.misc
Normal file
1
changelog.d/5974.misc
Normal file
@ -0,0 +1 @@
|
||||
Removes the Login2 proof of concept - replaced by the FTUE changes
|
@ -1 +0,0 @@
|
||||
[Modularization] Provides abstraction to avoids direct usages of BuildConfig
|
1
changelog.d/6505.wip
Normal file
1
changelog.d/6505.wip
Normal file
@ -0,0 +1 @@
|
||||
added filter tabs for new App layout's Home screen
|
@ -1 +0,0 @@
|
||||
Refactors SpaceStateHandler (previously AppStateHandler) and adds unit tests for it
|
@ -1 +0,0 @@
|
||||
Setup Danger to the project
|
@ -1 +0,0 @@
|
||||
[Location Share] Open maximized map on tapping on live sharing notification
|
1
changelog.d/6645.misc
Normal file
1
changelog.d/6645.misc
Normal file
@ -0,0 +1 @@
|
||||
Enable auto-capitalization for Room creation Title field
|
@ -1 +0,0 @@
|
||||
[Location sharing] Align naming of components for live location feature
|
@ -1 +0,0 @@
|
||||
[Location share] Update minimum sending period to 5 seconds for a live
|
@ -1 +0,0 @@
|
||||
Adds new app layout toolbar (feature flagged)
|
@ -1 +0,0 @@
|
||||
[Location sharing] - Fix the memory leaks
|
@ -1 +0,0 @@
|
||||
[Timeline] Memory leak in audio message playback tracker
|
@ -1 +0,0 @@
|
||||
[FTUE] Memory leak on FtueAuthSplashCarouselFragment
|
@ -1 +0,0 @@
|
||||
[Location sharing] Invisible text on map symbol
|
@ -1 +0,0 @@
|
||||
Fix message content sometimes appearing in the log
|
@ -1 +0,0 @@
|
||||
[Location Share] Render fallback UI when map fails to load
|
@ -1 +0,0 @@
|
||||
Disable 'Enable biometrics' option if there are not biometric authenticators enrolled.
|
@ -1 +0,0 @@
|
||||
Fixes crash when entering non ascii characters during account creation
|
@ -1 +0,0 @@
|
||||
Fixes onboarding login/account creation errors showing after navigation
|
@ -1 +0,0 @@
|
||||
Link directly to DCO docs from danger message.
|
1
changelog.d/6746.feature
Normal file
1
changelog.d/6746.feature
Normal file
@ -0,0 +1 @@
|
||||
[Notification] - Handle creation of notification for live location and poll start
|
1
changelog.d/6749.wip
Normal file
1
changelog.d/6749.wip
Normal file
@ -0,0 +1 @@
|
||||
Adds space list bottom sheet for new app layout
|
@ -1 +0,0 @@
|
||||
Fix crash when biometric key is used when coming back to foreground and KeyStore reports that the device is still locked.
|
@ -1 +0,0 @@
|
||||
Catch all exceptions on lockscreen system key migrations.
|
1
changelog.d/6783.misc
Normal file
1
changelog.d/6783.misc
Normal file
@ -0,0 +1 @@
|
||||
Decouples the variant logic from the vector module
|
1
changelog.d/6786.misc
Normal file
1
changelog.d/6786.misc
Normal file
@ -0,0 +1 @@
|
||||
Add a developer setting to enable LeakCanary at runtime
|
1
changelog.d/6795.wip
Normal file
1
changelog.d/6795.wip
Normal file
@ -0,0 +1 @@
|
||||
Makes toolbar switch title based on space in New App Layout
|
1
changelog.d/6798.wip
Normal file
1
changelog.d/6798.wip
Normal file
@ -0,0 +1 @@
|
||||
[Devices management] Add a feature flag and empty screen for future new layout
|
1
changelog.d/6799.misc
Normal file
1
changelog.d/6799.misc
Normal file
@ -0,0 +1 @@
|
||||
[Create Room] Reduce some boilerplate with room state event contents
|
1
changelog.d/6806.wip
Normal file
1
changelog.d/6806.wip
Normal file
@ -0,0 +1 @@
|
||||
[Devices management] Other sessions section in new layout
|
1
changelog.d/6808.misc
Normal file
1
changelog.d/6808.misc
Normal file
@ -0,0 +1 @@
|
||||
[Call] Memory leak after a call
|
1
changelog.d/6843.misc
Normal file
1
changelog.d/6843.misc
Normal file
@ -0,0 +1 @@
|
||||
Fix some string template
|
@ -22,7 +22,7 @@ def markwon = "4.6.2"
|
||||
def moshi = "1.13.0"
|
||||
def lifecycle = "2.5.1"
|
||||
def flowBinding = "1.2.0"
|
||||
def flipper = "0.156.0"
|
||||
def flipper = "0.157.0"
|
||||
def epoxy = "4.6.2"
|
||||
def mavericks = "2.7.0"
|
||||
def glide = "4.13.2"
|
||||
@ -30,7 +30,7 @@ def bigImageViewer = "1.8.1"
|
||||
def jjwt = "0.11.5"
|
||||
def vanniktechEmoji = "0.15.0"
|
||||
|
||||
def fragment = "1.5.1"
|
||||
def fragment = "1.5.2"
|
||||
|
||||
// Testing
|
||||
def mockk = "1.12.3" // We need to use 1.12.3 to have mocking in androidTest until a new version is released: https://github.com/mockk/mockk/issues/819
|
||||
|
@ -107,7 +107,9 @@ ext.groups = [
|
||||
'com.pinterest.ktlint',
|
||||
'com.posthog.android',
|
||||
'com.squareup',
|
||||
'com.squareup.curtains',
|
||||
'com.squareup.duktape',
|
||||
'com.squareup.leakcanary',
|
||||
'com.squareup.moshi',
|
||||
'com.squareup.okhttp3',
|
||||
'com.squareup.okio',
|
||||
|
@ -23,6 +23,7 @@ Here are the checks that Danger does so far:
|
||||
- PR description is not empty
|
||||
- Big PR got a warning to recommend to split
|
||||
- PR contains a file for towncrier and extension is checked
|
||||
- PR does not modify frozen classes
|
||||
- PR contains a Sign-Off, with exception for Element employee contributors
|
||||
- PR with change on layout should include screenshot in the description
|
||||
- PR which adds png file warn about the usage of vector drawables
|
||||
@ -84,6 +85,8 @@ To let Danger check all the PRs, including PRs form forks, a GitHub account have
|
||||
- password: Stored on Passbolt
|
||||
- GitHub token: A token with limited access has been created and added to the repository https://github.com/vector-im/element-android as secret DANGER_GITHUB_API_TOKEN. This token is not saved anywhere else. In case of problem, just delete it and create a new one, then update the secret.
|
||||
|
||||
PRs from forks do not always have access to the secret `secrets.DANGER_GITHUB_API_TOKEN`, so `secrets.GITHUB_TOKEN` is also provided to the job environment. If `secrets.DANGER_GITHUB_API_TOKEN` is available, it will be used, so user `ElementBot` will comment the PR. Else `secrets.GITHUB_TOKEN` will be used, and bot `github-actions` will comment the PR.
|
||||
|
||||
## Useful links
|
||||
|
||||
- https://danger.systems/
|
||||
|
2
fastlane/metadata/android/en-US/changelogs/40104320.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40104320.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Main changes in this version: Various bug fixes and stability improvements.
|
||||
Full changelog: https://github.com/vector-im/element-android/releases
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=97a52d145762adc241bad7fd18289bf7f6801e08ece6badf80402fe2b9f250b1
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
||||
distributionSha256Sum=db9c8211ed63f61f60292c69e80d89196f9eb36665e369e7f00ac4cc841c2219
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<declare-styleable name="DevicesListHeaderView">
|
||||
<attr name="devicesListHeaderTitle" format="string" />
|
||||
<attr name="devicesListHeaderDescription" format="string" />
|
||||
</declare-styleable>
|
||||
|
||||
</resources>
|
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<style name="TextAppearance.Vector.Subtitle.Medium.DevicesManagement">
|
||||
<item name="android:textColor">?vctr_content_primary</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Vector.Body.DevicesManagement">
|
||||
<item name="android:textColor">?vctr_content_secondary</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
18
library/ui-styles/src/main/res/values/styles_tablayout.xml
Normal file
18
library/ui-styles/src/main/res/values/styles_tablayout.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<style name="Widget.Vector.TabLayout" parent="Widget.MaterialComponents.TabLayout">
|
||||
<item name="materialThemeOverlay">@style/ThemeOverlay.Vector.HomeFilterTabLayout</item>
|
||||
<item name="tabTextAppearance">@style/TextAppearance.Vector.FilterTabTextAppearance</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Vector.FilterTabTextAppearance" parent="TextAppearance.Vector.Subtitle">
|
||||
<item name="textAllCaps">false</item>
|
||||
</style>
|
||||
|
||||
<style name="ThemeOverlay.Vector.HomeFilterTabLayout" parent="Theme.Vector.Launcher">
|
||||
<item name="colorSurface">?vctr_toolbar_background</item>
|
||||
<item name="colorOnSurface">?vctr_content_secondary</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
@ -17,7 +17,7 @@ buildscript {
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath "io.realm:realm-gradle-plugin:10.11.0"
|
||||
classpath "io.realm:realm-gradle-plugin:10.11.1"
|
||||
}
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ android {
|
||||
// that the app's state is completely cleared between tests.
|
||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||
|
||||
buildConfigField "String", "SDK_VERSION", "\"1.4.32\""
|
||||
buildConfigField "String", "SDK_VERSION", "\"1.4.34\""
|
||||
|
||||
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
||||
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
|
||||
|
@ -29,14 +29,12 @@ data class RoomGuestAccessContent(
|
||||
// Required. Whether guests can join the room. One of: ["can_join", "forbidden"]
|
||||
@Json(name = "guest_access") val guestAccessStr: String? = null
|
||||
) {
|
||||
val guestAccess: GuestAccess? = when (guestAccessStr) {
|
||||
"can_join" -> GuestAccess.CanJoin
|
||||
"forbidden" -> GuestAccess.Forbidden
|
||||
else -> {
|
||||
Timber.w("Invalid value for GuestAccess: `$guestAccessStr`")
|
||||
null
|
||||
}
|
||||
}
|
||||
val guestAccess: GuestAccess? = GuestAccess.values()
|
||||
.find { it.value == guestAccessStr }
|
||||
?: run {
|
||||
Timber.w("Invalid value for GuestAccess: `$guestAccessStr`")
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
@JsonClass(generateAdapter = false)
|
||||
|
@ -23,30 +23,30 @@ import com.squareup.moshi.JsonClass
|
||||
* Ref: https://matrix.org/docs/spec/client_server/latest#room-history-visibility
|
||||
*/
|
||||
@JsonClass(generateAdapter = false)
|
||||
enum class RoomHistoryVisibility {
|
||||
enum class RoomHistoryVisibility(val value: String) {
|
||||
/**
|
||||
* All events while this is the m.room.history_visibility value may be shared by any
|
||||
* participating homeserver with anyone, regardless of whether they have ever joined the room.
|
||||
*/
|
||||
@Json(name = "world_readable") WORLD_READABLE,
|
||||
@Json(name = "world_readable") WORLD_READABLE("world_readable"),
|
||||
|
||||
/**
|
||||
* Previous events are always accessible to newly joined members. All events in the
|
||||
* room are accessible, even those sent when the member was not a part of the room.
|
||||
*/
|
||||
@Json(name = "shared") SHARED,
|
||||
@Json(name = "shared") SHARED("shared"),
|
||||
|
||||
/**
|
||||
* Events are accessible to newly joined members from the point they were invited onwards.
|
||||
* Events stop being accessible when the member's state changes to something other than invite or join.
|
||||
*/
|
||||
@Json(name = "invited") INVITED,
|
||||
@Json(name = "invited") INVITED("invited"),
|
||||
|
||||
/**
|
||||
* Events are accessible to newly joined members from the point they joined the room onwards.
|
||||
* Events stop being accessible when the member's state changes to something other than join.
|
||||
*/
|
||||
@Json(name = "joined") JOINED
|
||||
@Json(name = "joined") JOINED("joined")
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -24,14 +24,10 @@ import timber.log.Timber
|
||||
data class RoomHistoryVisibilityContent(
|
||||
@Json(name = "history_visibility") val historyVisibilityStr: String? = null
|
||||
) {
|
||||
val historyVisibility: RoomHistoryVisibility? = when (historyVisibilityStr) {
|
||||
"world_readable" -> RoomHistoryVisibility.WORLD_READABLE
|
||||
"shared" -> RoomHistoryVisibility.SHARED
|
||||
"invited" -> RoomHistoryVisibility.INVITED
|
||||
"joined" -> RoomHistoryVisibility.JOINED
|
||||
else -> {
|
||||
Timber.w("Invalid value for RoomHistoryVisibility: `$historyVisibilityStr`")
|
||||
null
|
||||
}
|
||||
}
|
||||
val historyVisibility: RoomHistoryVisibility? = RoomHistoryVisibility.values()
|
||||
.find { it.value == historyVisibilityStr }
|
||||
?: run {
|
||||
Timber.w("Invalid value for RoomHistoryVisibility: `$historyVisibilityStr`")
|
||||
null
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,6 @@
|
||||
|
||||
package org.matrix.android.sdk.api.session.room.model.create
|
||||
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||
import org.matrix.android.sdk.api.session.events.model.toContent
|
||||
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
|
||||
@ -30,7 +29,7 @@ interface RoomFeaturePreset {
|
||||
|
||||
fun updateRoomParams(params: CreateRoomParams)
|
||||
|
||||
fun setupInitialStates(): List<Event>?
|
||||
fun setupInitialStates(): List<CreateRoomStateEvent>?
|
||||
}
|
||||
|
||||
class RestrictedRoomPreset(val homeServerCapabilities: HomeServerCapabilities, val restrictedList: List<RoomJoinRulesAllowEntry>) : RoomFeaturePreset {
|
||||
@ -41,9 +40,9 @@ class RestrictedRoomPreset(val homeServerCapabilities: HomeServerCapabilities, v
|
||||
params.roomVersion = homeServerCapabilities.versionOverrideForFeature(HomeServerCapabilities.ROOM_CAP_RESTRICTED)
|
||||
}
|
||||
|
||||
override fun setupInitialStates(): List<Event>? {
|
||||
override fun setupInitialStates(): List<CreateRoomStateEvent> {
|
||||
return listOf(
|
||||
Event(
|
||||
CreateRoomStateEvent(
|
||||
type = EventType.STATE_ROOM_JOIN_RULES,
|
||||
stateKey = "",
|
||||
content = RoomJoinRulesContent(
|
||||
|
@ -22,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Content
|
||||
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
|
||||
|
||||
/**
|
||||
* Content of the state event of type
|
||||
* Content of the event of type
|
||||
* [EventType.BEACON_LOCATION_DATA][org.matrix.android.sdk.api.session.events.model.EventType.BEACON_LOCATION_DATA]
|
||||
*
|
||||
* It contains location data related to a live location share.
|
||||
|
@ -76,12 +76,12 @@ internal class VerificationTransportToDevice(
|
||||
.configureWith(SendToDeviceTask.Params(MessageType.MSGTYPE_VERIFICATION_REQUEST, contentMap)) {
|
||||
this.callback = object : MatrixCallback<Unit> {
|
||||
override fun onSuccess(data: Unit) {
|
||||
Timber.v("## verification [$tx.transactionId] send toDevice request success")
|
||||
Timber.v("## verification [${tx?.transactionId}] send toDevice request success")
|
||||
callback.invoke(localId, validKeyReq)
|
||||
}
|
||||
|
||||
override fun onFailure(failure: Throwable) {
|
||||
Timber.e("## verification [$tx.transactionId] failed to send toDevice request")
|
||||
Timber.e("## verification [${tx?.transactionId}] failed to send toDevice request")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -103,12 +103,12 @@ internal class VerificationTransportToDevice(
|
||||
.configureWith(SendToDeviceTask.Params(EventType.KEY_VERIFICATION_READY, contentMap)) {
|
||||
this.callback = object : MatrixCallback<Unit> {
|
||||
override fun onSuccess(data: Unit) {
|
||||
Timber.v("## verification [$tx.transactionId] send toDevice request success")
|
||||
Timber.v("## verification [${tx?.transactionId}] send toDevice request success")
|
||||
callback?.invoke()
|
||||
}
|
||||
|
||||
override fun onFailure(failure: Throwable) {
|
||||
Timber.e("## verification [$tx.transactionId] failed to send toDevice request")
|
||||
Timber.e("## verification [${tx?.transactionId}] failed to send toDevice request")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -136,7 +136,7 @@ internal class VerificationTransportToDevice(
|
||||
.configureWith(SendToDeviceTask.Params(type, contentMap)) {
|
||||
this.callback = object : MatrixCallback<Unit> {
|
||||
override fun onSuccess(data: Unit) {
|
||||
Timber.v("## SAS verification [$tx.transactionId] toDevice type '$type' success.")
|
||||
Timber.v("## SAS verification [${tx.transactionId}] toDevice type '$type' success.")
|
||||
if (onDone != null) {
|
||||
onDone()
|
||||
} else {
|
||||
@ -149,7 +149,7 @@ internal class VerificationTransportToDevice(
|
||||
}
|
||||
|
||||
override fun onFailure(failure: Throwable) {
|
||||
Timber.e("## SAS verification [$tx.transactionId] failed to send toDevice in state : $tx.state")
|
||||
Timber.e("## SAS verification [${tx.transactionId}] failed to send toDevice in state : ${tx.state}")
|
||||
tx.cancel(onErrorReason)
|
||||
}
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ internal class SessionRealmConfigurationFactory @Inject constructor(
|
||||
return
|
||||
}
|
||||
|
||||
listOf(REALM_NAME, "$REALM_NAME.lock", "$REALM_NAME.note", "$REALM_NAME.management").forEach { file ->
|
||||
listOf(REALM_NAME, "${REALM_NAME}.lock", "${REALM_NAME}.note", "${REALM_NAME}.management").forEach { file ->
|
||||
try {
|
||||
File(directory, file).deleteRecursively()
|
||||
} catch (e: Exception) {
|
||||
|
@ -20,8 +20,13 @@ import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||
import org.matrix.android.sdk.api.session.events.model.content.EncryptionEventContent
|
||||
import org.matrix.android.sdk.api.session.events.model.toContent
|
||||
import org.matrix.android.sdk.api.session.identity.IdentityServiceError
|
||||
import org.matrix.android.sdk.api.session.identity.toMedium
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomAvatarContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
|
||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||
import org.matrix.android.sdk.api.util.MimeTypes
|
||||
import org.matrix.android.sdk.internal.crypto.DeviceListManager
|
||||
@ -78,7 +83,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
||||
buildAvatarEvent(params),
|
||||
buildGuestAccess(params)
|
||||
) +
|
||||
params.featurePreset?.setupInitialStates().orEmpty() +
|
||||
buildFeaturePresetInitialStates(params) +
|
||||
buildCustomInitialStates(params)
|
||||
)
|
||||
.takeIf { it.isNotEmpty() }
|
||||
@ -99,6 +104,16 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
||||
)
|
||||
}
|
||||
|
||||
private fun buildFeaturePresetInitialStates(params: CreateRoomParams): List<Event> {
|
||||
return params.featurePreset?.setupInitialStates().orEmpty().map {
|
||||
Event(
|
||||
type = it.type,
|
||||
stateKey = it.stateKey,
|
||||
content = it.content
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun buildCustomInitialStates(params: CreateRoomParams): List<Event> {
|
||||
return params.initialStates.map {
|
||||
Event(
|
||||
@ -123,7 +138,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
||||
Event(
|
||||
type = EventType.STATE_ROOM_AVATAR,
|
||||
stateKey = "",
|
||||
content = mapOf("url" to response.contentUri)
|
||||
content = RoomAvatarContent(response.contentUri).toContent()
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -134,7 +149,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
||||
Event(
|
||||
type = EventType.STATE_ROOM_HISTORY_VISIBILITY,
|
||||
stateKey = "",
|
||||
content = mapOf("history_visibility" to it)
|
||||
content = RoomHistoryVisibilityContent(it.value).toContent()
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -145,7 +160,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
||||
Event(
|
||||
type = EventType.STATE_ROOM_GUEST_ACCESS,
|
||||
stateKey = "",
|
||||
content = mapOf("guest_access" to it.value)
|
||||
content = RoomGuestAccessContent(it.value).toContent()
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -167,7 +182,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
||||
Event(
|
||||
type = EventType.STATE_ROOM_ENCRYPTION,
|
||||
stateKey = "",
|
||||
content = mapOf("algorithm" to it)
|
||||
content = EncryptionEventContent(it).toContent()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -16,21 +16,6 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
#######################################################################################################################
|
||||
# Check frozen class modification
|
||||
#######################################################################################################################
|
||||
|
||||
echo "Check if frozen class modified"
|
||||
git diff "HEAD@{1}" --name-only | grep -e OlmInboundGroupSessionWrapper.kt -e OlmInboundGroupSessionWrapper2.kt
|
||||
FROZEN_CHANGED=$?
|
||||
if [ ${FROZEN_CHANGED} -eq 0 ]; then
|
||||
echo "❌ FROZEN CLASS CHANGED ERROR"
|
||||
exit 1
|
||||
else
|
||||
echo "Frozen check OK"
|
||||
fi
|
||||
|
||||
|
||||
#######################################################################################################################
|
||||
# Check drawable quantity
|
||||
#######################################################################################################################
|
||||
|
@ -185,3 +185,6 @@ System\.currentTimeMillis\(\)===2
|
||||
onCreateOptionsMenu
|
||||
onOptionsItemSelected
|
||||
onPrepareOptionsMenu
|
||||
|
||||
### Suspicious String template. Please check that the string template will behave as expected, i.e. the class field and not the whole object will be used. For instance `Timber.d("$event.type")` is not correct, you should write `Timber.d("${event.type}")`. In the former the whole event content will be logged, since it's a data class. If this is expected (i.e. to fix false positive), please add explicit curly braces (`{` and `}`) around the variable, for instance `"elementLogs.${i}.txt"`
|
||||
\$[a-zA-Z_]\w*\??\.[a-zA-Z_]
|
||||
|
@ -52,6 +52,19 @@ if (requiresChangelog) {
|
||||
}
|
||||
}
|
||||
|
||||
// check that frozen classes have not been modified
|
||||
const frozenClasses = [
|
||||
"OlmInboundGroupSessionWrapper.kt",
|
||||
"OlmInboundGroupSessionWrapper2.kt",
|
||||
]
|
||||
|
||||
frozenClasses.forEach(frozen => {
|
||||
if (editedFiles.some(file => file.endsWith(frozen))) {
|
||||
fail("Frozen class `" + frozen + "` has been modified. Please do not modify frozen class.")
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
// Check for a sign-off
|
||||
const signOff = "Signed-off-by:"
|
||||
|
||||
|
@ -2634,7 +2634,8 @@
|
||||
"mask",
|
||||
"sick",
|
||||
"ill",
|
||||
"disease"
|
||||
"disease",
|
||||
"covid"
|
||||
]
|
||||
},
|
||||
"face-with-thermometer": {
|
||||
@ -2647,7 +2648,8 @@
|
||||
"thermometer",
|
||||
"temperature",
|
||||
"cold",
|
||||
"fever"
|
||||
"fever",
|
||||
"covid"
|
||||
]
|
||||
},
|
||||
"face-with-headbandage": {
|
||||
@ -4481,7 +4483,9 @@
|
||||
"hope",
|
||||
"wish",
|
||||
"namaste",
|
||||
"highfive"
|
||||
"highfive",
|
||||
"thank you",
|
||||
"appreciate"
|
||||
]
|
||||
},
|
||||
"writing-hand": {
|
||||
@ -9581,7 +9585,8 @@
|
||||
"amoeba",
|
||||
"bacteria",
|
||||
"virus",
|
||||
"germs"
|
||||
"germs",
|
||||
"covid"
|
||||
]
|
||||
},
|
||||
"bouquet": {
|
||||
@ -10260,7 +10265,9 @@
|
||||
"baguette",
|
||||
"bread",
|
||||
"food",
|
||||
"french"
|
||||
"french",
|
||||
"france",
|
||||
"bakery"
|
||||
]
|
||||
},
|
||||
"flatbread": {
|
||||
@ -10272,7 +10279,8 @@
|
||||
"naan",
|
||||
"pita",
|
||||
"flour",
|
||||
"food"
|
||||
"food",
|
||||
"bakery"
|
||||
]
|
||||
},
|
||||
"pretzel": {
|
||||
@ -10282,7 +10290,9 @@
|
||||
"twisted",
|
||||
"convoluted",
|
||||
"food",
|
||||
"bread"
|
||||
"bread",
|
||||
"germany",
|
||||
"bakery"
|
||||
]
|
||||
},
|
||||
"bagel": {
|
||||
@ -10293,7 +10303,8 @@
|
||||
"breakfast",
|
||||
"schmear",
|
||||
"food",
|
||||
"bread"
|
||||
"bread",
|
||||
"jewish"
|
||||
]
|
||||
},
|
||||
"pancakes": {
|
||||
@ -10306,7 +10317,8 @@
|
||||
"hotcake",
|
||||
"pancake",
|
||||
"flapjacks",
|
||||
"hotcakes"
|
||||
"hotcakes",
|
||||
"brunch"
|
||||
]
|
||||
},
|
||||
"waffle": {
|
||||
@ -10316,7 +10328,8 @@
|
||||
"breakfast",
|
||||
"indecisive",
|
||||
"iron",
|
||||
"food"
|
||||
"food",
|
||||
"brunch"
|
||||
]
|
||||
},
|
||||
"cheese-wedge": {
|
||||
@ -10325,7 +10338,8 @@
|
||||
"j": [
|
||||
"cheese",
|
||||
"food",
|
||||
"chadder"
|
||||
"chadder",
|
||||
"swiss"
|
||||
]
|
||||
},
|
||||
"meat-on-bone": {
|
||||
@ -10376,7 +10390,8 @@
|
||||
"food",
|
||||
"meat",
|
||||
"pork",
|
||||
"pig"
|
||||
"pig",
|
||||
"brunch"
|
||||
]
|
||||
},
|
||||
"hamburger": {
|
||||
@ -10400,7 +10415,8 @@
|
||||
"fries",
|
||||
"chips",
|
||||
"snack",
|
||||
"fast food"
|
||||
"fast food",
|
||||
"potato"
|
||||
]
|
||||
},
|
||||
"pizza": {
|
||||
@ -10410,7 +10426,8 @@
|
||||
"cheese",
|
||||
"slice",
|
||||
"food",
|
||||
"party"
|
||||
"party",
|
||||
"italy"
|
||||
]
|
||||
},
|
||||
"hot-dog": {
|
||||
@ -10420,7 +10437,8 @@
|
||||
"frankfurter",
|
||||
"hotdog",
|
||||
"sausage",
|
||||
"food"
|
||||
"food",
|
||||
"america"
|
||||
]
|
||||
},
|
||||
"sandwich": {
|
||||
@ -10429,7 +10447,9 @@
|
||||
"j": [
|
||||
"bread",
|
||||
"food",
|
||||
"lunch"
|
||||
"lunch",
|
||||
"toast",
|
||||
"bakery"
|
||||
]
|
||||
},
|
||||
"taco": {
|
||||
@ -10468,7 +10488,8 @@
|
||||
"food",
|
||||
"gyro",
|
||||
"kebab",
|
||||
"stuffed"
|
||||
"stuffed",
|
||||
"mediterranean"
|
||||
]
|
||||
},
|
||||
"falafel": {
|
||||
@ -10477,7 +10498,8 @@
|
||||
"j": [
|
||||
"chickpea",
|
||||
"meatball",
|
||||
"food"
|
||||
"food",
|
||||
"mediterranean"
|
||||
]
|
||||
},
|
||||
"egg": {
|
||||
@ -10498,7 +10520,8 @@
|
||||
"frying",
|
||||
"pan",
|
||||
"food",
|
||||
"kitchen"
|
||||
"kitchen",
|
||||
"skillet"
|
||||
]
|
||||
},
|
||||
"shallow-pan-of-food": {
|
||||
@ -10510,7 +10533,8 @@
|
||||
"paella",
|
||||
"pan",
|
||||
"shallow",
|
||||
"cooking"
|
||||
"cooking",
|
||||
"skillet"
|
||||
]
|
||||
},
|
||||
"pot-of-food": {
|
||||
@ -10521,7 +10545,8 @@
|
||||
"stew",
|
||||
"food",
|
||||
"meat",
|
||||
"soup"
|
||||
"soup",
|
||||
"hot pot"
|
||||
]
|
||||
},
|
||||
"fondue": {
|
||||
@ -10556,7 +10581,8 @@
|
||||
"green",
|
||||
"salad",
|
||||
"healthy",
|
||||
"lettuce"
|
||||
"lettuce",
|
||||
"vegetable"
|
||||
]
|
||||
},
|
||||
"popcorn": {
|
||||
@ -10566,7 +10592,8 @@
|
||||
"food",
|
||||
"movie theater",
|
||||
"films",
|
||||
"snack"
|
||||
"snack",
|
||||
"drama"
|
||||
]
|
||||
},
|
||||
"butter": {
|
||||
@ -10592,7 +10619,8 @@
|
||||
"j": [
|
||||
"can",
|
||||
"food",
|
||||
"soup"
|
||||
"soup",
|
||||
"tomatoes"
|
||||
]
|
||||
},
|
||||
"bento-box": {
|
||||
@ -10602,7 +10630,8 @@
|
||||
"bento",
|
||||
"box",
|
||||
"food",
|
||||
"japanese"
|
||||
"japanese",
|
||||
"lunch"
|
||||
]
|
||||
},
|
||||
"rice-cracker": {
|
||||
@ -10612,7 +10641,8 @@
|
||||
"cracker",
|
||||
"rice",
|
||||
"food",
|
||||
"japanese"
|
||||
"japanese",
|
||||
"snack"
|
||||
]
|
||||
},
|
||||
"rice-ball": {
|
||||
@ -10633,7 +10663,6 @@
|
||||
"cooked",
|
||||
"rice",
|
||||
"food",
|
||||
"china",
|
||||
"asian"
|
||||
]
|
||||
},
|
||||
@ -10680,7 +10709,8 @@
|
||||
"roasted",
|
||||
"sweet",
|
||||
"food",
|
||||
"nature"
|
||||
"nature",
|
||||
"plant"
|
||||
]
|
||||
},
|
||||
"oden": {
|
||||
@ -10745,7 +10775,8 @@
|
||||
"autumn",
|
||||
"festival",
|
||||
"yuèbǐng",
|
||||
"food"
|
||||
"food",
|
||||
"dessert"
|
||||
]
|
||||
},
|
||||
"dango": {
|
||||
@ -10772,7 +10803,8 @@
|
||||
"jiaozi",
|
||||
"pierogi",
|
||||
"potsticker",
|
||||
"food"
|
||||
"food",
|
||||
"gyoza"
|
||||
]
|
||||
},
|
||||
"fortune-cookie": {
|
||||
@ -10780,7 +10812,8 @@
|
||||
"b": "1F960",
|
||||
"j": [
|
||||
"prophecy",
|
||||
"food"
|
||||
"food",
|
||||
"dessert"
|
||||
]
|
||||
},
|
||||
"takeout-box": {
|
||||
@ -22169,7 +22202,9 @@
|
||||
"nation",
|
||||
"country",
|
||||
"banner",
|
||||
"japan"
|
||||
"japan",
|
||||
"jp",
|
||||
"ja"
|
||||
]
|
||||
},
|
||||
"flag-kenya": {
|
||||
|
@ -18,6 +18,5 @@ package im.vector.app.config
|
||||
|
||||
enum class OnboardingVariant {
|
||||
LEGACY,
|
||||
LOGIN_2,
|
||||
FTUE_AUTH
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ ext.versionMinor = 4
|
||||
// Note: even values are reserved for regular release, odd values for hotfix release.
|
||||
// When creating a hotfix, you should decrease the value, since the current value
|
||||
// is the value for the next regular release.
|
||||
ext.versionPatch = 32
|
||||
ext.versionPatch = 34
|
||||
|
||||
static def getGitTimestamp() {
|
||||
def cmd = 'git show -s --format=%ct'
|
||||
@ -307,7 +307,6 @@ android {
|
||||
isDefault = true
|
||||
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getGplayVersionSuffix()}"
|
||||
|
||||
resValue "bool", "isGplay", "true"
|
||||
buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"G\""
|
||||
buildConfigField "String", "FLAVOR_DESCRIPTION", "\"GooglePlay\""
|
||||
}
|
||||
@ -317,7 +316,6 @@ android {
|
||||
|
||||
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getFdroidVersionSuffix()}"
|
||||
|
||||
resValue "bool", "isGplay", "false"
|
||||
buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"F\""
|
||||
buildConfigField "String", "FLAVOR_DESCRIPTION", "\"FDroid\""
|
||||
}
|
||||
@ -393,7 +391,7 @@ dependencies {
|
||||
implementation libs.androidx.biometric
|
||||
|
||||
implementation "org.threeten:threetenbp:1.4.0:no-tzdb"
|
||||
implementation "com.gabrielittner.threetenbp:lazythreetenbp:0.10.0"
|
||||
implementation "com.gabrielittner.threetenbp:lazythreetenbp:0.11.0"
|
||||
|
||||
implementation libs.squareup.moshi
|
||||
kapt libs.squareup.moshiKotlin
|
||||
@ -502,7 +500,7 @@ dependencies {
|
||||
implementation 'com.posthog.android:posthog:1.1.2'
|
||||
|
||||
// UnifiedPush
|
||||
implementation 'com.github.UnifiedPush:android-connector:2.0.0'
|
||||
implementation 'com.github.UnifiedPush:android-connector:2.0.1'
|
||||
// UnifiedPush gplay flavor only
|
||||
gplayImplementation('com.github.UnifiedPush:android-embedded_fcm_distributor:2.1.1') {
|
||||
exclude group: 'com.google.firebase', module: 'firebase-core'
|
||||
@ -578,7 +576,7 @@ dependencies {
|
||||
debugImplementation "com.kgurgul.flipper:flipper-realm-android:2.2.0"
|
||||
|
||||
// Activate when you want to check for leaks, from time to time.
|
||||
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
|
||||
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
|
||||
|
||||
androidTestImplementation libs.androidx.testCore
|
||||
androidTestImplementation libs.androidx.testRunner
|
||||
|
@ -83,7 +83,7 @@ private fun useMediaStoreScreenshotStorage(
|
||||
screenshotLocation: String,
|
||||
bitmap: Bitmap
|
||||
) {
|
||||
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "$screenshotName.jpeg")
|
||||
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "${screenshotName}.jpeg")
|
||||
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, screenshotLocation)
|
||||
val uri: Uri? = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
|
||||
if (uri != null) {
|
||||
@ -104,7 +104,7 @@ private fun usePublicExternalScreenshotStorage(
|
||||
if (!directory.exists()) {
|
||||
directory.mkdirs()
|
||||
}
|
||||
val file = File(directory, "$screenshotName.jpeg")
|
||||
val file = File(directory, "${screenshotName}.jpeg")
|
||||
saveScreenshotToStream(bitmap, FileOutputStream(file))
|
||||
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
|
||||
}
|
||||
|
@ -9,6 +9,8 @@
|
||||
<activity android:name=".features.debug.settings.DebugPrivateSettingsActivity" />
|
||||
<activity android:name=".features.debug.sas.DebugSasEmojiActivity" />
|
||||
<activity android:name=".features.debug.features.DebugFeaturesSettingsActivity" />
|
||||
<activity android:name=".features.debug.DebugMenuActivity" />
|
||||
<activity android:name=".features.debug.leak.DebugMemoryLeaksActivity" />
|
||||
|
||||
<activity
|
||||
android:name="com.facebook.flipper.android.diagnostics.FlipperDiagnosticActivity"
|
||||
|
@ -37,6 +37,7 @@ import im.vector.app.core.utils.toast
|
||||
import im.vector.app.databinding.ActivityDebugMenuBinding
|
||||
import im.vector.app.features.debug.analytics.DebugAnalyticsActivity
|
||||
import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity
|
||||
import im.vector.app.features.debug.leak.DebugMemoryLeaksActivity
|
||||
import im.vector.app.features.debug.sas.DebugSasEmojiActivity
|
||||
import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity
|
||||
import im.vector.app.features.qrcode.QrCodeScannerActivity
|
||||
@ -86,6 +87,7 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||
views.debugAnalytics.setOnClickListener {
|
||||
startActivity(Intent(this, DebugAnalyticsActivity::class.java))
|
||||
}
|
||||
views.debugMemoryLeaks.setOnClickListener { openMemoryLeaksSettings() }
|
||||
views.debugTestTextViewLink.setOnClickListener { testTextViewLink() }
|
||||
views.debugOpenButtonStylesLight.setOnClickListener {
|
||||
startActivity(Intent(this, DebugVectorButtonStylesLightActivity::class.java))
|
||||
@ -130,6 +132,10 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
|
||||
startActivity(Intent(this, DebugPrivateSettingsActivity::class.java))
|
||||
}
|
||||
|
||||
private fun openMemoryLeaksSettings() {
|
||||
startActivity(Intent(this, DebugMemoryLeaksActivity::class.java))
|
||||
}
|
||||
|
||||
private fun renderQrCode(text: String) {
|
||||
views.debugQrCode.setData(text)
|
||||
}
|
||||
|
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.di
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import im.vector.app.core.debug.DebugNavigator
|
||||
import im.vector.app.core.debug.DebugReceiver
|
||||
import im.vector.app.core.debug.FlipperProxy
|
||||
import im.vector.app.core.debug.LeakDetector
|
||||
import im.vector.app.features.debug.DebugMenuActivity
|
||||
import im.vector.app.flipper.VectorFlipperProxy
|
||||
import im.vector.app.leakcanary.LeakCanaryLeakDetector
|
||||
import im.vector.app.receivers.VectorDebugReceiver
|
||||
|
||||
@InstallIn(SingletonComponent::class)
|
||||
@Module
|
||||
abstract class DebugModule {
|
||||
|
||||
companion object {
|
||||
|
||||
@Provides
|
||||
fun providesDebugNavigator() = object : DebugNavigator {
|
||||
override fun openDebugMenu(context: Context) {
|
||||
context.startActivity(Intent(context, DebugMenuActivity::class.java))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Binds
|
||||
abstract fun bindsDebugReceiver(receiver: VectorDebugReceiver): DebugReceiver
|
||||
|
||||
@Binds
|
||||
abstract fun bindsFlipperProxy(flipperProxy: VectorFlipperProxy): FlipperProxy
|
||||
|
||||
@Binds
|
||||
abstract fun bindsLeakDetector(leakDetector: LeakCanaryLeakDetector): LeakDetector
|
||||
}
|
@ -24,6 +24,7 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||
import im.vector.app.core.di.MavericksViewModelComponent
|
||||
import im.vector.app.core.di.MavericksViewModelKey
|
||||
import im.vector.app.features.debug.analytics.DebugAnalyticsViewModel
|
||||
import im.vector.app.features.debug.leak.DebugMemoryLeaksViewModel
|
||||
import im.vector.app.features.debug.settings.DebugPrivateSettingsViewModel
|
||||
|
||||
@InstallIn(MavericksViewModelComponent::class)
|
||||
@ -39,4 +40,9 @@ interface MavericksViewModelDebugModule {
|
||||
@IntoMap
|
||||
@MavericksViewModelKey(DebugPrivateSettingsViewModel::class)
|
||||
fun debugPrivateSettingsViewModelFactory(factory: DebugPrivateSettingsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@MavericksViewModelKey(DebugMemoryLeaksViewModel::class)
|
||||
fun debugMemoryLeaksViewModelFactory(factory: DebugMemoryLeaksViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||
}
|
||||
|
@ -90,6 +90,11 @@ class DebugFeaturesStateFactory @Inject constructor(
|
||||
key = DebugFeatureKeys.newAppLayoutEnabled,
|
||||
factory = VectorFeatures::isNewAppLayoutEnabled
|
||||
),
|
||||
createBooleanFeature(
|
||||
label = "Enable New Device Management",
|
||||
key = DebugFeatureKeys.newDeviceManagementEnabled,
|
||||
factory = VectorFeatures::isNewDeviceManagementEnabled
|
||||
),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
@ -79,6 +79,9 @@ class DebugVectorFeatures(
|
||||
override fun isNewAppLayoutEnabled(): Boolean = read(DebugFeatureKeys.newAppLayoutEnabled)
|
||||
?: vectorFeatures.isNewAppLayoutEnabled()
|
||||
|
||||
override fun isNewDeviceManagementEnabled(): Boolean = read(DebugFeatureKeys.newDeviceManagementEnabled)
|
||||
?: vectorFeatures.isNewDeviceManagementEnabled()
|
||||
|
||||
fun <T> override(value: T?, key: Preferences.Key<T>) = updatePreferences {
|
||||
if (value == null) {
|
||||
it.remove(key)
|
||||
@ -139,4 +142,5 @@ object DebugFeatureKeys {
|
||||
val forceUsageOfOpusEncoder = booleanPreferencesKey("force-usage-of-opus-encoder")
|
||||
val startDmOnFirstMsg = booleanPreferencesKey("start-dm-on-first-msg")
|
||||
val newAppLayoutEnabled = booleanPreferencesKey("new-app-layout-enabled")
|
||||
val newDeviceManagementEnabled = booleanPreferencesKey("new-device-management-enabled")
|
||||
}
|
||||
|
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.leak
|
||||
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import im.vector.app.core.extensions.addFragment
|
||||
import im.vector.app.core.platform.VectorBaseActivity
|
||||
import im.vector.app.databinding.ActivitySimpleBinding
|
||||
|
||||
@AndroidEntryPoint
|
||||
class DebugMemoryLeaksActivity : VectorBaseActivity<ActivitySimpleBinding>() {
|
||||
|
||||
override fun getBinding() = ActivitySimpleBinding.inflate(layoutInflater)
|
||||
|
||||
override fun initUiAndData() {
|
||||
if (isFirstCreation()) {
|
||||
addFragment(
|
||||
views.simpleFragmentContainer,
|
||||
DebugMemoryLeaksFragment::class.java
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.leak
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import im.vector.app.core.epoxy.onClick
|
||||
import im.vector.app.core.platform.VectorBaseFragment
|
||||
import im.vector.app.databinding.FragmentDebugMemoryLeaksBinding
|
||||
|
||||
@AndroidEntryPoint
|
||||
class DebugMemoryLeaksFragment : VectorBaseFragment<FragmentDebugMemoryLeaksBinding>() {
|
||||
|
||||
private val viewModel: DebugMemoryLeaksViewModel by fragmentViewModel()
|
||||
|
||||
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentDebugMemoryLeaksBinding {
|
||||
return FragmentDebugMemoryLeaksBinding.inflate(inflater, container, false)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
setViewListeners()
|
||||
}
|
||||
|
||||
private fun setViewListeners() {
|
||||
views.enableMemoryLeakAnalysis.onClick {
|
||||
viewModel.handle(DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis(views.enableMemoryLeakAnalysis.isChecked))
|
||||
}
|
||||
}
|
||||
|
||||
override fun invalidate() = withState(viewModel) { viewState ->
|
||||
views.enableMemoryLeakAnalysis.isChecked = viewState.isMemoryLeaksAnalysisEnabled
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.leak
|
||||
|
||||
import im.vector.app.core.platform.VectorViewModelAction
|
||||
|
||||
sealed interface DebugMemoryLeaksViewActions : VectorViewModelAction {
|
||||
data class EnableMemoryLeaksAnalysis(val isEnabled: Boolean) : DebugMemoryLeaksViewActions
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* 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.leak
|
||||
|
||||
import com.airbnb.mvrx.MavericksViewModelFactory
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import im.vector.app.core.debug.LeakDetector
|
||||
import im.vector.app.core.di.MavericksAssistedViewModelFactory
|
||||
import im.vector.app.core.di.hiltMavericksViewModelFactory
|
||||
import im.vector.app.core.platform.EmptyViewEvents
|
||||
import im.vector.app.core.platform.VectorViewModel
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class DebugMemoryLeaksViewModel @AssistedInject constructor(
|
||||
@Assisted initialState: DebugMemoryLeaksViewState,
|
||||
private val vectorPreferences: VectorPreferences,
|
||||
private val leakDetector: LeakDetector,
|
||||
) : VectorViewModel<DebugMemoryLeaksViewState, DebugMemoryLeaksViewActions, EmptyViewEvents>(initialState) {
|
||||
|
||||
@AssistedFactory
|
||||
interface Factory : MavericksAssistedViewModelFactory<DebugMemoryLeaksViewModel, DebugMemoryLeaksViewState> {
|
||||
override fun create(initialState: DebugMemoryLeaksViewState): DebugMemoryLeaksViewModel
|
||||
}
|
||||
|
||||
companion object : MavericksViewModelFactory<DebugMemoryLeaksViewModel, DebugMemoryLeaksViewState> by hiltMavericksViewModelFactory()
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
refreshStateFromPreferences()
|
||||
}
|
||||
}
|
||||
|
||||
override fun handle(action: DebugMemoryLeaksViewActions) {
|
||||
when (action) {
|
||||
is DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis -> handleEnableMemoryLeaksAnalysis(action)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleEnableMemoryLeaksAnalysis(action: DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis) {
|
||||
viewModelScope.launch {
|
||||
vectorPreferences.enableMemoryLeakAnalysis(action.isEnabled)
|
||||
leakDetector.enable(action.isEnabled)
|
||||
refreshStateFromPreferences()
|
||||
}
|
||||
}
|
||||
|
||||
private fun refreshStateFromPreferences() {
|
||||
setState { copy(isMemoryLeaksAnalysisEnabled = vectorPreferences.isMemoryLeakAnalysisEnabled()) }
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.leak
|
||||
|
||||
import com.airbnb.mvrx.MavericksState
|
||||
|
||||
data class DebugMemoryLeaksViewState(
|
||||
val isMemoryLeaksAnalysisEnabled: Boolean = false
|
||||
) : MavericksState
|
@ -29,19 +29,19 @@ import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPl
|
||||
import com.facebook.soloader.SoLoader
|
||||
import com.kgurgul.flipper.RealmDatabaseDriver
|
||||
import com.kgurgul.flipper.RealmDatabaseProvider
|
||||
import im.vector.app.core.debug.FlipperProxy
|
||||
import io.realm.RealmConfiguration
|
||||
import okhttp3.Interceptor
|
||||
import org.matrix.android.sdk.api.Matrix
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class FlipperProxy @Inject constructor(
|
||||
class VectorFlipperProxy @Inject constructor(
|
||||
private val context: Context,
|
||||
) {
|
||||
) : FlipperProxy {
|
||||
private val networkFlipperPlugin = NetworkFlipperPlugin()
|
||||
|
||||
fun init(matrix: Matrix) {
|
||||
override fun init(matrix: Matrix) {
|
||||
SoLoader.init(context, false)
|
||||
|
||||
if (FlipperUtils.shouldEnableFlipper(context)) {
|
||||
@ -65,8 +65,5 @@ class FlipperProxy @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("RedundantNullableReturnType")
|
||||
fun getNetworkInterceptor(): Interceptor? {
|
||||
return FlipperOkhttpInterceptor(networkFlipperPlugin)
|
||||
}
|
||||
override fun networkInterceptor() = FlipperOkhttpInterceptor(networkFlipperPlugin)
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.leakcanary
|
||||
|
||||
import im.vector.app.core.debug.LeakDetector
|
||||
import leakcanary.LeakCanary
|
||||
import javax.inject.Inject
|
||||
|
||||
class LeakCanaryLeakDetector @Inject constructor() : LeakDetector {
|
||||
override fun enable(enable: Boolean) {
|
||||
LeakCanary.config = LeakCanary.config.copy(dumpHeap = enable)
|
||||
}
|
||||
}
|
@ -22,14 +22,24 @@ import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.SharedPreferences
|
||||
import androidx.core.content.edit
|
||||
import im.vector.app.core.debug.DebugReceiver
|
||||
import im.vector.app.core.di.DefaultSharedPreferences
|
||||
import im.vector.app.core.utils.lsFiles
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Receiver to handle some command from ADB
|
||||
*/
|
||||
class DebugReceiver : BroadcastReceiver() {
|
||||
class VectorDebugReceiver @Inject constructor() : BroadcastReceiver(), DebugReceiver {
|
||||
|
||||
override fun register(context: Context) {
|
||||
context.registerReceiver(this, getIntentFilter(context))
|
||||
}
|
||||
|
||||
override fun unregister(context: Context) {
|
||||
context.unregisterReceiver(this)
|
||||
}
|
||||
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
Timber.v("Received debug action: ${intent.action}")
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/coordinatorLayout"
|
||||
android:layout_width="match_parent"
|
||||
@ -8,8 +9,11 @@
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/scrollView2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_anchor="@+id/scrollView2"
|
||||
app:layout_anchorGravity="center">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
@ -38,6 +42,12 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Analytics" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_memory_leaks"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Memory leaks" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/debug_test_text_view_link"
|
||||
android:layout_width="wrap_content"
|
||||
|
32
vector/src/debug/res/layout/fragment_debug_memory_leaks.xml
Normal file
32
vector/src/debug/res/layout/fragment_debug_memory_leaks.xml
Normal file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/coordinatorLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".features.debug.settings.DebugPrivateSettingsActivity"
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:divider="@drawable/linear_divider"
|
||||
android:orientation="vertical"
|
||||
android:padding="@dimen/layout_horizontal_margin"
|
||||
android:showDividers="middle">
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/enableMemoryLeakAnalysis"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Enable memory leak analysis" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
@ -17,20 +17,46 @@
|
||||
package im.vector.app.di
|
||||
|
||||
import android.content.Context
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.services.GuardServiceStarter
|
||||
import im.vector.app.fdroid.service.FDroidGuardServiceStarter
|
||||
import im.vector.app.features.home.NightlyProxy
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import im.vector.app.features.settings.legals.FlavorLegals
|
||||
import im.vector.app.push.fcm.FdroidFcmHelper
|
||||
|
||||
@InstallIn(SingletonComponent::class)
|
||||
@Module
|
||||
object FlavorModule {
|
||||
abstract class FlavorModule {
|
||||
|
||||
@Provides
|
||||
fun provideGuardServiceStarter(preferences: VectorPreferences, appContext: Context): GuardServiceStarter {
|
||||
return FDroidGuardServiceStarter(preferences, appContext)
|
||||
companion object {
|
||||
@Provides
|
||||
fun provideGuardServiceStarter(preferences: VectorPreferences, appContext: Context): GuardServiceStarter {
|
||||
return FDroidGuardServiceStarter(preferences, appContext)
|
||||
}
|
||||
|
||||
@Provides
|
||||
fun provideNightlyProxy() = object : NightlyProxy {
|
||||
override fun onHomeResumed() {
|
||||
// no op
|
||||
}
|
||||
}
|
||||
|
||||
@Provides
|
||||
fun providesFlavorLegals() = object : FlavorLegals {
|
||||
override fun hasThirdPartyNotices() = false
|
||||
|
||||
override fun navigateToThirdPartyNotices(context: Context) {
|
||||
// no op
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Binds
|
||||
abstract fun bindsFcmHelper(fcmHelper: FdroidFcmHelper): FcmHelper
|
||||
}
|
||||
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.di
|
||||
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.components.ActivityComponent
|
||||
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
|
||||
import im.vector.app.push.fcm.FdroidNotificationTroubleshootTestManagerFactory
|
||||
|
||||
@InstallIn(ActivityComponent::class)
|
||||
@Module
|
||||
abstract class NotificationTestModule {
|
||||
@Binds
|
||||
abstract fun bindsNotificationTestFactory(factory: FdroidNotificationTroubleshootTestManagerFactory): NotificationTroubleshootTestManagerFactory
|
||||
}
|
@ -20,6 +20,7 @@ package im.vector.app.push.fcm
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.pushers.PushersManager
|
||||
import im.vector.app.fdroid.BackgroundSyncStarter
|
||||
import im.vector.app.fdroid.receiver.AlarmSyncBroadcastReceiver
|
||||
@ -28,47 +29,32 @@ import javax.inject.Inject
|
||||
/**
|
||||
* This class has an alter ego in the gplay variant.
|
||||
*/
|
||||
class FcmHelper @Inject constructor(
|
||||
class FdroidFcmHelper @Inject constructor(
|
||||
private val context: Context,
|
||||
private val backgroundSyncStarter: BackgroundSyncStarter,
|
||||
) {
|
||||
) : FcmHelper {
|
||||
|
||||
fun isFirebaseAvailable(): Boolean = false
|
||||
override fun isFirebaseAvailable(): Boolean = false
|
||||
|
||||
/**
|
||||
* Retrieves the FCM registration token.
|
||||
*
|
||||
* @return the FCM token or null if not received from FCM
|
||||
*/
|
||||
fun getFcmToken(): String? {
|
||||
override fun getFcmToken(): String? {
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Store FCM token to the SharedPrefs
|
||||
*
|
||||
* @param token the token to store
|
||||
*/
|
||||
fun storeFcmToken(token: String?) {
|
||||
override fun storeFcmToken(token: String?) {
|
||||
// No op
|
||||
}
|
||||
|
||||
/**
|
||||
* onNewToken may not be called on application upgrade, so ensure my shared pref is set
|
||||
*
|
||||
* @param activity the first launch Activity
|
||||
*/
|
||||
fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
|
||||
override fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
|
||||
// No op
|
||||
}
|
||||
|
||||
fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
|
||||
override fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
|
||||
// try to stop all regardless of background mode
|
||||
activeSessionHolder.getSafeActiveSession()?.syncService()?.stopAnyBackgroundSync()
|
||||
AlarmSyncBroadcastReceiver.cancelAlarm(context)
|
||||
}
|
||||
|
||||
fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
|
||||
override fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
|
||||
backgroundSyncStarter.start(activeSessionHolder)
|
||||
}
|
||||
}
|
@ -21,6 +21,7 @@ import im.vector.app.fdroid.features.settings.troubleshoot.TestAutoStartBoot
|
||||
import im.vector.app.fdroid.features.settings.troubleshoot.TestBackgroundRestrictions
|
||||
import im.vector.app.fdroid.features.settings.troubleshoot.TestBatteryOptimization
|
||||
import im.vector.app.features.VectorFeatures
|
||||
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
|
||||
import im.vector.app.features.settings.troubleshoot.NotificationTroubleshootTestManager
|
||||
import im.vector.app.features.settings.troubleshoot.TestAccountSettings
|
||||
import im.vector.app.features.settings.troubleshoot.TestAvailableUnifiedPushDistributors
|
||||
@ -35,7 +36,7 @@ import im.vector.app.features.settings.troubleshoot.TestUnifiedPushEndpoint
|
||||
import im.vector.app.features.settings.troubleshoot.TestUnifiedPushGateway
|
||||
import javax.inject.Inject
|
||||
|
||||
class NotificationTroubleshootTestManagerFactory @Inject constructor(
|
||||
class FdroidNotificationTroubleshootTestManagerFactory @Inject constructor(
|
||||
private val unifiedPushHelper: UnifiedPushHelper,
|
||||
private val testSystemSettings: TestSystemSettings,
|
||||
private val testAccountSettings: TestAccountSettings,
|
||||
@ -52,9 +53,9 @@ class NotificationTroubleshootTestManagerFactory @Inject constructor(
|
||||
private val testBatteryOptimization: TestBatteryOptimization,
|
||||
private val testNotification: TestNotification,
|
||||
private val vectorFeatures: VectorFeatures,
|
||||
) {
|
||||
) : NotificationTroubleshootTestManagerFactory {
|
||||
|
||||
fun create(fragment: Fragment): NotificationTroubleshootTestManager {
|
||||
override fun create(fragment: Fragment): NotificationTroubleshootTestManager {
|
||||
val mgr = NotificationTroubleshootTestManager(fragment)
|
||||
mgr.addTest(testSystemSettings)
|
||||
mgr.addTest(testAccountSettings)
|
33
vector/src/gplay/java/im/vector/app/GoogleFlavorLegals.kt
Normal file
33
vector/src/gplay/java/im/vector/app/GoogleFlavorLegals.kt
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
|
||||
import im.vector.app.features.settings.legals.FlavorLegals
|
||||
import javax.inject.Inject
|
||||
|
||||
class GoogleFlavorLegals @Inject constructor() : FlavorLegals {
|
||||
|
||||
override fun hasThirdPartyNotices() = true
|
||||
|
||||
override fun navigateToThirdPartyNotices(context: Context) {
|
||||
// See https://developers.google.com/android/guides/opensource
|
||||
context.startActivity(Intent(context, OssLicensesMenuActivity::class.java))
|
||||
}
|
||||
}
|
@ -16,18 +16,36 @@
|
||||
|
||||
package im.vector.app.di
|
||||
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import im.vector.app.GoogleFlavorLegals
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.services.GuardServiceStarter
|
||||
import im.vector.app.features.home.NightlyProxy
|
||||
import im.vector.app.features.settings.legals.FlavorLegals
|
||||
import im.vector.app.nightly.FirebaseNightlyProxy
|
||||
import im.vector.app.push.fcm.GoogleFcmHelper
|
||||
|
||||
@InstallIn(SingletonComponent::class)
|
||||
@Module
|
||||
object FlavorModule {
|
||||
abstract class FlavorModule {
|
||||
|
||||
@Provides
|
||||
fun provideGuardServiceStarter(): GuardServiceStarter {
|
||||
return object : GuardServiceStarter {}
|
||||
companion object {
|
||||
@Provides
|
||||
fun provideGuardServiceStarter(): GuardServiceStarter {
|
||||
return object : GuardServiceStarter {}
|
||||
}
|
||||
}
|
||||
|
||||
@Binds
|
||||
abstract fun bindsNightlyProxy(nightlyProxy: FirebaseNightlyProxy): NightlyProxy
|
||||
|
||||
@Binds
|
||||
abstract fun bindsFcmHelper(fcmHelper: GoogleFcmHelper): FcmHelper
|
||||
|
||||
@Binds
|
||||
abstract fun bindsFlavorLegals(legals: GoogleFlavorLegals): FlavorLegals
|
||||
}
|
||||
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) 2022 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.di
|
||||
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.components.ActivityComponent
|
||||
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
|
||||
import im.vector.app.push.fcm.GoogleNotificationTroubleshootTestManagerFactory
|
||||
|
||||
@InstallIn(ActivityComponent::class)
|
||||
@Module
|
||||
abstract class NotificationTestModule {
|
||||
@Binds
|
||||
abstract fun bindsNotificationTestFactory(factory: GoogleNotificationTroubleshootTestManagerFactory): NotificationTroubleshootTestManagerFactory
|
||||
}
|
@ -20,10 +20,10 @@ import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.google.firebase.messaging.FirebaseMessaging
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.core.utils.startAddGoogleAccountIntent
|
||||
import im.vector.app.features.settings.troubleshoot.TroubleshootTest
|
||||
import im.vector.app.push.fcm.FcmHelper
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
|
@ -23,10 +23,10 @@ import androidx.work.WorkInfo
|
||||
import androidx.work.WorkManager
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.pushers.PushersManager
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.features.settings.troubleshoot.TroubleshootTest
|
||||
import im.vector.app.push.fcm.FcmHelper
|
||||
import org.matrix.android.sdk.api.session.pushers.PusherState
|
||||
import javax.inject.Inject
|
||||
|
||||
|
@ -23,15 +23,17 @@ import com.google.firebase.appdistribution.FirebaseAppDistributionException
|
||||
import im.vector.app.BuildConfig
|
||||
import im.vector.app.core.di.DefaultPreferences
|
||||
import im.vector.app.core.time.Clock
|
||||
import im.vector.app.features.home.NightlyProxy
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
class NightlyProxy @Inject constructor(
|
||||
class FirebaseNightlyProxy @Inject constructor(
|
||||
private val clock: Clock,
|
||||
@DefaultPreferences
|
||||
private val sharedPreferences: SharedPreferences,
|
||||
) {
|
||||
fun onHomeResumed() {
|
||||
) : NightlyProxy {
|
||||
|
||||
override fun onHomeResumed() {
|
||||
if (!canDisplayPopup()) return
|
||||
val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
|
||||
firebaseAppDistribution.updateIfNewReleaseAvailable()
|
@ -25,6 +25,7 @@ import com.google.firebase.messaging.FirebaseMessaging
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.di.DefaultSharedPreferences
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.pushers.PushersManager
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
@ -33,44 +34,29 @@ import javax.inject.Inject
|
||||
* This class store the FCM token in SharedPrefs and ensure this token is retrieved.
|
||||
* It has an alter ego in the fdroid variant.
|
||||
*/
|
||||
class FcmHelper @Inject constructor(
|
||||
class GoogleFcmHelper @Inject constructor(
|
||||
context: Context,
|
||||
) {
|
||||
) : FcmHelper {
|
||||
companion object {
|
||||
private const val PREFS_KEY_FCM_TOKEN = "FCM_TOKEN"
|
||||
}
|
||||
|
||||
private val sharedPrefs = DefaultSharedPreferences.getInstance(context)
|
||||
|
||||
fun isFirebaseAvailable(): Boolean = true
|
||||
override fun isFirebaseAvailable(): Boolean = true
|
||||
|
||||
/**
|
||||
* Retrieves the FCM registration token.
|
||||
*
|
||||
* @return the FCM token or null if not received from FCM
|
||||
*/
|
||||
fun getFcmToken(): String? {
|
||||
override fun getFcmToken(): String? {
|
||||
return sharedPrefs.getString(PREFS_KEY_FCM_TOKEN, null)
|
||||
}
|
||||
|
||||
/**
|
||||
* Store FCM token to the SharedPrefs
|
||||
* TODO Store in realm
|
||||
*
|
||||
* @param token the token to store
|
||||
*/
|
||||
fun storeFcmToken(token: String?) {
|
||||
override fun storeFcmToken(token: String?) {
|
||||
// TODO Store in realm
|
||||
sharedPrefs.edit {
|
||||
putString(PREFS_KEY_FCM_TOKEN, token)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* onNewToken may not be called on application upgrade, so ensure my shared pref is set
|
||||
*
|
||||
* @param activity the first launch Activity
|
||||
*/
|
||||
fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
|
||||
override fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
|
||||
// if (TextUtils.isEmpty(getFcmToken(activity))) {
|
||||
// 'app should always check the device for a compatible Google Play services APK before accessing Google Play services features'
|
||||
if (checkPlayServices(activity)) {
|
||||
@ -105,13 +91,11 @@ class FcmHelper @Inject constructor(
|
||||
return resultCode == ConnectionResult.SUCCESS
|
||||
}
|
||||
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
|
||||
override fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
|
||||
// No op
|
||||
}
|
||||
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
|
||||
override fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
|
||||
// No op
|
||||
}
|
||||
}
|
@ -18,6 +18,7 @@ package im.vector.app.push.fcm
|
||||
import androidx.fragment.app.Fragment
|
||||
import im.vector.app.core.pushers.UnifiedPushHelper
|
||||
import im.vector.app.features.VectorFeatures
|
||||
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
|
||||
import im.vector.app.features.settings.troubleshoot.NotificationTroubleshootTestManager
|
||||
import im.vector.app.features.settings.troubleshoot.TestAccountSettings
|
||||
import im.vector.app.features.settings.troubleshoot.TestAvailableUnifiedPushDistributors
|
||||
@ -35,7 +36,7 @@ import im.vector.app.gplay.features.settings.troubleshoot.TestPlayServices
|
||||
import im.vector.app.gplay.features.settings.troubleshoot.TestTokenRegistration
|
||||
import javax.inject.Inject
|
||||
|
||||
class NotificationTroubleshootTestManagerFactory @Inject constructor(
|
||||
class GoogleNotificationTroubleshootTestManagerFactory @Inject constructor(
|
||||
private val unifiedPushHelper: UnifiedPushHelper,
|
||||
private val testSystemSettings: TestSystemSettings,
|
||||
private val testAccountSettings: TestAccountSettings,
|
||||
@ -52,9 +53,9 @@ class NotificationTroubleshootTestManagerFactory @Inject constructor(
|
||||
private val testPushFromPushGateway: TestPushFromPushGateway,
|
||||
private val testNotification: TestNotification,
|
||||
private val vectorFeatures: VectorFeatures,
|
||||
) {
|
||||
) : NotificationTroubleshootTestManagerFactory {
|
||||
|
||||
fun create(fragment: Fragment): NotificationTroubleshootTestManager {
|
||||
override fun create(fragment: Fragment): NotificationTroubleshootTestManager {
|
||||
val mgr = NotificationTroubleshootTestManager(fragment)
|
||||
mgr.addTest(testSystemSettings)
|
||||
mgr.addTest(testAccountSettings)
|
@ -187,7 +187,6 @@
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value=".features.home.HomeActivity" />
|
||||
</activity>
|
||||
<activity android:name=".features.debug.DebugMenuActivity" />
|
||||
<activity android:name=".features.createdirect.CreateDirectRoomActivity" />
|
||||
<activity android:name=".features.invite.InviteUsersToRoomActivity" />
|
||||
<activity android:name=".features.webview.VectorWebViewActivity" />
|
||||
|
@ -45,7 +45,10 @@ import com.vanniktech.emoji.EmojiManager
|
||||
import com.vanniktech.emoji.google.GoogleEmojiProvider
|
||||
import dagger.hilt.android.HiltAndroidApp
|
||||
import im.vector.app.config.Config
|
||||
import im.vector.app.core.debug.FlipperProxy
|
||||
import im.vector.app.core.debug.LeakDetector
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.pushers.FcmHelper
|
||||
import im.vector.app.core.resources.BuildMeta
|
||||
import im.vector.app.features.analytics.VectorAnalytics
|
||||
import im.vector.app.features.call.webrtc.WebRtcCallManager
|
||||
@ -63,8 +66,6 @@ import im.vector.app.features.settings.VectorLocale
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import im.vector.app.features.themes.ThemeUtils
|
||||
import im.vector.app.features.version.VersionProvider
|
||||
import im.vector.app.flipper.FlipperProxy
|
||||
import im.vector.app.push.fcm.FcmHelper
|
||||
import org.jitsi.meet.sdk.log.JitsiMeetDefaultLogHandler
|
||||
import org.matrix.android.sdk.api.Matrix
|
||||
import org.matrix.android.sdk.api.auth.AuthenticationService
|
||||
@ -106,6 +107,7 @@ class VectorApplication :
|
||||
@Inject lateinit var matrix: Matrix
|
||||
@Inject lateinit var fcmHelper: FcmHelper
|
||||
@Inject lateinit var buildMeta: BuildMeta
|
||||
@Inject lateinit var leakDetector: LeakDetector
|
||||
|
||||
// font thread handler
|
||||
private var fontThreadHandler: Handler? = null
|
||||
@ -201,6 +203,8 @@ class VectorApplication :
|
||||
|
||||
// Initialize Mapbox before inflating mapViews
|
||||
Mapbox.getInstance(this)
|
||||
|
||||
initMemoryLeakAnalysis()
|
||||
}
|
||||
|
||||
private fun configureEpoxy() {
|
||||
@ -266,4 +270,8 @@ class VectorApplication :
|
||||
handlerThread.start()
|
||||
return Handler(handlerThread.looper)
|
||||
}
|
||||
|
||||
private fun initMemoryLeakAnalysis() {
|
||||
leakDetector.enable(vectorPreferences.isMemoryLeakAnalysisEnabled())
|
||||
}
|
||||
}
|
||||
|
@ -14,10 +14,10 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.nightly
|
||||
package im.vector.app.core.debug
|
||||
|
||||
import javax.inject.Inject
|
||||
import android.content.Context
|
||||
|
||||
class NightlyProxy @Inject constructor() {
|
||||
fun onHomeResumed() = Unit
|
||||
interface DebugNavigator {
|
||||
fun openDebugMenu(context: Context)
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2020 New Vector Ltd
|
||||
* Copyright (c) 2022 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.
|
||||
@ -14,9 +14,11 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app
|
||||
package im.vector.app.core.debug
|
||||
|
||||
import android.content.Context
|
||||
|
||||
// No op
|
||||
fun openOssLicensesMenuActivity(@Suppress("UNUSED_PARAMETER") context: Context) = Unit
|
||||
interface DebugReceiver {
|
||||
fun register(context: Context)
|
||||
fun unregister(context: Context)
|
||||
}
|
@ -14,18 +14,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.flipper
|
||||
package im.vector.app.core.debug
|
||||
|
||||
import okhttp3.Interceptor
|
||||
import org.matrix.android.sdk.api.Matrix
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* No op version.
|
||||
*/
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
class FlipperProxy @Inject constructor() {
|
||||
fun init(matrix: Matrix) {}
|
||||
|
||||
fun getNetworkInterceptor(): Interceptor? = null
|
||||
interface FlipperProxy {
|
||||
fun init(matrix: Matrix)
|
||||
fun networkInterceptor(): Interceptor?
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2019 New Vector Ltd
|
||||
* Copyright (c) 2022 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.
|
||||
@ -14,9 +14,11 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.app.features.debug
|
||||
package im.vector.app.core.debug
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
// This activity is not accessible
|
||||
class DebugMenuActivity : AppCompatActivity()
|
||||
/**
|
||||
* Used for memory leak analysis control.
|
||||
*/
|
||||
interface LeakDetector {
|
||||
fun enable(enable: Boolean)
|
||||
}
|
@ -80,24 +80,6 @@ import im.vector.app.features.login.LoginSplashFragment
|
||||
import im.vector.app.features.login.LoginWaitForEmailFragment
|
||||
import im.vector.app.features.login.LoginWebFragment
|
||||
import im.vector.app.features.login.terms.LoginTermsFragment
|
||||
import im.vector.app.features.login2.LoginCaptchaFragment2
|
||||
import im.vector.app.features.login2.LoginFragmentSigninPassword2
|
||||
import im.vector.app.features.login2.LoginFragmentSigninUsername2
|
||||
import im.vector.app.features.login2.LoginFragmentSignupPassword2
|
||||
import im.vector.app.features.login2.LoginFragmentSignupUsername2
|
||||
import im.vector.app.features.login2.LoginFragmentToAny2
|
||||
import im.vector.app.features.login2.LoginGenericTextInputFormFragment2
|
||||
import im.vector.app.features.login2.LoginResetPasswordFragment2
|
||||
import im.vector.app.features.login2.LoginResetPasswordMailConfirmationFragment2
|
||||
import im.vector.app.features.login2.LoginResetPasswordSuccessFragment2
|
||||
import im.vector.app.features.login2.LoginServerSelectionFragment2
|
||||
import im.vector.app.features.login2.LoginServerUrlFormFragment2
|
||||
import im.vector.app.features.login2.LoginSplashSignUpSignInSelectionFragment2
|
||||
import im.vector.app.features.login2.LoginSsoOnlyFragment2
|
||||
import im.vector.app.features.login2.LoginWaitForEmailFragment2
|
||||
import im.vector.app.features.login2.LoginWebFragment2
|
||||
import im.vector.app.features.login2.created.AccountCreatedFragment
|
||||
import im.vector.app.features.login2.terms.LoginTermsFragment2
|
||||
import im.vector.app.features.matrixto.MatrixToRoomSpaceFragment
|
||||
import im.vector.app.features.matrixto.MatrixToUserFragment
|
||||
import im.vector.app.features.onboarding.ftueauth.FtueAuthAccountCreatedFragment
|
||||
@ -340,96 +322,6 @@ interface FragmentModule {
|
||||
@FragmentKey(LoginWaitForEmailFragment::class)
|
||||
fun bindLoginWaitForEmailFragment(fragment: LoginWaitForEmailFragment): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginFragmentSigninUsername2::class)
|
||||
fun bindLoginFragmentSigninUsername2(fragment: LoginFragmentSigninUsername2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(AccountCreatedFragment::class)
|
||||
fun bindAccountCreatedFragment(fragment: AccountCreatedFragment): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginFragmentSignupUsername2::class)
|
||||
fun bindLoginFragmentSignupUsername2(fragment: LoginFragmentSignupUsername2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginFragmentSigninPassword2::class)
|
||||
fun bindLoginFragmentSigninPassword2(fragment: LoginFragmentSigninPassword2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginFragmentSignupPassword2::class)
|
||||
fun bindLoginFragmentSignupPassword2(fragment: LoginFragmentSignupPassword2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginCaptchaFragment2::class)
|
||||
fun bindLoginCaptchaFragment2(fragment: LoginCaptchaFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginFragmentToAny2::class)
|
||||
fun bindLoginFragmentToAny2(fragment: LoginFragmentToAny2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginTermsFragment2::class)
|
||||
fun bindLoginTermsFragment2(fragment: LoginTermsFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginServerUrlFormFragment2::class)
|
||||
fun bindLoginServerUrlFormFragment2(fragment: LoginServerUrlFormFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginResetPasswordMailConfirmationFragment2::class)
|
||||
fun bindLoginResetPasswordMailConfirmationFragment2(fragment: LoginResetPasswordMailConfirmationFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginResetPasswordFragment2::class)
|
||||
fun bindLoginResetPasswordFragment2(fragment: LoginResetPasswordFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginResetPasswordSuccessFragment2::class)
|
||||
fun bindLoginResetPasswordSuccessFragment2(fragment: LoginResetPasswordSuccessFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginServerSelectionFragment2::class)
|
||||
fun bindLoginServerSelectionFragment2(fragment: LoginServerSelectionFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginSsoOnlyFragment2::class)
|
||||
fun bindLoginSsoOnlyFragment2(fragment: LoginSsoOnlyFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginSplashSignUpSignInSelectionFragment2::class)
|
||||
fun bindLoginSplashSignUpSignInSelectionFragment2(fragment: LoginSplashSignUpSignInSelectionFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginWebFragment2::class)
|
||||
fun bindLoginWebFragment2(fragment: LoginWebFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginGenericTextInputFormFragment2::class)
|
||||
fun bindLoginGenericTextInputFormFragment2(fragment: LoginGenericTextInputFormFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(LoginWaitForEmailFragment2::class)
|
||||
fun bindLoginWaitForEmailFragment2(fragment: LoginWaitForEmailFragment2): Fragment
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FragmentKey(FtueAuthLegacyStyleCaptchaFragment::class)
|
||||
|
@ -58,8 +58,6 @@ import im.vector.app.features.location.LocationSharingViewModel
|
||||
import im.vector.app.features.location.live.map.LiveLocationMapViewModel
|
||||
import im.vector.app.features.location.preview.LocationPreviewViewModel
|
||||
import im.vector.app.features.login.LoginViewModel
|
||||
import im.vector.app.features.login2.LoginViewModel2
|
||||
import im.vector.app.features.login2.created.AccountCreatedViewModel
|
||||
import im.vector.app.features.matrixto.MatrixToBottomSheetViewModel
|
||||
import im.vector.app.features.media.VectorAttachmentViewerViewModel
|
||||
import im.vector.app.features.onboarding.OnboardingViewModel
|
||||
@ -456,21 +454,11 @@ interface MavericksViewModelModule {
|
||||
@MavericksViewModelKey(MatrixToBottomSheetViewModel::class)
|
||||
fun matrixToBottomSheetViewModelFactory(factory: MatrixToBottomSheetViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@MavericksViewModelKey(AccountCreatedViewModel::class)
|
||||
fun accountCreatedViewModelFactory(factory: AccountCreatedViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@MavericksViewModelKey(OnboardingViewModel::class)
|
||||
fun onboardingViewModelFactory(factory: OnboardingViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@MavericksViewModelKey(LoginViewModel2::class)
|
||||
fun loginViewModel2Factory(factory: LoginViewModel2.Factory): MavericksAssistedViewModelFactory<*, *>
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@MavericksViewModelKey(LoginViewModel::class)
|
||||
|
@ -34,6 +34,7 @@ import im.vector.app.EmojiSpanify
|
||||
import im.vector.app.SpaceStateHandler
|
||||
import im.vector.app.SpaceStateHandlerImpl
|
||||
import im.vector.app.config.Config
|
||||
import im.vector.app.core.debug.FlipperProxy
|
||||
import im.vector.app.core.dispatchers.CoroutineDispatchers
|
||||
import im.vector.app.core.error.DefaultErrorFormatter
|
||||
import im.vector.app.core.error.ErrorFormatter
|
||||
@ -57,7 +58,6 @@ import im.vector.app.features.settings.FontScalePreferencesImpl
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import im.vector.app.features.ui.SharedPreferencesUiStateRepository
|
||||
import im.vector.app.features.ui.UiStateRepository
|
||||
import im.vector.app.flipper.FlipperProxy
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -144,7 +144,7 @@ object VectorStaticModule {
|
||||
roomDisplayNameFallbackProvider = vectorRoomDisplayNameFallbackProvider,
|
||||
threadMessagesEnabledDefault = vectorPreferences.areThreadMessagesEnabled(),
|
||||
networkInterceptors = listOfNotNull(
|
||||
flipperProxy.getNetworkInterceptor(),
|
||||
flipperProxy.networkInterceptor(),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ import im.vector.app.features.home.HomeSharedActionViewModel
|
||||
import im.vector.app.features.home.room.detail.RoomDetailSharedActionViewModel
|
||||
import im.vector.app.features.home.room.detail.timeline.action.MessageSharedActionViewModel
|
||||
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel
|
||||
import im.vector.app.features.home.room.list.actions.RoomListSharedActionViewModel
|
||||
import im.vector.app.features.reactions.EmojiChooserViewModel
|
||||
import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel
|
||||
@ -157,4 +158,9 @@ interface ViewModelModule {
|
||||
@IntoMap
|
||||
@ViewModelKey(SpacePeopleSharedActionViewModel::class)
|
||||
fun bindSpacePeopleSharedActionViewModel(viewModel: SpacePeopleSharedActionViewModel): ViewModel
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(RoomListSharedActionViewModel::class)
|
||||
fun bindRoomListSharedActionViewModel(viewModel: RoomListSharedActionViewModel): ViewModel
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ fun Fragment.queryExportKeys(userId: String, activityResultLauncher: ActivityRes
|
||||
selectTxtFileToWrite(
|
||||
activity = requireActivity(),
|
||||
activityResultLauncher = activityResultLauncher,
|
||||
defaultFileName = "$appName-megolm-export-$userId-$timestamp.txt",
|
||||
defaultFileName = "$appName-megolm-export-$userId-${timestamp}.txt",
|
||||
chooserHint = getString(R.string.keys_backup_setup_step1_manual_export)
|
||||
)
|
||||
}
|
||||
@ -187,7 +187,7 @@ fun Activity.queryExportKeys(userId: String, activityResultLauncher: ActivityRes
|
||||
selectTxtFileToWrite(
|
||||
activity = this,
|
||||
activityResultLauncher = activityResultLauncher,
|
||||
defaultFileName = "$appName-megolm-export-$userId-$timestamp.txt",
|
||||
defaultFileName = "$appName-megolm-export-$userId-${timestamp}.txt",
|
||||
chooserHint = getString(R.string.keys_backup_setup_step1_manual_export)
|
||||
)
|
||||
}
|
||||
|
@ -55,6 +55,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import dagger.hilt.android.EntryPointAccessors
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.debug.DebugReceiver
|
||||
import im.vector.app.core.di.ActiveSessionHolder
|
||||
import im.vector.app.core.di.ActivityEntryPoint
|
||||
import im.vector.app.core.dialogs.DialogLocker
|
||||
@ -91,7 +92,6 @@ import im.vector.app.features.settings.FontScalePreferencesImpl
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import im.vector.app.features.themes.ActivityOtherThemes
|
||||
import im.vector.app.features.themes.ThemeUtils
|
||||
import im.vector.app.receivers.DebugReceiver
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import org.matrix.android.sdk.api.extensions.orFalse
|
||||
@ -161,6 +161,9 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
|
||||
@Inject lateinit var buildMeta: BuildMeta
|
||||
@Inject lateinit var fontScalePreferences: FontScalePreferences
|
||||
|
||||
// For debug only
|
||||
@Inject lateinit var debugReceiver: DebugReceiver
|
||||
|
||||
@Inject
|
||||
lateinit var vectorFeatures: VectorFeatures
|
||||
|
||||
@ -176,9 +179,6 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
|
||||
|
||||
private var savedInstanceState: Bundle? = null
|
||||
|
||||
// For debug only
|
||||
private var debugReceiver: DebugReceiver? = null
|
||||
|
||||
private val restorables = ArrayList<Restorable>()
|
||||
|
||||
override fun attachBaseContext(base: Context) {
|
||||
@ -418,13 +418,7 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
|
||||
if (this !is BugReportActivity && vectorPreferences.useRageshake()) {
|
||||
rageShake.start()
|
||||
}
|
||||
DebugReceiver
|
||||
.getIntentFilter(this)
|
||||
.takeIf { buildMeta.isDebug }
|
||||
?.let {
|
||||
debugReceiver = DebugReceiver()
|
||||
registerReceiver(debugReceiver, it)
|
||||
}
|
||||
debugReceiver.register(this)
|
||||
}
|
||||
|
||||
private val postResumeScheduledActions = mutableListOf<() -> Unit>()
|
||||
@ -454,11 +448,7 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
|
||||
Timber.i("onPause Activity ${javaClass.simpleName}")
|
||||
|
||||
rageShake.stop()
|
||||
|
||||
debugReceiver?.let {
|
||||
unregisterReceiver(debugReceiver)
|
||||
debugReceiver = null
|
||||
}
|
||||
debugReceiver.unregister(this)
|
||||
}
|
||||
|
||||
override fun onWindowFocusChanged(hasFocus: Boolean) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user