Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

♻️ Enabled validation of nicknames, job titles, links, and images on the ProfileCard screen. #458

Conversation

Corvus400
Copy link
Contributor

@Corvus400 Corvus400 commented Aug 14, 2024

Issue

Overview (Required)

  1. Added an input check function to the Edit screen
  2. Added VRT for the added input check function
  3. Added Fake implementation that was missing to implement VRT

Movie (Optional)

Before After
before.mp4

Copy link

Detekt check failed. Please run ./gradlew detekt --auto-correct to fix the issues.

@github-actions github-actions bot temporarily deployed to deploygate-distribution August 14, 2024 21:41 Inactive
@github-actions github-actions bot temporarily deployed to deploygate-distribution August 15, 2024 02:08 Inactive
@Corvus400 Corvus400 marked this pull request as ready for review August 15, 2024 02:17
@github-actions github-actions bot temporarily deployed to deploygate-distribution August 15, 2024 02:33 Inactive
nickname = "test",
occupation = "test",
link = "test",
image = "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",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was added because it is necessary to prepare image data that can be decoded by FAKE in advance.
Of course, if there is a shorter string that can be decoded, we will replace it with it.🙏
This is a Base64 encoded version of the following image.
image

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. Could we create images by path or something similar? This base64 image makes code review difficult. I'm not sure if this would work, but could we create images like this?

@OptIn(ExperimentalEncodingApi::class)
fun drawCircleToBase64(size: IntSize = IntSize(100, 100)): String {
    val imageBitmap = ImageBitmap(size.width, size.height)
    val canvas = Canvas(imageBitmap)

    canvas.drawCircle(
        center = Offset(size.width / 2f, size.height / 2f),
        radius = size.width.coerceAtMost(size.height) / 2f,
        paint = Paint().apply {
            color = Color.Blue
            style = PaintingStyle.Fill
        }
    )

    val buffer = IntArray(size.width * size.height)
    imageBitmap.readPixels(buffer)
    val byteArray = when (imageBitmap.config) {
        ImageBitmapConfig.Argb8888 -> ByteArray(buffer.size) {
            buffer[it].toByte()
        }
        else -> throw UnsupportedOperationException("Unsupported image config: ${imageBitmap.config}")
    }

    return Base64.encode(byteArray)
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@takahirom
If I use the code you suggested as is, the test does not proceed after 60 seconds time and seems to time out. 🤔
I will continue to look for a solution.

Copy link
Contributor Author

@Corvus400 Corvus400 Aug 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@takahirom
We have addressed this by adding a method to generate a Base64-encoded string of 400*400 white squares.
The reason we chose 400*400 is because the Twitter icon size is 400*400.

@github-actions github-actions bot temporarily deployed to deploygate-distribution August 15, 2024 06:56 Inactive
@github-actions github-actions bot temporarily deployed to deploygate-distribution August 15, 2024 07:05 Inactive
run {
setupProfileCardDataStore(ProfileCardInputStatus.AllNotEntered)
Copy link
Member

@takahirom takahirom Aug 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. DataStore could be considered a 'how' aspect of the test. Therefore, I suggest naming it like this: setupSavedProfileCard(ProfileCardInputStatus.AllNotEntered)

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf

public class FakeProfileCardDataStore : ProfileCardDataStore {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Member

@takahirom takahirom Aug 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need to change this in this PR, but my second thought on this is that we might be able to use DefaultProfileCardDataStore, and I think we can save the nickname or something similar when we call setupSavedProfileCard() as we can call suspend function. In this way, we can achieve high-fidelity tests.

@takahirom
Copy link
Member

The issue is that this implementation could potentially conflict with this PR. Do you have any thoughts on this?
#459

@Corvus400
Copy link
Contributor Author

Corvus400 commented Aug 15, 2024

@takahirom

Do you have any thoughts on this?

I see... 🤔
I was not aware of the content of that PR. 🙏
Since I should not have the authority to decide how to respond, I will leave it to you. 🫡
However, if I were to state this as an opinion, I believe that if I could be in charge of the task #112, it could be handled smoothly. 💪 (This is just an opinion)

@takahirom
Copy link
Member

Well, we already have the PR, and we need to value the issue assignee to protect the opportunity for the contributor. Of course, we can't always protect it, though. So I think I might need to prioritize the other PR first. This might lead to a conflict. Sorry in advance.
#459

…feature/implement_validation_profile_edit_screen

# Conflicts:
#	core/testing/src/main/java/io/github/droidkaigi/confsched/testing/robot/ProfileCardScreenRobot.kt
#	feature/profilecard/src/androidUnitTest/kotlin/io/github/droidkaigi/confsched/profilecard/ProfileCardScreenTest.kt
#	feature/profilecard/src/commonMain/kotlin/io/github/droidkaigi/confsched/profilecard/ProfileCardScreen.kt
@Corvus400
Copy link
Contributor Author

@takahirom
Conflicts have been resolved. 👍
In addition to resolving the conflict, we have made the display more similar to the requirements shown in Figma. 🫡

@github-actions github-actions bot temporarily deployed to deploygate-distribution August 15, 2024 17:49 Inactive
) : ProfileCardRepositoryRobot {
override suspend fun saveProfileCard(profileCard: ProfileCard.Exists) {
profileCardRepository.save(profileCard)
class DefaultProfileCardDataStoreRobot @Inject constructor(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to change this in this PR, but since tests can see the DataStore name, it would be better to use a more abstract name. However, it's fine for now.

)

return remember(nickname, occupation, link, image) {
val nicknameError = if (nickname.isEmpty()) nicknameValidationErrorString else ""
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, I think this 'if the string is empty, show an error message' logic should be in the presenter.

@takahirom
Copy link
Member

As you might know, I recommend small PRs because they can be merged quickly

Copy link
Member

@takahirom takahirom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your continuous efforts to improve our app!

@takahirom takahirom merged commit 5c2ea9e into DroidKaigi:main Aug 16, 2024
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ProfileCard: validate nickname, occupation, link, and image
2 participants