Fixes #3389 - Show User profiles (#4678)

* Fixes #3389 - Show  User profiles

* Don't show dummy achievements data - show data only when loaded
This commit is contained in:
Ashish 2021-10-26 02:10:08 +05:30 committed by GitHub
parent 7ce80aa804
commit 88b21a678e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 358 additions and 48 deletions

View file

@ -13,6 +13,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
@ -25,6 +26,7 @@ import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.ViewPagerAdapter;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.contributions.ContributionsListFragment;
import fr.free.nrw.commons.profile.achievements.AchievementsFragment;
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment;
import fr.free.nrw.commons.theme.BaseActivity;
@ -49,9 +51,6 @@ public class ProfileActivity extends BaseActivity {
@BindView(R.id.tab_layout)
TabLayout tabLayout;
@BindView(R.id.toolbar)
Toolbar toolbar;
@Inject
SessionManager sessionManager;
@ -59,15 +58,32 @@ public class ProfileActivity extends BaseActivity {
private AchievementsFragment achievementsFragment;
private LeaderboardFragment leaderboardFragment;
public static final String KEY_USERNAME ="username";
public static final String KEY_SHOULD_SHOW_CONTRIBUTIONS ="shouldShowContributions";
String userName;
private boolean shouldShowContributions;
@Override
protected void onRestoreInstanceState(final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
userName = savedInstanceState.getString(KEY_USERNAME);
shouldShowContributions = savedInstanceState.getBoolean(KEY_SHOULD_SHOW_CONTRIBUTIONS);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setTitle(sessionManager.getUserName());
userName = getIntent().getStringExtra(KEY_USERNAME);
shouldShowContributions = getIntent().getBooleanExtra(KEY_SHOULD_SHOW_CONTRIBUTIONS, false);
supportFragmentManager = getSupportFragmentManager();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
@ -87,11 +103,15 @@ public class ProfileActivity extends BaseActivity {
/**
* Creates a way to change current activity to AchievementActivity
*
* @param context
*/
public static void startYourself(Context context) {
public static void startYourself(final Context context, final String userName,
final boolean shouldShowContributions) {
Intent intent = new Intent(context, ProfileActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra(KEY_USERNAME, userName);
intent.putExtra(KEY_SHOULD_SHOW_CONTRIBUTIONS, shouldShowContributions);
context.startActivity(intent);
}
@ -102,11 +122,28 @@ public class ProfileActivity extends BaseActivity {
List<Fragment> fragmentList = new ArrayList<>();
List<String> titleList = new ArrayList<>();
achievementsFragment = new AchievementsFragment();
Bundle achievementsBundle = new Bundle();
achievementsBundle.putString(KEY_USERNAME, userName);
achievementsFragment.setArguments(achievementsBundle);
fragmentList.add(achievementsFragment);
titleList.add(getResources().getString(R.string.achievements_tab_title).toUpperCase());
leaderboardFragment = new LeaderboardFragment();
Bundle leaderBoardBundle = new Bundle();
leaderBoardBundle.putString(KEY_USERNAME, userName);
leaderboardFragment.setArguments(leaderBoardBundle);
fragmentList.add(leaderboardFragment);
titleList.add(getResources().getString(R.string.leaderboard_tab_title).toUpperCase());
if (shouldShowContributions) {
ContributionsListFragment contributionsListFragment = new ContributionsListFragment();
Bundle contributionsListBundle = new Bundle();
contributionsListBundle.putString(KEY_USERNAME, userName);
contributionsListFragment.setArguments(contributionsListBundle);
fragmentList.add(contributionsListFragment);
titleList.add(getString(R.string.contributions_fragment).toUpperCase());
}
viewPagerAdapter.setTabData(fragmentList, titleList);
viewPagerAdapter.notifyDataSetChanged();
@ -191,4 +228,10 @@ public class ProfileActivity extends BaseActivity {
e.printStackTrace();
}
}
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
outState.putString(KEY_USERNAME, userName);
super.onSaveInstanceState(outState);
}
}

View file

@ -15,7 +15,9 @@ import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.view.ContextThemeWrapper;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import butterknife.BindView;
@ -28,6 +30,7 @@ import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.utils.ViewUtil;
import fr.free.nrw.commons.profile.ProfileActivity;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
@ -114,6 +117,9 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
@BindView(R.id.wikidata_edits)
TextView wikidataEditsText;
@BindView(R.id.tv_achievements_of_user)
AppCompatTextView tvAchievementsOfUser;
@Inject
SessionManager sessionManager;
@ -128,6 +134,16 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
// menu item for action bar
private MenuItem item;
private String userName;
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
userName = getArguments().getString(ProfileActivity.KEY_USERNAME);
}
}
/**
* This method helps in the creation Achievement screen and
* dynamically set the size of imageView
@ -157,6 +173,12 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
// Set the initial value of WikiData edits to 0
wikidataEditsText.setText("0");
if(sessionManager.getUserName().equals(userName)){
tvAchievementsOfUser.setVisibility(View.GONE);
}else{
tvAchievementsOfUser.setVisibility(View.VISIBLE);
tvAchievementsOfUser.setText(getString(R.string.achievements_of_user,userName));
}
setWikidataEditCount();
setAchievements();
return rootView;
@ -182,7 +204,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
try{
compositeDisposable.add(okHttpJsonApiClient
.getAchievements(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
.getAchievements(Objects.requireNonNull(userName))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
@ -225,7 +247,6 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
* in the form of JavaRx Single object<JSONobject>
*/
private void setWikidataEditCount() {
String userName = sessionManager.getUserName();
if (StringUtils.isBlank(userName)) {
return;
}
@ -274,7 +295,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
private void setUploadCount(Achievements achievements) {
if (checkAccount()) {
compositeDisposable.add(okHttpJsonApiClient
.getUploadCount(Objects.requireNonNull(sessionManager.getCurrentAccount()).name)
.getUploadCount(Objects.requireNonNull(userName))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
@ -304,7 +325,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
if (uploadCount==0){
setZeroAchievements();
}else {
imagesUploadedProgressbar.setVisibility(View.VISIBLE);
imagesUploadedProgressbar.setProgress
(100*uploadCount/levelInfo.getMaxUploadCount());
imagesUploadedProgressbar.setProgressTextFormatPattern
@ -314,10 +335,14 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
}
private void setZeroAchievements() {
AlertDialog.Builder builder=new AlertDialog.Builder(getActivity())
.setMessage(getString(R.string.no_achievements_yet))
.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
});
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setMessage(
!Objects.equals(sessionManager.getUserName(), userName) ?
getString(R.string.no_achievements_yet, userName) :
getString(R.string.you_have_no_achievements_yet)
)
.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
});
AlertDialog dialog = builder.create();
dialog.show();
imagesUploadedProgressbar.setVisibility(View.INVISIBLE);
@ -336,6 +361,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
* @param notRevertPercentage
*/
private void setImageRevertPercentage(int notRevertPercentage){
imageRevertsProgressbar.setVisibility(View.VISIBLE);
imageRevertsProgressbar.setProgress(notRevertPercentage);
String revertPercentage = Integer.toString(notRevertPercentage);
imageRevertsProgressbar.setProgressTextFormatPattern(revertPercentage + "%%");
@ -348,6 +374,7 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
* @param achievements
*/
private void inflateAchievements(Achievements achievements) {
imagesUsedByWikiProgressBar.setVisibility(View.VISIBLE);
thanksReceived.setText(String.valueOf(achievements.getThanksReceived()));
imagesUsedByWikiProgressBar.setProgress
(100 * achievements.getUniqueUsedImages() / levelInfo.getMaxUniqueImages());
@ -481,5 +508,4 @@ public class AchievementsFragment extends CommonsDaggerSupportFragment {
}
return true;
}
}

View file

@ -17,6 +17,7 @@ import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.MergeAdapter;
@ -27,6 +28,7 @@ import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
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.utils.ViewUtil;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
@ -104,6 +106,16 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
*/
private boolean scrollToRank;
private String userName;
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
userName = getArguments().getString(ProfileActivity.KEY_USERNAME);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_leaderboard, container, false);
@ -220,7 +232,7 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
if (checkAccount()) {
try {
compositeDisposable.add(okHttpJsonApiClient
.getLeaderboard(Objects.requireNonNull(sessionManager.getCurrentAccount()).name,
.getLeaderboard(Objects.requireNonNull(userName),
duration, category, null, null)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

View file

@ -1,7 +1,7 @@
package fr.free.nrw.commons.profile.leaderboard;
import static fr.free.nrw.commons.profile.leaderboard.LeaderboardConstants.USER_LINK_PREFIX;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.facebook.drawee.view.SimpleDraweeView;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.profile.ProfileActivity;
/**
* This class extends RecyclerView.Adapter and creates the List section of the leaderboard
@ -81,9 +82,13 @@ public class LeaderboardListAdapter extends PagedListAdapter<LeaderboardList, Le
count.setText(getItem(position).getCategoryCount().toString());
/*
Open the user profile in a webview when a username is clicked on leaderboard
Now that we have our in app profile-section, lets take the user there
*/
holder.itemView.setOnClickListener(view -> Utils.handleWebUrl(holder.getContext(), Uri.parse(
String.format("%s%s", USER_LINK_PREFIX, getItem(position).getUsername()))));
holder.itemView.setOnClickListener(view -> {
if (view.getContext() instanceof ProfileActivity) {
((Activity) (view.getContext())).finish();
}
ProfileActivity.startYourself(view.getContext(), getItem(position).getUsername(), true);
});
}
}