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

MM-52857 - DM/GM ringing #445

Merged
merged 29 commits into from
Jul 8, 2023
Merged

MM-52857 - DM/GM ringing #445

merged 29 commits into from
Jul 8, 2023

Conversation

cpoile
Copy link
Member

@cpoile cpoile commented Jun 8, 2023

Summary

  • This is the first step in an epic of DM/GM ringing. Apologies for the single commit, it's all kind of related. For now, the following has been completed (also useful for a testing plan):

    • user in DM receiving a call will get a call alert in the LHS.
    • Multiple alerts will stack.
    • if user is in a call, they will receive the call alert in a condensed form above the call widget (all cases).
    • Multiple alerts will stack.
    • if the user is on desktop with the global widget, the LHS call alert will also appear. Otherwise, only the condensed form about the vall widget will appear.
    • dismiss should record the dismissal
      • this way you don't get another ring if you restart the webapp (or log in using another client)
    • dismisal array is sent with call data
      • this means you won't be given a notice if you dismiss and then restart the webapp (or re-log in another client)
    • notifications seen when logging in and calls are waiting
    • do not ring for second call
      • LHS has expanded notification open, second call arrives (condensed) -- webapp without widget, and desktop with and without global widget
      • webapp widget has one condensed notification, second call arrives
    • users with the global widget should have only one sound playing at once (this is testing if the global widget is causing sound, when only the LHS notification on the channels side of the desktop app should be)
    • do not ring twice for same call:
      • call appears in condensed above widget, then widget's call is exited (making the condensed turn into full notification) -- webapp
      • call appears in lhs, then user starts unrelated call (widget appears, lhs call notification disappears, condensed call appears above widget, no call sound)
      • call appears in lhs, then another call notification arrives (no sound)
      • first call appears above widget (webapp), rings. Second call appears, does not ring
    • should ring once for a call, only if it is the "first call" in the list
      • when second call arrives, no sound. When first call is dimissed, the second call takes the first call's place and does not ring. Try this in webapp (no widget), webapp (in a call, widget), desktop (no widget), and desktop (in a call, widget)

TODO: (I will make tickets for these)

  • when incoming call is hung up, it shouldn't disappear -- it should turn into cancelled state. Needs to be manually dismissed.
  • ringing in a different server
    • should cause desktop notification, no ringing sound (?)
  • clicking on the popover should redirect the user to the dm/gm
  • badge notification when in a call (expanded view)
  • badge icon on the LHS channel name
    • badge shows even if call notification is dismissed
  • delay in notice (3 seconds)
  • if user is already on the dm/gm channel, ringing should only last 5 seconds
  • dismiss should work across clients
  • animations (slide in, dismiss, halo around avatar)
  • tests

To try this out, you'll need: mattermost/mattermost#23444
And you'll need to tag this commit with v0.17.0 before deploying.

Some screenshots

image image image image

I think I need to get some UX input on hover states, I'll leave that for a polish stage -- this is mostly for functionality.

Ticket Link

Fixes #125
Fixes #427

@cpoile cpoile added the 2: Dev Review Requires review by a core committer label Jun 8, 2023
@cpoile cpoile requested a review from streamer45 June 8, 2023 20:42
# Conflicts:
#	webapp/src/actions.ts
#	webapp/src/index.tsx
#	webapp/src/reducers.ts
@codecov-commenter
Copy link

codecov-commenter commented Jun 8, 2023

Codecov Report

Patch coverage: 21.12% and project coverage change: +0.01 🎉

Comparison is base (115d4e5) 5.65% compared to head (ad40445) 5.67%.

Additional details and impacted files
@@           Coverage Diff            @@
##            main    #445      +/-   ##
========================================
+ Coverage   5.65%   5.67%   +0.01%     
========================================
  Files         22      22              
  Lines       4104    4162      +58     
========================================
+ Hits         232     236       +4     
- Misses      3856    3909      +53     
- Partials      16      17       +1     
Impacted Files Coverage Δ
server/api.go 1.22% <0.00%> (-0.14%) ⬇️
server/websocket.go 0.00% <0.00%> (ø)
server/channel_state.go 42.47% <75.00%> (+0.10%) ⬆️

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

@streamer45 streamer45 added this to the v0.17.0 milestone Jun 8, 2023
@streamer45 streamer45 added 2: QA Review Requires review by a QA tester 1: UX Review Requires review by ux 1: PM Review Requires review by a product manager labels Jun 9, 2023
@streamer45
Copy link
Collaborator

Unrelated but let's fix it in here, the switch call modal for DMs has a little bug due to invalid property name used:

image

Copy link
Collaborator

@streamer45 streamer45 left a comment

Choose a reason for hiding this comment

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

This is great! Did a first pass and left mostly minor comments.

server/api.go Outdated Show resolved Hide resolved
server/api.go Outdated Show resolved Hide resolved
server/channel_state.go Outdated Show resolved Hide resolved
@@ -77,6 +77,15 @@ export function getChannelURL(state: GlobalState, channel: Channel, teamId: stri
return channelURL;
}

export function shouldRenderCallsIncoming() {
const win = window.opener ? window.opener : window;
if (win.desktop && window.location.pathname.indexOf('/messages/') === -1) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Do you know if the /messages/ path is going away any time soon? Just want to make sure we prepare for it if that's the case.

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 question.
I was kind of assuming /messages wouldn't change... But it might... And anyway, I discovered this was wrong (you could break it under some combinations of reloading and where you were in the app). So I've changed the index.tsx and the call_container to fix that, and I changed this util fn to do the check a bit more safely. Hopefully this will be a bit more robust for when we remove the tabs: there's a good chance that when the tabs are removed we will need to display the LHS incoming widget no matter what you're looking at, and this should work then.
(Remember, the reason we're doing this check is that we don't want multiple LHS incoming containers to ring at the same time, which is what was happening because the desktop loaded separate webapps per tab.)

webapp/src/components/incoming_calls/hooks.ts Outdated Show resolved Hide resolved
webapp/src/components/incoming_calls/hooks.ts Outdated Show resolved Hide resolved
webapp/src/index.tsx Outdated Show resolved Hide resolved
webapp/src/selectors.ts Outdated Show resolved Hide resolved
webapp/src/utils.ts Outdated Show resolved Hide resolved
webapp/src/reducers.ts Outdated Show resolved Hide resolved
@cpoile cpoile requested a review from streamer45 June 12, 2023 22:39
# Conflicts:
#	webapp/i18n/en.json
#	webapp/package-lock.json
#	webapp/package.json
#	webapp/src/utils.ts
@cpoile
Copy link
Member Author

cpoile commented Jun 14, 2023

@streamer45 Fixed the remaining issues, I think we're good for another pass.
There's one more remaining issue on my list: starting a call (desktop, global widget), existing notifications don't transfer over (like in webapp). I'm not sure if we would even need that, now that I think about it. If you have notifications, and you start a different call with the global widget, they don't disappear (like they do on webapp). So transferring them over to the global widget isn't as important. On the other hand, if you're in a different server, having the notifications pop up on the widget might still be useful. What do you think?

Copy link
Contributor

@matthewbirtch matthewbirtch left a comment

Choose a reason for hiding this comment

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

A quick first pass tonight and here are a few things I'm noticing:

  1. When the team sidebar is hidden, the width of the banners is more narriw and it looks like the join/ignore buttons are not respecting the padding and the join button is even extending beyond the container somehow. One way we could combat this is to reduce the horizontal padding on these buttons to 16px instead of 20px. We could also reduce the space between buttons to 8px instead of 12px.
    image

  2. The onboarding checklist floating button overlaps the new DM ringing banner. I think we can place the ringing banner at a higher z-index
    Screenshot 2023-06-14 at 9 14 17 PM

  3. In the new ringing banner, can we reduce the margin-top on the buttons row from 16px to 12px?
    Screenshot 2023-06-14 at 8 54 07 PM

  4. For the hover state on the Ignore button, let's go with background: rgba(var(--button-color-rgb),0.16);

  5. If I join the DM call by clicking the top canner in the DM channel or the call card in the message area, the new banner shows as if another call is still ringing, but I'm in the call already
    image

    Screen.Recording.2023-06-14.at.9.12.22.PM.mov

I still need to test the following:

  • scenarios of other multiple DM calls at once
  • GMs
  • popup window
  • desktop app

@cpoile
Copy link
Member Author

cpoile commented Jun 15, 2023

Thanks @matthewbirtch for the great comments -- I've made the adjustments, much much better now.

Thinner team bar:
image

Wider team bar:
image

The z-index works (those are both above the onboarding tour button).

@streamer45 In the latest PR I migrated the ChannelCallToast component so that I could reuse the onJoin hook. I tested and it works, but because of the changes would you mind doing a test on it too? Thanks.

@cpoile
Copy link
Member Author

cpoile commented Jun 15, 2023

I'm not sure what's happening with the channel toast e2e diff -- it passes locally, and I can't see why it would be narrower in the trace.

@streamer45
Copy link
Collaborator

I'm not sure what's happening with the channel toast e2e diff -- it passes locally, and I can't see why it would be narrower in the trace.

The e2e pipeline is currently half broken. It doesn't even start the tests. See https://community.mattermost.com/private-core/pl/7qm1ndx8hjy9fqm7mtxbp5smkc

webapp/src/actions.ts Outdated Show resolved Hide resolved
Comment on lines 314 to 317
const otherUser = getUser(getState(), hostID);
if (!otherUser) {
await dispatch(getProfilesByIdsAction([hostID]));
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

How does this apply to GM? Maybe it's just a naming thing but it looks like what we really need here is the caller, right?

Copy link
Member Author

Choose a reason for hiding this comment

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

Maybe I made a wrong assumption? I was assuming the hostID was the person who started the call (i.e., the caller).

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think it's just the name that's confusing. Calling it otherUser when we mean the caller. In the context of a DM it's fine I suppose but in a GM it feels weird. No problem with the logic, although technically the host could change so it's not always an exact mapping. What you really want would be what we set as OwnerID, not sure if we expose it though but not a big deal.

Copy link
Member Author

@cpoile cpoile Jun 28, 2023

Choose a reason for hiding this comment

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

I agree -- I fixed it by moving over to ownerID and then referring to them as the Caller from then on. in ade6649

webapp/src/actions.ts Outdated Show resolved Hide resolved
webapp/src/actions.ts Show resolved Hide resolved
webapp/src/components/channel_call_toast.tsx Show resolved Hide resolved
webapp/src/components/incoming_calls/call_container.tsx Outdated Show resolved Hide resolved
webapp/src/components/incoming_calls/hooks.ts Outdated Show resolved Hide resolved
webapp/src/components/incoming_calls/hooks.ts Outdated Show resolved Hide resolved
Copy link
Contributor

@matthewbirtch matthewbirtch left a comment

Choose a reason for hiding this comment

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

Added a few minor tweaks to the CSS.

And I'm also hoping we can add a tooltip to the banners when the name is truncated so you can fully see who's calling when hovering.
image

@cpoile
Copy link
Member Author

cpoile commented Jun 23, 2023

Thanks @matthewbirtch, I made a ticket for the tooltip: https://mattermost.atlassian.net/browse/MM-53320

Copy link
Collaborator

@streamer45 streamer45 left a comment

Choose a reason for hiding this comment

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

Thanks @cpoile , amazing effort 🙇

webapp/src/components/channel_call_toast.tsx Show resolved Hide resolved
Copy link
Contributor

@matthewbirtch matthewbirtch left a comment

Choose a reason for hiding this comment

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

Thanks Chris! I think this looks good to me!

* refactor & add hooks; notify when in background (desktop & webapp)

* desktop notifications, ringing rules, simplification of ringing

* finish rebase, mostly channelID -> callID changes

* use main branch calls-common; enable ringingEnabled feature flag

* small bug from switching to callID

* couple more small fixes

* respect user and channel muted settings

* more granular notification preferences (channel + system level)

* ringing should default to on if not set

* use ownerID as caller, hostID -> callerID; fix notification bug

* small fix

* i18n

* MM-53322 - Channel toast fixes (#455)

* record explicit dismisses for channel toast and for later use

* e2e tests

* Translated using Weblate (Japanese) (#457)

Currently translated at 100.0% (161 of 161 strings)

Merge remote-tracking branch 'origin/main'

Translated using Weblate (Korean)

Currently translated at 3.1% (5 of 161 strings)

Translated using Weblate (Czech)

Currently translated at 99.3% (160 of 161 strings)

Translated using Weblate (French)

Currently translated at 60.2% (97 of 161 strings)

Merge remote-tracking branch 'origin/main'

Merge remote-tracking branch 'origin/main'

Translated using Weblate (Polish)

Currently translated at 100.0% (161 of 161 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (161 of 161 strings)

Translated using Weblate (Spanish)

Currently translated at 30.4% (49 of 161 strings)

Translated using Weblate (German)

Currently translated at 100.0% (161 of 161 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Spanish)

Currently translated at 26.7% (43 of 161 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (161 of 161 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (161 of 161 strings)

Merge remote-tracking branch 'origin/main'

Translated using Weblate (German)

Currently translated at 100.0% (161 of 161 strings)

Translated using Weblate (Italian)

Currently translated at 26.0% (42 of 161 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (161 of 161 strings)

Translated using Weblate (Korean)

Currently translated at 1.8% (3 of 161 strings)

Translated using Weblate (Croatian)

Currently translated at 96.8% (156 of 161 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (161 of 161 strings)

Added translation using Weblate (Korean)

Translated using Weblate (Turkish)

Currently translated at 100.0% (161 of 161 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 63.9% (103 of 161 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (161 of 161 strings)

Merge remote-tracking branch 'origin/main'

Translated using Weblate (Japanese)

Currently translated at 100.0% (159 of 159 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (159 of 159 strings)

Translated using Weblate (Japanese)

Currently translated at 1.8% (3 of 159 strings)

Translated using Weblate (Croatian)

Currently translated at 95.5% (152 of 159 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 15.7% (25 of 159 strings)

Translated using Weblate (Japanese)

Currently translated at 1.2% (2 of 159 strings)

Translated using Weblate (Uzbek)

Currently translated at 4.4% (7 of 159 strings)

Added translation using Weblate (Uzbek)

Translated using Weblate (Italian)

Currently translated at 20.1% (32 of 159 strings)

Added translation using Weblate (Italian)

Translated using Weblate (Czech)

Currently translated at 100.0% (159 of 159 strings)

Translated using Weblate (Croatian)

Currently translated at 94.9% (151 of 159 strings)

Translated using Weblate (Croatian)

Currently translated at 1.2% (2 of 159 strings)

Added translation using Weblate (Croatian)

Translated using Weblate (German)

Currently translated at 100.0% (159 of 159 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (159 of 159 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (159 of 159 strings)






















Translate-URL: https://translate.mattermost.com/projects/calls/webapp/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/cs/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/de/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/es/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/fr/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/hr/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/it/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/ja/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/ko/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/nl/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/pl/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/tr/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/uz/
Translate-URL: https://translate.mattermost.com/projects/calls/webapp/zh_Hans/
Translation: Calls/webapp

Co-authored-by: Alberto Lozano <alferto82@gmail.com>
Co-authored-by: GJ\" Guenjun Yoo <guenjun.yoo@outlook.com>
Co-authored-by: Gianluigi Fiorillo <ggflower@gmail.com>
Co-authored-by: Jihyeon Gim <potatogim@potatogim.net>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
Co-authored-by: Kwangoh Moon <raymond.moon@gmail.com>
Co-authored-by: Michele Amato <mike.amato85@tiscali.it>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Nathanaël <contact@nathanaelhoun.fr>
Co-authored-by: Pan Klobouk <julda.fulda@centrum.cz>
Co-authored-by: Sarvarbek Hasanov <admin@softex.uz>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: ondraknezour <knezour@weboutsourcing.cz>
Co-authored-by: orta-contrib <orta.contrib@gmail.com>
Co-authored-by: tianyazi <1278881217@qq.com>
Co-authored-by: timmycheng <timmycheng@foxmail.com>

* Translated using Weblate (Korean) (#456)

Currently translated at 100.0% (2 of 2 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (2 of 2 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2 of 2 strings)

Merge remote-tracking branch 'origin/main'

Added translation using Weblate (Korean)

Merge remote-tracking branch 'origin/main'

Merge remote-tracking branch 'origin/main'

Merge remote-tracking branch 'origin/main'

Translated using Weblate (Japanese)

Currently translated at 100.0% (2 of 2 strings)

Translated using Weblate (Japanese)

Currently translated at 50.0% (1 of 2 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2 of 2 strings)

Added translation using Weblate (Uzbek)

Translated using Weblate (Italian)

Currently translated at 100.0% (2 of 2 strings)

Added translation using Weblate (Italian)

Translated using Weblate (Croatian)

Currently translated at 100.0% (2 of 2 strings)

Added translation using Weblate (Croatian)











Translate-URL: https://translate.mattermost.com/projects/calls/standalone/es/
Translate-URL: https://translate.mattermost.com/projects/calls/standalone/hr/
Translate-URL: https://translate.mattermost.com/projects/calls/standalone/it/
Translate-URL: https://translate.mattermost.com/projects/calls/standalone/ja/
Translate-URL: https://translate.mattermost.com/projects/calls/standalone/ko/
Translate-URL: https://translate.mattermost.com/projects/calls/standalone/zh_Hans/
Translation: Calls/standalone

Co-authored-by: Alberto Lozano <alferto82@gmail.com>
Co-authored-by: GJ\" Guenjun Yoo <guenjun.yoo@outlook.com>
Co-authored-by: Gianluigi Fiorillo <ggflower@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: orta-contrib <orta.contrib@gmail.com>
Co-authored-by: tianyazi <1278881217@qq.com>
Co-authored-by: timmycheng <timmycheng@foxmail.com>

* MM-53261 - Expanded view notifications (#461)

* incoming calls on expanded window; simplify global join

* stack the notifications vertically

* dismiss notification from SwitchCallModal; some formatting

---------

Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Alberto Lozano <alferto82@gmail.com>
Co-authored-by: GJ\" Guenjun Yoo <guenjun.yoo@outlook.com>
Co-authored-by: Gianluigi Fiorillo <ggflower@gmail.com>
Co-authored-by: Jihyeon Gim <potatogim@potatogim.net>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
Co-authored-by: Kwangoh Moon <raymond.moon@gmail.com>
Co-authored-by: Michele Amato <mike.amato85@tiscali.it>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Nathanaël <contact@nathanaelhoun.fr>
Co-authored-by: Pan Klobouk <julda.fulda@centrum.cz>
Co-authored-by: Sarvarbek Hasanov <admin@softex.uz>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: ondraknezour <knezour@weboutsourcing.cz>
Co-authored-by: orta-contrib <orta.contrib@gmail.com>
Co-authored-by: tianyazi <1278881217@qq.com>
Co-authored-by: timmycheng <timmycheng@foxmail.com>

---------

Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Alberto Lozano <alferto82@gmail.com>
Co-authored-by: GJ\" Guenjun Yoo <guenjun.yoo@outlook.com>
Co-authored-by: Gianluigi Fiorillo <ggflower@gmail.com>
Co-authored-by: Jihyeon Gim <potatogim@potatogim.net>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
Co-authored-by: Kwangoh Moon <raymond.moon@gmail.com>
Co-authored-by: Michele Amato <mike.amato85@tiscali.it>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Nathanaël <contact@nathanaelhoun.fr>
Co-authored-by: Pan Klobouk <julda.fulda@centrum.cz>
Co-authored-by: Sarvarbek Hasanov <admin@softex.uz>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: ondraknezour <knezour@weboutsourcing.cz>
Co-authored-by: orta-contrib <orta.contrib@gmail.com>
Co-authored-by: tianyazi <1278881217@qq.com>
Co-authored-by: timmycheng <timmycheng@foxmail.com>
@cpoile cpoile added 3: Reviews Complete All reviewers have approved the pull request and removed 1: PM Review Requires review by a product manager 1: UX Review Requires review by ux 2: Dev Review Requires review by a core committer 2: QA Review Requires review by a QA tester labels Jul 8, 2023
@cpoile cpoile merged commit 67d5dcf into main Jul 8, 2023
6 checks passed
@cpoile cpoile deleted the MM-52857-dm-ringing branch July 8, 2023 15:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3: Reviews Complete All reviewers have approved the pull request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

add continous ringtone for calls Add a popup notification when someone calls you
4 participants