<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][13177] trunk/src: Make sure the `new_avatar` activity can use the avatar crop results</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/13177">13177</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/13177","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2021-12-11 13:40:24 +0000 (Sat, 11 Dec 2021)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Make sure the `new_avatar` activity can use the avatar crop results

Since <a href="http://buddypress.trac.wordpress.org/changeset/13175">[13175]</a> the `BP_Attachment_Avatar::crop()` method include the timestamp the avatar was generated on into its returned array. This array is now transported into the action the function creating a `new_avatar` activity hooks to. This function (`bp_members_new_avatar_activity()`) now accepts 3 more parameters included the transported crop results. This makes it possible to use the timestamp when the avatar was generated on as the `new_avatar` activity recorded time. Doing so, we don't need to add an extra activity meta to store the name of the avatar file to be sure to display the avatar the user had at the time the activity was created.

Props vapvarun, oztaser

See <a href="http://buddypress.trac.wordpress.org/ticket/8581">#8581</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpcorebpcoreavatarsphp">trunk/src/bp-core/bp-core-avatars.php</a></li>
<li><a href="#trunksrcbpgroupsactionscreatephp">trunk/src/bp-groups/actions/create.php</a></li>
<li><a href="#trunksrcbpgroupsscreenssingleadmingroupavatarphp">trunk/src/bp-groups/screens/single/admin/group-avatar.php</a></li>
<li><a href="#trunksrcbpmembersbpmembersactivityphp">trunk/src/bp-members/bp-members-activity.php</a></li>
<li><a href="#trunksrcbpmembersscreenschangeavatarphp">trunk/src/bp-members/screens/change-avatar.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpcorebpcoreavatarsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-core/bp-core-avatars.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-core/bp-core-avatars.php     2021-12-11 12:31:50 UTC (rev 13176)
+++ trunk/src/bp-core/bp-core-avatars.php       2021-12-11 13:40:24 UTC (rev 13177)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1176,12 +1176,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Handle avatar webcam capture.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.3.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 10.0.0 Adds the `$return` param to eventually return the crop result.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string $data    Base64 encoded image.
</span><span class="cx" style="display: block; padding: 0 10px">  * @param int    $item_id Item to associate.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @return bool True on success, false on failure.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param string $return  Whether to get the crop `array` or a `boolean`. Defaults to `boolean`.
+ * @return array|bool True on success, false on failure.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function bp_avatar_handle_capture( $data = '', $item_id = 0 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function bp_avatar_handle_capture( $data = '', $item_id = 0, $return = 'boolean' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( empty( $data ) || empty( $item_id ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1237,6 +1239,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                // Crop to default values.
</span><span class="cx" style="display: block; padding: 0 10px">                $crop_args = array( 'item_id' => $item_id, 'original_file' => $avatar_to_crop, 'crop_x' => 0, 'crop_y' => 0 );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                if ( 'array' === $return ) {
+                       return bp_core_avatar_handle_crop( $crop_args, 'array' );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 return bp_core_avatar_handle_crop( $crop_args );
</span><span class="cx" style="display: block; padding: 0 10px">        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1247,6 +1253,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Crop an uploaded avatar.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 1.1.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 10.0.0 Adds the `$return` param to eventually return the crop result.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param array|string $args {
</span><span class="cx" style="display: block; padding: 0 10px">  *     Array of function parameters.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1265,9 +1272,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type int         $crop_x        The horizontal starting point of the crop. Default: 0.
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type int         $crop_y        The vertical starting point of the crop. Default: 0.
</span><span class="cx" style="display: block; padding: 0 10px">  * }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @return bool True on success, false on failure.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param string       $return Whether to get the crop `array` or a `boolean`. Defaults to `boolean`.
+ * @return array|bool True or the crop result on success, false on failure.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function bp_core_avatar_handle_crop( $args = '' ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function bp_core_avatar_handle_crop( $args = '', $return = 'boolean' ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $r = bp_parse_args(
</span><span class="cx" style="display: block; padding: 0 10px">                $args,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1306,6 +1314,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ( 'array' === $return ) {
+               return $cropped;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         return true;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1352,7 +1364,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $webcam_avatar = base64_decode( $webcam_avatar );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ! bp_avatar_handle_capture( $webcam_avatar, $avatar_data['item_id'] ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $cropped_webcam_avatar = bp_avatar_handle_capture( $webcam_avatar, $avatar_data['item_id'], 'array' );
+
+               if ( ! $cropped_webcam_avatar ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         wp_send_json_error( array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'feedback_code' => 1
</span><span class="cx" style="display: block; padding: 0 10px">                        ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1359,12 +1373,16 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        $return = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'avatar' => esc_url( bp_core_fetch_avatar( array(
-                                       'object'  => $avatar_data['object'],
-                                       'item_id' => $avatar_data['item_id'],
-                                       'html'    => false,
-                                       'type'    => 'full',
-                               ) ) ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'avatar' => esc_url(
+                                       bp_core_fetch_avatar(
+                                               array(
+                                                       'object'  => $avatar_data['object'],
+                                                       'item_id' => $avatar_data['item_id'],
+                                                       'html'    => false,
+                                                       'type'    => 'full',
+                                               )
+                                       )
+                               ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'feedback_code' => 2,
</span><span class="cx" style="display: block; padding: 0 10px">                                'item_id'       => $avatar_data['item_id'],
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1376,12 +1394,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         * Fires if the new avatar was successfully captured.
</span><span class="cx" style="display: block; padding: 0 10px">                         *
</span><span class="cx" style="display: block; padding: 0 10px">                         * @since 6.0.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         * @since 10.0.0 Adds a new param: an array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                         * @param string $item_id     Inform about the user id the avatar was set for.
-                        * @param string $type        Inform about the way the avatar was set ('camera').
-                        * @param array  $avatar_data Array of parameters passed to the avatar handler.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                  * @param string $item_id               Inform about the user id the avatar was set for.
+                        * @param string $type                  Inform about the way the avatar was set ('camera').
+                        * @param array  $avatar_data           Array of parameters passed to the crop handler.
+                        * @param array  $cropped_webcam_avatar Array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        do_action( 'bp_members_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $avatar_data );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 do_action( 'bp_members_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $avatar_data, $cropped_webcam_avatar );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_send_json_success( $return );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1413,14 +1433,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Handle crop.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( bp_core_avatar_handle_crop( $r ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $cropped_avatar = bp_core_avatar_handle_crop( $r, 'array' );
+
+       if ( $cropped_avatar ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $return = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'avatar' => esc_url( bp_core_fetch_avatar( array(
-                               'object'  => $avatar_data['object'],
-                               'item_id' => $avatar_data['item_id'],
-                               'html'    => false,
-                               'type'    => 'full',
-                       ) ) ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'avatar' => esc_url(
+                               bp_core_fetch_avatar(
+                                       array(
+                                               'object'  => $avatar_data['object'],
+                                               'item_id' => $avatar_data['item_id'],
+                                               'html'    => false,
+                                               'type'    => 'full',
+                                       )
+                               )
+                       ),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'feedback_code' => 2,
</span><span class="cx" style="display: block; padding: 0 10px">                        'item_id'       => $avatar_data['item_id'],
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1430,10 +1456,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        do_action_deprecated( 'xprofile_avatar_uploaded', array( (int) $avatar_data['item_id'], $avatar_data['type'], $r ), '6.0.0', 'bp_members_avatar_uploaded' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        /** This action is documented in bp-core/bp-core-avatars.php */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        do_action( 'bp_members_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 do_action( 'bp_members_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r, $cropped_avatar );
</ins><span class="cx" style="display: block; padding: 0 10px">                 } elseif ( 'group' === $avatar_data['object'] ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        /** This action is documented in bp-groups/bp-groups-screens.php */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        do_action( 'groups_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 do_action( 'groups_avatar_uploaded', (int) $avatar_data['item_id'], $avatar_data['type'], $r, $cropped_avatar );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                wp_send_json_success( $return );
</span></span></pre></div>
<a id="trunksrcbpgroupsactionscreatephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-groups/actions/create.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/actions/create.php    2021-12-11 12:31:50 UTC (rev 13176)
+++ trunk/src/bp-groups/actions/create.php      2021-12-11 13:40:24 UTC (rev 13177)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -270,7 +270,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'crop_h'        => $_POST['h']
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! bp_core_avatar_handle_crop( $args ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $cropped_avatar = bp_core_avatar_handle_crop( $args, 'array' );
+
+                       if ( ! $cropped_avatar ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 bp_core_add_message( __( 'There was an error saving the group profile photo, please try uploading again.', 'buddypress' ), 'error' );
</span><span class="cx" style="display: block; padding: 0 10px">                        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                                /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -277,12 +279,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                 * Fires after a group avatar is uploaded.
</span><span class="cx" style="display: block; padding: 0 10px">                                 *
</span><span class="cx" style="display: block; padding: 0 10px">                                 * @since 2.8.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 * @since 10.0.0 Adds a new param: an array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                                  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                 * @param int    $group_id ID of the group.
-                                * @param string $type     Avatar type. 'crop' or 'full'.
-                                * @param array  $args     Array of parameters passed to the avatar handler.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                          * @param int    $group_id       ID of the group.
+                                * @param string $type           Avatar type. 'crop' or 'camera'.
+                                * @param array  $args           Array of parameters passed to the crop handler.
+                                * @param array  $cropped_avatar Array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                                  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                do_action( 'groups_avatar_uploaded', bp_get_current_group_id(), 'crop', $args );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         do_action( 'groups_avatar_uploaded', bp_get_current_group_id(), 'crop', $args, $cropped_avatar );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                bp_core_add_message( __( 'The group profile photo was uploaded successfully.', 'buddypress' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span></span></pre></div>
<a id="trunksrcbpgroupsscreenssingleadmingroupavatarphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-groups/screens/single/admin/group-avatar.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/screens/single/admin/group-avatar.php 2021-12-11 12:31:50 UTC (rev 13176)
+++ trunk/src/bp-groups/screens/single/admin/group-avatar.php   2021-12-11 13:40:24 UTC (rev 13177)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -74,7 +74,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'crop_h'        => $_POST['h']
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( !bp_core_avatar_handle_crop( $args ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $cropped_avatar = bp_core_avatar_handle_crop( $args, 'array' );
+
+               if ( ! $cropped_avatar ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         bp_core_add_message( __( 'There was a problem cropping the group profile photo.', 'buddypress' ), 'error' );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -81,12 +83,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         * Fires after a group avatar is uploaded.
</span><span class="cx" style="display: block; padding: 0 10px">                         *
</span><span class="cx" style="display: block; padding: 0 10px">                         * @since 2.8.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         * @since 10.0.0 Adds a new param: an array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                         * @param int    $group_id ID of the group.
-                        * @param string $type     Avatar type. 'crop' or 'full'.
-                        * @param array  $args     Array of parameters passed to the avatar handler.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                  * @param int    $group_id       ID of the group.
+                        * @param string $type           Avatar type. 'crop' or 'camera'.
+                        * @param array  $args           Array of parameters passed to the avatar handler.
+                        * @param array  $cropped_avatar Array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        do_action( 'groups_avatar_uploaded', bp_get_current_group_id(), 'crop', $args );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 do_action( 'groups_avatar_uploaded', bp_get_current_group_id(), 'crop', $args, $cropped_avatar );
</ins><span class="cx" style="display: block; padding: 0 10px">                         bp_core_add_message( __( 'The new group profile photo was uploaded successfully.', 'buddypress' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -109,4 +113,4 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        bp_core_load_template( apply_filters( 'groups_template_group_admin_avatar', 'groups/single/home' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-add_action( 'bp_screens', 'groups_screen_group_admin_avatar' );
</del><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+add_action( 'bp_screens', 'groups_screen_group_admin_avatar' );
</ins></span></pre></div>
<a id="trunksrcbpmembersbpmembersactivityphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-members/bp-members-activity.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-members/bp-members-activity.php      2021-12-11 12:31:50 UTC (rev 13176)
+++ trunk/src/bp-members/bp-members-activity.php        2021-12-11 13:40:24 UTC (rev 13177)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -166,10 +166,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Adds an activity stream item when a user has uploaded a new avatar.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 8.0.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 10.0.0 Adds the `$type`, `$crop_data` and `$cropped_avatar` parameters.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param int $user_id The user id the avatar was set for.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param int    $user_id        The user id the avatar was set for.
+ * @param string $type           The way the avatar was set ('camera' or `crop`).
+ * @param array  $crop_data      Array of parameters passed to the crop handler.
+ * @param array  $cropped_avatar Array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function bp_members_new_avatar_activity( $user_id = 0 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function bp_members_new_avatar_activity( $user_id = 0, $type = '', $crop_data = array(), $cropped_avatar = array() ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Bail if activity component is not active.
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! bp_is_active( 'activity' ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -230,13 +234,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $recorded_time = '';
+       if ( isset( $cropped_avatar['timestamp'] ) && $cropped_avatar['timestamp'] ) {
+               $recorded_time = date( 'Y-m-d H:i:s', $cropped_avatar['timestamp'] );
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         // Add the activity.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        bp_activity_add(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $activity_id = bp_activity_add(
</ins><span class="cx" style="display: block; padding: 0 10px">                 array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'user_id'   => $user_id,
-                       'component' => $bp->members->id,
-                       'type'      => 'new_avatar',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'user_id'       => $user_id,
+                       'component'     => $bp->members->id,
+                       'type'          => 'new_avatar',
+                       'recorded_time' => $recorded_time,
</ins><span class="cx" style="display: block; padding: 0 10px">                 )
</span><span class="cx" style="display: block; padding: 0 10px">        );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-add_action( 'bp_members_avatar_uploaded', 'bp_members_new_avatar_activity' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+add_action( 'bp_members_avatar_uploaded', 'bp_members_new_avatar_activity', 10, 4 );
</ins></span></pre></div>
<a id="trunksrcbpmembersscreenschangeavatarphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-members/screens/change-avatar.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-members/screens/change-avatar.php    2021-12-11 12:31:50 UTC (rev 13176)
+++ trunk/src/bp-members/screens/change-avatar.php      2021-12-11 13:40:24 UTC (rev 13177)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -61,7 +61,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'crop_h'        => $_POST['h']
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( ! bp_core_avatar_handle_crop( $args ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // Handle crop.
+               $cropped_avatar = bp_core_avatar_handle_crop( $r, 'array' );
+
+               if ( ! $cropped_avatar ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         bp_core_add_message( __( 'There was a problem cropping your profile photo.', 'buddypress' ), 'error' );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -72,11 +75,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         * Fires right before the redirect, after processing a new avatar.
</span><span class="cx" style="display: block; padding: 0 10px">                         *
</span><span class="cx" style="display: block; padding: 0 10px">                         * @since 6.0.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         * @since 10.0.0 Adds a new param: an array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                         * @param string $item_id Inform about the user id the avatar was set for.
-                        * @param string $value   Inform about the way the avatar was set ('crop').
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                  * @param string $item_id        Inform about the user id the avatar was set for.
+                        * @param string $type           Inform about the way the avatar was set ('camera').
+                        * @param array  $args           Array of parameters passed to the crop handler.
+                        * @param array  $cropped_avatar Array containing the full, thumb avatar and the timestamp.
</ins><span class="cx" style="display: block; padding: 0 10px">                          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        do_action( 'bp_members_avatar_uploaded', (int) $args['item_id'], 'crop' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 do_action( 'bp_members_avatar_uploaded', (int) $args['item_id'], 'crop', $args, $cropped_avatar );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        bp_core_add_message( __( 'Your new profile photo was uploaded successfully.', 'buddypress' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        bp_core_redirect( bp_displayed_user_domain() );
</span></span></pre>
</div>
</div>

</body>
</html>