Skip to content

Commit

Permalink
Fixes #3389 - Show User profiles (#4678)
Browse files Browse the repository at this point in the history
* Fixes #3389 - Show  User profiles

* Don't show dummy achievements data - show data only when loaded
  • Loading branch information
ashishkumar468 committed Oct 25, 2021
1 parent 7ce80aa commit 88b21a6
Show file tree
Hide file tree
Showing 20 changed files with 358 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class ContributionBoundaryCallback @Inject constructor(
@param:Named(CommonsApplicationModule.IO_THREAD) private val ioThreadScheduler: Scheduler
) : BoundaryCallback<Contribution>() {
private val compositeDisposable: CompositeDisposable = CompositeDisposable()
lateinit var userName: String


/**
* It is triggered when the list has no items User's Contributions are then fetched from the
Expand Down Expand Up @@ -55,7 +57,7 @@ class ContributionBoundaryCallback @Inject constructor(
fun fetchContributions() {
if (sessionManager.userName != null) {
compositeDisposable.add(
mediaClient.getMediaListForUser(sessionManager.userName!!)
mediaClient.getMediaListForUser(userName!!)
.map { mediaList ->
mediaList.map {
Contribution(media = it, state = Contribution.STATE_COMPLETED)
Expand Down Expand Up @@ -88,4 +90,11 @@ class ContributionBoundaryCallback @Inject constructor(
}
)
}

/**
* Clean up
*/
fun dispose() {
compositeDisposable.dispose()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import static fr.free.nrw.commons.di.NetworkingModule.NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE;

import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
Expand All @@ -21,6 +20,7 @@
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
Expand All @@ -35,17 +35,20 @@
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.customselector.ui.selector.CustomSelectorActivity;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.utils.DialogUtil;
import fr.free.nrw.commons.media.MediaClient;
import fr.free.nrw.commons.utils.SystemThemeUtils;
import fr.free.nrw.commons.utils.ViewUtil;
import java.util.Locale;
import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.wikipedia.dataclient.WikiSite;
import timber.log.Timber;
import fr.free.nrw.commons.profile.ProfileActivity;


/**
* Created by root on 01.06.2018.
Expand All @@ -56,7 +59,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
WikipediaInstructionsDialogFragment.Callback {

private static final String RV_STATE = "rv_scroll_state";

@BindView(R.id.contributionsList)
RecyclerView rvContributionsList;
@BindView(R.id.loadingContributionsProgressBar)
Expand All @@ -76,6 +79,8 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl

@Inject
SystemThemeUtils systemThemeUtils;
@BindView(R.id.tv_contributions_of_user)
AppCompatTextView tvContributionsOfUser;

@Inject
ContributionController controller;
Expand All @@ -89,6 +94,9 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
@Inject
ContributionsListPresenter contributionsListPresenter;

@Inject
SessionManager sessionManager;

private Animation fab_close;
private Animation fab_open;
private Animation rotate_forward;
Expand All @@ -105,7 +113,22 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private final int SPAN_COUNT_PORTRAIT = 1;

private int contributionsSize;
String userName;


@Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Now that we are allowing this fragment to be started for
// any userName- we expect it to be passed as an argument
if (getArguments() != null) {
userName = getArguments().getString(ProfileActivity.KEY_USERNAME);
}

if (StringUtils.isEmpty(userName)) {
userName = sessionManager.getUserName();
}
}

@Override
public View onCreateView(
Expand All @@ -114,6 +137,16 @@ public View onCreateView(
final View view = inflater.inflate(R.layout.fragment_contributions_list, container, false);
ButterKnife.bind(this, view);
contributionsListPresenter.onAttachView(this);

if (Objects.equals(sessionManager.getUserName(), userName)) {
tvContributionsOfUser.setVisibility(GONE);
fab_layout.setVisibility(VISIBLE);
} else {
tvContributionsOfUser.setVisibility(VISIBLE);
tvContributionsOfUser.setText(getString(R.string.contributions_of_user, userName));
fab_layout.setVisibility(GONE);
}

initAdapter();
return view;
}
Expand Down Expand Up @@ -155,8 +188,9 @@ private void initRecyclerView() {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}

contributionsListPresenter.setup();
contributionsListPresenter.contributionList.observe(this.getViewLifecycleOwner(), list -> {
contributionsListPresenter.setup(userName,
Objects.equals(sessionManager.getUserName(), userName));
contributionsListPresenter.contributionList.observe(getViewLifecycleOwner(), list -> {
contributionsSize = list.size();
adapter.submitList(list);
if (callback != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package fr.free.nrw.commons.contributions;

import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.paging.DataSource;
import androidx.paging.DataSource.Factory;
import androidx.paging.LivePagedListBuilder;
import androidx.paging.PagedList;
import fr.free.nrw.commons.contributions.ContributionsListContract.UserActionListener;
Expand All @@ -20,17 +23,20 @@ public class ContributionsListPresenter implements UserActionListener {
private final Scheduler ioThreadScheduler;

private final CompositeDisposable compositeDisposable;
private final ContributionsRemoteDataSource contributionsRemoteDataSource;

LiveData<PagedList<Contribution>> contributionList;

@Inject
ContributionsListPresenter(
final ContributionBoundaryCallback contributionBoundaryCallback,
final ContributionsRemoteDataSource contributionsRemoteDataSource,
final ContributionsRepository repository,
@Named(CommonsApplicationModule.IO_THREAD) final Scheduler ioThreadScheduler) {
this.contributionBoundaryCallback = contributionBoundaryCallback;
this.repository = repository;
this.ioThreadScheduler = ioThreadScheduler;
this.contributionsRemoteDataSource=contributionsRemoteDataSource;
compositeDisposable = new CompositeDisposable();
}

Expand All @@ -43,19 +49,44 @@ public void onAttachView(final ContributionsListContract.View view) {
* the live data object. This method can be tweaked to update the lazy loading behavior of the
* contributions list
*/
void setup() {
void setup(String userName, boolean isSelf) {
final PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
.setPrefetchDistance(50)
.setPageSize(10).build();
contributionList = (new LivePagedListBuilder(repository.fetchContributions(),
pagedListConfig)
.setBoundaryCallback(contributionBoundaryCallback)).build();
Factory<Integer, Contribution> factory;
boolean shouldSetBoundaryCallback;
if (!isSelf) {
//We don't want to persist contributions for other user's, therefore
// creating a new DataSource for them
contributionsRemoteDataSource.setUserName(userName);
factory = new Factory<Integer, Contribution>() {
@NonNull
@Override
public DataSource<Integer, Contribution> create() {
return contributionsRemoteDataSource;
}
};
shouldSetBoundaryCallback = false;
} else {
contributionBoundaryCallback.setUserName(userName);
shouldSetBoundaryCallback = true;
factory = repository.fetchContributions();
}

LivePagedListBuilder livePagedListBuilder = new LivePagedListBuilder(factory, pagedListConfig);
if (shouldSetBoundaryCallback) {
livePagedListBuilder.setBoundaryCallback(contributionBoundaryCallback);
}

contributionList = livePagedListBuilder.build();
}

@Override
public void onDetachView() {
compositeDisposable.clear();
contributionsRemoteDataSource.dispose();
contributionBoundaryCallback.dispose();
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package fr.free.nrw.commons.contributions

import androidx.paging.ItemKeyedDataSource
import fr.free.nrw.commons.di.CommonsApplicationModule
import fr.free.nrw.commons.media.MediaClient
import io.reactivex.Scheduler
import io.reactivex.disposables.CompositeDisposable
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Named

/**
* Data-Source which acts as mediator for contributions-data from the API
*/
class ContributionsRemoteDataSource @Inject constructor(
private val mediaClient: MediaClient,
@param:Named(CommonsApplicationModule.IO_THREAD) private val ioThreadScheduler: Scheduler
) : ItemKeyedDataSource<Int, Contribution>() {
private val compositeDisposable: CompositeDisposable = CompositeDisposable()
var userName: String? = null

override fun loadInitial(
params: LoadInitialParams<Int>,
callback: LoadInitialCallback<Contribution>
) {
fetchContributions(callback)
}

override fun loadAfter(
params: LoadParams<Int>,
callback: LoadCallback<Contribution>
) {
fetchContributions(callback)
}

override fun loadBefore(
params: LoadParams<Int>,
callback: LoadCallback<Contribution>
) {
}

override fun getKey(item: Contribution): Int {
return item.pageId.hashCode()
}


/**
* Fetches contributions using the MediaWiki API
*/
private fun fetchContributions(callback: LoadCallback<Contribution>) {
compositeDisposable.add(
mediaClient.getMediaListForUser(userName!!)
.map { mediaList ->
mediaList.map {
Contribution(media = it, state = Contribution.STATE_COMPLETED)
}
}
.subscribeOn(ioThreadScheduler)
.subscribe({
callback.onResult(it)
}) { error: Throwable ->
Timber.e(
"Failed to fetch contributions: %s",
error.message
)
}
)
}

fun dispose() {
compositeDisposable.dispose()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
import fr.free.nrw.commons.explore.depictions.WikidataItemDetailsActivity;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.nearby.Label;
import fr.free.nrw.commons.profile.ProfileActivity;
import fr.free.nrw.commons.ui.widget.HtmlTextView;
import fr.free.nrw.commons.utils.ViewUtilWrapper;
import io.reactivex.Single;
Expand Down Expand Up @@ -1014,6 +1015,15 @@ public void onSeeMoreClicked(){
}
}

@OnClick(R.id.mediaDetailAuthor)
public void onAuthorViewClicked() {
if (media == null || media.getUser() == null) {
return;
}
ProfileActivity.startYourself(getActivity(), media.getUser(), !Objects
.equals(sessionManager.getUserName(), media.getUser()));
}

/**
* Enable Progress Bar and Update delete button text.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.profile.ProfileActivity;
import fr.free.nrw.commons.theme.BaseActivity;
import fr.free.nrw.commons.utils.DownloadUtils;
import fr.free.nrw.commons.utils.ImageUtils;
Expand Down Expand Up @@ -201,6 +202,11 @@ public boolean onOptionsItemSelected(MenuItem item) {
// Set avatar
setAvatar(m);
return true;
case R.id.menu_view_user_page:
if (m != null && m.getUser() != null) {
ProfileActivity.startYourself(getActivity(), m.getUser(),
!Objects.equals(sessionManager.getUserName(), m.getUser()));
}
default:
return super.onOptionsItemSelected(item);
}
Expand Down Expand Up @@ -258,7 +264,9 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.findItem(R.id.menu_download_current_image).setEnabled(true).setVisible(true);
menu.findItem(R.id.menu_bookmark_current_image).setEnabled(true).setVisible(true);
menu.findItem(R.id.menu_set_as_wallpaper).setEnabled(true).setVisible(true);

if (m.getUser() != null) {
menu.findItem(R.id.menu_view_user_page).setEnabled(true).setVisible(true);
}
// Initialize bookmark object
bookmark = new Bookmark(
m.getFilename(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,20 @@ public void onAttach(@NonNull final Context context) {
* Set the username in navigationHeader.
*/
private void setUserName() {
AccountManager accountManager = AccountManager.get(getActivity());
Account[] allAccounts = accountManager.getAccountsByType(BuildConfig.ACCOUNT_TYPE);
moreProfile.setText(getUserName());
}

private String getUserName(){
final AccountManager accountManager = AccountManager.get(getActivity());
final Account[] allAccounts = accountManager.getAccountsByType(BuildConfig.ACCOUNT_TYPE);
if (allAccounts.length != 0) {
moreProfile.setText(allAccounts[0].name);
return allAccounts[0].name;
}
return "";
}


@OnClick(R.id.more_logout)
public void onLogoutClicked() {
new AlertDialog.Builder(getActivity())
Expand Down Expand Up @@ -136,9 +143,7 @@ public void onSettingsClicked() {

@OnClick(R.id.more_profile)
public void onProfileClicked() {
final Intent intent = new Intent(getActivity(), ProfileActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
getActivity().startActivity(intent);
ProfileActivity.startYourself(getActivity(), getUserName(), false);
}

@OnClick(R.id.more_peer_review)
Expand Down

0 comments on commit 88b21a6

Please sign in to comment.