Merge pull request #2483 from element-hq/feature/bma/checkInvalidScreeenshot
Check invalid screenshots
This commit is contained in:
commit
a9e97d7aa1
19 changed files with 121 additions and 39 deletions
12
.github/workflows/quality.yml
vendored
12
.github/workflows/quality.yml
vendored
|
|
@ -21,6 +21,18 @@ jobs:
|
||||||
- name: Run code quality check suite
|
- name: Run code quality check suite
|
||||||
run: ./tools/check/check_code_quality.sh
|
run: ./tools/check/check_code_quality.sh
|
||||||
|
|
||||||
|
checkScreesnhot:
|
||||||
|
name: Search for invalid screenshot files
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up Python 3.9
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.9
|
||||||
|
- name: Search for invalid screenshot files
|
||||||
|
run: ./tools/test/checkInvalidScreenshots.py
|
||||||
|
|
||||||
check:
|
check:
|
||||||
name: Project Check Suite
|
name: Project Check Suite
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
|
||||||
2
.github/workflows/sync-sas-strings.yml
vendored
2
.github/workflows/sync-sas-strings.yml
vendored
|
|
@ -13,7 +13,7 @@ jobs:
|
||||||
# No concurrency required, runs every time on a schedule.
|
# No concurrency required, runs every time on a schedule.
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Set up Python 3.8
|
- name: Set up Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.9
|
python-version: 3.9
|
||||||
|
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -20,6 +20,9 @@ out/
|
||||||
.gradle/
|
.gradle/
|
||||||
build/
|
build/
|
||||||
|
|
||||||
|
# Python cache
|
||||||
|
__pycache__/
|
||||||
|
|
||||||
# Local configuration file (sdk path, etc)
|
# Local configuration file (sdk path, etc)
|
||||||
local.properties
|
local.properties
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ package io.element.android.features.createroom.impl.userlist
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
|
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
|
||||||
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
|
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
|
||||||
|
import io.element.android.libraries.usersearch.api.UserSearchResult
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
|
|
@ -38,14 +39,14 @@ open class UserListStateProvider : PreviewParameterProvider<UserListState> {
|
||||||
isSearchActive = true,
|
isSearchActive = true,
|
||||||
searchQuery = "@someone:matrix.org",
|
searchQuery = "@someone:matrix.org",
|
||||||
selectedUsers = aMatrixUserList().toImmutableList(),
|
selectedUsers = aMatrixUserList().toImmutableList(),
|
||||||
searchResults = SearchBarResultState.Results(aListOfSelectedUsers()),
|
searchResults = SearchBarResultState.Results(aListOfUserSearchResults()),
|
||||||
),
|
),
|
||||||
aUserListState().copy(
|
aUserListState().copy(
|
||||||
isSearchActive = true,
|
isSearchActive = true,
|
||||||
searchQuery = "@someone:matrix.org",
|
searchQuery = "@someone:matrix.org",
|
||||||
selectionMode = SelectionMode.Multiple,
|
selectionMode = SelectionMode.Multiple,
|
||||||
selectedUsers = aMatrixUserList().toImmutableList(),
|
selectedUsers = aMatrixUserList().toImmutableList(),
|
||||||
searchResults = SearchBarResultState.Results(aListOfSelectedUsers()),
|
searchResults = SearchBarResultState.Results(aListOfUserSearchResults()),
|
||||||
),
|
),
|
||||||
aUserListState().copy(
|
aUserListState().copy(
|
||||||
isSearchActive = true,
|
isSearchActive = true,
|
||||||
|
|
@ -67,3 +68,4 @@ fun aUserListState() = UserListState(
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aListOfSelectedUsers() = aMatrixUserList().take(6).toImmutableList()
|
fun aListOfSelectedUsers() = aMatrixUserList().take(6).toImmutableList()
|
||||||
|
fun aListOfUserSearchResults() = aMatrixUserList().take(6).map { UserSearchResult(it) }.toImmutableList()
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.Shape
|
import androidx.compose.ui.graphics.Shape
|
||||||
|
import androidx.compose.ui.platform.LocalInspectionMode
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
@ -58,10 +59,11 @@ fun ModalBottomSheet(
|
||||||
windowInsets: WindowInsets = BottomSheetDefaults.windowInsets,
|
windowInsets: WindowInsets = BottomSheetDefaults.windowInsets,
|
||||||
content: @Composable ColumnScope.() -> Unit,
|
content: @Composable ColumnScope.() -> Unit,
|
||||||
) {
|
) {
|
||||||
|
val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState
|
||||||
androidx.compose.material3.ModalBottomSheet(
|
androidx.compose.material3.ModalBottomSheet(
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
sheetState = sheetState,
|
sheetState = safeSheetState,
|
||||||
shape = shape,
|
shape = shape,
|
||||||
containerColor = containerColor,
|
containerColor = containerColor,
|
||||||
contentColor = contentColor,
|
contentColor = contentColor,
|
||||||
|
|
@ -102,7 +104,6 @@ private fun ContentToPreview() {
|
||||||
) {
|
) {
|
||||||
ModalBottomSheet(
|
ModalBottomSheet(
|
||||||
onDismissRequest = {},
|
onDismissRequest = {},
|
||||||
sheetState = sheetStateForPreview(),
|
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = "Sheet Content",
|
text = "Sheet Content",
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:ac4629968854e34cb676e9348bdad7eb4bd747aed13bf0283d5a9382fde1a46d
|
||||||
size 4462
|
size 41643
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:33eb14ad0f5b9a8cd73122b87f217e76e0d0527df009bd2669643153671bd889
|
||||||
size 4462
|
size 57450
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:2120e963b9fd9ea9397b4a41d0d52906dd49f4c71530f2c8fdaad730239f428d
|
||||||
size 4462
|
size 40630
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:6e044b924c9c148788189980498c768875ca3ac4db6e048dfefa105b04586caa
|
||||||
size 4462
|
size 56246
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:5f6f3350f9e409d8a6e87116b5500f519cad1f1d731f03b3674412207c6f4b1e
|
||||||
size 4462
|
size 28044
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:e56586426695abaf31a2e5fd3f4367177e69378daa5ed4f8a19ec93f768a60ff
|
||||||
size 4462
|
size 24781
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:56aac7fa99de7ea4729c6bf33d938c627a2eb155149dcc07a4bdbc1c3a24bbd3
|
||||||
size 4462
|
size 23949
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:2202f45b9b2a9c99b7a3b2744e22077546b7154fb748cf6a83470e89971cb8cc
|
||||||
size 4462
|
size 21801
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:38dcfa8c21ff100830ba53ac4a2555784b8e132031cb82ea90fad3cc153152e0
|
||||||
size 4462
|
size 21177
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0
|
oid sha256:26352ab65c7d2ff59bcb63d05b398baae77f7e04a4120ebf2c6353fdd011fa3e
|
||||||
size 4462
|
size 19330
|
||||||
|
|
|
||||||
46
tools/test/checkInvalidScreenshots.py
Executable file
46
tools/test/checkInvalidScreenshots.py
Executable file
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright (c) 2024 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.
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from util import compare
|
||||||
|
|
||||||
|
|
||||||
|
def checkInvalidScreenshots(reference):
|
||||||
|
__doc__ = "Detect invalid screenshot, by comparing to an invalid reference."
|
||||||
|
path_of_screenshots = "tests/uitests/src/test/snapshots/images/"
|
||||||
|
files = os.listdir(path_of_screenshots)
|
||||||
|
counter = 0
|
||||||
|
for file in files:
|
||||||
|
if not compare(reference, path_of_screenshots + file):
|
||||||
|
print("Invalid screenshot detected: " + file)
|
||||||
|
counter += 1
|
||||||
|
return counter
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
invalid_screenshot_reference_path = "tools/test/invalid_screenshot.png"
|
||||||
|
result = checkInvalidScreenshots(invalid_screenshot_reference_path)
|
||||||
|
if result > 0:
|
||||||
|
print("%d invalid screenshot(s) detected" % result)
|
||||||
|
print("Please check that the Preview is OK in Android Studio. You may want to use a Fake Composable for the screenshot to render correctly.")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print("No invalid screenshot detected!")
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
from util import compare
|
||||||
|
|
||||||
# Read all arguments and return a list of them, this are the languages list.
|
# Read all arguments and return a list of them, this are the languages list.
|
||||||
def readArguments():
|
def readArguments():
|
||||||
|
|
@ -40,20 +41,6 @@ def detectLanguages():
|
||||||
return languages
|
return languages
|
||||||
|
|
||||||
|
|
||||||
def compare(file1, file2):
|
|
||||||
__doc__ = "Compare two files, return True if different, False if identical."
|
|
||||||
# Compare file size
|
|
||||||
file1_stats = os.stat(file1)
|
|
||||||
file2_stats = os.stat(file2)
|
|
||||||
if file1_stats.st_size != file2_stats.st_size:
|
|
||||||
return True
|
|
||||||
# Compare file content
|
|
||||||
with open(file1, "rb") as f1, open(file2, "rb") as f2:
|
|
||||||
content1 = f1.read()
|
|
||||||
content2 = f2.read()
|
|
||||||
return content1 != content2
|
|
||||||
|
|
||||||
|
|
||||||
def deleteDuplicatedScreenshots(lang):
|
def deleteDuplicatedScreenshots(lang):
|
||||||
__doc__ = "Delete screenshots identical to the English version for a language"
|
__doc__ = "Delete screenshots identical to the English version for a language"
|
||||||
print("Deleting screenshots identical to the English version for language %s..." % lang)
|
print("Deleting screenshots identical to the English version for language %s..." % lang)
|
||||||
|
|
|
||||||
BIN
tools/test/invalid_screenshot.png
Normal file
BIN
tools/test/invalid_screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
31
tools/test/util.py
Normal file
31
tools/test/util.py
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright (c) 2024 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.
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def compare(file1, file2):
|
||||||
|
__doc__ = "Compare two files, return True if different, False if identical."
|
||||||
|
# Compare file size
|
||||||
|
file1_stats = os.stat(file1)
|
||||||
|
file2_stats = os.stat(file2)
|
||||||
|
if file1_stats.st_size != file2_stats.st_size:
|
||||||
|
return True
|
||||||
|
# Compare file content
|
||||||
|
with open(file1, "rb") as f1, open(file2, "rb") as f2:
|
||||||
|
content1 = f1.read()
|
||||||
|
content2 = f2.read()
|
||||||
|
return content1 != content2
|
||||||
Loading…
Add table
Add a link
Reference in a new issue