Skip to content

Commit 7a816f2

Browse files
authored
Merge pull request #17120 from wordpress-mobile/feature/author-button-to-post-settings
Add Author button to post settings
2 parents 29cbcb0 + 165ed6f commit 7a816f2

File tree

14 files changed

+370
-15
lines changed

14 files changed

+370
-15
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
-----
55
* [**] Stats: Always use Western Arabic numerals in Arabic languages (previously there was a mix of Eastern and Western Arabic numerals) [https://github.com/wordpress-mobile/WordPress-Android/pull/17160]
66
* [*] [Jetpack-only] Adds more widgets, At a glance, All-time and Today widgets with dynamic previews [https://github.com/wordpress-mobile/WordPress-Android/pull/17140]
7-
7+
* [**] Added author button to the post settings and the author of the post can be changed with it. [https://github.com/wordpress-mobile/WordPress-Android/pull/17120]
88

99
20.7
1010
-----

WordPress/src/main/java/org/wordpress/android/modules/AppComponent.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import com.automattic.android.tracks.crashlogging.CrashLogging;
44

5-
import org.wordpress.android.sharedlogin.provider.SharedLoginProvider;
65
import org.wordpress.android.push.GCMMessageService;
76
import org.wordpress.android.push.GCMRegistrationIntentService;
87
import org.wordpress.android.push.NotificationsProcessingService;
8+
import org.wordpress.android.sharedlogin.provider.SharedLoginProvider;
99
import org.wordpress.android.ui.AddQuickPressShortcutActivity;
1010
import org.wordpress.android.ui.CommentFullScreenDialogFragment;
1111
import org.wordpress.android.ui.JetpackConnectionResultActivity;
@@ -118,6 +118,7 @@
118118
import org.wordpress.android.ui.posts.PostListCreateMenuFragment;
119119
import org.wordpress.android.ui.posts.PostListFragment;
120120
import org.wordpress.android.ui.posts.PostNotificationScheduleTimeDialogFragment;
121+
import org.wordpress.android.ui.posts.PostSettingsListDialogFragment;
121122
import org.wordpress.android.ui.posts.PostSettingsTagsFragment;
122123
import org.wordpress.android.ui.posts.PostTimePickerDialogFragment;
123124
import org.wordpress.android.ui.posts.PostsListActivity;
@@ -201,10 +202,10 @@
201202
import org.wordpress.android.ui.stats.refresh.lists.widget.today.StatsTodayWidget;
202203
import org.wordpress.android.ui.stats.refresh.lists.widget.today.TodayWidgetBlockListProviderFactory;
203204
import org.wordpress.android.ui.stats.refresh.lists.widget.today.TodayWidgetListProvider;
204-
import org.wordpress.android.ui.stats.refresh.lists.widget.weeks.StatsWeekWidget;
205-
import org.wordpress.android.ui.stats.refresh.lists.widget.weeks.WeekViewsWidgetListProvider;
206205
import org.wordpress.android.ui.stats.refresh.lists.widget.views.StatsViewsWidget;
207206
import org.wordpress.android.ui.stats.refresh.lists.widget.views.ViewsWidgetListProvider;
207+
import org.wordpress.android.ui.stats.refresh.lists.widget.weeks.StatsWeekWidget;
208+
import org.wordpress.android.ui.stats.refresh.lists.widget.weeks.WeekViewsWidgetListProvider;
208209
import org.wordpress.android.ui.stats.refresh.lists.widget.weeks.WeekWidgetBlockListProviderFactory;
209210
import org.wordpress.android.ui.stockmedia.StockMediaPickerActivity;
210211
import org.wordpress.android.ui.stories.StoryComposerActivity;
@@ -342,6 +343,8 @@ public interface AppComponent {
342343

343344
void inject(EditPostSettingsFragment object);
344345

346+
void inject(PostSettingsListDialogFragment object);
347+
345348
void inject(PostsListActivity object);
346349

347350
void inject(PagesActivity object);

WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class PeopleUtils {
2525
// We limit followers we display to 1000 to avoid API performance issues
2626
public static final int FOLLOWER_PAGE_LIMIT = 50;
2727
public static final int FETCH_LIMIT = 20;
28+
public static final int AUTHOR_FETCH_LIMIT = 100;
2829

2930
public static void fetchUsers(final SiteModel site, final int offset, final FetchUsersCallback callback) {
3031
RestRequest.Listener listener = new RestRequest.Listener() {
@@ -64,6 +65,39 @@ public void onErrorResponse(VolleyError volleyError) {
6465
WordPress.getRestClientUtilsV1_1().get(path, params, null, listener, errorListener);
6566
}
6667

68+
public static void fetchAuthors(final SiteModel site, final int offset, final FetchUsersCallback callback) {
69+
RestRequest.Listener listener = jsonObject -> {
70+
if (jsonObject != null && callback != null) {
71+
try {
72+
JSONArray jsonArray = jsonObject.getJSONArray("users");
73+
List<Person> people = peopleListFromJSON(jsonArray, site.getId(), Person.PersonType.USER);
74+
int numberOfUsers = jsonObject.optInt("found");
75+
boolean isEndOfList = (people.size() + offset) >= numberOfUsers;
76+
callback.onSuccess(people, isEndOfList);
77+
} catch (JSONException e) {
78+
AppLog.e(T.API, "JSON exception occurred while parsing the response for sites/%s/users: " + e);
79+
callback.onError();
80+
}
81+
}
82+
};
83+
84+
RestRequest.ErrorListener errorListener = volleyError -> {
85+
AppLog.e(T.API, volleyError);
86+
if (callback != null) {
87+
callback.onError();
88+
}
89+
};
90+
91+
Map<String, String> params = new HashMap<>();
92+
params.put("number", Integer.toString(PeopleUtils.AUTHOR_FETCH_LIMIT));
93+
params.put("offset", Integer.toString(offset));
94+
params.put("order_by", "display_name");
95+
params.put("order", "ASC");
96+
params.put("authors_only", "true");
97+
String path = String.format(Locale.US, "sites/%d/users", site.getSiteId());
98+
WordPress.getRestClientUtilsV1_1().get(path, params, null, listener, errorListener);
99+
}
100+
67101
public static void fetchRevisionAuthorsDetails(final SiteModel site, List<String> authors,
68102
final FetchUsersCallback callback) {
69103
RestRequest.Listener listener = new RestRequest.Listener() {
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package org.wordpress.android.ui.people.utils
2+
3+
import org.wordpress.android.fluxc.model.SiteModel
4+
import org.wordpress.android.models.Person.PersonType
5+
import org.wordpress.android.ui.people.utils.PeopleUtils.FetchFollowersCallback
6+
import org.wordpress.android.ui.people.utils.PeopleUtils.FetchUsersCallback
7+
import org.wordpress.android.ui.people.utils.PeopleUtils.FetchViewersCallback
8+
import org.wordpress.android.ui.people.utils.PeopleUtils.InvitationsSendCallback
9+
import org.wordpress.android.ui.people.utils.PeopleUtils.RemovePersonCallback
10+
import org.wordpress.android.ui.people.utils.PeopleUtils.UpdateUserCallback
11+
import org.wordpress.android.ui.people.utils.PeopleUtils.ValidateUsernameCallback
12+
import javax.inject.Inject
13+
14+
/**
15+
* Injectable wrapper around PeopleUtils.
16+
*
17+
* PeopleUtils is consisted of static methods, which make the client code difficult to test/mock.
18+
* Main purpose of this wrapper is to make testing easier.
19+
*/
20+
class PeopleUtilsWrapper @Inject constructor() {
21+
fun fetchUsers(
22+
site: SiteModel,
23+
offset: Int,
24+
callback: FetchUsersCallback
25+
) = PeopleUtils.fetchUsers(site, offset, callback)
26+
27+
fun fetchAuthors(
28+
site: SiteModel,
29+
offset: Int,
30+
callback: FetchUsersCallback
31+
) = PeopleUtils.fetchAuthors(site, offset, callback)
32+
33+
fun fetchRevisionAuthorsDetails(
34+
site: SiteModel,
35+
authors: List<String>,
36+
callback: FetchUsersCallback
37+
) = PeopleUtils.fetchRevisionAuthorsDetails(site, authors, callback)
38+
39+
fun fetchFollowers(
40+
site: SiteModel,
41+
page: Int,
42+
callback: FetchFollowersCallback
43+
) = PeopleUtils.fetchFollowers(site, page, callback)
44+
45+
fun fetchEmailFollowers(
46+
site: SiteModel,
47+
page: Int,
48+
callback: FetchFollowersCallback
49+
) = PeopleUtils.fetchEmailFollowers(site, page, callback)
50+
51+
fun fetchViewers(
52+
site: SiteModel,
53+
offset: Int,
54+
callback: FetchViewersCallback
55+
) = PeopleUtils.fetchViewers(site, offset, callback)
56+
57+
fun updateRole(
58+
site: SiteModel,
59+
personID: Long,
60+
newRole: String,
61+
localTableBlogId: Int,
62+
callback: UpdateUserCallback
63+
) = PeopleUtils.updateRole(site, personID, newRole, localTableBlogId, callback)
64+
65+
fun removeUser(
66+
site: SiteModel,
67+
personID: Long,
68+
callback: RemovePersonCallback
69+
) = PeopleUtils.removeUser(site, personID, callback)
70+
71+
fun removeFollower(
72+
site: SiteModel,
73+
personID: Long,
74+
personType: PersonType,
75+
callback: RemovePersonCallback
76+
) = PeopleUtils.removeFollower(site, personID, personType, callback)
77+
78+
fun removeViewer(
79+
site: SiteModel,
80+
personID: Long,
81+
callback: RemovePersonCallback
82+
) = PeopleUtils.removeViewer(site, personID, callback)
83+
84+
fun validateUsernames(
85+
usernames: List<String>,
86+
role: String,
87+
wpComBlogId: Long,
88+
callback: ValidateUsernameCallback
89+
) = PeopleUtils.validateUsernames(usernames, role, wpComBlogId, callback)
90+
91+
fun sendInvitations(
92+
usernames: List<String>,
93+
role: String,
94+
message: String,
95+
wpComBlogId: Long,
96+
callback: InvitationsSendCallback
97+
) = PeopleUtils.sendInvitations(usernames, role, message, wpComBlogId, callback)
98+
}
Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,69 @@
11
package org.wordpress.android.ui.posts
22

3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.MutableLiveData
5+
import org.wordpress.android.R
6+
import org.wordpress.android.fluxc.model.SiteModel
37
import org.wordpress.android.fluxc.store.PostSchedulingNotificationStore
48
import org.wordpress.android.fluxc.store.SiteStore
9+
import org.wordpress.android.models.Person
10+
import org.wordpress.android.ui.people.utils.PeopleUtils.FetchUsersCallback
11+
import org.wordpress.android.ui.people.utils.PeopleUtilsWrapper
512
import org.wordpress.android.util.LocaleManagerWrapper
13+
import org.wordpress.android.viewmodel.Event
614
import org.wordpress.android.viewmodel.ResourceProvider
715
import javax.inject.Inject
816

917
class EditPostPublishSettingsViewModel @Inject constructor(
10-
resourceProvider: ResourceProvider,
18+
private val resourceProvider: ResourceProvider,
1119
postSettingsUtils: PostSettingsUtils,
20+
private val peopleUtilsWrapper: PeopleUtilsWrapper,
1221
localeManagerWrapper: LocaleManagerWrapper,
1322
postSchedulingNotificationStore: PostSchedulingNotificationStore,
14-
siteStore: SiteStore
23+
private val siteStore: SiteStore
1524
) : PublishSettingsViewModel(
1625
resourceProvider,
1726
postSettingsUtils,
1827
localeManagerWrapper,
1928
postSchedulingNotificationStore,
2029
siteStore
21-
)
30+
) {
31+
private val _authors = MutableLiveData<List<Person>>()
32+
val authors: LiveData<List<Person>> = _authors
33+
34+
// Used for combining fetched users
35+
private val fetchedAuthors = mutableListOf<Person>()
36+
37+
private var isStarted = false
38+
39+
override fun start(postRepository: EditPostRepository?) {
40+
super.start(postRepository)
41+
if (isStarted) return
42+
isStarted = true
43+
44+
postRepository?.let {
45+
val site = siteStore.getSiteByLocalId(it.localSiteId) ?: return@let
46+
fetchAuthors(site)
47+
}
48+
}
49+
50+
// This fetches authors page by page and combine the result in fetchedAuthors.
51+
private fun fetchAuthors(site: SiteModel) {
52+
peopleUtilsWrapper.fetchAuthors(site, fetchedAuthors.size, object : FetchUsersCallback {
53+
override fun onSuccess(peopleList: List<Person>, isEndOfList: Boolean) {
54+
fetchedAuthors.addAll(peopleList)
55+
if (isEndOfList) {
56+
_authors.value = fetchedAuthors
57+
} else {
58+
fetchAuthors(site)
59+
}
60+
}
61+
62+
override fun onError() {
63+
_onToast.postValue(Event(resourceProvider.getString(R.string.error_fetch_authors_list)))
64+
}
65+
})
66+
}
67+
68+
fun getAuthorIndex(authorId: Long) = authors.value?.indexOfFirst { it.personID == authorId } ?: -1
69+
}

0 commit comments

Comments
 (0)