Change group chats and conference icons.

Change color on selected call (call list).
Change burger icon into dot menu in calls list.
Change conversation icon to match timeline.
Merge calls into conference.
Fix twin participants on invitation.
This commit is contained in:
Julien Wadel 2022-11-02 16:46:06 +01:00
parent ced6a8b396
commit dd39203d47
19 changed files with 243 additions and 83 deletions

View file

@ -3,16 +3,19 @@
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg21"
id="svg8"
sodipodi:docname="chat_room_custom.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs12" />
<sodipodi:namedview
id="namedview23"
id="namedview10"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
@ -20,57 +23,31 @@
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
width="30px"
inkscape:zoom="5.659091"
inkscape:cx="-9.6305219"
inkscape:cy="24.738955"
inkscape:zoom="6.9166667"
inkscape:cx="15.180723"
inkscape:cy="22.987952"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg21" />
<defs
id="defs5">
<filter
id="d1wmealema"
color-interpolation-filters="auto"
x="0"
y="0"
width="1"
height="1">
<feColorMatrix
in="SourceGraphic"
values="0 0 0 0 0.349020 0 0 0 0 0.341176 0 0 0 0 0.349020 0 0 0 1.000000 0"
id="feColorMatrix2" />
</filter>
</defs>
inkscape:current-layer="svg8" />
<g
fill="none"
fill-rule="evenodd"
id="g19"
transform="matrix(0.91808004,0,0,0.97218937,14.299365,21.746553)">
<g
id="g17">
<g
id="g15">
<g
filter="url(#d1wmealema)"
transform="translate(0.763635,0.775)"
id="g13">
<g
fill="#000000"
fill-rule="nonzero"
id="g11">
<path
d="m 45.911,13.38 c 1.019,0 2,-0.213 2.882,-0.616 0.049,-0.022 0.098,-0.04 0.149,-0.055 0.06,-0.018 0.21,-0.075 0.417,-0.178 0.362,-0.18 0.727,-0.419 1.066,-0.723 0.294,-0.264 0.555,-0.565 0.775,-0.906 0.432,-0.67 0.709,-1.305 0.864,-1.88 0.052,-0.19 0.085,-0.358 0.104,-0.498 L 52.18,8.419 52.185,8.326 c 0.018,-0.169 0.026,-0.34 0.026,-0.51 0,-3.046 -2.796,-5.566 -6.3,-5.566 -3.503,0 -6.3,2.52 -6.3,5.565 0,1.452 0.633,2.82 1.758,3.855 0.181,0.166 0.302,0.388 0.346,0.63 l 0.013,0.075 c 0.157,0.635 0.156,1.22 0.026,1.752 0.291,-0.182 0.532,-0.363 0.74,-0.542 0.071,-0.06 0.132,-0.116 0.184,-0.166 l 0.043,-0.041 0.028,-0.028 0.032,-0.03 C 42.8,13.303 42.8,13.303 42.887,13.235 l 0.1,-0.063 0.849,-0.1 c 0.678,0.206 1.367,0.308 2.075,0.308 z m 0,2.25 c -0.707,0 -1.404,-0.078 -2.077,-0.232 -0.258,0.213 -0.545,0.422 -0.86,0.62 -1.44,0.905 -3.045,1.324 -4.733,0.947 -1.135,-0.253 -1.186,-1.852 -0.07,-2.178 0.027,-0.008 0.105,-0.035 0.216,-0.083 0.193,-0.084 0.386,-0.19 0.56,-0.315 0.5,-0.359 0.72,-0.756 0.628,-1.324 -1.41,-1.421 -2.214,-3.275 -2.214,-5.25 0,-4.343 3.853,-7.815 8.55,-7.815 4.697,0 8.55,3.472 8.55,7.815 0,0.235 -0.01,0.468 -0.033,0.7 -0.011,0.253 -0.065,0.625 -0.192,1.095 -0.214,0.794 -0.585,1.641 -1.145,2.51 -0.332,0.516 -0.725,0.969 -1.164,1.363 -0.5,0.448 -1.032,0.798 -1.568,1.064 -0.283,0.14 -0.521,0.236 -0.696,0.293 -1.159,0.518 -2.435,0.79 -3.752,0.79 z M 42.454,5.506 h 6.895 c 1.5,0 1.5,2.25 0,2.25 h -6.895 c -1.5,0 -1.5,-2.25 0,-2.25 z m 0,2.818 h 6.895 c 1.5,0 1.5,2.25 0,2.25 h -6.895 c -1.5,0 -1.5,-2.25 0,-2.25 z M 8.671,32.229 c 2.257,0.675 4.576,1.106 6.87,1.336 1.674,0.167 3.097,0.207 4.157,0.177 0.104,-0.003 0.173,-0.006 0.203,-0.008 l 0.209,-0.002 0.265,0.01 c 1.06,0.03 2.483,-0.01 4.156,-0.177 2.295,-0.23 4.614,-0.66 6.87,-1.336 0.34,-1.838 0.01,-3.916 -1.507,-5.904 -1.151,-1.51 -2.924,-2.845 -5.428,-3.946 -0.064,-0.028 -0.124,-0.061 -0.181,-0.1 l -0.274,-0.187 c -0.607,-0.413 -0.662,-1.287 -0.112,-1.773 0.087,-0.103 0.105,-0.125 0.185,-0.21 0.944,-1.019 1.478,-2.356 1.478,-3.782 0,-3.055 -2.448,-5.527 -5.463,-5.527 h -0.126 c -3.014,0 -5.462,2.472 -5.462,5.527 0,1.426 0.534,2.763 1.48,3.783 0.079,0.086 0.092,0.102 0.163,0.193 0.57,0.5 0.516,1.377 -0.093,1.79 l -0.276,0.187 c -0.056,0.038 -0.116,0.071 -0.178,0.099 -2.504,1.1 -4.277,2.437 -5.428,3.946 -1.517,1.988 -1.848,4.066 -1.508,5.904 z m 11.32,3.753 -0.229,0.009 c -1.151,0.033 -2.67,-0.01 -4.444,-0.187 C 12.671,35.539 9.992,35.021 7.388,34.187 7.05,34.079 6.784,33.818 6.668,33.484 6.615,33.33 6.545,33.081 6.48,32.747 5.999,30.307 6.414,27.55 8.39,24.96 c 1.217,-1.596 2.96,-2.995 5.276,-4.155 -0.905,-1.294 -1.405,-2.848 -1.405,-4.478 0,-4.293 3.45,-7.777 7.712,-7.777 h 0.126 c 4.263,0 7.713,3.484 7.713,7.777 0,1.63 -0.5,3.183 -1.406,4.478 2.316,1.16 4.06,2.56 5.277,4.155 1.976,2.59 2.39,5.347 1.91,7.787 -0.066,0.334 -0.135,0.583 -0.188,0.737 -0.116,0.334 -0.383,0.595 -0.72,0.703 -2.604,0.834 -5.284,1.352 -7.93,1.617 -1.775,0.177 -3.294,0.22 -4.445,0.187 l -0.228,-0.009 z"
id="path7" />
<path
d="m 27.704,16.327 c 0,1.63 -0.5,3.183 -1.405,4.478 3.468,1.736 5.623,3.985 6.655,6.56 1.97,-0.151 4.02,-0.496 6.038,-1.09 0.223,-1.387 -0.052,-2.942 -1.193,-4.437 -0.901,-1.181 -2.296,-2.232 -4.275,-3.102 -0.063,-0.028 -0.123,-0.061 -0.18,-0.1 l -0.221,-0.15 c -0.607,-0.414 -0.662,-1.288 -0.111,-1.774 0.049,-0.062 0.069,-0.085 0.132,-0.153 0.721,-0.778 1.129,-1.799 1.129,-2.889 0,-2.333 -1.868,-4.22 -4.168,-4.22 h -0.102 c -1.611,0 -3.048,0.935 -3.739,2.35 0.928,1.306 1.44,2.878 1.44,4.527 z m 5.278,0.423 0.002,-0.001 z m -7.719,3.57 -0.452,1.03 0.633,-0.93 -0.085,-0.058 c -0.031,-0.015 -0.063,-0.029 -0.096,-0.043 z m -1.287,-0.211 c 0.945,-1.019 1.478,-2.356 1.478,-3.782 0,-1.348 -0.476,-2.617 -1.33,-3.615 -0.255,-0.299 -0.336,-0.71 -0.213,-1.083 C 24.775,9.007 27.216,7.2 30.003,7.2 h 0.102 c 3.547,0 6.418,2.9 6.418,6.47 0,1.269 -0.364,2.482 -1.028,3.515 1.78,0.925 3.133,2.03 4.093,3.289 1.631,2.137 1.974,4.416 1.576,6.434 -0.054,0.279 -0.113,0.489 -0.159,0.622 -0.116,0.334 -0.382,0.594 -0.72,0.702 -2.702,0.866 -5.457,1.303 -8.056,1.432 -0.517,0.026 -0.985,-0.306 -1.133,-0.802 -0.755,-2.53 -2.838,-4.77 -6.738,-6.483 -0.063,-0.028 -0.124,-0.061 -0.18,-0.1 l -0.275,-0.187 c -0.607,-0.413 -0.661,-1.287 -0.111,-1.773 0.086,-0.103 0.105,-0.125 0.184,-0.21 z m -10.31,0.696 c -0.905,-1.294 -1.405,-2.848 -1.405,-4.478 0,-2.066 0.805,-4 2.192,-5.432 C 13.675,9.992 12.54,9.45 11.312,9.45 H 11.21 c -2.3,0 -4.168,1.887 -4.168,4.22 0,1.09 0.408,2.111 1.13,2.89 0.064,0.069 0.08,0.088 0.13,0.15 0.553,0.486 0.498,1.363 -0.111,1.777 l -0.221,0.15 c -0.057,0.038 -0.117,0.071 -0.18,0.099 -1.978,0.87 -3.373,1.92 -4.274,3.102 -1.14,1.495 -1.416,3.05 -1.193,4.438 1.561,0.458 3.157,0.771 4.741,0.96 1.053,-2.522 3.194,-4.725 6.602,-6.431 z M 8.333,16.75 8.332,16.748 v 0.002 z m 6.19,3.667 0.63,0.931 -0.452,-1.03 -0.095,0.042 -0.084,0.057 z m 1.538,1.675 -0.276,0.187 C 15.729,22.317 15.669,22.35 15.607,22.378 11.752,24.072 9.671,26.281 8.894,28.78 8.737,29.287 8.246,29.615 7.717,29.566 5.495,29.362 3.232,28.936 1.03,28.231 0.693,28.123 0.426,27.863 0.31,27.529 0.264,27.396 0.206,27.186 0.15,26.907 -0.247,24.888 0.096,22.61 1.727,20.473 2.687,19.214 4.04,18.108 5.82,17.183 5.157,16.151 4.792,14.938 4.792,13.669 c 0,-3.57 2.871,-6.47 6.418,-6.47 h 0.102 c 2.356,0 4.486,1.29 5.61,3.325 0.267,0.483 0.144,1.089 -0.29,1.43 -1.329,1.04 -2.121,2.638 -2.121,4.372 0,1.426 0.534,2.763 1.48,3.783 0.079,0.086 0.092,0.102 0.163,0.193 0.57,0.5 0.516,1.377 -0.093,1.79 z"
id="path9" />
</g>
</g>
</g>
</g>
id="g832"
transform="matrix(0.67345025,0,0,0.67345025,9.9999997,20)">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="m 33.7385,59.5539 c -5.4936,-0.5499 -11.046,-1.5836 -16.4472,-3.2018 -0.8149,-4.4048 -0.0225,-9.3836 3.6084,-14.1483 2.756,-3.6166 7.0003,-6.8186 12.9943,-9.456 0.1497,-0.0658 0.2931,-0.1452 0.4285,-0.2371 l 0.6594,-0.4479 c 1.4585,-0.9906 1.5891,-3.0935 0.2234,-4.291 C 35.0358,27.5543 35.0033,27.5167 34.813,27.3106 32.5497,24.8668 31.2713,21.6615 31.2713,18.2449 31.2713,10.924 37.1314,5 44.3466,5 h 0.3033 c 7.2171,0 13.0769,5.9235 13.0769,13.2449 0,3.4172 -1.278,6.6224 -3.5383,9.063 -0.1905,0.2048 -0.2352,0.2573 -0.4418,0.5031 -1.3173,1.1642 -1.186,3.2589 0.2664,4.2491 L 54.67,32.508 c 0.1365,0.0931 0.2813,0.1734 0.4325,0.2399 5.9945,2.6373 10.2391,5.8394 12.9953,9.456 3.6313,4.7647 4.4238,9.7434 3.609,14.1482 -5.4018,1.6182 -10.9545,2.6519 -16.4482,3.2018 -4.0055,0.4008 -7.4119,0.4967 -9.9495,0.4236 -0.1865,-0.0054 -0.3252,-0.0106 -0.4752,-0.0162 -0.0509,-0.002 -0.1031,-0.0039 -0.1589,-0.006 l -0.4995,0.0041 c -0.0734,0.004 -0.2375,0.0109 -0.4874,0.0181 -2.5377,0.0731 -5.9441,-0.0228 -9.9496,-0.4236 z"
fill="#444444"
id="path2" />
<path
d="m 62.1606,17.3664 c 0,4.0408 -1.3225,8.2219 -3.5628,11.4314 8.5813,4.3036 11.0776,8.8212 13.6299,15.2022 4.874,-0.3728 11.6211,-1.122 16.5902,-2.8452 0.8014,-4.0073 -0.0642,-8.6958 -3.6707,-12.3023 -2.6641,-2.6641 -4.1035,-4.1096 -8.7036,-6.1351 -0.1563,-0.0689 -0.3481,-0.1803 -0.4891,-0.2766 -1.7232,-0.8015 -2.5246,-1.6029 -2.1239,-3.2058 0,-0.4008 1.021,-1.3364 1.2022,-1.6029 1.4108,-2.0755 2.5647,-3.3516 2.5647,-7.2132 C 77.5975,4.80874 73.2857,0 66.6175,0 61.408,0 57.8015,4.00729 57,7.21311 c 2.2963,3.23579 5.1606,6.06519 5.1606,10.15329 z"
fill="#444444"
id="path4" />
<path
d="m 26.8544,17.3664 c 0,4.0408 1.3187,8.2219 3.5525,11.4314 C 21.8505,33.1014 19.3615,37.619 16.8166,44 11.9569,43.6272 5.22934,42.878 0.274772,41.1548 -0.524352,37.1475 0.338703,32.459 3.93476,28.8525 6.59109,26.1884 8.02628,24.7429 12.613,22.7174 c 0.1559,-0.0689 0.347,-0.1803 0.4877,-0.2766 1.7181,-0.8015 2.5173,-1.6029 2.1177,-3.2058 0,-0.4008 -1.018,-1.3364 -1.1987,-1.6029 C 12.613,15.5566 11.4625,14.2805 11.4625,10.4189 11.4625,4.80874 15.7617,0 22.4105,0 27.6048,0 31.2009,4.00729 32,7.21311 29.7104,10.4489 26.8544,13.2783 26.8544,17.3664 Z"
fill="#444444"
id="path6" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="80"
height="80"
viewBox="0 0 80 80"
fill="none"
version="1.1"
id="svg7"
sodipodi:docname="conference_merge_custom.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs11" />
<sodipodi:namedview
id="namedview9"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="5.6283784"
inkscape:cx="72.045618"
inkscape:cy="45.661464"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg7" />
<g
id="rassemblement_conf_over_alpha"
transform="matrix(0.67228336,0,0,0.66946229,-9.7483237,-10.083869)">
<path
id="new_conference_default"
fill-rule="evenodd"
clip-rule="evenodd"
d="m 57.542,109.575 c 0.2349,-0.253 0.6303,-0.268 0.8833,-0.033 6.9396,6.444 18.2098,6.444 25.1494,0 0.253,-0.235 0.6484,-0.22 0.8833,0.033 0.2349,0.253 0.2202,0.648 -0.0327,0.883 -7.4192,6.889 -19.4314,6.889 -26.8506,0 -0.2529,-0.235 -0.2676,-0.63 -0.0327,-0.883 z m 8.9776,-1.922 c 0.1435,0.214 0.1402,0.495 -0.0083,0.706 l -6.3268,9 c -0.1399,0.199 -0.3824,0.299 -0.6217,0.256 -0.2393,-0.043 -0.432,-0.221 -0.494,-0.456 l -1.8876,-7.162 c -0.0433,-0.164 -0.0179,-0.339 0.0704,-0.484 0.0883,-0.145 0.2318,-0.248 0.3975,-0.285 l 8.2144,-1.838 c 0.252,-0.056 0.5127,0.048 0.6561,0.263 z m -7.9643,2.653 1.3796,5.235 4.6243,-6.578 z M 50,46.625 c -9.5977,0 -17.375,7.7777 -17.375,17.375 0,0.3452 -0.2798,0.625 -0.625,0.625 -0.3452,0 -0.625,-0.2798 -0.625,-0.625 0,-10.2877 8.3369,-18.625 18.625,-18.625 0.3452,0 0.625,0.2798 0.625,0.625 0,0.3452 -0.2798,0.625 -0.625,0.625 z m -6.3179,-6.1631 c 0.2267,-0.1339 0.5129,-0.1114 0.7158,0.0562 l 6.0312,4.9797 c 0.2459,0.2031 0.2995,0.5587 0.1244,0.8252 l -3.9555,6.0202 c -0.1399,0.2129 -0.3951,0.3196 -0.6449,0.2697 -0.2499,-0.05 -0.4444,-0.2466 -0.4916,-0.497 l -2.0757,-11 c -0.0488,-0.2587 0.0697,-0.5202 0.2963,-0.654 z m 1.2525,2.1203 1.4683,7.7815 2.7982,-4.2588 z M 93.375,46 c 0,-0.3452 0.2798,-0.625 0.625,-0.625 10.286,0 18.625,8.3394 18.625,18.625 0,0.3452 -0.28,0.625 -0.625,0.625 -0.345,0 -0.625,-0.2798 -0.625,-0.625 0,-9.5953 -7.779,-17.375 -17.375,-17.375 -0.3452,0 -0.625,-0.2798 -0.625,-0.625 z m 23.138,11.6424 c 0.14,0.2018 0.15,0.4674 0.023,0.6785 l -3.853,6.4407 c -0.086,0.1431 -0.225,0.246 -0.387,0.2859 -0.162,0.0399 -0.333,0.0135 -0.475,-0.0735 l -7.147,-4.3647 c -0.22,-0.1348 -0.335,-0.3915 -0.289,-0.6459 0.047,-0.2543 0.245,-0.4537 0.499,-0.5017 l 11,-2.0759 c 0.242,-0.0456 0.488,0.0549 0.629,0.2566 z m -9.801,2.7465 5.222,3.1896 2.816,-4.7066 z"
fill="#000000"
stroke="#000000"
stroke-width="4"
stroke-linecap="round"
stroke-linejoin="round" />
<path
id="chat_group_new"
fill-rule="evenodd"
clip-rule="evenodd"
d="m 47.171,101.988 c 0.1201,-0.004 0.212,-0.007 0.2743,-0.01 h 0.109 c 0.0623,0.003 0.1542,0.006 0.2743,0.01 1.3829,0.039 3.2061,-0.012 5.3379,-0.225 3.178,-0.318 6.3965,-0.942 9.5244,-1.9443 0.4048,-0.1297 0.725,-0.4426 0.8643,-0.8446 0.0641,-0.1846 0.147,-0.4846 0.2259,-0.8858 0.5774,-2.9339 0.0789,-6.2473 -2.2942,-9.361 -1.4622,-1.9186 -3.5553,-3.6001 -6.3368,-4.995 C 56.2374,82.1758 56.838,80.3087 56.838,78.349 56.838,73.1884 52.6946,69 47.5757,69 h -0.1522 c -5.1179,0 -9.2615,4.1887 -9.2615,9.349 0,1.9599 0.601,3.8273 1.6879,5.3829 -2.7817,1.395 -4.8749,3.0766 -6.3372,4.9955 -2.3728,3.1136 -2.8711,6.427 -2.2938,9.3609 0.0789,0.4012 0.1619,0.7012 0.2259,0.8858 0.1393,0.402 0.4595,0.7148 0.8643,0.8446 3.1276,1.0023 6.3459,1.6263 9.5239,1.9443 2.1318,0.213 3.955,0.264 5.338,0.225 z m -4.5622,-4.1908 c -2.497,-0.2499 -5.0209,-0.7198 -7.476,-1.4553 -0.3703,-2.0022 -0.0102,-4.2653 1.6402,-6.4311 1.2528,-1.6439 3.182,-3.0994 5.9065,-4.2981 0.0681,-0.03 0.1333,-0.0661 0.1948,-0.1078 l 0.2997,-0.2036 c 0.663,-0.4503 0.7223,-1.4062 0.1016,-1.9505 -0.0771,-0.0989 -0.0918,-0.1159 -0.1783,-0.2096 -1.0288,-1.1108 -1.6099,-2.5678 -1.6099,-4.1208 0,-3.3277 2.6637,-6.0204 5.9433,-6.0204 h 0.1379 c 3.2805,0 5.944,2.6925 5.944,6.0204 0,1.5533 -0.5809,3.0102 -1.6083,4.1196 -0.0866,0.093 -0.1069,0.1169 -0.2008,0.2286 -0.5988,0.5292 -0.5391,1.4814 0.1211,1.9315 l 0.2986,0.2035 c 0.062,0.0423 0.1278,0.0788 0.1965,0.1091 2.7248,1.1988 4.6542,2.6543 5.907,4.2981 1.6506,2.1658 2.0108,4.4289 1.6405,6.4311 -2.4554,0.7355 -4.9794,1.2054 -7.4765,1.4553 -1.8207,0.1822 -3.369,0.2258 -4.5225,0.1926 -0.0846,-0.0025 -0.1476,-0.0048 -0.2157,-0.0074 -0.0232,-9e-4 -0.047,-0.0018 -0.0725,-0.0027 l -0.2271,0.0018 c -0.0333,0.0018 -0.1079,0.005 -0.2215,0.0083 -1.1535,0.0332 -2.7019,-0.0104 -4.5226,-0.1926 z"
fill="#000000" />
<path
id="chat_group_new_2"
fill-rule="evenodd"
clip-rule="evenodd"
d="m 100.171,101.988 c 0.12,-0.004 0.212,-0.007 0.274,-0.01 h 0.109 c 0.063,0.003 0.154,0.006 0.275,0.01 1.383,0.039 3.206,-0.012 5.337,-0.225 3.179,-0.318 6.397,-0.942 9.525,-1.9443 0.405,-0.1297 0.725,-0.4426 0.864,-0.8446 0.064,-0.1846 0.147,-0.4846 0.226,-0.8858 0.577,-2.9339 0.079,-6.2473 -2.294,-9.361 -1.462,-1.9186 -3.555,-3.6001 -6.337,-4.995 1.087,-1.5565 1.688,-3.4236 1.688,-5.3833 0,-5.1606 -4.143,-9.349 -9.262,-9.349 h -0.152 c -5.1184,0 -9.262,4.1887 -9.262,9.349 0,1.9599 0.601,3.8273 1.6879,5.3829 -2.7817,1.395 -4.8749,3.0766 -6.3372,4.9955 -2.3728,3.1136 -2.8711,6.427 -2.2938,9.3609 0.0789,0.4012 0.1619,0.7012 0.2259,0.8858 0.1393,0.402 0.4595,0.7148 0.8643,0.8446 3.1276,1.0023 6.3459,1.6263 9.5239,1.9443 2.1318,0.213 3.955,0.264 5.338,0.225 z m -4.5622,-4.1908 c -2.497,-0.2499 -5.0209,-0.7198 -7.476,-1.4553 -0.3703,-2.0022 -0.0102,-4.2653 1.6402,-6.4311 1.2528,-1.6439 3.182,-3.0994 5.9065,-4.2981 0.0681,-0.03 0.1333,-0.0661 0.1948,-0.1078 l 0.2997,-0.2036 c 0.663,-0.4503 0.7223,-1.4062 0.1016,-1.9505 -0.0771,-0.0989 -0.0918,-0.1159 -0.1783,-0.2096 -1.0288,-1.1108 -1.6099,-2.5678 -1.6099,-4.1208 0,-3.3277 2.6637,-6.0204 5.9436,-6.0204 h 0.138 c 3.28,0 5.944,2.6925 5.944,6.0204 0,1.5533 -0.581,3.0102 -1.609,4.1196 -0.086,0.093 -0.107,0.1169 -0.201,0.2286 -0.598,0.5292 -0.539,1.4814 0.122,1.9315 l 0.298,0.2035 c 0.062,0.0423 0.128,0.0788 0.197,0.1091 2.725,1.1988 4.654,2.6543 5.907,4.2981 1.65,2.1658 2.011,4.4289 1.64,6.4311 -2.455,0.7355 -4.979,1.2054 -7.476,1.4553 -1.821,0.1822 -3.369,0.2258 -4.523,0.1926 -0.084,-0.0025 -0.147,-0.0048 -0.215,-0.0074 -0.024,-9e-4 -0.048,-0.0018 -0.073,-0.0027 l -0.227,0.0018 c -0.033,0.0018 -0.108,0.005 -0.222,0.0083 -1.1531,0.0332 -2.7015,-0.0104 -4.5222,-0.1926 z"
fill="#000000" />
<path
id="chat_group_new_3"
fill-rule="evenodd"
clip-rule="evenodd"
d="m 73.171,62.9876 c 0.1201,-0.0035 0.212,-0.007 0.2743,-0.01 h 0.109 c 0.0623,0.003 0.1542,0.0065 0.2743,0.01 1.3829,0.0399 3.2061,-0.0115 5.3379,-0.2248 3.178,-0.3181 6.3965,-0.9415 9.5244,-1.9441 0.4048,-0.1297 0.725,-0.4426 0.8643,-0.8446 0.0641,-0.1846 0.147,-0.4846 0.2259,-0.8858 0.5774,-2.9339 0.0789,-6.2473 -2.2942,-9.361 -1.4622,-1.9186 -3.5553,-3.6001 -6.3368,-4.995 C 82.2374,43.1758 82.838,41.3087 82.838,39.349 82.838,34.1884 78.6946,30 73.5757,30 h -0.1522 c -5.1179,0 -9.2615,4.1887 -9.2615,9.349 0,1.9599 0.601,3.8273 1.6879,5.3829 -2.7817,1.395 -4.8749,3.0766 -6.3372,4.9955 -2.3728,3.1136 -2.8711,6.427 -2.2938,9.3609 0.0789,0.4012 0.1619,0.7012 0.2259,0.8858 0.1393,0.402 0.4595,0.7148 0.8643,0.8446 3.1276,1.0026 6.3459,1.626 9.5239,1.9441 2.1318,0.2133 3.955,0.2647 5.338,0.2248 z m -4.5622,-4.1904 c -2.497,-0.2499 -5.0209,-0.7198 -7.476,-1.4553 -0.3703,-2.0022 -0.0102,-4.2653 1.6402,-6.4311 1.2528,-1.6439 3.182,-3.0994 5.9065,-4.2981 0.0681,-0.03 0.1333,-0.0661 0.1948,-0.1078 l 0.2997,-0.2036 c 0.663,-0.4503 0.7223,-1.4062 0.1016,-1.9505 -0.0771,-0.0989 -0.0918,-0.1159 -0.1783,-0.2096 -1.0288,-1.1108 -1.6099,-2.5678 -1.6099,-4.1208 0,-3.3277 2.6637,-6.0204 5.9433,-6.0204 h 0.1379 c 3.2805,0 5.944,2.6925 5.944,6.0204 0,1.5533 -0.5809,3.0102 -1.6083,4.1196 -0.0866,0.093 -0.1069,0.1169 -0.2008,0.2286 -0.5988,0.5292 -0.5391,1.4814 0.1211,1.9315 l 0.2986,0.2035 c 0.062,0.0423 0.1278,0.0788 0.1965,0.1091 2.7248,1.1988 4.6542,2.6543 5.907,4.2981 1.6506,2.1658 2.0108,4.4289 1.6405,6.4311 -2.4554,0.7355 -4.9794,1.2054 -7.4765,1.4553 -1.8207,0.1822 -3.369,0.2258 -4.5225,0.1926 -0.0846,-0.0025 -0.1476,-0.0048 -0.2157,-0.0074 -0.0232,-9e-4 -0.047,-0.0018 -0.0725,-0.0027 l -0.2271,0.0018 c -0.0333,0.0018 -0.1079,0.005 -0.2215,0.0083 -1.1535,0.0332 -2.7019,-0.0104 -4.5226,-0.1926 z"
fill="#000000" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

View file

@ -62,6 +62,7 @@
<file>assets/images/conference_audio_only_custom.svg</file>
<file>assets/images/conference_layout_grid_custom.svg</file>
<file>assets/images/conference_layout_active_speaker_custom.svg</file>
<file>assets/images/conference_merge_custom.svg</file>
<file>assets/images/contact_add_custom.svg</file>
<file>assets/images/contact_card_photo_custom.svg</file>
<file>assets/images/contact_custom.svg</file>

View file

@ -109,8 +109,10 @@ CallModel::CallModel (shared_ptr<linphone::Call> call){
if(mCall) {
mRemoteAddress = mCall->getRemoteAddress()->clone();
if(mCall->getConference())
if(mCall->getConference()) {
mConferenceModel = ConferenceModel::create(mCall->getConference());
connect(mConferenceModel.get(), &ConferenceModel::participantAdminStatusChanged, this, &CallModel::onParticipantAdminStatusChanged);
}
auto conferenceInfo = CoreManager::getInstance()->getCore()->findConferenceInformationFromUri(getConferenceAddress());
if( conferenceInfo ){
mConferenceInfoModel = ConferenceInfoModel::create(conferenceInfo);
@ -232,7 +234,8 @@ ConferenceInfoModel * CallModel::getConferenceInfoModel(){
QSharedPointer<ConferenceModel> CallModel::getConferenceSharedModel(){
if(mCall->getConference() && !mConferenceModel){
mConferenceModel = ConferenceModel::create(mCall->getConference());
mConferenceModel = ConferenceModel::create(mCall->getConference());
connect(mConferenceModel.get(), &ConferenceModel::participantAdminStatusChanged, this, &CallModel::onParticipantAdminStatusChanged);
emit conferenceModelChanged();
}
return mConferenceModel;
@ -977,6 +980,12 @@ void CallModel::onChatRoomInitialized(int state){
emit chatRoomModelChanged();
}
void CallModel::onParticipantAdminStatusChanged(const std::shared_ptr<const linphone::Participant> & participant){
if(mConferenceModel && participant == mConferenceModel->getConference()->getMe()) {
emit meAdminChanged();
}
}
void CallModel::setRemoteDisplayName(const std::string& name){
mRemoteAddress->setDisplayName(name);
if(mCall) {

View file

@ -200,8 +200,10 @@ public slots:
void endCall();
void onRemoteRecording(const std::shared_ptr<linphone::Call> & call, bool recording);
void onChatRoomInitialized(int state);
void onParticipantAdminStatusChanged(const std::shared_ptr<const linphone::Participant> & participant);
signals:
void meAdminChanged();
void callErrorChanged (const QString &callError);
void callIdChanged();
void isInConferenceChanged (bool status);

View file

@ -69,6 +69,7 @@ CallsListModel::CallsListModel (QObject *parent) : ProxyListModel(parent) {
mCoreHandlers.get(), &CoreHandlers::callStateChanged,
this, &CallsListModel::handleCallStateChanged
);
connect(this, &CallsListModel::countChanged, this, &CallsListModel::canMergeCallsChanged);
}
CallModel *CallsListModel::findCallModelFromPeerAddress (const QString &peerAddress) const {
@ -372,15 +373,100 @@ void CallsListModel::prepareConferenceCall(ConferenceInfoModel * model){
app->smartShowWindow(app->getCallsWindow());
emit callConferenceAsked(model);
}
int CallsListModel::addAllToConference(){
return CoreManager::getInstance()->getCore()->addAllToConference();
}
void CallsListModel::mergeAll(){
auto core = CoreManager::getInstance()->getCore();
auto currentCalls = CoreManager::getInstance()->getCore()->getCalls();
shared_ptr<linphone::Conference> conference = core->getConference();
// Search a managable conference from calls
if(!conference){
for(auto call : currentCalls){
auto dbConference = call->getConference();
if(dbConference && dbConference->getMe()->isAdmin()){
conference = dbConference;
break;
}
}
}
auto currentCall = CoreManager::getInstance()->getCore()->getCurrentCall();
bool enablingVideo = false;
if( currentCall )
enablingVideo = currentCall->getCurrentParams()->videoEnabled();
if(!conference){
auto parameters = core->createConferenceParams(conference);
if(!CoreManager::getInstance()->getSettingsModel()->getVideoConferenceEnabled()) {
parameters->enableVideo(false);
parameters->setConferenceFactoryAddress(nullptr);// Do a local conference
parameters->setSubject("Local meeting");
}else{
parameters->enableVideo(enablingVideo);
parameters->setSubject("Meeting");
}
conference = core->createConferenceWithParams(parameters);
}
list<shared_ptr<linphone::Address>> allLinphoneAddresses;
list<shared_ptr<linphone::Address>> newCalls;
list<shared_ptr<linphone::Call>> runningCallsToAdd;
for(auto call : currentCalls){
if(!call->getConference()){
runningCallsToAdd.push_back(call);
}
}
// 1) Add running calls
if( runningCallsToAdd.size() > 0){
conference->addParticipants(runningCallsToAdd);
}
/*
// 2) Put in pause and remove all calls that are not in the conference list
for(const auto &call : CoreManager::getInstance()->getCore()->getCalls()){
const std::string callAddress = call->getRemoteAddress()->asStringUriOnly();
auto address = allLinphoneAddresses.begin();
while(address != allLinphoneAddresses.end() && (*address)->asStringUriOnly() != callAddress)
++address;
if(address == allLinphoneAddresses.end()){// Not in conference list : put in pause and remove it from conference if it's the case
if( call->getParams()->getLocalConferenceMode() ){// Remove conference if it is not yet requested
CoreManager::getInstance()->getCore()->removeFromConference(call);
}else
call->pause();
}
}*/
}
// -----------------------------------------------------------------------------
int CallsListModel::getRunningCallsNumber () const {
return CoreManager::getInstance()->getCore()->getCallsNb();
}
bool CallsListModel::canMergeCalls()const{
auto calls = CoreManager::getInstance()->getCore()->getCalls();
bool mergableConference = false;
int mergableCalls = 0;
bool mergable = false;
for(auto itCall = calls.begin(); !mergable && itCall != calls.end() ; ++itCall ) {
auto conference = (*itCall)->getConference();
if(conference){
if( !mergableConference )
mergableConference = (conference && conference->getMe()->isAdmin());
}else{
++mergableCalls;
}
mergable = (mergableConference && mergableCalls>0) // A call can be merged into the conference
|| mergableCalls>1;// 2 calls can be merged
}
return mergable;
}
void CallsListModel::terminateAllCalls () const {
CoreManager::getInstance()->getCore()->terminateAllCalls();
}
@ -479,6 +565,8 @@ void CallsListModel::addCall (const shared_ptr<linphone::Call> &call) {
qInfo() << QStringLiteral("Add call:") << callModel->getFullLocalAddress() << callModel->getFullPeerAddress();
App::getInstance()->getEngine()->setObjectOwnership(callModel.get(), QQmlEngine::CppOwnership);
connect(callModel.get(), &CallModel::meAdminChanged, this, &CallsListModel::canMergeCallsChanged);
add(callModel);
emit layoutChanged();
@ -511,7 +599,7 @@ void CallsListModel::addDummyCall () {
int id = findCallIndex(mList, *callModel);
emit dataChanged(index(id, 0), index(id, 0));
});
connect(callModel.get(), &CallModel::meAdminChanged, this, &CallsListModel::canMergeCallsChanged);
add(callModel);
emit layoutChanged();

View file

@ -37,6 +37,9 @@ class CallsListModel : public ProxyListModel {
Q_OBJECT
public:
Q_PROPERTY(bool canMergeCalls READ canMergeCalls NOTIFY canMergeCallsChanged)
CallsListModel (QObject *parent = Q_NULLPTR);
CallModel *findCallModelFromPeerAddress (const QString &peerAddress) const;
@ -57,9 +60,11 @@ public:
Q_INVOKABLE void prepareConferenceCall(ConferenceInfoModel * model);
Q_INVOKABLE int addAllToConference();
Q_INVOKABLE void mergeAll();
Q_INVOKABLE int getRunningCallsNumber () const;
bool canMergeCalls()const;
Q_INVOKABLE void terminateAllCalls () const;
Q_INVOKABLE void terminateCall (const QString& sipAddress) const;
@ -73,6 +78,7 @@ signals:
void callConferenceAsked(ConferenceInfoModel * conferenceInfoModel);
void callMissed (CallModel *callModel);
void canMergeCallsChanged();
private:

View file

@ -99,6 +99,8 @@ void ParticipantDeviceListModel::updateDevices(const std::list<std::shared_ptr<l
}
bool ParticipantDeviceListModel::add(std::shared_ptr<linphone::ParticipantDevice> deviceToAdd){
auto deviceToAddAddr = deviceToAdd->getAddress();
int row = 0;
qDebug() << "Adding device " << deviceToAdd->getAddress()->asString().c_str();
for(auto item : mList) {
auto deviceModel = item.objectCast<ParticipantDeviceModel>();
@ -106,7 +108,12 @@ bool ParticipantDeviceListModel::add(std::shared_ptr<linphone::ParticipantDevice
qDebug() << "Device already exist. Send video update event";
deviceModel->updateVideoEnabled();
return false;
}else if(deviceToAddAddr->equal(deviceModel->getDevice()->getAddress())){// Address is the same (same device) but the model is using another linphone object. Replace it.
deviceModel->updateVideoEnabled();
removeRow(row);
break;
}
++row;
}
bool addMe = isMe(deviceToAdd);
auto deviceModel = ParticipantDeviceModel::create(mCallModel, deviceToAdd, addMe);
@ -114,6 +121,12 @@ bool ParticipantDeviceListModel::add(std::shared_ptr<linphone::ParticipantDevice
connect(deviceModel.get(), &ParticipantDeviceModel::isSpeakingChanged, this, &ParticipantDeviceListModel::onParticipantDeviceSpeaking);
ProxyListModel::add<ParticipantDeviceModel>(deviceModel);
qDebug() << "Device added. Count=" << mList.count();
QStringList debugDevices;
for(auto i : mList){
auto item = i.objectCast<ParticipantDeviceModel>();
debugDevices.push_back( item->getAddress());
}
qDebug() << debugDevices.join("\n");
if( addMe){
qDebug() << "Added a me device";
emit meChanged();

View file

@ -13,6 +13,7 @@ Rectangle {
// ---------------------------------------------------------------------------
default property alias _content: content.data
property alias isDarkMode: contact.isDarkMode
property alias signIcon: signIcon.icon
property alias subtitleColor: contact.subtitleColor

View file

@ -144,20 +144,17 @@ ListView {
id: _callControls
// -------------------------------------------------------------------------
function useColorStatus () {
return calls.currentIndex === index && $modelData && $modelData.status !== CallModel.CallStatusEnded
}
isDarkMode: calls.currentIndex === index && $modelData!=undefined && $modelData.status!=undefined && $modelData.status !== CallModel.CallStatusEnded
// -------------------------------------------------------------------------
color: useColorStatus()
color: isDarkMode
? CallsStyle.entry.color.selected
: CallsStyle.entry.color.normal
subtitleColor: useColorStatus()
subtitleColor: isDarkMode
? CallsStyle.entry.subtitleColor.selected
: CallsStyle.entry.subtitleColor.normal
titleColor: useColorStatus()
titleColor: isDarkMode
? CallsStyle.entry.titleColor.selected
: CallsStyle.entry.titleColor.normal

View file

@ -15,7 +15,8 @@ Item {
// ---------------------------------------------------------------------------
property alias presenceLevel: presenceLevelIcon.level
property color backgroundColor: AvatarStyle.backgroundColor
property bool isDarkMode: false
property color backgroundColor: isDarkMode ? AvatarStyle.backgroundDarkModeColor : AvatarStyle.backgroundColor
property color foregroundColor: 'transparent'
property string username
property var image
@ -64,7 +65,7 @@ Item {
Text {
id: initialsText
anchors.centerIn: parent
color: AvatarStyle.initials.color
color: isDarkMode ? AvatarStyle.initials.darkModeColor : AvatarStyle.initials.color
font.pointSize: {
var width
@ -82,7 +83,7 @@ Item {
Icon {
anchors.fill: parent
icon: ContactStyle.groupChat.icon
overwriteColor: ContactStyle.groupChat.avatarColor
overwriteColor: isDarkMode ? ContactStyle.groupChat.avatarDarkModeColor : ContactStyle.groupChat.avatarColor
iconSize: avatar.width
//visible: entry!=undefined && entry.isOneToOne!=undefined && !entry.isOneToOne
visible: !avatar.isOneToOne

View file

@ -21,6 +21,7 @@ Rectangle {
property alias subtitleColor: description.subtitleColor
property alias titleColor: description.titleColor
property alias statusText : description.statusText
property alias isDarkMode: avatar.isDarkMode
property bool displayUnreadMessageCount: false
property bool showSubtitle : true

View file

@ -19,7 +19,7 @@ QtObject {
}
property QtObject burgerMenu: QtObject {
property string name : 'burgerMenu'
property string icon : 'burger_menu_custom'
property string icon : 'menu_vdots_custom'
property int iconSize: 35
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_bg').color
@ -30,7 +30,7 @@ QtObject {
}
property QtObject selectedBurgerMenu: QtObject {
property string name : 'selectedBurgerMenu'
property string icon : 'burger_menu_custom'
property string icon : 'menu_vdots_custom'
property int iconSize: 35
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'me_n_b_inv_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'me_h_b_inv_bg').color
@ -39,6 +39,7 @@ QtObject {
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'me_h_b_inv_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'me_p_b_inv_fg').color
}
property QtObject hangup: QtObject {
property int iconSize: 35
property string icon : 'hangup_custom'

View file

@ -9,11 +9,14 @@ import ColorsList 1.0
QtObject {
property string sectionName: 'Avatar'
property color backgroundColor: ColorsList.add(sectionName+'_bg', 'd').color
property color backgroundDarkModeColor: ColorsList.add(sectionName+'_dark_bg', 'q').color
property string personImage : 'contact_custom'
property QtObject initials: QtObject {
property color color: ColorsList.add(sectionName+'_initials', 'q').color
property color darkModeColor: ColorsList.add(sectionName+'_dark_initials', 'd').color
property int pointSize: Units.dp * 10
property int ratio: 30
}

View file

@ -16,5 +16,6 @@ QtObject {
property string icon: 'chat_room_custom'
property color color: ColorsList.addImageColor(sectionName+'_groupChat', icon, 'g').color
property color avatarColor: ColorsList.addImageColor(sectionName+'_groupChat_onAvatar', icon, 'q').color
property color avatarDarkModeColor: ColorsList.addImageColor(sectionName+'_groupChat_dark_onAvatar', icon, 'd').color
}
}

View file

@ -140,11 +140,12 @@ Window {
ActionButton {
isCustom: true
backgroundRadius: 4
colorSet: CallsWindowStyle.callsList.newConference
colorSet: CallsWindowStyle.callsList.mergeConference
visible: SettingsModel.conferenceEnabled
enabled: CallsListModel.canMergeCalls
onClicked: {
Logic.openConferenceManager()
CallsListModel.mergeAll()
}
}
}

View file

@ -103,20 +103,9 @@ ColumnLayout {
//username: Logic.getUsername()
username: chatRoomModel?chatRoomModel.username:( conversation._sipAddressObserver ? UtilsCpp.getDisplayName(conversation._sipAddressObserver.peerAddress) : '')
visible: !groupChat.visible
isOneToOne: chatRoomModel==undefined || chatRoomModel.isOneToOne==undefined || chatRoomModel.isOneToOne
}
Icon {
id: groupChat
Layout.preferredHeight: ConversationStyle.bar.groupChatSize
Layout.preferredWidth: ConversationStyle.bar.groupChatSize
icon: ConversationStyle.bar.groupChatIcon
overwriteColor: ConversationStyle.bar.groupChatColor
iconSize: ConversationStyle.bar.groupChatSize
visible: chatRoomModel && !chatRoomModel.isOneToOne
}
Item{
Layout.fillHeight: true
Layout.fillWidth: true
@ -127,7 +116,7 @@ ColumnLayout {
ColumnLayout{
property int maximumContentWidth: contactBar.width
-(avatar.visible?avatar.width:0)-(groupChat.visible?groupChat.width:0)
-(avatar.visible?avatar.width:0)
-actionBar.width - (secureIcon.visible?secureIcon.width :0)
-3*ConversationStyle.bar.spacing
Layout.fillHeight: true

View file

@ -37,16 +37,18 @@ QtObject {
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'ma_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'ma_p_b_fg').color
}
property QtObject newConference: QtObject {
property QtObject mergeConference: QtObject {
property int iconSize: 40
property string name : 'newConference'
property string icon : 'conference_custom'
property string name : 'mergeConference'
property string icon : 'conference_merge_custom'
property color backgroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_n', icon, 'ma_n_b_bg').color
property color backgroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_h', icon, 'ma_h_b_bg').color
property color backgroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_p', icon, 'ma_p_b_bg').color
property color backgroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_bg_d', icon, 'ma_d_b_bg').color
property color foregroundNormalColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_n', icon, 'ma_n_b_fg').color
property color foregroundHoveredColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_h', icon, 'ma_h_b_fg').color
property color foregroundPressedColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_p', icon, 'ma_p_b_fg').color
property color foregroundDisabledColor : ColorsList.addImageColor(sectionName+'_'+name+'_fg_d', icon, 'ma_d_b_fg').color
}
property QtObject closeButton: QtObject{

@ -1 +1 @@
Subproject commit 11f72d4e254a2a8305a9400e38cb44f125c18873
Subproject commit e5c95eaed5a2113cbba1ab62e8baa826abe7609c