Skip to content

Commit 9fca9ff

Browse files
committed
Move fetching authors logic from EditPostSettingsFragment to PostSettingsListDialogFragment
1 parent 8837ff9 commit 9fca9ff

File tree

5 files changed

+97
-63
lines changed

5 files changed

+97
-63
lines changed

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/posts/EditPostPublishSettingsViewModel.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.wordpress.android.ui.posts
33
import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
55
import org.wordpress.android.R
6+
import org.wordpress.android.fluxc.model.SiteModel
67
import org.wordpress.android.fluxc.store.PostSchedulingNotificationStore
78
import org.wordpress.android.fluxc.store.SiteStore
89
import org.wordpress.android.models.Person
@@ -30,22 +31,39 @@ class EditPostPublishSettingsViewModel @Inject constructor(
3031
private val _authors = MutableLiveData<List<Person>>()
3132
val authors: LiveData<List<Person>> = _authors
3233

34+
// Used for combining fetched users
35+
private val fetchedAuthors = mutableListOf<Person>()
36+
37+
private var isStarted = false
38+
3339
override fun start(postRepository: EditPostRepository?) {
3440
super.start(postRepository)
35-
postRepository?.let { fetchAuthors(it) }
36-
}
41+
if (isStarted) return
42+
isStarted = true
3743

38-
private fun fetchAuthors(postRepository: EditPostRepository) {
39-
val site = siteStore.getSiteByLocalId(postRepository.localSiteId) ?: return
44+
postRepository?.let {
45+
val site = siteStore.getSiteByLocalId(it.localSiteId) ?: return@let
46+
fetchAuthors(site)
47+
}
48+
}
4049

41-
peopleUtilsWrapper.fetchAuthors(site, object : FetchUsersCallback {
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 {
4253
override fun onSuccess(peopleList: List<Person>, isEndOfList: Boolean) {
43-
_authors.value = peopleList
54+
fetchedAuthors.addAll(peopleList)
55+
if (isEndOfList) {
56+
_authors.value = fetchedAuthors
57+
} else {
58+
fetchAuthors(site)
59+
}
4460
}
4561

4662
override fun onError() {
4763
_onToast.postValue(Event(resourceProvider.getString(R.string.error_fetch_authors_list)))
4864
}
4965
})
5066
}
67+
68+
fun getAuthorIndex(authorId: Long) = authors.value?.indexOfFirst { it.personID == authorId } ?: -1
5169
}

WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostSettingsFragment.java

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -367,25 +367,8 @@ public void onClick(View view) {
367367
}
368368
});
369369

370-
mPublishedViewModel.getAuthors().observe(getViewLifecycleOwner(), authors -> {
371-
if (authors.size() > 1) {
372-
// Authors are fetched and there are multiple authors. Show the Author button.
373-
final LinearLayout authorContainer = rootView.findViewById(R.id.post_author_container);
374-
authorContainer.setVisibility(View.VISIBLE);
375-
authorContainer.setOnClickListener(view -> showAuthorDialog());
376-
377-
EditPostRepository editPostRepository = getEditPostRepository();
378-
if (editPostRepository == null) {
379-
return;
380-
}
381-
PostImmutableModel postModel = editPostRepository.getPost();
382-
if (postModel != null && postModel.getAuthorDisplayName() == null) {
383-
// There is no current author. That means this is a new unpublished post.
384-
// Set author to current user name.
385-
updateAuthorTextView(mAccountStore.getAccount().getDisplayName());
386-
}
387-
}
388-
});
370+
final LinearLayout authorContainer = rootView.findViewById(R.id.post_author_container);
371+
authorContainer.setOnClickListener(view -> showAuthorDialog());
389372

390373
mStickySwitch.setOnCheckedChangeListener(mOnStickySwitchChangeListener);
391374

@@ -669,20 +652,9 @@ private void showAuthorDialog() {
669652
return;
670653
}
671654

672-
List<Person> siteUsers = mPublishedViewModel.getAuthors().getValue();
673-
if (siteUsers == null) {
674-
return;
675-
}
676-
String[] authorNames = siteUsers.stream().map(Person::getDisplayName).toArray(String[]::new);
677-
int index = getAuthorIndex(siteUsers);
678-
if (index < 0) {
679-
// index is never negative. But if it is, don't show the dialog.
680-
return;
681-
}
682655
FragmentManager fm = getActivity().getSupportFragmentManager();
683656

684-
PostSettingsListDialogFragment fragment =
685-
PostSettingsListDialogFragment.newInstance(DialogType.AUTHOR, index, authorNames);
657+
PostSettingsListDialogFragment fragment = PostSettingsListDialogFragment.newAuthorListInstance(getAuthorId());
686658
fragment.show(fm, PostSettingsListDialogFragment.TAG);
687659
}
688660

@@ -976,7 +948,20 @@ private void updatePublishDateTextView(String label, PostImmutableModel postImmu
976948
}
977949

978950
private void updateAuthorTextView(String authorDisplayName) {
979-
mAuthorTextView.setText(authorDisplayName);
951+
if (authorDisplayName == null) {
952+
// If the authorDisplayName is null, that means this is a new unpublished post.
953+
// Set author to the current user name.
954+
EditPostRepository editPostRepository = getEditPostRepository();
955+
if (editPostRepository == null) {
956+
return;
957+
}
958+
PostImmutableModel postModel = editPostRepository.getPost();
959+
if (postModel != null && postModel.getAuthorDisplayName() == null) {
960+
updateAuthorTextView(mAccountStore.getAccount().getDisplayName());
961+
}
962+
} else {
963+
mAuthorTextView.setText(authorDisplayName);
964+
}
980965
}
981966

982967
private void updateCategoriesTextView(PostImmutableModel post) {
@@ -1058,23 +1043,19 @@ private int getCurrentHomepageStatusIndex() {
10581043
return 0;
10591044
}
10601045

1061-
private int getAuthorIndex(List<Person> siteUsers) {
1046+
private long getAuthorId() {
10621047
PostImmutableModel postModel = getEditPostRepository().getPost();
10631048
if (postModel == null) {
10641049
return -1;
10651050
}
1066-
long selectedAuthorId = postModel.getAuthorId();
1067-
if (postModel.getAuthorId() == 0) {
1051+
long postAuthorId = postModel.getAuthorId();
1052+
if (postAuthorId == 0) {
10681053
// If the author id is 0, that means this is the post creating screen.
10691054
// Selected author should be the current user.
1070-
selectedAuthorId = mAccountStore.getAccount().getUserId();
1071-
}
1072-
for (int i = 0; i < siteUsers.size(); i++) {
1073-
if (siteUsers.get(i).getPersonID() == selectedAuthorId) {
1074-
return i;
1075-
}
1055+
return mAccountStore.getAccount().getUserId();
1056+
} else {
1057+
return postAuthorId;
10761058
}
1077-
return -1;
10781059
}
10791060

10801061
// Post Format Helpers

WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsListDialogFragment.java

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,21 @@
1111
import androidx.appcompat.app.AlertDialog;
1212
import androidx.appcompat.view.ContextThemeWrapper;
1313
import androidx.fragment.app.DialogFragment;
14+
import androidx.lifecycle.ViewModelProvider;
1415

1516
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
1617

1718
import org.wordpress.android.R;
19+
import org.wordpress.android.WordPress;
20+
import org.wordpress.android.models.Person;
1821
import org.wordpress.android.util.AppLog;
1922

23+
import javax.inject.Inject;
24+
2025
public class PostSettingsListDialogFragment extends DialogFragment {
2126
private static final String ARG_DIALOG_TYPE = "dialog_type";
2227
private static final String ARG_CHECKED_INDEX = "checked_index";
23-
private static final String ARG_ITEMS = "items";
28+
private static final String ARG_POST_AUTHOR_ID = "post_author_id";
2429

2530
public static final String TAG = "post_list_settings_dialog_fragment";
2631

@@ -36,40 +41,56 @@ interface OnPostSettingsDialogFragmentListener {
3641
}
3742

3843
private DialogType mDialogType;
39-
private String[] mItems;
4044
private int mCheckedIndex;
4145
private OnPostSettingsDialogFragmentListener mListener;
46+
private long mPostAuthorId;
47+
@Inject ViewModelProvider.Factory mViewModelFactory;
48+
private EditPostPublishSettingsViewModel mPublishedViewModel;
4249

43-
public static PostSettingsListDialogFragment newInstance(@NonNull DialogType dialogType, int index) {
44-
return newInstance(dialogType, index, null);
50+
public static PostSettingsListDialogFragment newInstance(
51+
@NonNull DialogType dialogType,
52+
int index
53+
) {
54+
return newInstance(dialogType, index, -1);
4555
}
4656

47-
public static PostSettingsListDialogFragment newInstance(
57+
public static PostSettingsListDialogFragment newAuthorListInstance(long postAuthorId) {
58+
return newInstance(DialogType.AUTHOR, -1, postAuthorId);
59+
}
60+
61+
private static PostSettingsListDialogFragment newInstance(
4862
@NonNull DialogType dialogType,
4963
int index,
50-
String[] items
64+
long postAuthorId
5165
) {
5266
PostSettingsListDialogFragment fragment = new PostSettingsListDialogFragment();
5367
Bundle args = new Bundle();
5468
args.putSerializable(ARG_DIALOG_TYPE, dialogType);
55-
args.putInt(ARG_CHECKED_INDEX, index);
56-
args.putStringArray(ARG_ITEMS, items);
69+
if (index >= 0) {
70+
args.putInt(ARG_CHECKED_INDEX, index);
71+
}
72+
if (postAuthorId > 0) {
73+
args.putLong(ARG_POST_AUTHOR_ID, postAuthorId);
74+
}
5775
fragment.setArguments(args);
5876
return fragment;
5977
}
6078

6179
@Override
6280
public void onCreate(Bundle savedInstanceState) {
6381
super.onCreate(savedInstanceState);
82+
((WordPress) getActivity().getApplicationContext()).component().inject(this);
6483
setCancelable(true);
84+
mPublishedViewModel = new ViewModelProvider(getActivity(), mViewModelFactory)
85+
.get(EditPostPublishSettingsViewModel.class);
6586
}
6687

6788
@Override
6889
public void setArguments(Bundle args) {
6990
super.setArguments(args);
7091
mDialogType = (DialogType) args.getSerializable(ARG_DIALOG_TYPE);
7192
mCheckedIndex = args.getInt(ARG_CHECKED_INDEX);
72-
mItems = args.getStringArray(ARG_ITEMS);
93+
mPostAuthorId = args.getLong(ARG_POST_AUTHOR_ID);
7394
}
7495

7596
@SuppressWarnings("deprecation")
@@ -114,7 +135,19 @@ public void onClick(DialogInterface dialog, int which) {
114135
break;
115136
case AUTHOR:
116137
builder.setTitle(R.string.post_settings_author);
117-
builder.setSingleChoiceItems(mItems, mCheckedIndex, clickListener);
138+
builder.setMessage(R.string.loading);
139+
mPublishedViewModel.getAuthors().observe(this, authors -> {
140+
// Dismiss the loading dialog and show a new dialog with the list.
141+
dismiss();
142+
143+
builder.setMessage(null);
144+
String[] authorNames = authors.stream().map(Person::getDisplayName).toArray(String[]::new);
145+
builder.setSingleChoiceItems(
146+
authorNames,
147+
mPublishedViewModel.getAuthorIndex(mPostAuthorId),
148+
clickListener
149+
).create().show();
150+
});
118151
break;
119152
case POST_FORMAT:
120153
builder.setTitle(R.string.post_settings_post_format);

WordPress/src/main/res/layout/edit_post_settings_fragment.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@
6969

7070
<LinearLayout
7171
android:id="@+id/post_author_container"
72-
style="@style/PostSettingsContainer"
73-
android:visibility="gone">
72+
style="@style/PostSettingsContainer" >
7473

7574
<com.google.android.material.textview.MaterialTextView
7675
style="@style/PostSettingsTitle"

0 commit comments

Comments
 (0)