<!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][12395] trunk: Improve i18n of Groups activity updates action string</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/12395">12395</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/12395","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>2019-05-11 13:33:14 +0000 (Sat, 11 May 2019)</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'>Improve i18n of Groups activity updates action string

Dynamically generated activity action strings were introduced in BuddyPress 2.0 to ensure these strings are always up to date and multilingual-friendly (see <a href="http://buddypress.trac.wordpress.org/ticket/3856">#3856</a>).

It appeared although the {{{activity_update}}} type enjoys this feature when activities are shared by users on their profiles, it was not the case for activity updates posted within Groups.

Thanks to this commit, BuddyPress is now taking it in charge by:
- Registering a new group activity action to reference a specific formatting callback function for activities posted within Groups.
- Making sure this new activity action type does not interfere with the one of regular activity updates in dropdown filters or into the Activity Administration screens.

BTW happy 4th WPTranslationDay to everyone :)

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpactivitybpactivityadminphp">trunk/src/bp-activity/bp-activity-admin.php</a></li>
<li><a href="#trunksrcbpactivitybpactivitytemplatephp">trunk/src/bp-activity/bp-activity-template.php</a></li>
<li><a href="#trunksrcbpactivityclassesclassbpactivitylisttablephp">trunk/src/bp-activity/classes/class-bp-activity-list-table.php</a></li>
<li><a href="#trunksrcbpgroupsbpgroupsactivityphp">trunk/src/bp-groups/bp-groups-activity.php</a></li>
<li><a href="#trunksrcbpgroupsbpgroupsfunctionsphp">trunk/src/bp-groups/bp-groups-functions.php</a></li>
<li><a href="#trunktestsphpunittestcasesblogsactivityphp">trunk/tests/phpunit/testcases/blogs/activity.php</a></li>
<li><a href="#trunktestsphpunittestcasesgroupsactivityphp">trunk/tests/phpunit/testcases/groups/activity.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpactivitybpactivityadminphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-activity/bp-activity-admin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-activity/bp-activity-admin.php       2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/src/bp-activity/bp-activity-admin.php 2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -840,13 +840,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $action = array_values( (array) $action );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                for ( $i = 0, $i_count = count( $action ); $i < $i_count; $i++ ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        /**
+                        * Don't take in account:
+                        * - a mis-named Friends activity type from before BP 1.6,
+                        * - The Group's component 'activity_update' one as the Activity component is using it.
+                        */
+                       if ( 'friends_register_activity_action' === $action[$i]['key'] || 'bp_groups_format_activity_action_group_activity_update' === $action[$i]['format_callback'] ) {
+                               continue;
+                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         $actions[ $action[$i]['key'] ] = $action[$i]['value'];
</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><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // This was a mis-named activity type from before BP 1.6.
-       unset( $actions['friends_register_activity_action'] );
-
</del><span class="cx" style="display: block; padding: 0 10px">         // Sort array by the human-readable value.
</span><span class="cx" style="display: block; padding: 0 10px">        natsort( $actions );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -870,13 +876,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( bp_activity_get_actions() as $action ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $action = array_values( (array) $action );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                for ( $i = 0, $i_count = count( $action ); $i < $i_count; $i++ )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         for ( $i = 0, $i_count = count( $action ); $i < $i_count; $i++ ) {
+                       /**
+                        * Don't take in account:
+                        * - a mis-named Friends activity type from before BP 1.6,
+                        * - The Group's component 'activity_update' one as the Activity component is using it.
+                        */
+                       if ( 'friends_register_activity_action' === $action[$i]['key'] || 'bp_groups_format_activity_action_group_activity_update' === $action[$i]['format_callback'] ) {
+                               continue;
+                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         $actions[ $action[$i]['key'] ] = $action[$i]['value'];
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                }
</ins><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">-        // This was a mis-named activity type from before BP 1.6.
-       unset( $actions['friends_register_activity_action'] );
-
</del><span class="cx" style="display: block; padding: 0 10px">         // Sort array by the human-readable value.
</span><span class="cx" style="display: block; padding: 0 10px">        natsort( $actions );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcbpactivitybpactivitytemplatephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-activity/bp-activity-template.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-activity/bp-activity-template.php    2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/src/bp-activity/bp-activity-template.php      2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3848,6 +3848,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $action['key'] = 'friendship_accepted,friendship_created';
</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">+                        // The 'activity_update' filter is already used by the Activity component.
+                       if ( 'bp_groups_format_activity_action_group_activity_update' === $action['format_callback'] ) {
+                               continue;
+                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         $filters[ $action['key'] ] = $action['label'];
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcbpactivityclassesclassbpactivitylisttablephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-activity/classes/class-bp-activity-list-table.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-activity/classes/class-bp-activity-list-table.php    2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/src/bp-activity/classes/class-bp-activity-list-table.php      2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -435,6 +435,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                                $component = 'xprofile';
</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">+                                        // The 'activity_update' filter is already used by the Activity component.
+                                       if ( isset( $actions->activity_update ) && 'bp_groups_format_activity_action_group_activity_update' === $actions->activity_update['format_callback'] ) {
+                                               unset( $actions->activity_update );
+                                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                                         if ( bp_is_active( $component ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                                if ( $component === 'xprofile' ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                                        $component_name = buddypress()->profile->name;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -455,7 +460,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                                        <?php
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                                        // Skip the incorrectly named pre-1.6 action.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                                        if ( 'friends_register_activity_action' !== $action_key ) : ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                 if ( 'friends_register_activity_action' !== $action_key  ) : ?>
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                                                <option value="<?php echo esc_attr( $action_key ); ?>" <?php selected( $action_key,  $selected ); ?>><?php echo esc_html( $action_values[ 'value' ] ); ?></option>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcbpgroupsbpgroupsactivityphp"></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/bp-groups-activity.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/bp-groups-activity.php        2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/src/bp-groups/bp-groups-activity.php  2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -54,6 +54,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">                array( 'activity', 'group', 'member', 'member_groups' )
</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">+        bp_activity_set_action(
+               $bp->groups->id,
+               'activity_update',
+               __( 'Posted a status update in a Group', 'buddypress' ),
+               'bp_groups_format_activity_action_group_activity_update',
+               __( 'Group Activity Updates', 'buddypress' ),
+               array( 'activity', 'group', 'member', 'member_groups' )
+       );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Fires at end of registration of the default activity actions for the Groups component.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -64,6 +73,27 @@
</span><span class="cx" style="display: block; padding: 0 10px"> add_action( 'bp_register_activity_actions', 'groups_register_activity_actions' );
</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">+ * Get the group object the activity belongs to.
+ *
+ * @since 5.0.0
+ *
+ * @param integer $group_id The group ID the activity is linked to.
+ * @return BP_Groups_Group  The group object the activity belongs to.
+ */
+function bp_groups_get_activity_group( $group_id = 0 ) {
+       // If displaying a specific group, check the activity belongs to it.
+       if ( bp_is_group() && bp_get_current_group_id() === (int) $group_id ) {
+               $group = groups_get_current_group();
+
+               // Otherwise get the group the activity belongs to.
+       } else {
+               $group = groups_get_group( $group_id );
+       }
+
+       return $group;
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Format 'created_group' activity actions.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.0.0
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -75,7 +105,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_groups_format_activity_action_created_group( $action, $activity ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $user_link = bp_core_get_userlink( $activity->user_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $group      = groups_get_group( $activity->item_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $group      = bp_groups_get_activity_group( $activity->item_id );
</ins><span class="cx" style="display: block; padding: 0 10px">         $group_link = '<a href="' . esc_url( bp_get_group_permalink( $group ) ) . '">' . esc_html( $group->name ) . '</a>';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $action = sprintf( esc_html__( '%1$s created the group %2$s', 'buddypress'), $user_link, $group_link );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -103,7 +133,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_groups_format_activity_action_joined_group( $action, $activity ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $user_link = bp_core_get_userlink( $activity->user_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $group      = groups_get_group( $activity->item_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $group      = bp_groups_get_activity_group( $activity->item_id );
</ins><span class="cx" style="display: block; padding: 0 10px">         $group_link = '<a href="' . esc_url( bp_get_group_permalink( $group ) ) . '">' . esc_html( $group->name ) . '</a>';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $action = sprintf( esc_html__( '%1$s joined the group %2$s', 'buddypress' ), $user_link, $group_link );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -142,7 +172,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> function bp_groups_format_activity_action_group_details_updated( $action, $activity ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $user_link = bp_core_get_userlink( $activity->user_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $group      = groups_get_group( $activity->item_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $group      = bp_groups_get_activity_group( $activity->item_id );
</ins><span class="cx" style="display: block; padding: 0 10px">         $group_link = '<a href="' . esc_url( bp_get_group_permalink( $group ) ) . '">' . esc_html( $group->name ) . '</a>';
</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">@@ -184,6 +214,38 @@
</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">+ * Format the action for activity updates posted in a Group.
+ *
+ * @since 5.0.0
+ *
+ * @param string $action   Static activity action.
+ * @param object $activity Activity data object.
+ * @return string          The formatted action for activity updates posted in a Group.
+ */
+function bp_groups_format_activity_action_group_activity_update( $action, $activity ) {
+       $user_link = bp_core_get_userlink( $activity->user_id );
+       $group     = bp_groups_get_activity_group( $activity->item_id );
+
+       $group_link = '<a href="' . esc_url( bp_get_group_permalink( $group ) ) . '">' . esc_html( $group->name ) . '</a>';
+
+       // Set the Activity update posted in a Group action.
+       $action = sprintf( esc_html__( '%1$s posted an update in the group %2$s', 'buddypress' ), $user_link, $group_link );
+
+       /** This filter is documented in wp-includes/deprecated.php */
+       $action = apply_filters_deprecated( 'groups_activity_new_update_action', array( $action ), '5.0.0', 'bp_groups_format_activity_action_group_activity_update' );
+
+       /**
+        * Filters the Group's activity update action.
+        *
+        * @since 5.0.0
+        *
+        * @param string $action   The Group's activity update action.
+        * @param object $activity Activity data object.
+        */
+       return apply_filters( 'bp_groups_format_activity_action_group_activity_update', $action, $activity );
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Fetch data related to groups at the beginning of an activity loop.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * This reduces database overhead during the activity loop.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -440,12 +502,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Set the default for hide_sitewide by checking the status of the group.
</span><span class="cx" style="display: block; padding: 0 10px">        $hide_sitewide = false;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( !empty( $args['item_id'] ) ) {
-               if ( bp_get_current_group_id() == $args['item_id'] ) {
-                       $group = groups_get_current_group();
-               } else {
-                       $group = groups_get_group( $args['item_id'] );
-               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! empty( $args['item_id'] ) ) {
+               $group = bp_groups_get_activity_group( $args['item_id'] );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( isset( $group->status ) && 'public' != $group->status ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $hide_sitewide = true;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -471,6 +529,84 @@
</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">+ * Post an Activity status update affiliated with a group.
+ *
+ * @since 1.2.0
+ * @since 2.6.0 Added 'error_type' parameter to $args.
+ *
+ * @param array|string $args {
+ *     Array of arguments.
+ *     @type string $content  The content of the update.
+ *     @type int    $user_id  Optional. ID of the user posting the update. Default:
+ *                            ID of the logged-in user.
+ *     @type int    $group_id Optional. ID of the group to be affiliated with the
+ *                            update. Default: ID of the current group.
+ * }
+ * @return WP_Error|bool|int Returns the ID of the new activity item on success, or false on failure.
+ */
+function groups_post_update( $args = '' ) {
+       $bp = buddypress();
+
+       $r = bp_parse_args( $args, array(
+               'content'    => false,
+               'user_id'    => bp_loggedin_user_id(),
+               'group_id'   => 0,
+               'error_type' => 'bool'
+       ), 'groups_post_update' );
+
+       $group_id = (int) $r['group_id'];
+       if ( ! $group_id && ! empty( $bp->groups->current_group->id ) ) {
+               $group_id = (int) $bp->groups->current_group->id;
+       }
+
+       $content = $r['content'];
+       $user_id = (int) $r['user_id'];
+       if ( ! $content || ! strlen( trim( $content ) ) || ! $user_id || ! $group_id ) {
+               return false;
+       }
+
+       $bp->groups->current_group = groups_get_group( $group_id );
+
+       // Be sure the user is a member of the group before posting.
+       if ( ! bp_current_user_can( 'bp_moderate' ) && ! groups_is_user_member( $user_id, $group_id ) ) {
+               return false;
+       }
+
+       /**
+        * Filters the content for the new group activity update.
+        *
+        * @since 1.2.0
+        *
+        * @param string $content The content of the update.
+        */
+       $content_filtered = apply_filters( 'groups_activity_new_update_content', $content );
+
+       $activity_id = groups_record_activity( array(
+               'user_id'    => $user_id,
+               'content'    => $content_filtered,
+               'type'       => 'activity_update',
+               'item_id'    => $group_id,
+               'error_type' => $r['error_type'],
+       ) );
+
+       groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
+
+       /**
+        * Fires after posting of an Activity status update affiliated with a group.
+        *
+        * @since 1.2.0
+        *
+        * @param string $content     The content of the update.
+        * @param int    $user_id     ID of the user posting the update.
+        * @param int    $group_id    ID of the group being posted to.
+        * @param bool   $activity_id Whether or not the activity recording succeeded.
+        */
+       do_action( 'bp_groups_posted_update', $content, $user_id, $group_id, $activity_id );
+
+       return $activity_id;
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Function used to determine if a user can comment on a group activity item.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * Used as a filter callback to 'bp_activity_can_comment'.
</span></span></pre></div>
<a id="trunksrcbpgroupsbpgroupsfunctionsphp"></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/bp-groups-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/bp-groups-functions.php       2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/src/bp-groups/bp-groups-functions.php 2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1266,99 +1266,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">        return BP_Groups_Member::check_is_creator( $user_id, $group_id );
</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">-/** Group Activity Posting ****************************************************/
-
-/**
- * Post an Activity status update affiliated with a group.
- *
- * @since 1.2.0
- * @since 2.6.0 Added 'error_type' parameter to $args.
- *
- * @param array|string $args {
- *     Array of arguments.
- *     @type string $content  The content of the update.
- *     @type int    $user_id  Optional. ID of the user posting the update. Default:
- *                            ID of the logged-in user.
- *     @type int    $group_id Optional. ID of the group to be affiliated with the
- *                            update. Default: ID of the current group.
- * }
- * @return WP_Error|bool|int Returns the ID of the new activity item on success, or false on failure.
- */
-function groups_post_update( $args = '' ) {
-       if ( ! bp_is_active( 'activity' ) ) {
-               return false;
-       }
-
-       $bp = buddypress();
-
-       $r = bp_parse_args( $args, array(
-               'content'    => false,
-               'user_id'    => bp_loggedin_user_id(),
-               'group_id'   => 0,
-               'error_type' => 'bool'
-       ), 'groups_post_update' );
-       extract( $r, EXTR_SKIP );
-
-       if ( empty( $group_id ) && !empty( $bp->groups->current_group->id ) )
-               $group_id = $bp->groups->current_group->id;
-
-       if ( empty( $content ) || !strlen( trim( $content ) ) || empty( $user_id ) || empty( $group_id ) )
-               return false;
-
-       $bp->groups->current_group = groups_get_group( $group_id );
-
-       // Be sure the user is a member of the group before posting.
-       if ( !bp_current_user_can( 'bp_moderate' ) && !groups_is_user_member( $user_id, $group_id ) )
-               return false;
-
-       // Record this in activity streams.
-       $activity_action  = sprintf( esc_html__( '%1$s posted an update in the group %2$s', 'buddypress'), bp_core_get_userlink( $user_id ), '<a href="' . esc_url( bp_get_group_permalink( $bp->groups->current_group ) ) . '">' . esc_html( $bp->groups->current_group->name ) . '</a>' );
-       $activity_content = $content;
-
-       /**
-        * Filters the action for the new group activity update.
-        *
-        * @since 1.2.0
-        *
-        * @param string $activity_action The new group activity update.
-        */
-       $action = apply_filters( 'groups_activity_new_update_action',  $activity_action  );
-
-       /**
-        * Filters the content for the new group activity update.
-        *
-        * @since 1.2.0
-        *
-        * @param string $activity_content The content of the update.
-        */
-       $content_filtered = apply_filters( 'groups_activity_new_update_content', $activity_content );
-
-       $activity_id = groups_record_activity( array(
-               'user_id'    => $user_id,
-               'action'     => $action,
-               'content'    => $content_filtered,
-               'type'       => 'activity_update',
-               'item_id'    => $group_id,
-               'error_type' => $error_type
-       ) );
-
-       groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
-
-       /**
-        * Fires after posting of an Activity status update affiliated with a group.
-        *
-        * @since 1.2.0
-        *
-        * @param string $content     The content of the update.
-        * @param int    $user_id     ID of the user posting the update.
-        * @param int    $group_id    ID of the group being posted to.
-        * @param bool   $activity_id Whether or not the activity recording succeeded.
-        */
-       do_action( 'bp_groups_posted_update', $content, $user_id, $group_id, $activity_id );
-
-       return $activity_id;
-}
-
</del><span class="cx" style="display: block; padding: 0 10px"> /** Group Invitations *********************************************************/
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span></span></pre></div>
<a id="trunktestsphpunittestcasesblogsactivityphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/testcases/blogs/activity.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/testcases/blogs/activity.php  2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/tests/phpunit/testcases/blogs/activity.php    2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -727,7 +727,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * @group bp_blogs_sync_activity_edit_to_post_comment
</span><span class="cx" style="display: block; padding: 0 10px">         * @group post_type_comment_activities
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @group imath
</del><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        public function test_bp_blogs_sync_activity_edit_to_post_comment_trash_comment_ham_activity() {
</span><span class="cx" style="display: block; padding: 0 10px">                $old_user = get_current_user_id();
</span></span></pre></div>
<a id="trunktestsphpunittestcasesgroupsactivityphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/testcases/groups/activity.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/testcases/groups/activity.php 2019-05-04 07:44:06 UTC (rev 12394)
+++ trunk/tests/phpunit/testcases/groups/activity.php   2019-05-11 13:33:14 UTC (rev 12395)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -5,6 +5,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @group activity
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class BP_Tests_Groups_Activity extends BP_UnitTestCase {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        protected $groups_post_update_args;
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * @group activity_action
</span><span class="cx" style="display: block; padding: 0 10px">         * @group bp_groups_format_activity_action_created_group
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -225,6 +227,84 @@
</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">+         * @group activity_action
+        * @group bp_groups_format_activity_action_group_activity_update
+        */
+       public function test_bp_groups_format_activity_action_group_activity_update() {
+               $u = self::factory()->user->create();
+               $g = self::factory()->group->create();
+               $a = self::factory()->activity->create( array(
+                       'component' => buddypress()->groups->id,
+                       'type' => 'activity_update',
+                       'user_id' => $u,
+                       'item_id' => $g,
+               ) );
+
+               $a_obj = new BP_Activity_Activity( $a );
+               $g_obj = groups_get_group( $g );
+
+               $expected = sprintf( esc_html__( '%1$s posted an update in the group %2$s', 'buddypress' ), bp_core_get_userlink( $u ),  '<a href="' . esc_url( bp_get_group_permalink( $g_obj ) ) . '">' . esc_html( $g_obj->name ) . '</a>' );
+
+               $this->assertSame( $expected, $a_obj->action );
+       }
+
+       /**
+        * @group groups_post_update
+        */
+       public function test_groups_post_update() {
+               $u = self::factory()->user->create();
+               $g = self::factory()->group->create();
+
+               // The user is a group member.
+               groups_join_group( $g, $u );
+
+               $activity_args = array(
+                       'content'    => 'Test group_post_update',
+                       'user_id'    => $u,
+                       'group_id'   => $g,
+                       'error_type' => 'wp_error',
+               );
+
+               add_filter( 'bp_before_groups_record_activity_parse_args', array( $this, 'groups_post_update_args' ), 10, 1 );
+
+               groups_post_update( $activity_args );
+
+               remove_filter( 'bp_before_groups_record_activity_parse_args', array( $this, 'groups_post_update_args' ), 10, 1 );
+
+               $expected = array_merge( $activity_args, array( 'item_id' => $g ) );
+               unset( $expected['group_id'] );
+
+               $this->assertEquals( $expected, $this->groups_post_update_args );
+       }
+
+       /**
+        * @group groups_post_update
+        */
+       public function test_groups_post_update_in_group() {
+               $bp = buddypress();
+               $u  = self::factory()->user->create();
+               $g  = self::factory()->group->create();
+
+               // The user is a group member.
+               groups_join_group( $g, $u );
+
+               $bp->groups->current_group = groups_get_group( $g );
+
+               $activity_args = array(
+                       'content' => 'Test group_post_update in a group',
+                       'user_id' => $u,
+               );
+
+               $a = groups_post_update( $activity_args );
+               $a_obj = new BP_Activity_Activity( $a );
+
+               $this->assertSame( $a_obj->item_id, $g );
+               $this->assertSame( $a_obj->component, 'groups' );
+
+               unset( $bp->groups->current_group );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * @group bp_activity_can_comment
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function test_groups_activity_can_comment() {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -262,4 +342,15 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->set_current_user( $old_user );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       public function groups_post_update_args( $args = array() ) {
+               $this->groups_post_update_args = array_intersect_key( $args, array(
+                       'content'    => true,
+                       'user_id'    => true,
+                       'item_id'    => true,
+                       'error_type' => true,
+               ) );
+
+               return $args;
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>