Merge branch 'release/1.3.16' into main
This commit is contained in:
commit
c657586de3
5
.github/ISSUE_TEMPLATE/bug.yml
vendored
5
.github/ISSUE_TEMPLATE/bug.yml
vendored
@ -57,8 +57,9 @@ body:
|
|||||||
id: homeserver
|
id: homeserver
|
||||||
attributes:
|
attributes:
|
||||||
label: Homeserver
|
label: Homeserver
|
||||||
description: Which server is your account registered on?
|
description: |
|
||||||
placeholder: e.g. matrix.org
|
Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version.
|
||||||
|
placeholder: e.g. matrix.org or Synapse 1.50.0rc1
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
|
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
@ -10,6 +10,8 @@ updates:
|
|||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "weekly"
|
||||||
|
ignore:
|
||||||
|
- dependency-name: "*github-script*"
|
||||||
# Updates for Gradle dependencies used in the app
|
# Updates for Gradle dependencies used in the app
|
||||||
- package-ecosystem: gradle
|
- package-ecosystem: gradle
|
||||||
directory: "/"
|
directory: "/"
|
||||||
|
86
.github/workflows/integration.yml
vendored
86
.github/workflows/integration.yml
vendored
@ -1,86 +0,0 @@
|
|||||||
name: Integration Test
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request: { }
|
|
||||||
push:
|
|
||||||
branches: [ main, develop ]
|
|
||||||
|
|
||||||
# Enrich gradle.properties for CI/CD
|
|
||||||
env:
|
|
||||||
CI_GRADLE_ARG_PROPERTIES: >
|
|
||||||
-Porg.gradle.jvmargs=-Xmx2g
|
|
||||||
-Porg.gradle.parallel=false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Temporary add build of Android tests, which cannot be run on the CI right now, but they need to at least compile
|
|
||||||
# So it will be mandatory for this action to be successful on every PRs
|
|
||||||
compile-android-test:
|
|
||||||
name: Compile Android tests
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-gradle-
|
|
||||||
- name: Compile Android tests
|
|
||||||
run: ./gradlew clean assembleAndroidTest $CI_GRADLE_ARG_PROPERTIES --stacktrace -PallWarningsAsErrors=false
|
|
||||||
|
|
||||||
integration-tests:
|
|
||||||
name: Integration Tests (Synapse)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
api-level: [28]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
|
||||||
- uses: actions/setup-java@v2
|
|
||||||
with:
|
|
||||||
distribution: 'adopt'
|
|
||||||
java-version: 11
|
|
||||||
- name: Set up Python 3.8
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: 3.8
|
|
||||||
- name: Cache pip
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
${{ runner.os }}-
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-gradle-
|
|
||||||
- name: Start synapse server
|
|
||||||
run: |
|
|
||||||
python3 -m venv .synapse
|
|
||||||
source .synapse/bin/activate
|
|
||||||
pip install synapse matrix-synapse
|
|
||||||
curl -sL https://raw.githubusercontent.com/matrix-org/synapse/develop/demo/start.sh --no-rate-limit \
|
|
||||||
| sed s/127.0.0.1/0.0.0.0/g | bash
|
|
||||||
- name: Run integration tests on API ${{ matrix.api-level }}
|
|
||||||
uses: reactivecircus/android-emulator-runner@v2
|
|
||||||
with:
|
|
||||||
api-level: ${{ matrix.api-level }}
|
|
||||||
#arch: x86_64
|
|
||||||
#disable-animations: true
|
|
||||||
# script: ./gradlew -PallWarningsAsErrors=false vector:connectedAndroidTest matrix-sdk-android:connectedAndroidTest
|
|
||||||
arch: x86
|
|
||||||
profile: Nexus 5X
|
|
||||||
force-avd-creation: false
|
|
||||||
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
|
||||||
emulator-build: 7425822
|
|
||||||
script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -PallWarningsAsErrors=false connectedCheck --stacktrace
|
|
208
.github/workflows/integration_tests.yml
vendored
Normal file
208
.github/workflows/integration_tests.yml
vendored
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
name: Integration Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request: { }
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
|
||||||
|
# Enrich gradle.properties for CI/CD
|
||||||
|
env:
|
||||||
|
CI_GRADLE_ARG_PROPERTIES: >
|
||||||
|
-Porg.gradle.jvmargs=-Xmx2g
|
||||||
|
-Porg.gradle.parallel=false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Build Android Tests [Matrix SDK]
|
||||||
|
build-android-test-matrix-sdk:
|
||||||
|
name: Matrix SDK - Build Android Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
- name: Build Android Tests for matrix-sdk-android
|
||||||
|
run: ./gradlew clean matrix-sdk-android:assembleAndroidTest $CI_GRADLE_ARG_PROPERTIES --stacktrace -PallWarningsAsErrors=false
|
||||||
|
|
||||||
|
# Build Android Tests [Matrix APP]
|
||||||
|
build-android-test-app:
|
||||||
|
name: App - Build Android Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
- name: Build Android Tests for vector
|
||||||
|
run: ./gradlew clean vector:assembleAndroidTest $CI_GRADLE_ARG_PROPERTIES --stacktrace -PallWarningsAsErrors=false
|
||||||
|
|
||||||
|
# Run Android Tests
|
||||||
|
integration-tests:
|
||||||
|
name: Matrix SDK - Running Integration Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
api-level: [ 28 ]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: gradle/wrapper-validation-action@v1
|
||||||
|
- uses: actions/setup-java@v2
|
||||||
|
with:
|
||||||
|
distribution: 'adopt'
|
||||||
|
java-version: 11
|
||||||
|
- name: Set up Python 3.8
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: 3.8
|
||||||
|
- name: Cache pip
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: ~/.cache/pip
|
||||||
|
key: ${{ runner.os }}-pip
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pip-
|
||||||
|
${{ runner.os }}-
|
||||||
|
- uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
- name: Start synapse server
|
||||||
|
run: |
|
||||||
|
python3 -m venv .synapse
|
||||||
|
source .synapse/bin/activate
|
||||||
|
pip install synapse matrix-synapse
|
||||||
|
curl https://raw.githubusercontent.com/matrix-org/synapse/develop/demo/start.sh -o start.sh
|
||||||
|
chmod 777 start.sh
|
||||||
|
./start.sh --no-rate-limit
|
||||||
|
# package: org.matrix.android.sdk.session
|
||||||
|
- name: Run integration tests for Matrix SDK [org.matrix.android.sdk.session] API[${{ matrix.api-level }}]
|
||||||
|
continue-on-error: true
|
||||||
|
uses: reactivecircus/android-emulator-runner@v2
|
||||||
|
with:
|
||||||
|
api-level: ${{ matrix.api-level }}
|
||||||
|
arch: x86
|
||||||
|
profile: Nexus 5X
|
||||||
|
force-avd-creation: false
|
||||||
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
|
emulator-build: 7425822
|
||||||
|
script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.package='org.matrix.android.sdk.session' matrix-sdk-android:connectedDebugAndroidTest
|
||||||
|
- name: Read Results [org.matrix.android.sdk.session]
|
||||||
|
continue-on-error: true
|
||||||
|
id: get-comment-body-session
|
||||||
|
run: |
|
||||||
|
body="$(cat ./matrix-sdk-android/build/outputs/androidTest-results/connected/*.xml | grep "<testsuite" | sed "s@.*tests=\(.*\)time=.*@\1@")"
|
||||||
|
echo "::set-output name=session::passed=$body"
|
||||||
|
# package: org.matrix.android.sdk.account
|
||||||
|
- name: Run integration tests for Matrix SDK [org.matrix.android.sdk.account] API[${{ matrix.api-level }}]
|
||||||
|
continue-on-error: true
|
||||||
|
uses: reactivecircus/android-emulator-runner@v2
|
||||||
|
with:
|
||||||
|
api-level: ${{ matrix.api-level }}
|
||||||
|
arch: x86
|
||||||
|
profile: Nexus 5X
|
||||||
|
force-avd-creation: false
|
||||||
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
|
emulator-build: 7425822
|
||||||
|
script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.package='org.matrix.android.sdk.account' matrix-sdk-android:connectedDebugAndroidTest
|
||||||
|
- name: Read Results [org.matrix.android.sdk.account]
|
||||||
|
continue-on-error: true
|
||||||
|
id: get-comment-body-account
|
||||||
|
run: |
|
||||||
|
body="$(cat ./matrix-sdk-android/build/outputs/androidTest-results/connected/*.xml | grep "<testsuite" | sed "s@.*tests=\(.*\)time=.*@\1@")"
|
||||||
|
echo "::set-output name=account::passed=$body"
|
||||||
|
# package: org.matrix.android.sdk.internal
|
||||||
|
- name: Run integration tests for Matrix SDK [org.matrix.android.sdk.internal] API[${{ matrix.api-level }}]
|
||||||
|
continue-on-error: true
|
||||||
|
uses: reactivecircus/android-emulator-runner@v2
|
||||||
|
with:
|
||||||
|
api-level: ${{ matrix.api-level }}
|
||||||
|
arch: x86
|
||||||
|
profile: Nexus 5X
|
||||||
|
force-avd-creation: false
|
||||||
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
|
emulator-build: 7425822
|
||||||
|
script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.package='org.matrix.android.sdk.internal' matrix-sdk-android:connectedDebugAndroidTest
|
||||||
|
- name: Read Results [org.matrix.android.sdk.internal]
|
||||||
|
continue-on-error: true
|
||||||
|
id: get-comment-body-internal
|
||||||
|
run: |
|
||||||
|
body="$(cat ./matrix-sdk-android/build/outputs/androidTest-results/connected/*.xml | grep "<testsuite" | sed "s@.*tests=\(.*\)time=.*@\1@")"
|
||||||
|
echo "::set-output name=internal::passed=$body"
|
||||||
|
# package: org.matrix.android.sdk.ordering
|
||||||
|
- name: Run integration tests for Matrix SDK [org.matrix.android.sdk.ordering] API[${{ matrix.api-level }}]
|
||||||
|
continue-on-error: true
|
||||||
|
uses: reactivecircus/android-emulator-runner@v2
|
||||||
|
with:
|
||||||
|
api-level: ${{ matrix.api-level }}
|
||||||
|
arch: x86
|
||||||
|
profile: Nexus 5X
|
||||||
|
force-avd-creation: false
|
||||||
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
|
emulator-build: 7425822
|
||||||
|
script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.package='org.matrix.android.sdk.ordering' matrix-sdk-android:connectedDebugAndroidTest
|
||||||
|
- name: Read Results [org.matrix.android.sdk.ordering]
|
||||||
|
continue-on-error: true
|
||||||
|
id: get-comment-body-ordering
|
||||||
|
run: |
|
||||||
|
body="$(cat ./matrix-sdk-android/build/outputs/androidTest-results/connected/*.xml | grep "<testsuite" | sed "s@.*tests=\(.*\)time=.*@\1@")"
|
||||||
|
echo "::set-output name=ordering::passed=$body"
|
||||||
|
# package: class PermalinkParserTest
|
||||||
|
- name: Run integration tests for Matrix SDK class [org.matrix.android.sdk.PermalinkParserTest] API[${{ matrix.api-level }}]
|
||||||
|
continue-on-error: true
|
||||||
|
uses: reactivecircus/android-emulator-runner@v2
|
||||||
|
with:
|
||||||
|
api-level: ${{ matrix.api-level }}
|
||||||
|
arch: x86
|
||||||
|
profile: Nexus 5X
|
||||||
|
force-avd-creation: false
|
||||||
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||||
|
emulator-build: 7425822
|
||||||
|
script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.class='org.matrix.android.sdk.PermalinkParserTest' matrix-sdk-android:connectedDebugAndroidTest
|
||||||
|
- name: Read Results [org.matrix.android.sd.PermalinkParserTest]
|
||||||
|
continue-on-error: true
|
||||||
|
id: get-comment-body-permalink
|
||||||
|
run: |
|
||||||
|
body="$(cat ./matrix-sdk-android/build/outputs/androidTest-results/connected/*.xml | grep "<testsuite" | sed "s@.*tests=\(.*\)time=.*@\1@")"
|
||||||
|
echo "::set-output name=permalink::passed=$body"
|
||||||
|
- name: Find Comment
|
||||||
|
uses: peter-evans/find-comment@v1
|
||||||
|
id: fc
|
||||||
|
with:
|
||||||
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
|
comment-author: 'github-actions[bot]'
|
||||||
|
body-includes: Integration Tests Results
|
||||||
|
- name: Publish results to PR
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
with:
|
||||||
|
comment-id: ${{ steps.fc.outputs.comment-id }}
|
||||||
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
|
body: |
|
||||||
|
### Matrix SDK
|
||||||
|
## Integration Tests Results:
|
||||||
|
- `[org.matrix.android.sdk.session]`<br>${{ steps.get-comment-body-session.outputs.session }}
|
||||||
|
- `[org.matrix.android.sdk.account]`<br>${{ steps.get-comment-body-account.outputs.account }}
|
||||||
|
- `[org.matrix.android.sdk.internal]`<br>${{ steps.get-comment-body-internal.outputs.internal }}
|
||||||
|
- `[org.matrix.android.sdk.ordering]`<br>${{ steps.get-comment-body-ordering.outputs.ordering }}
|
||||||
|
- `[org.matrix.android.sdk.PermalinkParserTest]`<br>${{ steps.get-comment-body-permalink.outputs.permalink }}
|
||||||
|
edit-mode: replace
|
||||||
|
## Useful commands
|
||||||
|
# script: ./integration_tests_script.sh
|
||||||
|
# script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.package='org.matrix.android.sdk.session' matrix-sdk-android:connectedDebugAndroidTest --info
|
||||||
|
# script: ./gradlew $CI_GRADLE_ARG_PROPERTIES matrix-sdk-android:connectedAndroidTest --info
|
||||||
|
# script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -PallWarningsAsErrors=false connectedCheck --stacktrace
|
||||||
|
# script: ./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.class=org.matrix.android.sdk.session.room.timeline.ChunkEntityTest matrix-sdk-android:connectedAndroidTest --info
|
@ -5,6 +5,31 @@ on:
|
|||||||
types: [labeled]
|
types: [labeled]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
apply_Z-Labs_label:
|
||||||
|
name: Add Z-Labs label for features behind labs flags
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: >
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Maths') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Message-Pinning') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Threads') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Polls') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Location-Sharing') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Message-Bubbles') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'Z-IA') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Themes-Custom') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Tags')
|
||||||
|
steps:
|
||||||
|
- uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.addLabels({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
labels: ['Z-Labs']
|
||||||
|
})
|
||||||
|
|
||||||
move_needs_info_issues:
|
move_needs_info_issues:
|
||||||
name: X-Needs-Info issues to Need info column on triage board
|
name: X-Needs-Info issues to Need info column on triage board
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -51,32 +76,57 @@ jobs:
|
|||||||
PROJECT_ID: "PN_kwDOAM0swc0sUA"
|
PROJECT_ID: "PN_kwDOAM0swc0sUA"
|
||||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
|
|
||||||
# delight_issues_to_board:
|
add_product_issues:
|
||||||
# name: Spaces issues to new Delight project board
|
name: X-Needs-Product to Design project board
|
||||||
# runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# # Skip in forks
|
if: >
|
||||||
# if: >
|
contains(github.event.issue.labels.*.name, 'X-Needs-Product')
|
||||||
# github.repository == 'vector-im/element-android' &&
|
steps:
|
||||||
# contains(github.event.issue.labels.*.name, 'A-Spaces') ||
|
- uses: octokit/graphql-action@v2.x
|
||||||
# contains(github.event.issue.labels.*.name, 'A-Space-Settings') ||
|
id: add_to_project
|
||||||
# contains(github.event.issue.labels.*.name, 'A-Subspaces')
|
with:
|
||||||
# steps:
|
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||||
# - uses: octokit/graphql-action@v2.x
|
query: |
|
||||||
# with:
|
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||||
# headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||||
# query: |
|
projectNextItem {
|
||||||
# mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
id
|
||||||
# addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
}
|
||||||
# projectNextItem {
|
}
|
||||||
# id
|
}
|
||||||
# }
|
projectid: ${{ env.PROJECT_ID }}
|
||||||
# }
|
contentid: ${{ github.event.issue.node_id }}
|
||||||
# }
|
env:
|
||||||
# projectid: ${{ env.PROJECT_ID }}
|
PROJECT_ID: "PN_kwDOAM0swc4AAg6N"
|
||||||
# contentid: ${{ github.event.issue.node_id }}
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
# env:
|
|
||||||
# PROJECT_ID: "PN_kwDOAM0swc1HvQ"
|
delight_issues_to_board:
|
||||||
# GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
name: Spaces issues to Delight project board
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# Skip in forks
|
||||||
|
if: >
|
||||||
|
github.repository == 'vector-im/element-android' &&
|
||||||
|
(contains(github.event.issue.labels.*.name, 'A-Spaces') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Space-Settings') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Subspaces') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'Z-IA'))
|
||||||
|
steps:
|
||||||
|
- uses: octokit/graphql-action@v2.x
|
||||||
|
with:
|
||||||
|
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||||
|
query: |
|
||||||
|
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||||
|
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||||
|
projectNextItem {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
projectid: ${{ env.PROJECT_ID }}
|
||||||
|
contentid: ${{ github.event.issue.node_id }}
|
||||||
|
env:
|
||||||
|
PROJECT_ID: "PN_kwDOAM0swc1HvQ"
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
|
|
||||||
move_voice-message_issues:
|
move_voice-message_issues:
|
||||||
name: A-Voice Messages to voice message board
|
name: A-Voice Messages to voice message board
|
139
.github/workflows/triage-move-review-requests.yml
vendored
Normal file
139
.github/workflows/triage-move-review-requests.yml
vendored
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
name: Move pull requests asking for review to the relevant project
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [review_requested]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
add_design_pr_to_project:
|
||||||
|
name: Move PRs asking for design review to the design board
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: octokit/graphql-action@v2.x
|
||||||
|
id: find_team_members
|
||||||
|
with:
|
||||||
|
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||||
|
query: |
|
||||||
|
query find_team_members($team: String!) {
|
||||||
|
organization(login: "vector-im") {
|
||||||
|
team(slug: $team) {
|
||||||
|
members {
|
||||||
|
nodes {
|
||||||
|
login
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
team: ${{ env.TEAM }}
|
||||||
|
env:
|
||||||
|
TEAM: "design"
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
|
- id: any_matching_reviewers
|
||||||
|
run: |
|
||||||
|
# Fetch requested reviewers, and people who are on the team
|
||||||
|
echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json
|
||||||
|
echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json
|
||||||
|
jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt
|
||||||
|
jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt
|
||||||
|
|
||||||
|
# Fetch requested team reviewers, and the name of the team
|
||||||
|
echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json
|
||||||
|
jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt
|
||||||
|
echo '${{ env.TEAM }}' | tee /tmp/team.txt
|
||||||
|
|
||||||
|
# If either a reviewer matches a team member, or a team matches our team, say "true"
|
||||||
|
if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then
|
||||||
|
echo "::set-output name=match::true"
|
||||||
|
elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then
|
||||||
|
echo "::set-output name=match::true"
|
||||||
|
else
|
||||||
|
echo "::set-output name=match::false"
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
TEAM: "design"
|
||||||
|
- uses: octokit/graphql-action@v2.x
|
||||||
|
id: add_to_project
|
||||||
|
if: steps.any_matching_reviewers.outputs.match == 'true'
|
||||||
|
with:
|
||||||
|
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||||
|
query: |
|
||||||
|
mutation add_to_project($projectid:ID!, $contentid:ID!) {
|
||||||
|
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||||
|
projectNextItem {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
projectid: ${{ env.PROJECT_ID }}
|
||||||
|
contentid: ${{ github.event.pull_request.node_id }}
|
||||||
|
env:
|
||||||
|
PROJECT_ID: "PN_kwDOAM0swc0sUA"
|
||||||
|
TEAM: "design"
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
|
|
||||||
|
add_product_pr_to_project:
|
||||||
|
name: Move PRs asking for product review to the product board
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: octokit/graphql-action@v2.x
|
||||||
|
id: find_team_members
|
||||||
|
with:
|
||||||
|
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||||
|
query: |
|
||||||
|
query find_team_members($team: String!) {
|
||||||
|
organization(login: "vector-im") {
|
||||||
|
team(slug: $team) {
|
||||||
|
members {
|
||||||
|
nodes {
|
||||||
|
login
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
team: ${{ env.TEAM }}
|
||||||
|
env:
|
||||||
|
TEAM: "product"
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
|
- id: any_matching_reviewers
|
||||||
|
run: |
|
||||||
|
# Fetch requested reviewers, and people who are on the team
|
||||||
|
echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json
|
||||||
|
echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json
|
||||||
|
jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt
|
||||||
|
jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt
|
||||||
|
|
||||||
|
# Fetch requested team reviewers, and the name of the team
|
||||||
|
echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json
|
||||||
|
jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt
|
||||||
|
echo '${{ env.TEAM }}' | tee /tmp/team.txt
|
||||||
|
|
||||||
|
# If either a reviewer matches a team member, or a team matches our team, say "true"
|
||||||
|
if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then
|
||||||
|
echo "::set-output name=match::true"
|
||||||
|
elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then
|
||||||
|
echo "::set-output name=match::true"
|
||||||
|
else
|
||||||
|
echo "::set-output name=match::false"
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
TEAM: "product"
|
||||||
|
- uses: octokit/graphql-action@v2.x
|
||||||
|
id: add_to_project
|
||||||
|
if: steps.any_matching_reviewers.outputs.match == 'true'
|
||||||
|
with:
|
||||||
|
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||||
|
query: |
|
||||||
|
mutation add_to_project($projectid:ID!, $contentid:ID!) {
|
||||||
|
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||||
|
projectNextItem {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
projectid: ${{ env.PROJECT_ID }}
|
||||||
|
contentid: ${{ github.event.pull_request.node_id }}
|
||||||
|
env:
|
||||||
|
PROJECT_ID: "PN_kwDOAM0swc4AAg6N"
|
||||||
|
TEAM: "product"
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
3
.github/workflows/triage-priority-bugs.yml
vendored
3
.github/workflows/triage-priority-bugs.yml
vendored
@ -38,6 +38,7 @@ jobs:
|
|||||||
# Skip in forks
|
# Skip in forks
|
||||||
if: >
|
if: >
|
||||||
github.repository == 'vector-im/element-android' &&
|
github.repository == 'vector-im/element-android' &&
|
||||||
|
(contains(github.event.issue.labels.*.name, 'Z-UISI') ||
|
||||||
(contains(github.event.issue.labels.*.name, 'A-E2EE') ||
|
(contains(github.event.issue.labels.*.name, 'A-E2EE') ||
|
||||||
contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') ||
|
contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') ||
|
||||||
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
||||||
@ -50,7 +51,7 @@ jobs:
|
|||||||
contains(github.event.issue.labels.*.name, 'S-Major') &&
|
contains(github.event.issue.labels.*.name, 'S-Major') &&
|
||||||
contains(github.event.issue.labels.*.name, 'O-Frequent') ||
|
contains(github.event.issue.labels.*.name, 'O-Frequent') ||
|
||||||
contains(github.event.issue.labels.*.name, 'A11y') &&
|
contains(github.event.issue.labels.*.name, 'A11y') &&
|
||||||
contains(github.event.issue.labels.*.name, 'O-Frequent'))
|
contains(github.event.issue.labels.*.name, 'O-Frequent')))
|
||||||
steps:
|
steps:
|
||||||
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
|
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
|
||||||
with:
|
with:
|
||||||
|
@ -34,3 +34,29 @@ jobs:
|
|||||||
project: Issue triage
|
project: Issue triage
|
||||||
column: Triaged
|
column: Triaged
|
||||||
repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||||
|
|
||||||
|
remove_Z-Labs_label:
|
||||||
|
name: Remove Z-Labs label when features behind labs flags are removed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: >
|
||||||
|
!(contains(github.event.issue.labels.*.name, 'A-Maths') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Message-Pinning') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Threads') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Polls') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Location-Sharing') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Message-Bubbles') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'Z-IA') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Themes-Custom') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
||||||
|
contains(github.event.issue.labels.*.name, 'A-Tags')) &&
|
||||||
|
contains(github.event.issue.labels.*.name, 'Z-Labs')
|
||||||
|
steps:
|
||||||
|
- uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.removeLabel({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
name: ['Z-Labs']
|
||||||
|
})
|
50
CHANGES.md
50
CHANGES.md
@ -1,3 +1,53 @@
|
|||||||
|
Changes in Element 1.3.16 (2022-01-25)
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Features ✨
|
||||||
|
----------
|
||||||
|
- Static location sharing and rendering ([#2210](https://github.com/vector-im/element-android/issues/2210))
|
||||||
|
- Enables the FTUE splash carousel ([#4584](https://github.com/vector-im/element-android/issues/4584))
|
||||||
|
- Allow editing polls ([#5036](https://github.com/vector-im/element-android/issues/5036))
|
||||||
|
|
||||||
|
Bugfixes 🐛
|
||||||
|
----------
|
||||||
|
- Fixing missing notifications in FDroid variants using `optimised for battery` background sync mode ([#5003](https://github.com/vector-im/element-android/issues/5003))
|
||||||
|
- Fix for stuck local event messages at the bottom of the screen ([#516](https://github.com/vector-im/element-android/issues/516))
|
||||||
|
- Notification does not take me to the room when another space was last viewed ([#3839](https://github.com/vector-im/element-android/issues/3839))
|
||||||
|
- Explore Rooms overflow menu - content update include "Create room" ([#3932](https://github.com/vector-im/element-android/issues/3932))
|
||||||
|
- Fix sync timeout after returning from background ([#4669](https://github.com/vector-im/element-android/issues/4669))
|
||||||
|
- Fix a wrong network error issue in the Legals screen ([#4935](https://github.com/vector-im/element-android/issues/4935))
|
||||||
|
- Prevent Alerts to be displayed in the automatically displayed analytics opt-in screen ([#4948](https://github.com/vector-im/element-android/issues/4948))
|
||||||
|
- EmojiPopupDismissListener not being triggered after dismissing the EmojiPopup ([#4991](https://github.com/vector-im/element-android/issues/4991))
|
||||||
|
- Fix an error in string resource ([#4997](https://github.com/vector-im/element-android/issues/4997))
|
||||||
|
- Big messages taking inappropriately long to evaluate .m.rule.roomnotif push rules ([#5008](https://github.com/vector-im/element-android/issues/5008))
|
||||||
|
- Improve auto rageshake lab feature ([#5021](https://github.com/vector-im/element-android/issues/5021))
|
||||||
|
|
||||||
|
In development 🚧
|
||||||
|
----------------
|
||||||
|
- Updates the onboarding carousel images, copy and improves the handling of different device sizes ([#4880](https://github.com/vector-im/element-android/issues/4880))
|
||||||
|
- Disabling onboarding automatic carousel transitions on user interaction ([#4914](https://github.com/vector-im/element-android/issues/4914))
|
||||||
|
- Locking phones to portrait during the FTUE onboarding ([#4918](https://github.com/vector-im/element-android/issues/4918))
|
||||||
|
- Adds a messaging use case screen to the FTUE onboarding ([#4927](https://github.com/vector-im/element-android/issues/4927))
|
||||||
|
- Updating the FTUE use case icons ([#5025](https://github.com/vector-im/element-android/issues/5025))
|
||||||
|
- Support undisclosed polls ([#5037](https://github.com/vector-im/element-android/issues/5037))
|
||||||
|
|
||||||
|
Other changes
|
||||||
|
-------------
|
||||||
|
- Enabling native support for window resizing ([#4811](https://github.com/vector-im/element-android/issues/4811))
|
||||||
|
- Analytics: send more Events ([#4734](https://github.com/vector-im/element-android/issues/4734))
|
||||||
|
- Fix integration tests and add a comment with results (still not perfect due to github actions resource limitations) ([#4842](https://github.com/vector-im/element-android/issues/4842))
|
||||||
|
- "/kick" command is replaced with "/remove". Also replaced all occurrences in string resources ([#4865](https://github.com/vector-im/element-android/issues/4865))
|
||||||
|
- Toolbar management rework. Toolbar title's and subtitle's text appearance now controlled by theme without local overrides. Helper class introduced to
|
||||||
|
help with toolbar configuration. Toolbar title, subtitle and navigation button widgets are removed where it is possible and replaced with built-in
|
||||||
|
toolbar widgets. ([#4884](https://github.com/vector-im/element-android/issues/4884))
|
||||||
|
- Add signing config for the release buildType. No secret added ([#4926](https://github.com/vector-im/element-android/issues/4926))
|
||||||
|
- Remove unused module matrix-sdk-android-rx and do some cleanup ([#4942](https://github.com/vector-im/element-android/issues/4942))
|
||||||
|
- Sync issue automation with element-web ([#4949](https://github.com/vector-im/element-android/issues/4949))
|
||||||
|
- Improves local echo blinking when non room events received ([#4960](https://github.com/vector-im/element-android/issues/4960))
|
||||||
|
- Including onboarding server options in the all screen sanity test suite ([#4975](https://github.com/vector-im/element-android/issues/4975))
|
||||||
|
- Exclude dependabot upgrade for @github-script@v3 ([#4988](https://github.com/vector-im/element-android/issues/4988))
|
||||||
|
- Small iteration on command parser and unit test it. ([#4998](https://github.com/vector-im/element-android/issues/4998))
|
||||||
|
|
||||||
|
|
||||||
Changes in Element v1.3.15 (2022-01-18)
|
Changes in Element v1.3.15 (2022-01-18)
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
|
@ -61,8 +61,9 @@ Supported filename extensions are:
|
|||||||
|
|
||||||
- ``.feature``: Signifying a new feature in Element Android or in the Matrix SDK.
|
- ``.feature``: Signifying a new feature in Element Android or in the Matrix SDK.
|
||||||
- ``.bugfix``: Signifying a bug fix.
|
- ``.bugfix``: Signifying a bug fix.
|
||||||
|
- ``.wip``: Signifying a work in progress change, typically a component of a larger feature which will be enabled once all tasks are complete.
|
||||||
- ``.doc``: Signifying a documentation improvement.
|
- ``.doc``: Signifying a documentation improvement.
|
||||||
- ``.removal``: Signifying a deprecation or removal of public API. Can be used to notifying about API change in the Matrix SDK
|
- ``.sdk``: Signifying a change to the Matrix SDK, this could be an addition, deprecation or removal of a public API.
|
||||||
- ``.misc``: Any other changes.
|
- ``.misc``: Any other changes.
|
||||||
|
|
||||||
See https://github.com/twisted/towncrier#news-fragments if you need more details.
|
See https://github.com/twisted/towncrier#news-fragments if you need more details.
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
# Element Android
|
# Element Android
|
||||||
|
|
||||||
Element Android is an Android Matrix Client provided by [Element](https://element.io/).
|
Element Android is an Android Matrix Client provided by [Element](https://element.io/). The app can be run on every Android devices with Android OS Lollipop and more (API 21).
|
||||||
|
|
||||||
It is a total rewrite of [Riot-Android](https://github.com/vector-im/riot-android) with a new user experience.
|
It is a total rewrite of [Riot-Android](https://github.com/vector-im/riot-android) with a new user experience.
|
||||||
|
|
||||||
|
@ -47,12 +47,10 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":library:ui-styles")
|
implementation project(":library:ui-styles")
|
||||||
|
implementation project(":library:core-utils")
|
||||||
|
|
||||||
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
||||||
|
|
||||||
implementation libs.rx.rxKotlin
|
|
||||||
implementation libs.rx.rxAndroid
|
|
||||||
|
|
||||||
implementation libs.androidx.core
|
implementation libs.androidx.core
|
||||||
implementation libs.androidx.appCompat
|
implementation libs.androidx.appCompat
|
||||||
implementation libs.androidx.recyclerview
|
implementation libs.androidx.recyclerview
|
||||||
|
@ -20,12 +20,9 @@ import android.util.Log
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import im.vector.lib.attachmentviewer.databinding.ItemVideoAttachmentBinding
|
import im.vector.lib.attachmentviewer.databinding.ItemVideoAttachmentBinding
|
||||||
import io.reactivex.Observable
|
import im.vector.lib.core.utils.timer.CountUpTimer
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.disposables.Disposable
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
// TODO, it would be probably better to use a unique media player
|
// TODO, it would be probably better to use a unique media player
|
||||||
// for better customization and control
|
// for better customization and control
|
||||||
@ -35,7 +32,7 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
|
|
||||||
private var isSelected = false
|
private var isSelected = false
|
||||||
private var mVideoPath: String? = null
|
private var mVideoPath: String? = null
|
||||||
private var progressDisposable: Disposable? = null
|
private var countUpTimer: CountUpTimer? = null
|
||||||
private var progress: Int = 0
|
private var progress: Int = 0
|
||||||
private var wasPaused = false
|
private var wasPaused = false
|
||||||
|
|
||||||
@ -47,8 +44,7 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
|
|
||||||
override fun onRecycled() {
|
override fun onRecycled() {
|
||||||
super.onRecycled()
|
super.onRecycled()
|
||||||
progressDisposable?.dispose()
|
stopTimer()
|
||||||
progressDisposable = null
|
|
||||||
mVideoPath = null
|
mVideoPath = null
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,8 +68,7 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
override fun entersBackground() {
|
override fun entersBackground() {
|
||||||
if (views.videoView.isPlaying) {
|
if (views.videoView.isPlaying) {
|
||||||
progress = views.videoView.currentPosition
|
progress = views.videoView.currentPosition
|
||||||
progressDisposable?.dispose()
|
stopTimer()
|
||||||
progressDisposable = null
|
|
||||||
views.videoView.stopPlayback()
|
views.videoView.stopPlayback()
|
||||||
views.videoView.pause()
|
views.videoView.pause()
|
||||||
}
|
}
|
||||||
@ -91,8 +86,7 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
} else {
|
} else {
|
||||||
progress = 0
|
progress = 0
|
||||||
}
|
}
|
||||||
progressDisposable?.dispose()
|
stopTimer()
|
||||||
progressDisposable = null
|
|
||||||
} else {
|
} else {
|
||||||
if (mVideoPath != null) {
|
if (mVideoPath != null) {
|
||||||
startPlaying()
|
startPlaying()
|
||||||
@ -107,11 +101,10 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
views.videoView.isVisible = true
|
views.videoView.isVisible = true
|
||||||
|
|
||||||
views.videoView.setOnPreparedListener {
|
views.videoView.setOnPreparedListener {
|
||||||
progressDisposable?.dispose()
|
stopTimer()
|
||||||
progressDisposable = Observable.interval(100, TimeUnit.MILLISECONDS)
|
countUpTimer = CountUpTimer(100).also {
|
||||||
.timeInterval()
|
it.tickListener = object : CountUpTimer.TickListener {
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
override fun onTick(milliseconds: Long) {
|
||||||
.subscribe {
|
|
||||||
val duration = views.videoView.duration
|
val duration = views.videoView.duration
|
||||||
val progress = views.videoView.currentPosition
|
val progress = views.videoView.currentPosition
|
||||||
val isPlaying = views.videoView.isPlaying
|
val isPlaying = views.videoView.isPlaying
|
||||||
@ -119,6 +112,9 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration))
|
eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
it.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
views.videoView.setVideoPath(mVideoPath)
|
views.videoView.setVideoPath(mVideoPath)
|
||||||
} catch (failure: Throwable) {
|
} catch (failure: Throwable) {
|
||||||
@ -134,6 +130,11 @@ class VideoViewHolder constructor(itemView: View) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun stopTimer() {
|
||||||
|
countUpTimer?.stop()
|
||||||
|
countUpTimer = null
|
||||||
|
}
|
||||||
|
|
||||||
override fun handleCommand(commands: AttachmentCommands) {
|
override fun handleCommand(commands: AttachmentCommands) {
|
||||||
if (!isSelected) return
|
if (!isSelected) return
|
||||||
when (commands) {
|
when (commands) {
|
||||||
|
10
build.gradle
10
build.gradle
@ -153,13 +153,3 @@ project(":diff-match-patch") {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
//
|
|
||||||
//project(":matrix-sdk-android-rx") {
|
|
||||||
// sonarqube {
|
|
||||||
// properties {
|
|
||||||
// property "sonar.sources", project(":matrix-sdk-android-rx").android.sourceSets.main.java.srcDirs
|
|
||||||
// // exclude source code from analyses separated by a colon (:)
|
|
||||||
// // property "sonar.exclusions", "**/*.*"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
1
changelog.d/4895.removal
Normal file
1
changelog.d/4895.removal
Normal file
@ -0,0 +1 @@
|
|||||||
|
`StateService.sendStateEvent()` now takes a non-nullable String for the parameter `stateKey`. If null was used, just now use an empty string.
|
1
changelog.d/4995.removal
Normal file
1
changelog.d/4995.removal
Normal file
@ -0,0 +1 @@
|
|||||||
|
429 are not automatically retried anymore in case of too long retry delay
|
@ -29,6 +29,7 @@ def vanniktechEmoji = "0.8.0"
|
|||||||
def mockk = "1.12.1"
|
def mockk = "1.12.1"
|
||||||
def espresso = "3.4.0"
|
def espresso = "3.4.0"
|
||||||
def androidxTest = "1.4.0"
|
def androidxTest = "1.4.0"
|
||||||
|
def androidxOrchestrator = "1.4.1"
|
||||||
|
|
||||||
|
|
||||||
ext.libs = [
|
ext.libs = [
|
||||||
@ -41,7 +42,6 @@ ext.libs = [
|
|||||||
jetbrains : [
|
jetbrains : [
|
||||||
'coroutinesCore' : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutines",
|
'coroutinesCore' : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutines",
|
||||||
'coroutinesAndroid' : "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinCoroutines",
|
'coroutinesAndroid' : "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinCoroutines",
|
||||||
'coroutinesRx2' : "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$kotlinCoroutines",
|
|
||||||
'coroutinesTest' : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinCoroutines"
|
'coroutinesTest' : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinCoroutines"
|
||||||
],
|
],
|
||||||
androidx : [
|
androidx : [
|
||||||
@ -63,7 +63,7 @@ ext.libs = [
|
|||||||
'pagingRuntimeKtx' : "androidx.paging:paging-runtime-ktx:2.1.2",
|
'pagingRuntimeKtx' : "androidx.paging:paging-runtime-ktx:2.1.2",
|
||||||
'coreTesting' : "androidx.arch.core:core-testing:2.1.0",
|
'coreTesting' : "androidx.arch.core:core-testing:2.1.0",
|
||||||
'testCore' : "androidx.test:core:$androidxTest",
|
'testCore' : "androidx.test:core:$androidxTest",
|
||||||
'orchestrator' : "androidx.test:orchestrator:$androidxTest",
|
'orchestrator' : "androidx.test:orchestrator:$androidxOrchestrator",
|
||||||
'testRunner' : "androidx.test:runner:$androidxTest",
|
'testRunner' : "androidx.test:runner:$androidxTest",
|
||||||
'testRules' : "androidx.test:rules:$androidxTest",
|
'testRules' : "androidx.test:rules:$androidxTest",
|
||||||
'espressoCore' : "androidx.test.espresso:espresso-core:$espresso",
|
'espressoCore' : "androidx.test.espresso:espresso-core:$espresso",
|
||||||
@ -87,8 +87,7 @@ ext.libs = [
|
|||||||
'retrofitMoshi' : "com.squareup.retrofit2:converter-moshi:$retrofit"
|
'retrofitMoshi' : "com.squareup.retrofit2:converter-moshi:$retrofit"
|
||||||
],
|
],
|
||||||
rx : [
|
rx : [
|
||||||
'rxKotlin' : "io.reactivex.rxjava2:rxkotlin:2.4.0",
|
'rxKotlin' : "io.reactivex.rxjava2:rxkotlin:2.4.0"
|
||||||
'rxAndroid' : "io.reactivex.rxjava2:rxandroid:2.1.1"
|
|
||||||
],
|
],
|
||||||
arrow : [
|
arrow : [
|
||||||
'core' : "io.arrow-kt:arrow-core:$arrow",
|
'core' : "io.arrow-kt:arrow-core:$arrow",
|
||||||
|
@ -83,6 +83,7 @@ ext.groups = [
|
|||||||
'com.jakewharton.android.repackaged',
|
'com.jakewharton.android.repackaged',
|
||||||
'com.jakewharton.timber',
|
'com.jakewharton.timber',
|
||||||
'com.linkedin.dexmaker',
|
'com.linkedin.dexmaker',
|
||||||
|
'com.mapbox.mapboxsdk',
|
||||||
'com.nulab-inc',
|
'com.nulab-inc',
|
||||||
'com.otaliastudios.opengl',
|
'com.otaliastudios.opengl',
|
||||||
'com.parse.bolts',
|
'com.parse.bolts',
|
||||||
@ -159,6 +160,7 @@ ext.groups = [
|
|||||||
'org.junit.jupiter',
|
'org.junit.jupiter',
|
||||||
'org.junit.platform',
|
'org.junit.platform',
|
||||||
'org.jvnet.staxex',
|
'org.jvnet.staxex',
|
||||||
|
'org.maplibre.gl',
|
||||||
'org.matrix.android',
|
'org.matrix.android',
|
||||||
'org.mockito',
|
'org.mockito',
|
||||||
'org.mongodb',
|
'org.mongodb',
|
||||||
|
@ -1,49 +1,64 @@
|
|||||||
fastlane documentation
|
fastlane documentation
|
||||||
================
|
----
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
Make sure you have the latest version of the Xcode command line tools installed:
|
Make sure you have the latest version of the Xcode command line tools installed:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
xcode-select --install
|
xcode-select --install
|
||||||
```
|
```
|
||||||
|
|
||||||
Install _fastlane_ using
|
For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
|
||||||
```
|
|
||||||
[sudo] gem install fastlane -NV
|
|
||||||
```
|
|
||||||
or alternatively using `brew install fastlane`
|
|
||||||
|
|
||||||
# Available Actions
|
# Available Actions
|
||||||
|
|
||||||
## Android
|
## Android
|
||||||
|
|
||||||
### android test
|
### android test
|
||||||
|
|
||||||
|
```sh
|
||||||
|
[bundle exec] fastlane android test
|
||||||
```
|
```
|
||||||
fastlane android test
|
|
||||||
```
|
|
||||||
Runs all the tests
|
Runs all the tests
|
||||||
|
|
||||||
### android beta
|
### android beta
|
||||||
|
|
||||||
|
```sh
|
||||||
|
[bundle exec] fastlane android beta
|
||||||
```
|
```
|
||||||
fastlane android beta
|
|
||||||
```
|
|
||||||
Submit a new Beta Build to Crashlytics Beta
|
Submit a new Beta Build to Crashlytics Beta
|
||||||
|
|
||||||
### android deploy
|
### android deploy
|
||||||
|
|
||||||
|
```sh
|
||||||
|
[bundle exec] fastlane android deploy
|
||||||
```
|
```
|
||||||
fastlane android deploy
|
|
||||||
```
|
|
||||||
Deploy a new version to the Google Play
|
Deploy a new version to the Google Play
|
||||||
|
|
||||||
### android deployMeta
|
### android deployMeta
|
||||||
|
|
||||||
|
```sh
|
||||||
|
[bundle exec] fastlane android deployMeta
|
||||||
```
|
```
|
||||||
fastlane android deployMeta
|
|
||||||
```
|
|
||||||
Deploy Google Play metadata
|
Deploy Google Play metadata
|
||||||
|
|
||||||
### android getVersionCode
|
### android getVersionCode
|
||||||
|
|
||||||
|
```sh
|
||||||
|
[bundle exec] fastlane android getVersionCode
|
||||||
```
|
```
|
||||||
fastlane android getVersionCode
|
|
||||||
```
|
|
||||||
Get version code
|
Get version code
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
|
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
|
||||||
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
|
|
||||||
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
|
||||||
|
|
||||||
|
The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
||||||
|
2
fastlane/metadata/android/de-DE/changelogs/40103100.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/40103100.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Änderungen: Die Websitevorschau hat ein neues Design erhalten. Außerdem gibt es in den experimentellen Einstellungen Abstimmungen.
|
||||||
|
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.10
|
2
fastlane/metadata/android/de-DE/changelogs/40103110.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/40103110.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Hauptänderungen: Bugfixes!
|
||||||
|
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.11
|
2
fastlane/metadata/android/de-DE/changelogs/40103120.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/40103120.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Hauptänderungen: Bugfixes!
|
||||||
|
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.12
|
2
fastlane/metadata/android/en-US/changelogs/40103160.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40103160.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Main changes in this version: send your location to any room. Edit poll.
|
||||||
|
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.16
|
@ -1 +1 @@
|
|||||||
Element - turvaline sõnumiklient
|
Element
|
||||||
|
2
fastlane/metadata/android/fr-FR/changelogs/40103100.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/40103100.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Principaux changements pour cette version : prise en charge des sondages (dans les labs). Nouvel affichage des prévisualisations d’URL
|
||||||
|
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.10
|
2
fastlane/metadata/android/fr-FR/changelogs/40103110.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/40103110.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Principaux changements pour cette version : corrections de bugs !
|
||||||
|
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.11
|
2
fastlane/metadata/android/fr-FR/changelogs/40103120.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/40103120.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Principaux changements pour cette version : corrections de bugs !
|
||||||
|
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.12
|
@ -1 +1 @@
|
|||||||
Element - Biztonságos üzenetküldő
|
Element
|
||||||
|
1
fastlane/metadata/android/pl-PL/title.txt
Normal file
1
fastlane/metadata/android/pl-PL/title.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Element
|
@ -1 +0,0 @@
|
|||||||
Element - Bezpieczny Komunikator
|
|
@ -1 +1 @@
|
|||||||
Element - Безопасный мессенджер
|
Element
|
||||||
|
2
fastlane/metadata/android/sq/changelogs/40103100.txt
Normal file
2
fastlane/metadata/android/sq/changelogs/40103100.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Ndryshimet kryesore në këtë version: Shtim mbulimi për anketime (në zhvillim). Skemë e re grafike për paraprje URL-sh.
|
||||||
|
Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.10
|
2
fastlane/metadata/android/sq/changelogs/40103110.txt
Normal file
2
fastlane/metadata/android/sq/changelogs/40103110.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Ndryshimet kryesore në këtë version: Ndreqje të metash!
|
||||||
|
Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.11
|
2
fastlane/metadata/android/sq/changelogs/40103120.txt
Normal file
2
fastlane/metadata/android/sq/changelogs/40103120.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Ndryshimet kryesore në këtë version: Ndreqje të metash!
|
||||||
|
Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.12
|
@ -1 +1 @@
|
|||||||
Element - Shkëmbyes i Sigurt Mesazhesh
|
Element
|
||||||
|
@ -26,3 +26,9 @@ vector.httpLogLevel=BASIC
|
|||||||
# Note: to debug, you can put and uncomment the following lines in the file ~/.gradle/gradle.properties to override the value above
|
# Note: to debug, you can put and uncomment the following lines in the file ~/.gradle/gradle.properties to override the value above
|
||||||
#vector.debugPrivateData=true
|
#vector.debugPrivateData=true
|
||||||
#vector.httpLogLevel=BODY
|
#vector.httpLogLevel=BODY
|
||||||
|
|
||||||
|
# Dummy values for signing secrets
|
||||||
|
signing.element.storePath=pathTo.keystore
|
||||||
|
signing.element.storePassword=Secret
|
||||||
|
signing.element.keyId=Secret
|
||||||
|
signing.element.keyPassword=Secret
|
||||||
|
3
integration_tests_script.sh
Executable file
3
integration_tests_script.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
./gradlew -Pandroid.testInstrumentationRunnerArguments.class=org.matrix.android.sdk.session.room.timeline.ChunkEntityTest matrix-sdk-android:connectedAndroidTest
|
||||||
|
./gradlew -Pandroid.testInstrumentationRunnerArguments.class=org.matrix.android.sdk.session.room.timeline.TimelineForwardPaginationTest matrix-sdk-android:connectedAndroidTest
|
3
integration_tests_script_github.sh
Executable file
3
integration_tests_script_github.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.class=org.matrix.android.sdk.session.room.timeline.ChunkEntityTest matrix-sdk-android:connectedAndroidTest
|
||||||
|
./gradlew $CI_GRADLE_ARG_PROPERTIES -Pandroid.testInstrumentationRunnerArguments.class=org.matrix.android.sdk.session.room.timeline.TimelineForwardPaginationTest matrix-sdk-android:connectedAndroidTest
|
1
library/core-utils/.gitignore
vendored
Normal file
1
library/core-utils/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build
|
55
library/core-utils/build.gradle
Normal file
55
library/core-utils/build.gradle
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id 'com.android.library'
|
||||||
|
id 'kotlin-android'
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdk versions.compileSdk
|
||||||
|
defaultConfig {
|
||||||
|
minSdk versions.minSdk
|
||||||
|
targetSdk versions.targetSdk
|
||||||
|
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
consumerProguardFiles "consumer-rules.pro"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility versions.sourceCompat
|
||||||
|
targetCompatibility versions.targetCompat
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "11"
|
||||||
|
freeCompilerArgs += [
|
||||||
|
"-Xopt-in=kotlin.RequiresOptIn"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation libs.androidx.appCompat
|
||||||
|
implementation libs.jetbrains.coroutinesAndroid
|
||||||
|
}
|
2
library/core-utils/src/main/AndroidManifest.xml
Normal file
2
library/core-utils/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest package="im.vector.lib.core.utils" />
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package im.vector.app.core.utils.compat
|
package im.vector.lib.core.utils.compat
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package im.vector.app.core.epoxy.charsequence
|
package im.vector.lib.core.utils.epoxy.charsequence
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for a CharSequence, which support mutation of the CharSequence, which can happen during rendering
|
* Wrapper for a CharSequence, which support mutation of the CharSequence, which can happen during rendering
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package im.vector.app.core.epoxy.charsequence
|
package im.vector.lib.core.utils.epoxy.charsequence
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extensions to wrap CharSequence to EpoxyCharSequence
|
* Extensions to wrap CharSequence to EpoxyCharSequence
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package im.vector.app.core.flow
|
package im.vector.lib.core.utils.flow
|
||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
@ -85,10 +85,12 @@ fun <T> Flow<T>.throttleFirst(windowDuration: Long): Flow<T> = flow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ExperimentalCoroutinesApi
|
||||||
fun tickerFlow(scope: CoroutineScope, delayMillis: Long, initialDelayMillis: Long = delayMillis): Flow<Unit> {
|
fun tickerFlow(scope: CoroutineScope, delayMillis: Long, initialDelayMillis: Long = delayMillis): Flow<Unit> {
|
||||||
return scope.fixedPeriodTicker(delayMillis, initialDelayMillis).consumeAsFlow()
|
return scope.fixedPeriodTicker(delayMillis, initialDelayMillis).consumeAsFlow()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ExperimentalCoroutinesApi
|
||||||
private fun CoroutineScope.fixedPeriodTicker(delayMillis: Long, initialDelayMillis: Long = delayMillis): ReceiveChannel<Unit> {
|
private fun CoroutineScope.fixedPeriodTicker(delayMillis: Long, initialDelayMillis: Long = delayMillis): ReceiveChannel<Unit> {
|
||||||
require(delayMillis >= 0) { "Expected non-negative delay, but has $delayMillis ms" }
|
require(delayMillis >= 0) { "Expected non-negative delay, but has $delayMillis ms" }
|
||||||
require(initialDelayMillis >= 0) { "Expected non-negative initial delay, but has $initialDelayMillis ms" }
|
require(initialDelayMillis >= 0) { "Expected non-negative initial delay, but has $initialDelayMillis ms" }
|
@ -14,9 +14,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package im.vector.app.core.utils
|
package im.vector.lib.core.utils.timer
|
||||||
|
|
||||||
import im.vector.app.core.flow.tickerFlow
|
import im.vector.lib.core.utils.flow.tickerFlow
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.cancel
|
import kotlinx.coroutines.cancel
|
||||||
@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.onEach
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import java.util.concurrent.atomic.AtomicLong
|
import java.util.concurrent.atomic.AtomicLong
|
||||||
|
|
||||||
|
@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
|
||||||
class CountUpTimer(private val intervalInMs: Long = 1_000) {
|
class CountUpTimer(private val intervalInMs: Long = 1_000) {
|
||||||
|
|
||||||
private val coroutineScope = CoroutineScope(Dispatchers.Main)
|
private val coroutineScope = CoroutineScope(Dispatchers.Main)
|
@ -42,6 +42,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation project(":library:core-utils")
|
||||||
|
|
||||||
implementation libs.androidx.appCompat
|
implementation libs.androidx.appCompat
|
||||||
implementation libs.androidx.core
|
implementation libs.androidx.core
|
||||||
|
|
||||||
@ -57,7 +59,7 @@ dependencies {
|
|||||||
implementation libs.jetbrains.coroutinesCore
|
implementation libs.jetbrains.coroutinesCore
|
||||||
implementation libs.jetbrains.coroutinesAndroid
|
implementation libs.jetbrains.coroutinesAndroid
|
||||||
|
|
||||||
testImplementation 'org.json:json:20190722'
|
testImplementation 'org.json:json:20211205'
|
||||||
testImplementation libs.tests.junit
|
testImplementation libs.tests.junit
|
||||||
androidTestImplementation libs.androidx.junit
|
androidTestImplementation libs.androidx.junit
|
||||||
androidTestImplementation libs.androidx.espressoCore
|
androidTestImplementation libs.androidx.espressoCore
|
||||||
|
@ -21,6 +21,7 @@ import android.view.View
|
|||||||
import com.airbnb.epoxy.TypedEpoxyController
|
import com.airbnb.epoxy.TypedEpoxyController
|
||||||
import com.airbnb.mvrx.Fail
|
import com.airbnb.mvrx.Fail
|
||||||
import com.airbnb.mvrx.Success
|
import com.airbnb.mvrx.Success
|
||||||
|
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
||||||
import me.gujun.android.span.Span
|
import me.gujun.android.span.Span
|
||||||
import me.gujun.android.span.span
|
import me.gujun.android.span.span
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
|
|||||||
is Fail -> {
|
is Fail -> {
|
||||||
valueItem {
|
valueItem {
|
||||||
id("fail")
|
id("fail")
|
||||||
text(async.error.localizedMessage?.toSafeCharSequence())
|
text(async.error.localizedMessage?.toEpoxyCharSequence())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Success -> {
|
is Success -> {
|
||||||
@ -94,7 +95,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
|
|||||||
+"{+${model.keys.size}}"
|
+"{+${model.keys.size}}"
|
||||||
textColor = host.styleProvider.baseColor
|
textColor = host.styleProvider.baseColor
|
||||||
}
|
}
|
||||||
}.toSafeCharSequence()
|
}.toEpoxyCharSequence()
|
||||||
)
|
)
|
||||||
itemClickListener(View.OnClickListener { host.itemClicked(model) })
|
itemClickListener(View.OnClickListener { host.itemClicked(model) })
|
||||||
}
|
}
|
||||||
@ -133,7 +134,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
|
|||||||
+"[+${model.items.size}]"
|
+"[+${model.items.size}]"
|
||||||
textColor = host.styleProvider.baseColor
|
textColor = host.styleProvider.baseColor
|
||||||
}
|
}
|
||||||
}.toSafeCharSequence()
|
}.toEpoxyCharSequence()
|
||||||
)
|
)
|
||||||
itemClickListener(View.OnClickListener { host.itemClicked(model) })
|
itemClickListener(View.OnClickListener { host.itemClicked(model) })
|
||||||
}
|
}
|
||||||
@ -163,7 +164,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
append(host.valueToSpan(model))
|
append(host.valueToSpan(model))
|
||||||
}.toSafeCharSequence()
|
}.toEpoxyCharSequence()
|
||||||
)
|
)
|
||||||
copyValue(model.stringRes)
|
copyValue(model.stringRes)
|
||||||
}
|
}
|
||||||
@ -233,7 +234,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
|
|||||||
span("{".takeIf { isObject } ?: "[") {
|
span("{".takeIf { isObject } ?: "[") {
|
||||||
textColor = host.styleProvider.baseColor
|
textColor = host.styleProvider.baseColor
|
||||||
}
|
}
|
||||||
}.toSafeCharSequence()
|
}.toEpoxyCharSequence()
|
||||||
)
|
)
|
||||||
itemClickListener(View.OnClickListener { host.itemClicked(composed) })
|
itemClickListener(View.OnClickListener { host.itemClicked(composed) })
|
||||||
}
|
}
|
||||||
@ -253,7 +254,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
|
|||||||
span {
|
span {
|
||||||
text = "}".takeIf { isObject } ?: "]"
|
text = "}".takeIf { isObject } ?: "]"
|
||||||
textColor = host.styleProvider.baseColor
|
textColor = host.styleProvider.baseColor
|
||||||
}.toSafeCharSequence()
|
}.toEpoxyCharSequence()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,6 @@ package org.billcarsonfr.jsonviewer
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO Mutualize
|
|
||||||
*/
|
|
||||||
internal object Utils {
|
internal object Utils {
|
||||||
fun dpToPx(dp: Int, context: Context): Int {
|
fun dpToPx(dp: Int, context: Context): Int {
|
||||||
return TypedValue.applyDimension(
|
return TypedValue.applyDimension(
|
||||||
|
@ -28,12 +28,13 @@ import com.airbnb.epoxy.EpoxyAttribute
|
|||||||
import com.airbnb.epoxy.EpoxyHolder
|
import com.airbnb.epoxy.EpoxyHolder
|
||||||
import com.airbnb.epoxy.EpoxyModelClass
|
import com.airbnb.epoxy.EpoxyModelClass
|
||||||
import com.airbnb.epoxy.EpoxyModelWithHolder
|
import com.airbnb.epoxy.EpoxyModelWithHolder
|
||||||
|
import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence
|
||||||
|
|
||||||
@EpoxyModelClass(layout = R2.layout.item_jv_base_value)
|
@EpoxyModelClass(layout = R2.layout.item_jv_base_value)
|
||||||
internal abstract class ValueItem : EpoxyModelWithHolder<ValueItem.Holder>() {
|
internal abstract class ValueItem : EpoxyModelWithHolder<ValueItem.Holder>() {
|
||||||
|
|
||||||
@EpoxyAttribute
|
@EpoxyAttribute
|
||||||
var text: SafeCharSequence? = null
|
var text: EpoxyCharSequence? = null
|
||||||
|
|
||||||
@EpoxyAttribute
|
@EpoxyAttribute
|
||||||
var depth: Int = 0
|
var depth: Int = 0
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<solid android:color="?android:colorBackground" />
|
||||||
|
</shape>
|
5
library/ui-styles/src/main/res/values-h720dp/dimens.xml
Normal file
5
library/ui-styles/src/main/res/values-h720dp/dimens.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<item name="ftue_auth_carousel_item_spacing" format="float" type="dimen">0.05</item>
|
||||||
|
<item name="ftue_auth_carousel_item_image_height" format="float" type="dimen">0.40</item>
|
||||||
|
</resources>
|
@ -2,5 +2,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<dimen name="width_percent">0.6</dimen>
|
<dimen name="width_percent">0.6</dimen>
|
||||||
|
<bool name="is_tablet">true</bool>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
@ -51,4 +51,7 @@
|
|||||||
<!-- Onboarding -->
|
<!-- Onboarding -->
|
||||||
<item name="ftue_auth_gutter_start_percent" format="float" type="dimen">0.05</item>
|
<item name="ftue_auth_gutter_start_percent" format="float" type="dimen">0.05</item>
|
||||||
<item name="ftue_auth_gutter_end_percent" format="float" type="dimen">0.95</item>
|
<item name="ftue_auth_gutter_end_percent" format="float" type="dimen">0.95</item>
|
||||||
|
|
||||||
|
<item name="ftue_auth_carousel_item_spacing" format="float" type="dimen">0.01</item>
|
||||||
|
<item name="ftue_auth_carousel_item_image_height" format="float" type="dimen">0.35</item>
|
||||||
</resources>
|
</resources>
|
@ -6,10 +6,12 @@
|
|||||||
<item name="elevation">0dp</item>
|
<item name="elevation">0dp</item>
|
||||||
|
|
||||||
<!-- main text -->
|
<!-- main text -->
|
||||||
<item name="titleTextStyle">@style/Widget.Vector.TextView.ActionBarTitle</item>
|
<item name="titleTextAppearance">@style/TextAppearance.Vector.Widget.ActionBarTitle</item>
|
||||||
|
|
||||||
<!-- sub text -->
|
<!-- sub text -->
|
||||||
<item name="subtitleTextStyle">@style/Widget.Vector.TextView.ActionBarSubTitle</item>
|
<item name="subtitleTextAppearance">@style/TextAppearance.Vector.Widget.ActionBarSubTitle</item>
|
||||||
|
|
||||||
|
<item name="navigationIconTint">?vctr_content_secondary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- Default toolbar style -->
|
<!-- Default toolbar style -->
|
||||||
@ -22,16 +24,18 @@
|
|||||||
|
|
||||||
<!-- Toolbar text style -->
|
<!-- Toolbar text style -->
|
||||||
<!-- main text -->
|
<!-- main text -->
|
||||||
<style name="Widget.Vector.TextView.ActionBarTitle" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
|
<style name="TextAppearance.Vector.Widget.ActionBarTitle" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
|
||||||
<item name="android:textColor">?vctr_content_primary</item>
|
<item name="android:textColor">?vctr_content_primary</item>
|
||||||
<item name="android:fontFamily">"sans-serif-medium"</item>
|
<item name="android:fontFamily">sans-serif-medium</item>
|
||||||
<item name="android:textSize">20sp</item>
|
<item name="fontFamily">sans-serif-medium</item>
|
||||||
|
<item name="android:textSize">18sp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- sub text -->
|
<!-- sub text -->
|
||||||
<style name="Widget.Vector.TextView.ActionBarSubTitle" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle">
|
<style name="TextAppearance.Vector.Widget.ActionBarSubTitle" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle">
|
||||||
<item name="android:textColor">?vctr_content_primary</item>
|
<item name="android:textColor">?vctr_content_secondary</item>
|
||||||
<item name="android:fontFamily">"sans-serif-medium"</item>
|
<item name="android:fontFamily">sans-serif</item>
|
||||||
|
<item name="fontFamily">sans-serif</item>
|
||||||
<item name="android:textSize">12sp</item>
|
<item name="android:textSize">12sp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -2,5 +2,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<dimen name="width_percent">1</dimen>
|
<dimen name="width_percent">1</dimen>
|
||||||
|
<bool name="is_tablet">false</bool>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
1
matrix-sdk-android-rx/.gitignore
vendored
1
matrix-sdk-android-rx/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
/build
|
|
@ -1,47 +0,0 @@
|
|||||||
apply plugin: 'com.android.library'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
apply plugin: 'kotlin-kapt'
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdk versions.compileSdk
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdk versions.minSdk
|
|
||||||
targetSdk versions.targetSdk
|
|
||||||
|
|
||||||
// Multidex is useful for tests
|
|
||||||
multiDexEnabled true
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
minifyEnabled false
|
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility versions.sourceCompat
|
|
||||||
targetCompatibility versions.targetCompat
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "11"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
|
|
||||||
implementation project(":matrix-sdk-android")
|
|
||||||
implementation libs.androidx.appCompat
|
|
||||||
implementation libs.rx.rxKotlin
|
|
||||||
implementation libs.rx.rxAndroid
|
|
||||||
implementation libs.jetbrains.coroutinesRx2
|
|
||||||
|
|
||||||
// Paging
|
|
||||||
implementation libs.androidx.pagingRuntimeKtx
|
|
||||||
|
|
||||||
// Logging
|
|
||||||
implementation libs.jakewharton.timber
|
|
||||||
}
|
|
21
matrix-sdk-android-rx/proguard-rules.pro
vendored
21
matrix-sdk-android-rx/proguard-rules.pro
vendored
@ -1,21 +0,0 @@
|
|||||||
# Add project specific ProGuard rules here.
|
|
||||||
# You can control the set of applied configuration files using the
|
|
||||||
# proguardFiles setting in build.gradle.
|
|
||||||
#
|
|
||||||
# For more details, see
|
|
||||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
|
||||||
|
|
||||||
# If your project uses WebView with JS, uncomment the following
|
|
||||||
# and specify the fully qualified class name to the JavaScript interface
|
|
||||||
# class:
|
|
||||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
|
||||||
# public *;
|
|
||||||
#}
|
|
||||||
|
|
||||||
# Uncomment this to preserve the line number information for
|
|
||||||
# debugging stack traces.
|
|
||||||
#-keepattributes SourceFile,LineNumberTable
|
|
||||||
|
|
||||||
# If you keep the line number information, uncomment this to
|
|
||||||
# hide the original source file name.
|
|
||||||
#-renamesourcefileattribute SourceFile
|
|
@ -1 +0,0 @@
|
|||||||
<manifest package="org.matrix.android.sdk.rx" />
|
|
@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
||||||
*
|
|
||||||
* 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 org.matrix.android.sdk.rx
|
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
|
||||||
import androidx.lifecycle.Observer
|
|
||||||
import io.reactivex.Observable
|
|
||||||
import io.reactivex.android.MainThreadDisposable
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.schedulers.Schedulers
|
|
||||||
|
|
||||||
private class LiveDataObservable<T>(
|
|
||||||
private val liveData: LiveData<T>,
|
|
||||||
private val valueIfNull: T? = null
|
|
||||||
) : Observable<T>() {
|
|
||||||
|
|
||||||
override fun subscribeActual(observer: io.reactivex.Observer<in T>) {
|
|
||||||
val relay = RemoveObserverInMainThread(observer)
|
|
||||||
observer.onSubscribe(relay)
|
|
||||||
liveData.observeForever(relay)
|
|
||||||
}
|
|
||||||
|
|
||||||
private inner class RemoveObserverInMainThread(private val observer: io.reactivex.Observer<in T>) :
|
|
||||||
MainThreadDisposable(), Observer<T> {
|
|
||||||
|
|
||||||
override fun onChanged(t: T?) {
|
|
||||||
if (!isDisposed) {
|
|
||||||
if (t == null) {
|
|
||||||
if (valueIfNull != null) {
|
|
||||||
observer.onNext(valueIfNull)
|
|
||||||
} else {
|
|
||||||
observer.onError(NullPointerException(
|
|
||||||
"convert liveData value t to RxJava onNext(t), t cannot be null"))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
observer.onNext(t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDispose() {
|
|
||||||
liveData.removeObserver(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> LiveData<T>.asObservable(): Observable<T> {
|
|
||||||
return LiveDataObservable(this).observeOn(Schedulers.computation())
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun <T> Observable<T>.startWithCallable(supplier: () -> T): Observable<T> {
|
|
||||||
val startObservable = Observable
|
|
||||||
.fromCallable(supplier)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
return startWith(startObservable)
|
|
||||||
}
|
|
@ -1,158 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
||||||
*
|
|
||||||
* 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 org.matrix.android.sdk.rx
|
|
||||||
|
|
||||||
import android.net.Uri
|
|
||||||
import io.reactivex.Completable
|
|
||||||
import io.reactivex.Observable
|
|
||||||
import io.reactivex.Single
|
|
||||||
import kotlinx.coroutines.rx2.rxCompletable
|
|
||||||
import kotlinx.coroutines.rx2.rxSingle
|
|
||||||
import org.matrix.android.sdk.api.query.QueryStringValue
|
|
||||||
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
|
||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
|
||||||
import org.matrix.android.sdk.api.session.identity.ThreePid
|
|
||||||
import org.matrix.android.sdk.api.session.room.Room
|
|
||||||
import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.ReadReceipt
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
|
||||||
import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState
|
|
||||||
import org.matrix.android.sdk.api.session.room.send.UserDraft
|
|
||||||
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
|
||||||
import org.matrix.android.sdk.api.util.Optional
|
|
||||||
import org.matrix.android.sdk.api.util.toOptional
|
|
||||||
|
|
||||||
class RxRoom(private val room: Room) {
|
|
||||||
|
|
||||||
fun liveRoomSummary(): Observable<Optional<RoomSummary>> {
|
|
||||||
return room.getRoomSummaryLive()
|
|
||||||
.asObservable()
|
|
||||||
.startWithCallable { room.roomSummary().toOptional() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveRoomMembers(queryParams: RoomMemberQueryParams): Observable<List<RoomMemberSummary>> {
|
|
||||||
return room.getRoomMembersLive(queryParams).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
room.getRoomMembers(queryParams)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveAnnotationSummary(eventId: String): Observable<Optional<EventAnnotationsSummary>> {
|
|
||||||
return room.getEventAnnotationsSummaryLive(eventId).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
room.getEventAnnotationsSummary(eventId).toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveTimelineEvent(eventId: String): Observable<Optional<TimelineEvent>> {
|
|
||||||
return room.getTimeLineEventLive(eventId).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
room.getTimeLineEvent(eventId).toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveStateEvent(eventType: String, stateKey: QueryStringValue): Observable<Optional<Event>> {
|
|
||||||
return room.getStateEventLive(eventType, stateKey).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
room.getStateEvent(eventType, stateKey).toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveStateEvents(eventTypes: Set<String>): Observable<List<Event>> {
|
|
||||||
return room.getStateEventsLive(eventTypes).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
room.getStateEvents(eventTypes)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveReadMarker(): Observable<Optional<String>> {
|
|
||||||
return room.getReadMarkerLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveReadReceipt(): Observable<Optional<String>> {
|
|
||||||
return room.getMyReadReceiptLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun loadRoomMembersIfNeeded(): Single<Unit> = rxSingle {
|
|
||||||
room.loadRoomMembersIfNeeded()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun joinRoom(reason: String? = null,
|
|
||||||
viaServers: List<String> = emptyList()): Single<Unit> = rxSingle {
|
|
||||||
room.join(reason, viaServers)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveEventReadReceipts(eventId: String): Observable<List<ReadReceipt>> {
|
|
||||||
return room.getEventReadReceiptsLive(eventId).asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveDraft(): Observable<Optional<UserDraft>> {
|
|
||||||
return room.getDraftLive().asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
room.getDraft().toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveNotificationState(): Observable<RoomNotificationState> {
|
|
||||||
return room.getLiveRoomNotificationState().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun invite(userId: String, reason: String? = null): Completable = rxCompletable {
|
|
||||||
room.invite(userId, reason)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun invite3pid(threePid: ThreePid): Completable = rxCompletable {
|
|
||||||
room.invite3pid(threePid)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateTopic(topic: String): Completable = rxCompletable {
|
|
||||||
room.updateTopic(topic)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateName(name: String): Completable = rxCompletable {
|
|
||||||
room.updateName(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateHistoryReadability(readability: RoomHistoryVisibility): Completable = rxCompletable {
|
|
||||||
room.updateHistoryReadability(readability)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?): Completable = rxCompletable {
|
|
||||||
room.updateJoinRule(joinRules, guestAccess)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateAvatar(avatarUri: Uri, fileName: String): Completable = rxCompletable {
|
|
||||||
room.updateAvatar(avatarUri, fileName)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun deleteAvatar(): Completable = rxCompletable {
|
|
||||||
room.deleteAvatar()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun sendMedia(attachment: ContentAttachmentData, compressBeforeSending: Boolean, roomIds: Set<String>): Completable = rxCompletable {
|
|
||||||
room.sendMedia(attachment, compressBeforeSending, roomIds)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Room.rx(): RxRoom {
|
|
||||||
return RxRoom(this)
|
|
||||||
}
|
|
@ -1,251 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
||||||
*
|
|
||||||
* 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 org.matrix.android.sdk.rx
|
|
||||||
|
|
||||||
import androidx.paging.PagedList
|
|
||||||
import io.reactivex.Observable
|
|
||||||
import io.reactivex.Single
|
|
||||||
import io.reactivex.functions.Function3
|
|
||||||
import kotlinx.coroutines.rx2.rxSingle
|
|
||||||
import org.matrix.android.sdk.api.extensions.orFalse
|
|
||||||
import org.matrix.android.sdk.api.query.QueryStringValue
|
|
||||||
import org.matrix.android.sdk.api.session.Session
|
|
||||||
import org.matrix.android.sdk.api.session.accountdata.UserAccountDataEvent
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
|
|
||||||
import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
|
|
||||||
import org.matrix.android.sdk.api.session.group.GroupSummaryQueryParams
|
|
||||||
import org.matrix.android.sdk.api.session.group.model.GroupSummary
|
|
||||||
import org.matrix.android.sdk.api.session.identity.FoundThreePid
|
|
||||||
import org.matrix.android.sdk.api.session.identity.ThreePid
|
|
||||||
import org.matrix.android.sdk.api.session.pushers.Pusher
|
|
||||||
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
|
|
||||||
import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataEvent
|
|
||||||
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
|
||||||
import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams
|
|
||||||
import org.matrix.android.sdk.api.session.sync.SyncState
|
|
||||||
import org.matrix.android.sdk.api.session.user.model.User
|
|
||||||
import org.matrix.android.sdk.api.session.widgets.model.Widget
|
|
||||||
import org.matrix.android.sdk.api.util.JsonDict
|
|
||||||
import org.matrix.android.sdk.api.util.Optional
|
|
||||||
import org.matrix.android.sdk.api.util.toOptional
|
|
||||||
import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
|
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
|
|
||||||
import org.matrix.android.sdk.internal.crypto.store.PrivateKeysInfo
|
|
||||||
import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription
|
|
||||||
|
|
||||||
class RxSession(private val session: Session) {
|
|
||||||
|
|
||||||
fun liveRoomSummaries(queryParams: RoomSummaryQueryParams): Observable<List<RoomSummary>> {
|
|
||||||
return session.getRoomSummariesLive(queryParams).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.getRoomSummaries(queryParams)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveGroupSummaries(queryParams: GroupSummaryQueryParams): Observable<List<GroupSummary>> {
|
|
||||||
return session.getGroupSummariesLive(queryParams).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.getGroupSummaries(queryParams)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveSpaceSummaries(queryParams: SpaceSummaryQueryParams): Observable<List<RoomSummary>> {
|
|
||||||
return session.spaceService().getSpaceSummariesLive(queryParams).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.spaceService().getSpaceSummaries(queryParams)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable<List<RoomSummary>> {
|
|
||||||
return session.getBreadcrumbsLive(queryParams).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.getBreadcrumbs(queryParams)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveMyDevicesInfo(): Observable<List<DeviceInfo>> {
|
|
||||||
return session.cryptoService().getLiveMyDevicesInfo().asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.cryptoService().getMyDevicesInfo()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveSyncState(): Observable<SyncState> {
|
|
||||||
return session.getSyncStateLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun livePushers(): Observable<List<Pusher>> {
|
|
||||||
return session.getPushersLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveUser(userId: String): Observable<Optional<User>> {
|
|
||||||
return session.getUserLive(userId).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.getUser(userId).toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveRoomMember(userId: String, roomId: String): Observable<Optional<RoomMemberSummary>> {
|
|
||||||
return session.getRoomMemberLive(userId, roomId).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.getRoomMember(userId, roomId).toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveUsers(): Observable<List<User>> {
|
|
||||||
return session.getUsersLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveIgnoredUsers(): Observable<List<User>> {
|
|
||||||
return session.getIgnoredUsersLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun livePagedUsers(filter: String? = null, excludedUserIds: Set<String>? = null): Observable<PagedList<User>> {
|
|
||||||
return session.getPagedUsersLive(filter, excludedUserIds).asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveThreePIds(refreshData: Boolean): Observable<List<ThreePid>> {
|
|
||||||
return session.getThreePidsLive(refreshData).asObservable()
|
|
||||||
.startWithCallable { session.getThreePids() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun livePendingThreePIds(): Observable<List<ThreePid>> {
|
|
||||||
return session.getPendingThreePidsLive().asObservable()
|
|
||||||
.startWithCallable { session.getPendingThreePids() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun createRoom(roomParams: CreateRoomParams): Single<String> = rxSingle {
|
|
||||||
session.createRoom(roomParams)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun searchUsersDirectory(search: String,
|
|
||||||
limit: Int,
|
|
||||||
excludedUserIds: Set<String>): Single<List<User>> = rxSingle {
|
|
||||||
session.searchUsersDirectory(search, limit, excludedUserIds)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun joinRoom(roomIdOrAlias: String,
|
|
||||||
reason: String? = null,
|
|
||||||
viaServers: List<String> = emptyList()): Single<Unit> = rxSingle {
|
|
||||||
session.joinRoom(roomIdOrAlias, reason, viaServers)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getRoomIdByAlias(roomAlias: String,
|
|
||||||
searchOnServer: Boolean): Single<Optional<RoomAliasDescription>> = rxSingle {
|
|
||||||
session.getRoomIdByAlias(roomAlias, searchOnServer)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getProfileInfo(userId: String): Single<JsonDict> = rxSingle {
|
|
||||||
session.getProfile(userId)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveUserCryptoDevices(userId: String): Observable<List<CryptoDeviceInfo>> {
|
|
||||||
return session.cryptoService().getLiveCryptoDeviceInfo(userId).asObservable().startWithCallable {
|
|
||||||
session.cryptoService().getCryptoDeviceInfo(userId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveCrossSigningInfo(userId: String): Observable<Optional<MXCrossSigningInfo>> {
|
|
||||||
return session.cryptoService().crossSigningService().getLiveCrossSigningKeys(userId).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.cryptoService().crossSigningService().getUserCrossSigningKeys(userId).toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveCrossSigningPrivateKeys(): Observable<Optional<PrivateKeysInfo>> {
|
|
||||||
return session.cryptoService().crossSigningService().getLiveCrossSigningPrivateKeys().asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.cryptoService().crossSigningService().getCrossSigningPrivateKeys().toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveUserAccountData(types: Set<String>): Observable<List<UserAccountDataEvent>> {
|
|
||||||
return session.accountDataService().getLiveUserAccountDataEvents(types).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.accountDataService().getUserAccountDataEvents(types)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveRoomAccountData(types: Set<String>): Observable<List<RoomAccountDataEvent>> {
|
|
||||||
return session.accountDataService().getLiveRoomAccountDataEvents(types).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.accountDataService().getRoomAccountDataEvents(types)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveRoomWidgets(
|
|
||||||
roomId: String,
|
|
||||||
widgetId: QueryStringValue,
|
|
||||||
widgetTypes: Set<String>? = null,
|
|
||||||
excludedTypes: Set<String>? = null
|
|
||||||
): Observable<List<Widget>> {
|
|
||||||
return session.widgetService().getRoomWidgetsLive(roomId, widgetId, widgetTypes, excludedTypes).asObservable()
|
|
||||||
.startWithCallable {
|
|
||||||
session.widgetService().getRoomWidgets(roomId, widgetId, widgetTypes, excludedTypes)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveRoomChangeMembershipState(): Observable<Map<String, ChangeMembershipState>> {
|
|
||||||
return session.getChangeMembershipsLive().asObservable()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun liveSecretSynchronisationInfo(): Observable<SecretsSynchronisationInfo> {
|
|
||||||
return Observable.combineLatest<List<UserAccountDataEvent>, Optional<MXCrossSigningInfo>, Optional<PrivateKeysInfo>, SecretsSynchronisationInfo>(
|
|
||||||
liveUserAccountData(setOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME)),
|
|
||||||
liveCrossSigningInfo(session.myUserId),
|
|
||||||
liveCrossSigningPrivateKeys(),
|
|
||||||
Function3 { _, crossSigningInfo, pInfo ->
|
|
||||||
// first check if 4S is already setup
|
|
||||||
val is4SSetup = session.sharedSecretStorageService.isRecoverySetup()
|
|
||||||
val isCrossSigningEnabled = crossSigningInfo.getOrNull() != null
|
|
||||||
val isCrossSigningTrusted = crossSigningInfo.getOrNull()?.isTrusted() == true
|
|
||||||
val allPrivateKeysKnown = pInfo.getOrNull()?.allKnown().orFalse()
|
|
||||||
|
|
||||||
val keysBackupService = session.cryptoService().keysBackupService()
|
|
||||||
val currentBackupVersion = keysBackupService.currentBackupVersion
|
|
||||||
val megolmBackupAvailable = currentBackupVersion != null
|
|
||||||
val savedBackupKey = keysBackupService.getKeyBackupRecoveryKeyInfo()
|
|
||||||
|
|
||||||
val megolmKeyKnown = savedBackupKey?.version == currentBackupVersion
|
|
||||||
SecretsSynchronisationInfo(
|
|
||||||
isBackupSetup = is4SSetup,
|
|
||||||
isCrossSigningEnabled = isCrossSigningEnabled,
|
|
||||||
isCrossSigningTrusted = isCrossSigningTrusted,
|
|
||||||
allPrivateKeysKnown = allPrivateKeysKnown,
|
|
||||||
megolmBackupAvailable = megolmBackupAvailable,
|
|
||||||
megolmSecretKnown = megolmKeyKnown,
|
|
||||||
isMegolmKeyIn4S = session.sharedSecretStorageService.isMegolmKeyInBackup()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.distinctUntilChanged()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun lookupThreePid(threePid: ThreePid): Single<Optional<FoundThreePid>> = rxSingle {
|
|
||||||
session.identityService().lookUp(listOf(threePid)).firstOrNull().toOptional()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Session.rx(): RxSession {
|
|
||||||
return RxSession(this)
|
|
||||||
}
|
|
@ -31,7 +31,7 @@ android {
|
|||||||
// that the app's state is completely cleared between tests.
|
// that the app's state is completely cleared between tests.
|
||||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||||
|
|
||||||
buildConfigField "String", "SDK_VERSION", "\"1.3.15\""
|
buildConfigField "String", "SDK_VERSION", "\"1.3.16\""
|
||||||
|
|
||||||
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
||||||
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
|
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
|
||||||
@ -45,7 +45,7 @@ android {
|
|||||||
|
|
||||||
testOptions {
|
testOptions {
|
||||||
// Comment to run on Android 12
|
// Comment to run on Android 12
|
||||||
execution 'ANDROIDX_TEST_ORCHESTRATOR'
|
// execution 'ANDROIDX_TEST_ORCHESTRATOR'
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
@ -64,6 +64,7 @@ android {
|
|||||||
|
|
||||||
adbOptions {
|
adbOptions {
|
||||||
installOptions "-g"
|
installOptions "-g"
|
||||||
|
// timeOutInMs 350 * 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
@ -115,6 +116,11 @@ dependencies {
|
|||||||
implementation libs.squareup.retrofit
|
implementation libs.squareup.retrofit
|
||||||
implementation libs.squareup.retrofitMoshi
|
implementation libs.squareup.retrofitMoshi
|
||||||
|
|
||||||
|
// When version of okhttp is updated (current is 4.9.3), consider removing the workaround
|
||||||
|
// to force usage of Protocol.HTTP_1_1. Check the status of:
|
||||||
|
// - https://github.com/square/okhttp/issues/3278
|
||||||
|
// - https://github.com/square/okhttp/issues/4455
|
||||||
|
// - https://github.com/square/okhttp/issues/3146
|
||||||
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.3"))
|
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.3"))
|
||||||
implementation 'com.squareup.okhttp3:okhttp'
|
implementation 'com.squareup.okhttp3:okhttp'
|
||||||
implementation 'com.squareup.okhttp3:logging-interceptor'
|
implementation 'com.squareup.okhttp3:logging-interceptor'
|
||||||
@ -158,7 +164,7 @@ dependencies {
|
|||||||
implementation libs.apache.commonsImaging
|
implementation libs.apache.commonsImaging
|
||||||
|
|
||||||
// Phone number https://github.com/google/libphonenumber
|
// Phone number https://github.com/google/libphonenumber
|
||||||
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.40'
|
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.41'
|
||||||
|
|
||||||
testImplementation libs.tests.junit
|
testImplementation libs.tests.junit
|
||||||
testImplementation 'org.robolectric:robolectric:4.7.3'
|
testImplementation 'org.robolectric:robolectric:4.7.3'
|
||||||
|
@ -16,7 +16,9 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.account
|
package org.matrix.android.sdk.account
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.JUnit4
|
import org.junit.runners.JUnit4
|
||||||
@ -29,6 +31,7 @@ import org.matrix.android.sdk.common.TestConstants
|
|||||||
|
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class AccountCreationTest : InstrumentedTest {
|
class AccountCreationTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
private val commonTestHelper = CommonTestHelper(context())
|
||||||
@ -42,6 +45,7 @@ class AccountCreationTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun createAccountAndLoginAgainTest() {
|
fun createAccountAndLoginAgainTest() {
|
||||||
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = true))
|
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = true))
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ package org.matrix.android.sdk.account
|
|||||||
|
|
||||||
import org.amshove.kluent.shouldBeTrue
|
import org.amshove.kluent.shouldBeTrue
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.JUnit4
|
import org.junit.runners.JUnit4
|
||||||
@ -30,6 +31,7 @@ import org.matrix.android.sdk.common.TestConstants
|
|||||||
|
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
class ChangePasswordTest : InstrumentedTest {
|
class ChangePasswordTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
private val commonTestHelper = CommonTestHelper(context())
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022 The Matrix.org Foundation C.I.C.
|
||||||
|
*
|
||||||
|
* 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 org.matrix.android.sdk.common
|
||||||
|
|
||||||
|
import org.junit.rules.TestRule
|
||||||
|
import org.junit.runner.Description
|
||||||
|
import org.junit.runners.model.Statement
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retry test rule used to retry test that failed.
|
||||||
|
* Retry failed test 3 times
|
||||||
|
*/
|
||||||
|
class RetryTestRule(val retryCount: Int = 3) : TestRule {
|
||||||
|
|
||||||
|
override fun apply(base: Statement, description: Description): Statement {
|
||||||
|
return statement(base)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun statement(base: Statement): Statement {
|
||||||
|
return object : Statement() {
|
||||||
|
@Throws(Throwable::class)
|
||||||
|
override fun evaluate() {
|
||||||
|
var caughtThrowable: Throwable? = null
|
||||||
|
|
||||||
|
// implement retry logic here
|
||||||
|
for (i in 0 until retryCount) {
|
||||||
|
try {
|
||||||
|
base.evaluate()
|
||||||
|
return
|
||||||
|
} catch (t: Throwable) {
|
||||||
|
caughtThrowable = t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw caughtThrowable!!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,8 +22,8 @@ object TestConstants {
|
|||||||
|
|
||||||
const val TESTS_HOME_SERVER_URL = "http://10.0.2.2:8080"
|
const val TESTS_HOME_SERVER_URL = "http://10.0.2.2:8080"
|
||||||
|
|
||||||
// Time out to use when waiting for server response. 20s
|
// Time out to use when waiting for server response.
|
||||||
private const val AWAIT_TIME_OUT_MILLIS = 20_000
|
private const val AWAIT_TIME_OUT_MILLIS = 30_000
|
||||||
|
|
||||||
// Time out to use when waiting for server response, when the debugger is connected. 10 minutes
|
// Time out to use when waiting for server response, when the debugger is connected. 10 minutes
|
||||||
private const val AWAIT_TIME_OUT_WITH_DEBUGGER_MILLIS = 10 * 60_000
|
private const val AWAIT_TIME_OUT_WITH_DEBUGGER_MILLIS = 10 * 60_000
|
||||||
|
@ -21,6 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
|
|||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -40,6 +41,7 @@ class PreShareKeysTest : InstrumentedTest {
|
|||||||
private val cryptoTestHelper = CryptoTestHelper(testHelper)
|
private val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun ensure_outbound_session_happy_path() {
|
fun ensure_outbound_session_happy_path() {
|
||||||
val testData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true)
|
val testData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true)
|
||||||
val e2eRoomID = testData.roomId
|
val e2eRoomID = testData.roomId
|
||||||
@ -97,7 +99,6 @@ class PreShareKeysTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
testHelper.signOutAndClose(aliceSession)
|
testData.cleanUp(testHelper)
|
||||||
testHelper.signOutAndClose(bobSession)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import org.amshove.kluent.shouldBe
|
|||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -84,6 +85,7 @@ class UnwedgingTest : InstrumentedTest {
|
|||||||
* -> This is automatically fixed after SDKs restarted the olm session
|
* -> This is automatically fixed after SDKs restarted the olm session
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testUnwedging() {
|
fun testUnwedging() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package org.matrix.android.sdk.internal.crypto.crosssigning
|
package org.matrix.android.sdk.internal.crypto.crosssigning
|
||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertFalse
|
import org.junit.Assert.assertFalse
|
||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
@ -24,6 +25,7 @@ import org.junit.Assert.assertNull
|
|||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Assert.fail
|
import org.junit.Assert.fail
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -43,6 +45,7 @@ import kotlin.coroutines.resume
|
|||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
|
@LargeTest
|
||||||
class XSigningTest : InstrumentedTest {
|
class XSigningTest : InstrumentedTest {
|
||||||
|
|
||||||
private val testHelper = CommonTestHelper(context())
|
private val testHelper = CommonTestHelper(context())
|
||||||
@ -124,11 +127,11 @@ class XSigningTest : InstrumentedTest {
|
|||||||
|
|
||||||
assertFalse("Bob keys from alice pov should not be trusted", bobKeysFromAlicePOV.isTrusted())
|
assertFalse("Bob keys from alice pov should not be trusted", bobKeysFromAlicePOV.isTrusted())
|
||||||
|
|
||||||
testHelper.signOutAndClose(aliceSession)
|
cryptoTestData.cleanUp(testHelper)
|
||||||
testHelper.signOutAndClose(bobSession)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_CrossSigningTestAliceTrustBobNewDevice() {
|
fun test_CrossSigningTestAliceTrustBobNewDevice() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ class EncryptionTest : InstrumentedTest {
|
|||||||
// Send an encryption Event as a State Event
|
// Send an encryption Event as a State Event
|
||||||
room.sendStateEvent(
|
room.sendStateEvent(
|
||||||
eventType = EventType.STATE_ROOM_ENCRYPTION,
|
eventType = EventType.STATE_ROOM_ENCRYPTION,
|
||||||
stateKey = null,
|
stateKey = "",
|
||||||
body = EncryptionEventContent(algorithm = MXCRYPTO_ALGORITHM_MEGOLM).toContent()
|
body = EncryptionEventContent(algorithm = MXCRYPTO_ALGORITHM_MEGOLM).toContent()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,14 @@ package org.matrix.android.sdk.internal.crypto.gossiping
|
|||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import junit.framework.TestCase.assertEquals
|
import junit.framework.TestCase.assertEquals
|
||||||
import junit.framework.TestCase.assertNotNull
|
import junit.framework.TestCase.assertNotNull
|
||||||
import junit.framework.TestCase.assertTrue
|
import junit.framework.TestCase.assertTrue
|
||||||
import junit.framework.TestCase.fail
|
import junit.framework.TestCase.fail
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -59,11 +61,13 @@ import kotlin.coroutines.resume
|
|||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class KeyShareTests : InstrumentedTest {
|
class KeyShareTests : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
private val commonTestHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_DoNotSelfShareIfNotTrusted() {
|
fun test_DoNotSelfShareIfNotTrusted() {
|
||||||
val aliceSession = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
|
|
||||||
@ -195,6 +199,7 @@ class KeyShareTests : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_ShareSSSSSecret() {
|
fun test_ShareSSSSSecret() {
|
||||||
val aliceSession1 = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession1 = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
|
|
||||||
@ -307,6 +312,7 @@ class KeyShareTests : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_ImproperKeyShareBug() {
|
fun test_ImproperKeyShareBug() {
|
||||||
val aliceSession = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
|
|
||||||
|
@ -18,8 +18,10 @@ package org.matrix.android.sdk.internal.crypto.gossiping
|
|||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -39,12 +41,14 @@ import org.matrix.android.sdk.internal.crypto.model.event.WithHeldCode
|
|||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class WithHeldTests : InstrumentedTest {
|
class WithHeldTests : InstrumentedTest {
|
||||||
|
|
||||||
private val testHelper = CommonTestHelper(context())
|
private val testHelper = CommonTestHelper(context())
|
||||||
private val cryptoTestHelper = CryptoTestHelper(testHelper)
|
private val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_WithHeldUnverifiedReason() {
|
fun test_WithHeldUnverifiedReason() {
|
||||||
// =============================
|
// =============================
|
||||||
// ARRANGE
|
// ARRANGE
|
||||||
@ -129,6 +133,7 @@ class WithHeldTests : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_WithHeldNoOlm() {
|
fun test_WithHeldNoOlm() {
|
||||||
val testData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val testData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
val aliceSession = testData.firstSession
|
val aliceSession = testData.firstSession
|
||||||
@ -199,6 +204,7 @@ class WithHeldTests : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_WithHeldKeyRequest() {
|
fun test_WithHeldKeyRequest() {
|
||||||
val testData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val testData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
val aliceSession = testData.firstSession
|
val aliceSession = testData.firstSession
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
package org.matrix.android.sdk.internal.crypto.keysbackup
|
package org.matrix.android.sdk.internal.crypto.keysbackup
|
||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertFalse
|
import org.junit.Assert.assertFalse
|
||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.Assert.assertNull
|
import org.junit.Assert.assertNull
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -47,6 +49,7 @@ import java.util.concurrent.CountDownLatch
|
|||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class KeysBackupTest : InstrumentedTest {
|
class KeysBackupTest : InstrumentedTest {
|
||||||
|
|
||||||
private val testHelper = CommonTestHelper(context())
|
private val testHelper = CommonTestHelper(context())
|
||||||
@ -59,6 +62,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Reset keys backup markers
|
* - Reset keys backup markers
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun roomKeysTest_testBackupStore_ok() {
|
fun roomKeysTest_testBackupStore_ok() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
|
|
||||||
@ -157,6 +161,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Check the backup completes
|
* - Check the backup completes
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun backupAfterCreateKeysBackupVersionTest() {
|
fun backupAfterCreateKeysBackupVersionTest() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
|
|
||||||
@ -197,6 +202,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* Check that backupAllGroupSessions() returns valid data
|
* Check that backupAllGroupSessions() returns valid data
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun backupAllGroupSessionsTest() {
|
fun backupAllGroupSessionsTest() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
|
|
||||||
@ -241,6 +247,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Compare the decrypted megolm key with the original one
|
* - Compare the decrypted megolm key with the original one
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testEncryptAndDecryptKeysBackupData() {
|
fun testEncryptAndDecryptKeysBackupData() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
|
|
||||||
@ -282,6 +289,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Restore must be successful
|
* - Restore must be successful
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun restoreKeysBackupTest() {
|
fun restoreKeysBackupTest() {
|
||||||
val testData = keysBackupTestHelper.createKeysBackupScenarioWithPassword(null)
|
val testData = keysBackupTestHelper.createKeysBackupScenarioWithPassword(null)
|
||||||
|
|
||||||
@ -365,6 +373,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - It must be trusted and must have with 2 signatures now
|
* - It must be trusted and must have with 2 signatures now
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun trustKeyBackupVersionTest() {
|
fun trustKeyBackupVersionTest() {
|
||||||
// - Do an e2e backup to the homeserver with a recovery key
|
// - Do an e2e backup to the homeserver with a recovery key
|
||||||
// - And log Alice on a new device
|
// - And log Alice on a new device
|
||||||
@ -424,6 +433,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - It must be trusted and must have with 2 signatures now
|
* - It must be trusted and must have with 2 signatures now
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun trustKeyBackupVersionWithRecoveryKeyTest() {
|
fun trustKeyBackupVersionWithRecoveryKeyTest() {
|
||||||
// - Do an e2e backup to the homeserver with a recovery key
|
// - Do an e2e backup to the homeserver with a recovery key
|
||||||
// - And log Alice on a new device
|
// - And log Alice on a new device
|
||||||
@ -481,6 +491,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - The backup must still be untrusted and disabled
|
* - The backup must still be untrusted and disabled
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun trustKeyBackupVersionWithWrongRecoveryKeyTest() {
|
fun trustKeyBackupVersionWithWrongRecoveryKeyTest() {
|
||||||
// - Do an e2e backup to the homeserver with a recovery key
|
// - Do an e2e backup to the homeserver with a recovery key
|
||||||
// - And log Alice on a new device
|
// - And log Alice on a new device
|
||||||
@ -522,6 +533,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - It must be trusted and must have with 2 signatures now
|
* - It must be trusted and must have with 2 signatures now
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun trustKeyBackupVersionWithPasswordTest() {
|
fun trustKeyBackupVersionWithPasswordTest() {
|
||||||
val password = "Password"
|
val password = "Password"
|
||||||
|
|
||||||
@ -581,6 +593,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - The backup must still be untrusted and disabled
|
* - The backup must still be untrusted and disabled
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun trustKeyBackupVersionWithWrongPasswordTest() {
|
fun trustKeyBackupVersionWithWrongPasswordTest() {
|
||||||
val password = "Password"
|
val password = "Password"
|
||||||
val badPassword = "Bad Password"
|
val badPassword = "Bad Password"
|
||||||
@ -621,6 +634,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - It must fail
|
* - It must fail
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun restoreKeysBackupWithAWrongRecoveryKeyTest() {
|
fun restoreKeysBackupWithAWrongRecoveryKeyTest() {
|
||||||
val testData = keysBackupTestHelper.createKeysBackupScenarioWithPassword(null)
|
val testData = keysBackupTestHelper.createKeysBackupScenarioWithPassword(null)
|
||||||
|
|
||||||
@ -654,6 +668,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Restore must be successful
|
* - Restore must be successful
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testBackupWithPassword() {
|
fun testBackupWithPassword() {
|
||||||
val password = "password"
|
val password = "password"
|
||||||
|
|
||||||
@ -709,6 +724,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - It must fail
|
* - It must fail
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun restoreKeysBackupWithAWrongPasswordTest() {
|
fun restoreKeysBackupWithAWrongPasswordTest() {
|
||||||
val password = "password"
|
val password = "password"
|
||||||
val wrongPassword = "passw0rd"
|
val wrongPassword = "passw0rd"
|
||||||
@ -745,6 +761,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Restore must be successful
|
* - Restore must be successful
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testUseRecoveryKeyToRestoreAPasswordBasedKeysBackup() {
|
fun testUseRecoveryKeyToRestoreAPasswordBasedKeysBackup() {
|
||||||
val password = "password"
|
val password = "password"
|
||||||
|
|
||||||
@ -773,6 +790,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - It must fail
|
* - It must fail
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testUsePasswordToRestoreARecoveryKeyBasedKeysBackup() {
|
fun testUsePasswordToRestoreARecoveryKeyBasedKeysBackup() {
|
||||||
val testData = keysBackupTestHelper.createKeysBackupScenarioWithPassword(null)
|
val testData = keysBackupTestHelper.createKeysBackupScenarioWithPassword(null)
|
||||||
|
|
||||||
@ -804,6 +822,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* - Check the returned KeysVersionResult is trusted
|
* - Check the returned KeysVersionResult is trusted
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testIsKeysBackupTrusted() {
|
fun testIsKeysBackupTrusted() {
|
||||||
// - Create a backup version
|
// - Create a backup version
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
@ -847,6 +866,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* -> The new alice session must back up to the same version
|
* -> The new alice session must back up to the same version
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testCheckAndStartKeysBackupWhenRestartingAMatrixSession() {
|
fun testCheckAndStartKeysBackupWhenRestartingAMatrixSession() {
|
||||||
// - Create a backup version
|
// - Create a backup version
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
@ -978,6 +998,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||||||
* -> It must success
|
* -> It must success
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testBackupAfterVerifyingADevice() {
|
fun testBackupAfterVerifyingADevice() {
|
||||||
// - Create a backup version
|
// - Create a backup version
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
|
||||||
|
@ -22,6 +22,7 @@ import org.junit.Assert.assertEquals
|
|||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.Assert.assertNull
|
import org.junit.Assert.assertNull
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -47,8 +48,6 @@ import org.matrix.android.sdk.internal.crypto.secrets.DefaultSharedSecretStorage
|
|||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
class QuadSTests : InstrumentedTest {
|
class QuadSTests : InstrumentedTest {
|
||||||
|
|
||||||
private val testHelper = CommonTestHelper(context())
|
|
||||||
|
|
||||||
private val emptyKeySigner = object : KeySigner {
|
private val emptyKeySigner = object : KeySigner {
|
||||||
override fun sign(canonicalJson: String): Map<String, Map<String, String>>? {
|
override fun sign(canonicalJson: String): Map<String, Map<String, String>>? {
|
||||||
return null
|
return null
|
||||||
@ -57,6 +56,8 @@ class QuadSTests : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_Generate4SKey() {
|
fun test_Generate4SKey() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
|
|
||||||
val quadS = aliceSession.sharedSecretStorageService
|
val quadS = aliceSession.sharedSecretStorageService
|
||||||
@ -108,6 +109,8 @@ class QuadSTests : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_StoreSecret() {
|
fun test_StoreSecret() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
val keyId = "My.Key"
|
val keyId = "My.Key"
|
||||||
val info = generatedSecret(aliceSession, keyId, true)
|
val info = generatedSecret(aliceSession, keyId, true)
|
||||||
@ -151,6 +154,8 @@ class QuadSTests : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_SetDefaultLocalEcho() {
|
fun test_SetDefaultLocalEcho() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
|
|
||||||
val quadS = aliceSession.sharedSecretStorageService
|
val quadS = aliceSession.sharedSecretStorageService
|
||||||
@ -171,6 +176,8 @@ class QuadSTests : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_StoreSecretWithMultipleKey() {
|
fun test_StoreSecretWithMultipleKey() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
val keyId1 = "Key.1"
|
val keyId1 = "Key.1"
|
||||||
val key1Info = generatedSecret(aliceSession, keyId1, true)
|
val key1Info = generatedSecret(aliceSession, keyId1, true)
|
||||||
@ -217,7 +224,10 @@ class QuadSTests : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("Test is working locally, not in GitHub actions")
|
||||||
fun test_GetSecretWithBadPassphrase() {
|
fun test_GetSecretWithBadPassphrase() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
val aliceSession = testHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
|
||||||
val keyId1 = "Key.1"
|
val keyId1 = "Key.1"
|
||||||
val passphrase = "The good pass phrase"
|
val passphrase = "The good pass phrase"
|
||||||
@ -264,6 +274,8 @@ class QuadSTests : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun assertAccountData(session: Session, type: String): UserAccountDataEvent {
|
private fun assertAccountData(session: Session, type: String): UserAccountDataEvent {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
var accountData: UserAccountDataEvent? = null
|
var accountData: UserAccountDataEvent? = null
|
||||||
testHelper.waitWithLatch {
|
testHelper.waitWithLatch {
|
||||||
val liveAccountData = session.accountDataService().getLiveUserAccountDataEvent(type)
|
val liveAccountData = session.accountDataService().getLiveUserAccountDataEvent(type)
|
||||||
@ -281,6 +293,7 @@ class QuadSTests : InstrumentedTest {
|
|||||||
|
|
||||||
private fun generatedSecret(session: Session, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
|
private fun generatedSecret(session: Session, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
|
||||||
val quadS = session.sharedSecretStorageService
|
val quadS = session.sharedSecretStorageService
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val creationInfo = testHelper.runBlockingTest {
|
val creationInfo = testHelper.runBlockingTest {
|
||||||
quadS.generateKey(keyId, null, keyId, emptyKeySigner)
|
quadS.generateKey(keyId, null, keyId, emptyKeySigner)
|
||||||
@ -300,6 +313,7 @@ class QuadSTests : InstrumentedTest {
|
|||||||
|
|
||||||
private fun generatedSecretFromPassphrase(session: Session, passphrase: String, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
|
private fun generatedSecretFromPassphrase(session: Session, passphrase: String, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
|
||||||
val quadS = session.sharedSecretStorageService
|
val quadS = session.sharedSecretStorageService
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val creationInfo = testHelper.runBlockingTest {
|
val creationInfo = testHelper.runBlockingTest {
|
||||||
quadS.generateKeyWithPassphrase(
|
quadS.generateKeyWithPassphrase(
|
||||||
|
@ -25,6 +25,7 @@ import org.junit.Assert.assertNull
|
|||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Assert.fail
|
import org.junit.Assert.fail
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -53,11 +54,11 @@ import java.util.concurrent.CountDownLatch
|
|||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
class SASTest : InstrumentedTest {
|
class SASTest : InstrumentedTest {
|
||||||
private val testHelper = CommonTestHelper(context())
|
|
||||||
private val cryptoTestHelper = CryptoTestHelper(testHelper)
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_aliceStartThenAliceCancel() {
|
fun test_aliceStartThenAliceCancel() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
@ -137,7 +138,10 @@ class SASTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_key_agreement_protocols_must_include_curve25519() {
|
fun test_key_agreement_protocols_must_include_curve25519() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
fail("Not passing for the moment")
|
fail("Not passing for the moment")
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
@ -194,7 +198,10 @@ class SASTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_key_agreement_macs_Must_include_hmac_sha256() {
|
fun test_key_agreement_macs_Must_include_hmac_sha256() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
fail("Not passing for the moment")
|
fail("Not passing for the moment")
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
@ -232,7 +239,10 @@ class SASTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_key_agreement_short_code_include_decimal() {
|
fun test_key_agreement_short_code_include_decimal() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
fail("Not passing for the moment")
|
fail("Not passing for the moment")
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
@ -303,6 +313,8 @@ class SASTest : InstrumentedTest {
|
|||||||
// If a device has two verifications in progress with the same device, then it should cancel both verifications.
|
// If a device has two verifications in progress with the same device, then it should cancel both verifications.
|
||||||
@Test
|
@Test
|
||||||
fun test_aliceStartTwoRequests() {
|
fun test_aliceStartTwoRequests() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
@ -342,7 +354,10 @@ class SASTest : InstrumentedTest {
|
|||||||
* Test that when alice starts a 'correct' request, bob agrees.
|
* Test that when alice starts a 'correct' request, bob agrees.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun test_aliceAndBobAgreement() {
|
fun test_aliceAndBobAgreement() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
@ -402,6 +417,8 @@ class SASTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_aliceAndBobSASCode() {
|
fun test_aliceAndBobSASCode() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
@ -458,6 +475,8 @@ class SASTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_happyPath() {
|
fun test_happyPath() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
@ -527,9 +546,6 @@ class SASTest : InstrumentedTest {
|
|||||||
val bobDeviceInfoFromAlicePOV: CryptoDeviceInfo? = aliceSession.cryptoService().getDeviceInfo(bobUserId, bobDeviceId)
|
val bobDeviceInfoFromAlicePOV: CryptoDeviceInfo? = aliceSession.cryptoService().getDeviceInfo(bobUserId, bobDeviceId)
|
||||||
val aliceDeviceInfoFromBobPOV: CryptoDeviceInfo? = bobSession.cryptoService().getDeviceInfo(aliceSession.myUserId, aliceSession.cryptoService().getMyDevice().deviceId)
|
val aliceDeviceInfoFromBobPOV: CryptoDeviceInfo? = bobSession.cryptoService().getDeviceInfo(aliceSession.myUserId, aliceSession.cryptoService().getMyDevice().deviceId)
|
||||||
|
|
||||||
// latch wait a bit again
|
|
||||||
Thread.sleep(1000)
|
|
||||||
|
|
||||||
assertTrue("alice device should be verified from bob point of view", aliceDeviceInfoFromBobPOV!!.isVerified)
|
assertTrue("alice device should be verified from bob point of view", aliceDeviceInfoFromBobPOV!!.isVerified)
|
||||||
assertTrue("bob device should be verified from alice point of view", bobDeviceInfoFromAlicePOV!!.isVerified)
|
assertTrue("bob device should be verified from alice point of view", bobDeviceInfoFromAlicePOV!!.isVerified)
|
||||||
cryptoTestData.cleanUp(testHelper)
|
cryptoTestData.cleanUp(testHelper)
|
||||||
@ -537,6 +553,8 @@ class SASTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun test_ConcurrentStart() {
|
fun test_ConcurrentStart() {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
|
@ -40,8 +40,6 @@ import kotlin.coroutines.resume
|
|||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
class VerificationTest : InstrumentedTest {
|
class VerificationTest : InstrumentedTest {
|
||||||
private val testHelper = CommonTestHelper(context())
|
|
||||||
private val cryptoTestHelper = CryptoTestHelper(testHelper)
|
|
||||||
|
|
||||||
data class ExpectedResult(
|
data class ExpectedResult(
|
||||||
val sasIsSupported: Boolean = false,
|
val sasIsSupported: Boolean = false,
|
||||||
@ -155,6 +153,8 @@ class VerificationTest : InstrumentedTest {
|
|||||||
bobSupportedMethods: List<VerificationMethod>,
|
bobSupportedMethods: List<VerificationMethod>,
|
||||||
expectedResultForAlice: ExpectedResult,
|
expectedResultForAlice: ExpectedResult,
|
||||||
expectedResultForBob: ExpectedResult) {
|
expectedResultForBob: ExpectedResult) {
|
||||||
|
val testHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(testHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
|
@ -21,6 +21,7 @@ import org.commonmark.parser.Parser
|
|||||||
import org.commonmark.renderer.html.HtmlRenderer
|
import org.commonmark.renderer.html.HtmlRenderer
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.MethodSorters
|
import org.junit.runners.MethodSorters
|
||||||
@ -132,6 +133,7 @@ class MarkdownParserTest : InstrumentedTest {
|
|||||||
* Note: the test is not passing, it does not work on Element Web neither
|
* Note: the test is not passing, it does not work on Element Web neither
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun parseStrike_not_passing() {
|
fun parseStrike_not_passing() {
|
||||||
testType(
|
testType(
|
||||||
name = "strike",
|
name = "strike",
|
||||||
@ -141,6 +143,7 @@ class MarkdownParserTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun parseStrikeNewLines() {
|
fun parseStrikeNewLines() {
|
||||||
testTypeNewLines(
|
testTypeNewLines(
|
||||||
name = "strike",
|
name = "strike",
|
||||||
@ -160,6 +163,7 @@ class MarkdownParserTest : InstrumentedTest {
|
|||||||
|
|
||||||
// TODO. Improve testTypeNewLines function to cover <pre><code class="language-code">test</code></pre>
|
// TODO. Improve testTypeNewLines function to cover <pre><code class="language-code">test</code></pre>
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun parseCodeNewLines_not_passing() {
|
fun parseCodeNewLines_not_passing() {
|
||||||
testTypeNewLines(
|
testTypeNewLines(
|
||||||
name = "code",
|
name = "code",
|
||||||
@ -179,6 +183,7 @@ class MarkdownParserTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun parseCode2NewLines_not_passing() {
|
fun parseCode2NewLines_not_passing() {
|
||||||
testTypeNewLines(
|
testTypeNewLines(
|
||||||
name = "code",
|
name = "code",
|
||||||
@ -197,6 +202,7 @@ class MarkdownParserTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun parseCode3NewLines_not_passing() {
|
fun parseCode3NewLines_not_passing() {
|
||||||
testTypeNewLines(
|
testTypeNewLines(
|
||||||
name = "code",
|
name = "code",
|
||||||
@ -233,6 +239,7 @@ class MarkdownParserTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun parseQuote_not_passing() {
|
fun parseQuote_not_passing() {
|
||||||
"> quoted\nline2".let { markdownParser.parse(it).expect(it, "<blockquote><p>quoted<br />line2</p></blockquote>") }
|
"> quoted\nline2".let { markdownParser.parse(it).expect(it, "<blockquote><p>quoted<br />line2</p></blockquote>") }
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.matrix.android.sdk
|
package org.matrix.android.sdk.ordering
|
||||||
|
|
||||||
import org.amshove.kluent.internal.assertEquals
|
import org.amshove.kluent.internal.assertEquals
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.matrix.android.sdk
|
package org.matrix.android.sdk.ordering
|
||||||
|
|
||||||
import org.amshove.kluent.internal.assertEquals
|
import org.amshove.kluent.internal.assertEquals
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.session.room.timeline
|
package org.matrix.android.sdk.session.room.timeline
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.amshove.kluent.internal.assertEquals
|
import org.amshove.kluent.internal.assertEquals
|
||||||
import org.amshove.kluent.shouldBeFalse
|
import org.amshove.kluent.shouldBeFalse
|
||||||
@ -40,16 +41,20 @@ import java.util.concurrent.CountDownLatch
|
|||||||
|
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class TimelineForwardPaginationTest : InstrumentedTest {
|
class TimelineForwardPaginationTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
// @Rule
|
||||||
private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
// @JvmField
|
||||||
|
// val mRetryTestRule = RetryTestRule()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test ensure that if we click to permalink, we will be able to go back to the live
|
* This test ensure that if we click to permalink, we will be able to go back to the live
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
fun forwardPaginationTest() {
|
fun forwardPaginationTest() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
||||||
val numberOfMessagesToSend = 90
|
val numberOfMessagesToSend = 90
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceInARoom(false)
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceInARoom(false)
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.session.room.timeline
|
package org.matrix.android.sdk.session.room.timeline
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import org.amshove.kluent.shouldBeFalse
|
import org.amshove.kluent.shouldBeFalse
|
||||||
import org.amshove.kluent.shouldBeTrue
|
import org.amshove.kluent.shouldBeTrue
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
@ -38,16 +39,17 @@ import java.util.concurrent.CountDownLatch
|
|||||||
|
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class TimelinePreviousLastForwardTest : InstrumentedTest {
|
class TimelinePreviousLastForwardTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
|
||||||
private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test ensure that if we have a chunk in the timeline which is due to a sync, and we click to permalink, we will be able to go back to the live
|
* This test ensure that if we have a chunk in the timeline which is due to a sync, and we click to permalink, we will be able to go back to the live
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun previousLastForwardTest() {
|
fun previousLastForwardTest() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
|
||||||
|
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.session.room.timeline
|
package org.matrix.android.sdk.session.room.timeline
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.amshove.kluent.internal.assertEquals
|
import org.amshove.kluent.internal.assertEquals
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
@ -36,13 +37,13 @@ import org.matrix.android.sdk.common.TestConstants
|
|||||||
|
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class TimelineSimpleBackPaginationTest : InstrumentedTest {
|
class TimelineSimpleBackPaginationTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
|
||||||
private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun timeline_backPaginate_shouldReachEndOfTimeline() {
|
fun timeline_backPaginate_shouldReachEndOfTimeline() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
||||||
val numberOfMessagesToSent = 200
|
val numberOfMessagesToSent = 200
|
||||||
|
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
|
||||||
|
@ -16,8 +16,10 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.session.room.timeline
|
package org.matrix.android.sdk.session.room.timeline
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import org.junit.Assert.fail
|
import org.junit.Assert.fail
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.JUnit4
|
import org.junit.runners.JUnit4
|
||||||
@ -31,8 +33,13 @@ import org.matrix.android.sdk.common.CommonTestHelper
|
|||||||
import org.matrix.android.sdk.common.CryptoTestHelper
|
import org.matrix.android.sdk.common.CryptoTestHelper
|
||||||
import java.util.concurrent.CountDownLatch
|
import java.util.concurrent.CountDownLatch
|
||||||
|
|
||||||
|
/** !! Not working with the new timeline
|
||||||
|
* Disabling it until the fix is made
|
||||||
|
*/
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
|
@LargeTest
|
||||||
class TimelineWithManyMembersTest : InstrumentedTest {
|
class TimelineWithManyMembersTest : InstrumentedTest {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@ -45,6 +52,7 @@ class TimelineWithManyMembersTest : InstrumentedTest {
|
|||||||
/**
|
/**
|
||||||
* Ensures when someone sends a message to a crowded room, everyone can decrypt the message.
|
* Ensures when someone sends a message to a crowded room, everyone can decrypt the message.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun everyone_should_decrypt_message_in_a_crowded_room() {
|
fun everyone_should_decrypt_message_in_a_crowded_room() {
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithManyMembers(NUMBER_OF_MEMBERS)
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithManyMembers(NUMBER_OF_MEMBERS)
|
||||||
|
@ -37,9 +37,6 @@ class SearchMessagesTest : InstrumentedTest {
|
|||||||
private const val MESSAGE = "Lorem ipsum dolor sit amet"
|
private const val MESSAGE = "Lorem ipsum dolor sit amet"
|
||||||
}
|
}
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
|
||||||
private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun sendTextMessageAndSearchPartOfItUsingSession() {
|
fun sendTextMessageAndSearchPartOfItUsingSession() {
|
||||||
doTest { cryptoTestData ->
|
doTest { cryptoTestData ->
|
||||||
@ -76,6 +73,8 @@ class SearchMessagesTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun doTest(block: suspend (CryptoTestData) -> SearchResult) {
|
private fun doTest(block: suspend (CryptoTestData) -> SearchResult) {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
|
val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
|
||||||
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceInARoom(false)
|
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceInARoom(false)
|
||||||
val aliceSession = cryptoTestData.firstSession
|
val aliceSession = cryptoTestData.firstSession
|
||||||
val aliceRoomId = cryptoTestData.roomId
|
val aliceRoomId = cryptoTestData.roomId
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.session.space
|
package org.matrix.android.sdk.session.space
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
@ -43,12 +44,12 @@ import org.matrix.android.sdk.common.SessionTestParams
|
|||||||
|
|
||||||
@RunWith(JUnit4::class)
|
@RunWith(JUnit4::class)
|
||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
|
@LargeTest
|
||||||
class SpaceCreationTest : InstrumentedTest {
|
class SpaceCreationTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun createSimplePublicSpace() {
|
fun createSimplePublicSpace() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val session = commonTestHelper.createAccount("Hubble", SessionTestParams(true))
|
val session = commonTestHelper.createAccount("Hubble", SessionTestParams(true))
|
||||||
val roomName = "My Space"
|
val roomName = "My Space"
|
||||||
val topic = "A public space for test"
|
val topic = "A public space for test"
|
||||||
@ -58,6 +59,7 @@ class SpaceCreationTest : InstrumentedTest {
|
|||||||
// wait a bit to let the summary update it self :/
|
// wait a bit to let the summary update it self :/
|
||||||
it.countDown()
|
it.countDown()
|
||||||
}
|
}
|
||||||
|
Thread.sleep(4_000)
|
||||||
|
|
||||||
val syncedSpace = session.spaceService().getSpace(spaceId)
|
val syncedSpace = session.spaceService().getSpace(spaceId)
|
||||||
commonTestHelper.waitWithLatch {
|
commonTestHelper.waitWithLatch {
|
||||||
@ -99,6 +101,8 @@ class SpaceCreationTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testJoinSimplePublicSpace() {
|
fun testJoinSimplePublicSpace() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
|
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
|
||||||
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
|
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
|
||||||
|
|
||||||
@ -130,6 +134,7 @@ class SpaceCreationTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testSimplePublicSpaceWithChildren() {
|
fun testSimplePublicSpaceWithChildren() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
|
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
|
||||||
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
|
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import org.junit.Assert.assertEquals
|
|||||||
import org.junit.Assert.assertNotNull
|
import org.junit.Assert.assertNotNull
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.FixMethodOrder
|
import org.junit.FixMethodOrder
|
||||||
|
import org.junit.Ignore
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.junit.runners.JUnit4
|
import org.junit.runners.JUnit4
|
||||||
@ -50,10 +51,10 @@ import org.matrix.android.sdk.common.SessionTestParams
|
|||||||
@FixMethodOrder(MethodSorters.JVM)
|
@FixMethodOrder(MethodSorters.JVM)
|
||||||
class SpaceHierarchyTest : InstrumentedTest {
|
class SpaceHierarchyTest : InstrumentedTest {
|
||||||
|
|
||||||
private val commonTestHelper = CommonTestHelper(context())
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun createCanonicalChildRelation() {
|
fun createCanonicalChildRelation() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
|
|
||||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||||
val spaceName = "My Space"
|
val spaceName = "My Space"
|
||||||
val topic = "A public space for test"
|
val topic = "A public space for test"
|
||||||
@ -170,6 +171,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testFilteringBySpace() {
|
fun testFilteringBySpace() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||||
|
|
||||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||||
@ -236,7 +238,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
it.countDown()
|
it.countDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.sleep(2_000)
|
Thread.sleep(6_000)
|
||||||
val orphansUpdate = session.getRoomSummaries(roomSummaryQueryParams {
|
val orphansUpdate = session.getRoomSummaries(roomSummaryQueryParams {
|
||||||
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
|
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
|
||||||
})
|
})
|
||||||
@ -244,7 +246,9 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore("This test will be ignored until it is fixed")
|
||||||
fun testBreakCycle() {
|
fun testBreakCycle() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||||
|
|
||||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||||
@ -273,8 +277,6 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
it.countDown()
|
it.countDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.sleep(1000)
|
|
||||||
|
|
||||||
// A -> C -> A
|
// A -> C -> A
|
||||||
|
|
||||||
val aChildren = session.getFlattenRoomSummaryChildrenOf(spaceAInfo.spaceId)
|
val aChildren = session.getFlattenRoomSummaryChildrenOf(spaceAInfo.spaceId)
|
||||||
@ -288,6 +290,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testLiveFlatChildren() {
|
fun testLiveFlatChildren() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||||
|
|
||||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||||
@ -374,6 +377,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
childInfo: List<Triple<String, Boolean, Boolean?>>
|
childInfo: List<Triple<String, Boolean, Boolean?>>
|
||||||
/** Name, auto-join, canonical*/
|
/** Name, auto-join, canonical*/
|
||||||
): TestSpaceCreationResult {
|
): TestSpaceCreationResult {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
var spaceId = ""
|
var spaceId = ""
|
||||||
var roomIds: List<String> = emptyList()
|
var roomIds: List<String> = emptyList()
|
||||||
commonTestHelper.waitWithLatch { latch ->
|
commonTestHelper.waitWithLatch { latch ->
|
||||||
@ -401,6 +405,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
childInfo: List<Triple<String, Boolean, Boolean?>>
|
childInfo: List<Triple<String, Boolean, Boolean?>>
|
||||||
/** Name, auto-join, canonical*/
|
/** Name, auto-join, canonical*/
|
||||||
): TestSpaceCreationResult {
|
): TestSpaceCreationResult {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
var spaceId = ""
|
var spaceId = ""
|
||||||
var roomIds: List<String> = emptyList()
|
var roomIds: List<String> = emptyList()
|
||||||
commonTestHelper.waitWithLatch { latch ->
|
commonTestHelper.waitWithLatch { latch ->
|
||||||
@ -435,6 +440,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testRootSpaces() {
|
fun testRootSpaces() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||||
|
|
||||||
/* val spaceAInfo = */ createPublicSpace(session, "SpaceA", listOf(
|
/* val spaceAInfo = */ createPublicSpace(session, "SpaceA", listOf(
|
||||||
@ -459,9 +465,10 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
runBlocking {
|
runBlocking {
|
||||||
val spaceB = session.spaceService().getSpace(spaceBInfo.spaceId)
|
val spaceB = session.spaceService().getSpace(spaceBInfo.spaceId)
|
||||||
spaceB!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
|
spaceB!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
|
||||||
|
Thread.sleep(6_000)
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.sleep(2000)
|
// Thread.sleep(4_000)
|
||||||
// + A
|
// + A
|
||||||
// a1, a2
|
// a1, a2
|
||||||
// + B
|
// + B
|
||||||
@ -478,6 +485,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testParentRelation() {
|
fun testParentRelation() {
|
||||||
|
val commonTestHelper = CommonTestHelper(context())
|
||||||
val aliceSession = commonTestHelper.createAccount("Alice", SessionTestParams(true))
|
val aliceSession = commonTestHelper.createAccount("Alice", SessionTestParams(true))
|
||||||
val bobSession = commonTestHelper.createAccount("Bib", SessionTestParams(true))
|
val bobSession = commonTestHelper.createAccount("Bib", SessionTestParams(true))
|
||||||
|
|
||||||
@ -542,7 +550,7 @@ class SpaceHierarchyTest : InstrumentedTest {
|
|||||||
?.setUserPowerLevel(aliceSession.myUserId, Role.Admin.value)
|
?.setUserPowerLevel(aliceSession.myUserId, Role.Admin.value)
|
||||||
?.toContent()
|
?.toContent()
|
||||||
|
|
||||||
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, null, newPowerLevelsContent!!)
|
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, stateKey = "", newPowerLevelsContent!!)
|
||||||
it.countDown()
|
it.countDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user