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

chore: first pass at fixing collectibles transition #19945

Merged
merged 1 commit into from May 24, 2024

Conversation

J-Son89
Copy link
Member

@J-Son89 J-Son89 commented May 8, 2024

fixes: #19678

This pr smoothes the transition for the collectibles cards loading to a loaded image.

On implementing I realised there is an issue when the image is already loaded as the image is cached and will load quite quickly anyway. To handle this I am measuring the load time. This works fine if the user only has a small number of images.

With help from @ulisesmac we also discovered a bug where the collectibles were re rendering a lot on scroll. This is also addressed in this pr and the overall scrolling experience is a lot smoother now.

Latest reference video:

Screen.Recording.2024-05-20.at.15.07.22.mov

Note: The animations being slower looks better for one load, but if the user goes back and forth from the tabs several times then it just becomes a bit irritating after a while.

@status-github-bot status-github-bot bot added this to REVIEW in Pipeline for QA May 8, 2024
@status-im-auto
Copy link
Member

status-im-auto commented May 8, 2024

Jenkins Builds

Click to see older builds (44)
Commit #️⃣ Finished (UTC) Duration Platform Result
598000f #1 2024-05-08 20:13:42 ~3 min tests 📄log
✔️ 598000f #1 2024-05-08 20:16:27 ~5 min android-e2e 🤖apk 📲
✔️ 598000f #1 2024-05-08 20:16:50 ~6 min android 🤖apk 📲
✔️ 598000f #1 2024-05-08 20:19:24 ~8 min ios 📱ipa 📲
23e7d7d #2 2024-05-14 21:58:21 ~2 min tests 📄log
✔️ 23e7d7d #2 2024-05-14 22:02:46 ~6 min android 🤖apk 📲
✔️ 23e7d7d #2 2024-05-14 22:02:55 ~7 min android-e2e 🤖apk 📲
✔️ 23e7d7d #2 2024-05-14 22:04:29 ~8 min ios 📱ipa 📲
✔️ ebf6b31 #3 2024-05-17 21:09:56 ~4 min tests 📄log
✔️ ebf6b31 #3 2024-05-17 21:11:38 ~6 min android 🤖apk 📲
✔️ ebf6b31 #3 2024-05-17 21:12:40 ~7 min android-e2e 🤖apk 📲
✔️ ebf6b31 #3 2024-05-17 21:14:01 ~8 min ios 📱ipa 📲
✔️ 941561f #4 2024-05-20 14:36:41 ~3 min tests 📄log
✔️ 941561f #4 2024-05-20 14:39:58 ~7 min android-e2e 🤖apk 📲
✔️ 941561f #4 2024-05-20 14:40:03 ~7 min android 🤖apk 📲
✔️ 941561f #4 2024-05-20 14:41:48 ~9 min ios 📱ipa 📲
✔️ e8a9fcc #5 2024-05-20 21:51:28 ~4 min tests 📄log
✔️ e8a9fcc #5 2024-05-20 21:52:50 ~6 min android-e2e 🤖apk 📲
✔️ e8a9fcc #5 2024-05-20 21:52:58 ~6 min android 🤖apk 📲
✔️ e8a9fcc #5 2024-05-20 21:55:09 ~8 min ios 📱ipa 📲
ae4a9f6 #8 2024-05-21 15:43:39 ~2 min tests 📄log
✔️ ae4a9f6 #8 2024-05-21 15:48:03 ~6 min android-e2e 🤖apk 📲
✔️ ae4a9f6 #8 2024-05-21 15:49:36 ~8 min ios 📱ipa 📲
✔️ ae4a9f6 #8 2024-05-21 15:50:11 ~8 min android 🤖apk 📲
✔️ ddf5bcd #9 2024-05-21 16:02:34 ~4 min tests 📄log
✔️ ddf5bcd #9 2024-05-21 16:05:42 ~7 min android-e2e 🤖apk 📲
✔️ ddf5bcd #9 2024-05-21 16:06:58 ~8 min ios 📱ipa 📲
✔️ ddf5bcd #9 2024-05-21 16:07:13 ~8 min android 🤖apk 📲
✔️ 9ab3479 #10 2024-05-22 19:17:34 ~4 min tests 📄log
✔️ 9ab3479 #10 2024-05-22 19:19:28 ~6 min android-e2e 🤖apk 📲
✔️ 9ab3479 #10 2024-05-22 19:20:50 ~8 min android 🤖apk 📲
✔️ 9ab3479 #10 2024-05-22 19:21:24 ~8 min ios 📱ipa 📲
✔️ 5cd2106 #11 2024-05-23 08:36:14 ~4 min tests 📄log
✔️ 5cd2106 #11 2024-05-23 08:39:13 ~7 min android 🤖apk 📲
✔️ 5cd2106 #11 2024-05-23 08:40:51 ~8 min android-e2e 🤖apk 📲
✔️ 5cd2106 #11 2024-05-23 08:41:07 ~9 min ios 📱ipa 📲
✔️ f577e9f #12 2024-05-24 12:13:22 ~4 min tests 📄log
✔️ f577e9f #12 2024-05-24 12:15:57 ~7 min android-e2e 🤖apk 📲
✔️ f577e9f #12 2024-05-24 12:16:39 ~7 min android 🤖apk 📲
✔️ f577e9f #12 2024-05-24 12:19:16 ~10 min ios 📱ipa 📲
✔️ 8a9a827 #13 2024-05-24 15:44:26 ~4 min tests 📄log
✔️ 8a9a827 #13 2024-05-24 15:48:04 ~7 min android-e2e 🤖apk 📲
✔️ 8a9a827 #13 2024-05-24 15:48:13 ~7 min android 🤖apk 📲
✔️ 8a9a827 #13 2024-05-24 15:51:51 ~11 min ios 📱ipa 📲
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 5f288f6 #14 2024-05-24 16:30:15 ~5 min tests 📄log
✔️ 5f288f6 #14 2024-05-24 16:32:45 ~8 min android-e2e 🤖apk 📲
✔️ 5f288f6 #14 2024-05-24 16:33:02 ~8 min android 🤖apk 📲
✔️ 5f288f6 #14 2024-05-24 16:38:55 ~14 min ios 📱ipa 📲
✔️ bde0a3b #15 2024-05-24 20:37:24 ~3 min tests 📄log
✔️ bde0a3b #15 2024-05-24 20:39:32 ~6 min android-e2e 🤖apk 📲
✔️ bde0a3b #15 2024-05-24 20:39:49 ~6 min android 🤖apk 📲
✔️ bde0a3b #15 2024-05-24 20:43:26 ~9 min ios 📱ipa 📲

:on-load-start #(set-load-time (fn [start-time] (- (datetime/now) start-time)))


:on-load-end (if (> load-time 200)
Copy link
Contributor

Choose a reason for hiding this comment

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

on-load-start and on-load-end can be moved to external functions. It has readability benefits and the potential to save renders.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yep for sure, I will add those types of details once I'm happy with the approach. This was just first pass 👌

@shivekkhurana
Copy link
Contributor

The image transition is almost perfect. Made me feel that we somehow loaded colors before hand.

The name and the logo seem to flicker in. A skeleton there will be nice too.

@J-Son89
Copy link
Member Author

J-Son89 commented May 9, 2024

The image transition is almost perfect. Made me feel that we somehow loaded colors before hand.

The name and the logo seem to flicker in. A skeleton there will be nice too.

Thanks, will add that!

@J-Son89 J-Son89 self-assigned this May 9, 2024
@J-Son89 J-Son89 force-pushed the jc/collectible-transition branch from 23e7d7d to ebf6b31 Compare May 17, 2024 21:05
@J-Son89 J-Son89 marked this pull request as ready for review May 17, 2024 21:05
@@ -121,30 +170,43 @@
(defn- image-view
[{:keys [avatar-image-src community? counter state set-state
gradient-color-index image-src supported-file?]}]
(let [theme (quo.theme/use-theme)]
(let [theme (quo.theme/use-theme)
Copy link
Member Author

Choose a reason for hiding this comment

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

I manually tested this for type image as well 👍

@@ -105,23 +105,6 @@
(def fast-create-community-enabled?
(enabled? (get-config :FAST_CREATE_COMMUNITY_ENABLED "0")))

(def default-multiaccount
Copy link
Member Author

Choose a reason for hiding this comment

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

unused 👍

on-collectible-long-press))
:on-end-reached on-end-reached
:on-end-reached-threshold 4}])))
;; TODO:
Copy link
Member Author

Choose a reason for hiding this comment

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

@ulisesmac - what to do here, should we create a follow up issue? 🤔

Copy link
Contributor

Choose a reason for hiding this comment

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

I think so, we can create a follow-up to improve the code and performance, it's not creating problems so we can address it when we have more time 👍

Comment on lines 23 to 24
(reanimated/animate-shared-value-with-timing loader-opacity 0 timing-options-out :easing1)
(reanimated/animate-shared-value-with-timing image-opacity 1 timing-options-in :easing1)
Copy link
Member

Choose a reason for hiding this comment

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

Could be changed to

(reanimated/animate loader-opacity 0 timing-options-out)
(reanimated/animate image-opacity 1 timing-options-in)

Copy link
Member Author

Choose a reason for hiding this comment

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

sounds good 👍

Comment on lines 25 to 38
(if (> load-time 200)
(js/setTimeout
(fn []
(set-state (fn [prev-state]
(assoc prev-state :image-loaded? true))))
500)
(set-state (fn [prev-state]
(assoc prev-state :image-loaded? true)))))

(defn on-load-error
[set-state]
(js/setTimeout (fn []
(set-state (fn [prev-state] (assoc prev-state :image-error? true))))
800))
Copy link
Member

Choose a reason for hiding this comment

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

Some magic numbers not defined (200, 500, 800)

Comment on lines 43 to 45
{:style (reanimated/apply-animations-to-style
{:opacity image-opacity}
(style/fallback {:theme theme}))}
Copy link
Member

Choose a reason for hiding this comment

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

Our guideline for apply-animations-to-style is to use it in the style file

Also we made a recent update to support passing an array of styles instead of using apply-animations-to-style https://github.com/status-im/status-mobile/blob/develop/doc/new-guidelines.md#pass-a-vector-of-styles-to-reanimated-view

Copy link
Member Author

Choose a reason for hiding this comment

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

@OmarBasem - imo this guideline is most likely wrong and a bad idea.
As @ulisesmac pointed out recently, this function apply-animations-to-style is actually using a hook and should really be called use-animated-styles or something of this sort.
Hiding this in the style file is likely to lead to bugs (see @ajayesivan's comment below) and we should keep it in the view/ perhaps reconsider the format in how we pass these styled values.

Copy link
Member

Choose a reason for hiding this comment

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

@J-Son89 I see, but are we still using the function apply-animations-to-style tho? What I currently see in the guidelines is we pass an array of styles:

     {:style [{:opacity   opacity
               :transform [{:translate-x scroll-x}]}
              {:flex-direction :row}]}

Copy link
Member Author

Choose a reason for hiding this comment

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

aha, so you mean just remove the use of apply-animations-to-style completely?
That sounds better if so 👍

Copy link
Contributor

@ulisesmac ulisesmac May 20, 2024

Choose a reason for hiding this comment

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

@OmarBasem - imo this guideline is most likely wrong and a bad idea. As @ulisesmac pointed out recently, this function apply-animations-to-style is actually using a hook and should really be called use-animated-styles or something of this sort. Hiding this in the style file is likely to lead to bugs (see @ajayesivan's comment below) and we should keep it in the view/ perhaps reconsider the format in how we pass these styled values.

@J-Son89 @OmarBasem @Parveshdhull Yeah, we need to update the guidelines and rename the animated functions to add the prefix use-

Copy link
Contributor

Choose a reason for hiding this comment

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

aha, so you mean just remove the use of apply-animations-to-style completely? That sounds better if so 👍

@J-Son89 Be careful, actually the vector syntax doesn't behave exaclty the same in all cases. I've learnt by experience that it requires a default value in the regular styles section, otherwise sometimes the animation looks inconsistent at the beginning, this is only needed if your animation doesn't behave as expected:

Example, if we want to animate the opacity, you should provide the "initial" opacity in the regular styles:

[reanimated/view
 {:style [;; Regular styles:
          {,,,
           :opacity 0 ;; This is the opacity at the beginning of the animation
           ,,,}
          ;; Animated styles:
          {,,,
           :opacity my-shared-value
           ,,,}
          ]}]

Copy link
Member Author

Choose a reason for hiding this comment

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

thanks @OmarBasem - yeah I think I noticed this alright. Strange, I'll update the uses here because likely it will affect. Thanks for the heads up 🙏

Copy link
Member Author

Choose a reason for hiding this comment

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

added a default value to each style using opacity. all looks good now 👍

Comment on lines 65 to 81
{:style (reanimated/apply-animations-to-style
{:opacity loader-opacity}
(style/loading-image theme))}
[gradients/view
Copy link
Member

Choose a reason for hiding this comment

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

same here regarding reanimated/apply-animations-to-style

[rn/view {:style style/card-details-container}
(cond (not (:avatar-loaded? state))
(cond (and not community? (not (:avatar-loaded? state)))
Copy link
Member

Choose a reason for hiding this comment

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

Shouldn't this not be inside paranthesis () ?

Copy link
Member Author

Choose a reason for hiding this comment

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

yes, will double check this. Thanks!

Copy link
Member Author

Choose a reason for hiding this comment

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

addressed this, thanks for spotting!

[rn/view {:style {:width 8}}]

[reanimated/view
{:style (reanimated/apply-animations-to-style
Copy link
Member

Choose a reason for hiding this comment

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

same here regarding reanimated/apply-animations-to-style

collectible-name]]])
collectible-name]]
:else [reanimated/view
{:style (reanimated/apply-animations-to-style
Copy link
Member

Choose a reason for hiding this comment

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

same here regarding reanimated/apply-animations-to-style

loader-opacity (reanimated/use-shared-value (if supported-file? 1 0))
image-opacity (reanimated/use-shared-value (if supported-file? 0 1))
[load-time set-load-time] (rn/use-state (datetime/now))
supported-file-styles (reanimated/apply-animations-to-style
Copy link
Member

Choose a reason for hiding this comment

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

Same reanimated/apply-animations-to-style

loader-opacity (reanimated/use-shared-value (if supported-file? 1 0))
image-opacity (reanimated/use-shared-value (if supported-file? 0 1))
[load-time set-load-time] (rn/use-state (datetime/now))
supported-file-styles (reanimated/apply-animations-to-style
Copy link
Member

Choose a reason for hiding this comment

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

Same reanimated/apply-animations-to-style

Comment on lines 8 to 10
(def collectible-container
{:padding 8
:width "50%"})
Copy link
Member

Choose a reason for hiding this comment

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

Could flex work here? (maybe :flex 0.5)

Copy link
Member Author

Choose a reason for hiding this comment

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

will try. 👍

[rn/view {:style {:width 8}}]

[reanimated/view
{:style (reanimated/apply-animations-to-style
Copy link
Contributor

Choose a reason for hiding this comment

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

Under the hood, reanimated/apply-animations-to-style uses a hook.

(defn apply-animations-to-style
[animations style]
(use-animated-style
(worklets.core/apply-animations-to-style (clj->js animations) (clj->js style))))

Here, we are calling it inside a condition, which is not ideal and can cause issues (see Rules of Hooks).

You are likely familiar with the hook rules, but the current function name doesn't indicate that it involves a hook.

I believe we decided to rename the function so that it starts with use-. cc: @Parveshdhull, @ulisesmac

Copy link
Member

Choose a reason for hiding this comment

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

and can cause issues

Probably can throw error like #16140

Copy link
Member Author

Choose a reason for hiding this comment

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

good point @ajayesivan. We should really update the naming for that method soon 👍

Copy link
Member

Choose a reason for hiding this comment

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

logged an issue #20110

Copy link
Contributor

Choose a reason for hiding this comment

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

Thank you @Parveshdhull

Copy link
Contributor

Choose a reason for hiding this comment

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

Oh, I've seen @Parveshdhull already added the issue, Thank you!

:number-of-lines 1
:style style/card-detail-text}
collectible-name]]])
(let [loader-opacity (reanimated/use-shared-value 1)
Copy link
Member Author

Choose a reason for hiding this comment

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

@OmarBasem - good spot on this section, was all a bit wrong but I have since refactored and fixed it. (I think it was my issue to begin with 😅 )

Copy link
Member

Choose a reason for hiding this comment

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

No worries, thanks for fixing :)

@J-Son89
Copy link
Member Author

J-Son89 commented May 20, 2024

use of apply-animations-to-style wasn't needed so I removed it in this pr 👍

@J-Son89 J-Son89 force-pushed the jc/collectible-transition branch from 941561f to e8a9fcc Compare May 20, 2024 21:46
Copy link
Member

@OmarBasem OmarBasem left a comment

Choose a reason for hiding this comment

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

Thanks for refactoring reanimated styles. LGTM!

@J-Son89 J-Son89 force-pushed the jc/collectible-transition branch from 788ffc8 to d7f773d Compare May 21, 2024 15:38
@J-Son89 J-Son89 requested review from ajayesivan and removed request for rasom May 21, 2024 15:39
Copy link
Contributor

@ulisesmac ulisesmac left a comment

Choose a reason for hiding this comment

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

I like how they look on the video 💯

the code looks good too 👍

Comment on lines +13 to +14
[{:opacity opacity}
{:opacity default-opacity-for-image
Copy link
Contributor

Choose a reason for hiding this comment

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

👍 nice you added these default values

Comment on lines +108 to +124
(defn loading-image-with-opacity
[theme opacity]
[{:opacity opacity}
(loading-image theme)])

(defn avatar-container
[loaded?]
{:flex 1
:flex-direction :row
:opacity (when-not loaded? 0)})
[opacity]
[{:opacity opacity}
{:flex 1
:flex-direction :row
:opacity default-opacity-for-image}])

(defn supported-file
[opacity]
[{:opacity opacity}
{:aspect-ratio 1
:opacity default-opacity-for-image}])
Copy link
Contributor

@ulisesmac ulisesmac May 21, 2024

Choose a reason for hiding this comment

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

Good to see the vector syntax is being used 👍 it's great because when it's possible to be used, it removes the complexities of dealing with a hook 👍

:number-of-lines 1
:style style/card-detail-text}
collectible-name]]
(when (not (:avatar-loaded? state))
Copy link
Contributor

Choose a reason for hiding this comment

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

when-not 👀

Comment on lines +14 to +29
(defn- on-collectible-press
[{:keys [id]}]
(rf/dispatch [:wallet/get-collectible-details id]))

(defn- on-collectible-long-press
[{:keys [preview-url collectible-details]}]
(rf/dispatch [:show-bottom-sheet
{:content (fn []
[options-drawer/view
{:name (:name collectible-details)
:image (:uri preview-url)}])}]))

(defn- on-end-reached
[]
(rf/dispatch [:wallet/request-collectibles-for-current-viewing-account]))

Copy link
Contributor

Choose a reason for hiding this comment

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

BTW, this was part of the solution to avoid the re-renders, previously they weren't stable references, so they caused a re-render on every collectible

@J-Son89 J-Son89 moved this from REVIEW to E2E Tests in Pipeline for QA May 21, 2024
@status-im-auto
Copy link
Member

87% of end-end tests have passed

Total executed tests: 52
Failed tests: 4
Expected to fail tests: 3
Passed tests: 45
IDs of failed tests: 727230,702782,702851,727229 
IDs of expected to fail tests: 703495,703503,702807 

Failed tests (4)

Click to expand
  • Rerun failed tests

  • Class TestWalletMultipleDevice:

    1. test_wallet_send_asset_from_drawer, id: 727230
    critical/test_wallet.py:119: in test_wallet_send_asset_from_drawer
        self.wallet_view.navigate_back_to_wallet_view()
     'TestWalletMultipleDevice' object has no attribute 'wallet_view'
    



    2. test_wallet_send_eth, id: 727229

    Device 1: Swiping right on element SlideButton
    Device 1: Find SlideButton by xpath: //*[@resource-id='slide-button-track']

    critical/test_wallet.py:111: in test_wallet_send_eth
        self.wallet_1.send_asset(address=self.receiver['address'], asset_name='Ether', amount=amount_to_send)
    ../views/wallet_view.py:100: in send_asset
        self.confirm_transaction()
    ../views/wallet_view.py:87: in confirm_transaction
        self.slide_and_confirm_with_password()
    ../views/wallet_view.py:81: in slide_and_confirm_with_password
        self.slide_button_track.slide()
    ../views/base_view.py:257: in slide
        self.swipe_right_on_element(width_percentage=1.3, start_x=100)
    ../views/base_element.py:308: in swipe_right_on_element
        location, size = self.get_element_coordinates()
    ../views/base_element.py:294: in get_element_coordinates
        element = self.find_element()
    ../views/base_element.py:79: in find_element
        raise NoSuchElementException(
     Device 1: SlideButton by xpath: `//*[@resource-id='slide-button-track']` is not found on the screen; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
    



    Class TestActivityCenterContactRequestMultipleDevicePR:

    1. test_activity_center_contact_request_accept_swipe_mark_all_as_read, id: 702851

    Device 1: Tap on found: Button
    # STEP: Device1 check that contact appeared in contact list mutually

    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:703: in urlopen
        httplib_response = self._make_request(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:449: in _make_request
        six.raise_from(e, None)
    <string>:3: in raise_from
        ???
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:444: in _make_request
        httplib_response = conn.getresponse()
    /usr/lib/python3.10/http/client.py:1375: in getresponse
        response.begin()
    /usr/lib/python3.10/http/client.py:318: in begin
        version, status, reason = self._read_status()
    /usr/lib/python3.10/http/client.py:287: in _read_status
        raise RemoteDisconnected("Remote end closed connection without"
    E   http.client.RemoteDisconnected: Remote end closed connection without response
    
    During handling of the above exception, another exception occurred:
    activity_center/test_activity_center.py:141: in test_activity_center_contact_request_accept_swipe_mark_all_as_read
        self.device_2.just_fyi('Device1 check that contact appeared in contact list mutually')
    ../views/base_view.py:410: in just_fyi
        self.driver.execute_script("sauce:context=STEP: %s" % some_str)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:405: in execute_script
        return self.execute(command, {"script": script, "args": converted_args})["value"]
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:343: in execute
        response = self.command_executor.execute(driver_command, params)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/remote_connection.py:291: in execute
        return self._request(command_info[0], url, body=data)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/selenium/webdriver/remote/remote_connection.py:312: in _request
        response = self._conn.request(method, url, body=body, headers=headers)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/request.py:78: in request
        return self.request_encode_body(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/request.py:170: in request_encode_body
        return self.urlopen(method, url, **extra_kw)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/poolmanager.py:376: in urlopen
        response = conn.urlopen(method, u.request_uri, **kw)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:787: in urlopen
        retries = retries.increment(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/util/retry.py:550: in increment
        raise six.reraise(type(error), error, _stacktrace)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/packages/six.py:769: in reraise
        raise value.with_traceback(tb)
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:703: in urlopen
        httplib_response = self._make_request(
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:449: in _make_request
        six.raise_from(e, None)
    <string>:3: in raise_from
        ???
    ../../../../status-app-prs@tmp/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:444: in _make_request
        httplib_response = conn.getresponse()
    /usr/lib/python3.10/http/client.py:1375: in getresponse
        response.begin()
    /usr/lib/python3.10/http/client.py:318: in begin
        version, status, reason = self._read_status()
    /usr/lib/python3.10/http/client.py:287: in _read_status
        raise RemoteDisconnected("Remote end closed connection without"
     ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
    



    Device sessions

    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_emoji_send_reply_and_open_link, id: 702782

    Device 2: Find OpenInStatusButton by xpath: //*[@text="Open in Status"]
    Device 2: Tap on found: OpenInStatusButton

    critical/chats/test_1_1_public_chats.py:179: in test_1_1_chat_emoji_send_reply_and_open_link
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Reply for 'Test with link: https://status.im/ here should be nothing unusual.' not present in message received in public chat
    



    Device sessions

    Expected to fail tests (3)

    Click to expand

    Class TestCommunityOneDeviceMerged:

    1. test_community_discovery, id: 703503

    Test is not run, e2e blocker  
    

    [[reason: [NOTRUN] Curated communities not loading, https://github.com//issues/17852]]

    Class TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_mute_chat, id: 703495

    # STEP: Change device time so chat will be unmuted by timer
    Device 2: Long press on ChatElement

    critical/chats/test_group_chat.py:466: in test_group_chat_mute_chat
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Chat is still muted after timeout 
    

    [[Chat is not unmuted after expected time: https://github.com//issues/19627]]

    Device sessions

    2. test_group_chat_join_send_text_messages_push, id: 702807

    Device 2: Find Text by xpath: //*[starts-with(@text,'Hey, admin!')]/ancestor::android.view.ViewGroup[@content-desc='chat-item']//*[@content-desc='message-status']/android.widget.TextView
    Device 2: Text is Sent

    critical/chats/test_group_chat.py:97: in test_group_chat_join_send_text_messages_push
        self.chats[1].chat_element_by_text(message_to_admin).wait_for_status_to_be('Delivered', timeout=120)
    ../views/chat_view.py:225: in wait_for_status_to_be
        raise TimeoutException("Message status was not changed to %s, it's %s" % (expected_status, current_status))
     Message status was not changed to Delivered, it's Sent 
    

    [[Issue with a message status - Sent instead of Delivered, https://github.com//issues/20126]]

    Device sessions

    Passed tests (45)

    Click to expand

    Class TestDeepLinksOneDevice:

    1. test_links_open_universal_links_from_chat, id: 704613
    Device sessions

    2. test_links_deep_links, id: 702775
    Device sessions

    Class TestCommunityOneDeviceMerged:

    1. test_restore_multiaccount_with_waku_backup_remove_switch, id: 703133
    Device sessions

    2. test_community_copy_and_paste_message_in_chat_input, id: 702742
    Device sessions

    3. test_community_undo_delete_message, id: 702869
    Device sessions

    4. test_community_navigate_to_channel_when_relaunch, id: 702846
    Device sessions

    5. test_community_mute_community_and_channel, id: 703382
    Device sessions

    Class TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_pin_messages, id: 702732
    Device sessions

    2. test_group_chat_send_image_save_and_share, id: 703297
    Device sessions

    3. test_group_chat_reactions, id: 703202
    Device sessions

    4. test_group_chat_offline_pn, id: 702808
    Device sessions

    Class TestOneToOneChatMultipleSharedDevicesNewUiTwo:

    1. test_1_1_chat_delete_via_long_press_relogin, id: 702784
    Device sessions

    2. test_1_1_chat_is_shown_message_sent_delivered_from_offline, id: 702783
    Device sessions

    3. test_1_1_chat_mute_chat, id: 703496
    Device sessions

    Class TestActivityMultipleDevicePR:

    1. test_navigation_jump_to, id: 702936
    Device sessions

    2. test_activity_center_reply_read_unread_delete_filter_swipe, id: 702947
    Device sessions

    Class TestActivityCenterContactRequestMultipleDevicePR:

    1. test_add_contact_field_validation, id: 702777
    Device sessions

    2. test_activity_center_contact_request_decline, id: 702850
    Device sessions

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_regular_account, id: 727231
    Device sessions

    2. test_wallet_add_remove_watch_only_account, id: 727232
    Device sessions

    Class TestCommunityMultipleDeviceMerged:

    1. test_community_several_images_send_reply, id: 703194
    Device sessions

    2. test_community_one_image_send_reply, id: 702859
    Device sessions

    3. test_community_emoji_send_copy_paste_reply, id: 702840
    Device sessions

    4. test_community_mark_all_messages_as_read, id: 703086
    Device sessions

    5. test_community_contact_block_unblock_offline, id: 702894
    Device sessions

    6. test_community_edit_delete_message_when_offline, id: 704615
    Device sessions

    7. test_community_message_delete, id: 702839
    Device sessions

    8. test_community_message_send_check_timestamps_sender_username, id: 702838
    Device sessions

    9. test_community_links_with_previews_github_youtube_twitter_gif_send_enable, id: 702844
    Device sessions

    10. test_community_message_edit, id: 702843
    Device sessions

    11. test_community_unread_messages_badge, id: 702841
    Device sessions

    Class TestCommunityMultipleDeviceMergedTwo:

    1. test_community_markdown_support, id: 702809
    Device sessions

    2. test_community_hashtag_links_to_community_channels, id: 702948
    Device sessions

    3. test_community_mentions_push_notification, id: 702786
    Device sessions

    4. test_community_leave, id: 702845
    Device sessions

    5. test_community_join_when_node_owner_offline, id: 703629
    Device sessions

    Class TestActivityMultipleDevicePRTwo:

    1. test_activity_center_mentions, id: 702957
    Device sessions

    2. test_activity_center_admin_notification_accept_swipe, id: 702958
    Device sessions

    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_text_message_delete_push_disappear, id: 702733
    Device sessions

    2. test_1_1_chat_push_emoji, id: 702813
    Device sessions

    3. test_1_1_chat_non_latin_messages_stack_update_profile_photo, id: 702745
    Device sessions

    4. test_1_1_chat_edit_message, id: 702855
    Device sessions

    5. test_1_1_chat_send_image_save_and_share, id: 703391
    Device sessions

    6. test_1_1_chat_pin_messages, id: 702731
    Device sessions

    7. test_1_1_chat_message_reaction, id: 702730
    Device sessions

    Copy link
    Contributor

    @ajayesivan ajayesivan left a comment

    Choose a reason for hiding this comment

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

    Nice work @J-Son89 🎉

    @qoqobolo qoqobolo assigned qoqobolo and unassigned qoqobolo May 23, 2024
    @mariia-skrypnyk mariia-skrypnyk moved this from E2E Tests to IN TESTING in Pipeline for QA May 24, 2024
    @mariia-skrypnyk mariia-skrypnyk self-assigned this May 24, 2024
    @mariia-skrypnyk
    Copy link

    Hey @J-Son89 !

    Thanks for the PR.
    The loading of images looks really smoother.
    Failed e2e are not related, you can merge your PR.

    @mariia-skrypnyk mariia-skrypnyk moved this from IN TESTING to MERGE in Pipeline for QA May 24, 2024
    @J-Son89
    Copy link
    Member Author

    J-Son89 commented May 24, 2024

    Thanks @mariia-skrypnyk and thanks @ulisesmac for the help on this pr 💪🏼

    Fix hidden hook usage
    
    Improve logging for unsupported collectibles
    
    Fix re-rendering of collectibles in flat-list
    
    chore: clean up implementation and speed up animation
    
    remove apply animations to style
    
    chore: use default opacity
    
    chore: use default opacity
    
    chore: add issue to todo
    
    chore: use flex
    
    chore: flex
    
    Avatars/Community Avatar Component (#20147)
    
    Avatars/dApp Avatar Component (#20145)
    
    Update eth-archival pokt url
    
    Remove not implemented Notification settings from community longtap m… (#20169)
    
    pick between JSC & Hermes for Android (#20171)
    
    We implement both `JSC` and `Hermes` in build phase of `Android` which increases our `APK` size by ~ `2 MB`.
    This was fine before but currently we have to get below the `100 MB` limit.
    
    This commit implements the preferred engine after inferring `hermesEnabled`  property from gradle.properties
    This property is modified at build time for release here
    https://github.com/status-im/status-mobile/blob/178d62bd276afffef5fe7a3f773e390d83336d9c/nix/mobile/android/build.nix#L17
    and set for debug here
    https://github.com/status-im/status-mobile/blob/178d62bd276afffef5fe7a3f773e390d83336d9c/Makefile#L280
    
    Which should further reduce the `APK` size by `2 MB`.
    
    [#19232] - Fix derivation path generation and keypair creation (#19531)
    
    * Add more default dependencies to slide button
    
    * Fix wallet account creation: derivation paths and keypairs
    @J-Son89 J-Son89 force-pushed the jc/collectible-transition branch from 5f288f6 to bde0a3b Compare May 24, 2024 20:33
    @J-Son89 J-Son89 merged commit 777b2bb into develop May 24, 2024
    6 checks passed
    Pipeline for QA automation moved this from MERGE to DONE May 24, 2024
    @J-Son89 J-Son89 deleted the jc/collectible-transition branch May 24, 2024 20:44
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    Development

    Successfully merging this pull request may close these issues.

    Follow-up: Add Animation to New Collectible UI
    9 participants