diff --git a/app/src/androidTest/java/fr/free/nrw/commons/AchievementsActivityTest.kt b/app/src/androidTest/java/fr/free/nrw/commons/AchievementsActivityTest.kt
index 198578f2f..6bded4351 100644
--- a/app/src/androidTest/java/fr/free/nrw/commons/AchievementsActivityTest.kt
+++ b/app/src/androidTest/java/fr/free/nrw/commons/AchievementsActivityTest.kt
@@ -7,10 +7,9 @@ import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import androidx.test.espresso.intent.rule.IntentsTestRule
import androidx.test.espresso.matcher.ViewMatchers.withId
-import androidx.test.filters.MediumTest
import androidx.test.runner.AndroidJUnit4
-import fr.free.nrw.commons.achievements.AchievementsActivity
import fr.free.nrw.commons.auth.LoginActivity
+import fr.free.nrw.commons.profile.ProfileActivity
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -32,6 +31,6 @@ class AchievementsActivityTest {
onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
onView(withId(R.id.user_icon)).perform(click())
- Intents.intended(hasComponent(AchievementsActivity::class.java.name))
+ Intents.intended(hasComponent(ProfileActivity::class.java.name))
}
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6f8eade2e..7a0c876de 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -137,8 +137,8 @@
/>
+ android:name=".profile.ProfileActivity"
+ android:label="@string/Profile" />
fragmentList = new ArrayList<>();
+ List titleList = new ArrayList<>();
+ achievementsFragment = new AchievementsFragment();
+ fragmentList.add(achievementsFragment);
+ titleList.add(getResources().getString(R.string.achievements_tab_title).toUpperCase());
+ leaderboardFragment = new LeaderboardFragment();
+ fragmentList.add(leaderboardFragment);
+ titleList.add(getResources().getString(R.string.leaderboard_tab_title).toUpperCase());
+ viewPagerAdapter.setTabData(fragmentList, titleList);
+ viewPagerAdapter.notifyDataSetChanged();
+
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ compositeDisposable.clear();
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/fr/free/nrw/commons/profile/ViewPagerAdapter.java b/app/src/main/java/fr/free/nrw/commons/profile/ViewPagerAdapter.java
new file mode 100644
index 000000000..d9db05696
--- /dev/null
+++ b/app/src/main/java/fr/free/nrw/commons/profile/ViewPagerAdapter.java
@@ -0,0 +1,54 @@
+package fr.free.nrw.commons.profile;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ViewPagerAdapter extends FragmentPagerAdapter {
+ private List fragmentList = new ArrayList<>();
+ private List fragmentTitleList = new ArrayList<>();
+
+ public ViewPagerAdapter(FragmentManager manager) {
+ super(manager);
+ }
+
+ /**
+ * This method returns the fragment of the viewpager at a particular position
+ * @param position
+ */
+ @Override
+ public Fragment getItem(int position) {
+ return fragmentList.get(position);
+ }
+
+ /**
+ * This method returns the total number of fragments in the viewpager.
+ * @return size
+ */
+ @Override
+ public int getCount() {
+ return fragmentList.size();
+ }
+
+ /**
+ * This method sets the fragment and title list in the viewpager
+ * @param fragmentList List of all fragments to be displayed in the viewpager
+ * @param fragmentTitleList List of all titles of the fragments
+ */
+ public void setTabData(List fragmentList, List fragmentTitleList) {
+ this.fragmentList = fragmentList;
+ this.fragmentTitleList = fragmentTitleList;
+ }
+
+ /**
+ * This method returns the title of the page at a particular position
+ * @param position
+ */
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return fragmentTitleList.get(position);
+ }
+}
+
diff --git a/app/src/main/java/fr/free/nrw/commons/achievements/Achievements.kt b/app/src/main/java/fr/free/nrw/commons/profile/achievements/Achievements.kt
similarity index 85%
rename from app/src/main/java/fr/free/nrw/commons/achievements/Achievements.kt
rename to app/src/main/java/fr/free/nrw/commons/profile/achievements/Achievements.kt
index 3de252af8..081fe7e5f 100644
--- a/app/src/main/java/fr/free/nrw/commons/achievements/Achievements.kt
+++ b/app/src/main/java/fr/free/nrw/commons/profile/achievements/Achievements.kt
@@ -1,4 +1,4 @@
-package fr.free.nrw.commons.achievements
+package fr.free.nrw.commons.profile.achievements
/**
* Represents Achievements class and stores all the parameters
@@ -87,12 +87,14 @@ class Achievements {
*/
@JvmStatic
fun from(response: FeedbackResponse): Achievements {
- return Achievements(response.uniqueUsedImages,
- response.articlesUsingImages,
- response.thanksReceived,
- response.featuredImages.qualityImages
- + response.featuredImages.featuredPicturesOnWikimediaCommons, 0,
- response.deletedUploads)
+ return Achievements(
+ response.uniqueUsedImages,
+ response.articlesUsingImages,
+ response.thanksReceived,
+ response.featuredImages.qualityImages
+ + response.featuredImages.featuredPicturesOnWikimediaCommons, 0,
+ response.deletedUploads
+ )
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/fr/free/nrw/commons/achievements/AchievementsActivity.java b/app/src/main/java/fr/free/nrw/commons/profile/achievements/AchievementsFragment.java
similarity index 86%
rename from app/src/main/java/fr/free/nrw/commons/achievements/AchievementsActivity.java
rename to app/src/main/java/fr/free/nrw/commons/profile/achievements/AchievementsFragment.java
index d12ec942e..703f14f2f 100644
--- a/app/src/main/java/fr/free/nrw/commons/achievements/AchievementsActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/profile/achievements/AchievementsFragment.java
@@ -1,61 +1,52 @@
-package fr.free.nrw.commons.achievements;
+package fr.free.nrw.commons.profile.achievements;
import android.accounts.Account;
-import android.annotation.SuppressLint;
-import android.content.Context;
+import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
-import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
-
-import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.widget.Toolbar;
+import androidx.appcompat.view.ContextThemeWrapper;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.FileProvider;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
-
-import com.dinuscxj.progressbar.CircleProgressBar;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Objects;
-
-import javax.inject.Inject;
-
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
+import com.dinuscxj.progressbar.CircleProgressBar;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
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.theme.NavigationBaseActivity;
import fr.free.nrw.commons.utils.ViewUtil;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Objects;
+import javax.inject.Inject;
+import org.apache.commons.lang3.StringUtils;
import timber.log.Timber;
-
-
/**
- * activity for sharing feedback on uploaded activity
+ * fragment for sharing feedback on uploaded activity
*/
-public class AchievementsActivity extends NavigationBaseActivity {
+public class AchievementsFragment extends CommonsDaggerSupportFragment {
private static final double BADGE_IMAGE_WIDTH_RATIO = 0.4;
private static final double BADGE_IMAGE_HEIGHT_RATIO = 0.3;
@@ -64,55 +55,71 @@ public class AchievementsActivity extends NavigationBaseActivity {
@BindView(R.id.achievement_badge_image)
ImageView imageView;
+
@BindView(R.id.achievement_badge_text)
TextView badgeText;
+
@BindView(R.id.achievement_level)
TextView levelNumber;
- @BindView(R.id.toolbar)
- Toolbar toolbar;
+
@BindView(R.id.thanks_received)
TextView thanksReceived;
+
@BindView(R.id.images_uploaded_progressbar)
CircleProgressBar imagesUploadedProgressbar;
+
@BindView(R.id.images_used_by_wiki_progress_bar)
CircleProgressBar imagesUsedByWikiProgressBar;
+
@BindView(R.id.image_reverts_progressbar)
CircleProgressBar imageRevertsProgressbar;
+
@BindView(R.id.image_featured)
TextView imagesFeatured;
+
@BindView(R.id.images_revert_limit_text)
TextView imagesRevertLimitText;
+
@BindView(R.id.progressBar)
ProgressBar progressBar;
+
@BindView(R.id.layout_image_uploaded)
RelativeLayout layoutImageUploaded;
+
@BindView(R.id.layout_image_reverts)
RelativeLayout layoutImageReverts;
+
@BindView(R.id.layout_image_used_by_wiki)
RelativeLayout layoutImageUsedByWiki;
+
@BindView(R.id.layout_statistics)
LinearLayout layoutStatistics;
+
@BindView(R.id.images_used_by_wiki_text)
TextView imageByWikiText;
+
@BindView(R.id.images_reverted_text)
TextView imageRevertedText;
+
@BindView(R.id.images_upload_text_param)
TextView imageUploadedText;
+
@BindView(R.id.wikidata_edits)
TextView wikidataEditsText;
-
@Inject
SessionManager sessionManager;
+
@Inject
OkHttpJsonApiClient okHttpJsonApiClient;
- MenuItem item;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
// To keep track of the number of wiki edits made by a user
private int numberOfEdits = 0;
+ MenuItem item;
+
/**
* This method helps in the creation Achievement screen and
* dynamically set the size of imageView
@@ -120,15 +127,13 @@ public class AchievementsActivity extends NavigationBaseActivity {
* @param savedInstanceState Data bundle
*/
@Override
- @SuppressLint("StringFormatInvalid")
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_achievements);
- ButterKnife.bind(this);
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_achievements, container, false);
+ ButterKnife.bind(this, rootView);
// DisplayMetrics used to fetch the size of the screen
DisplayMetrics displayMetrics = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
@@ -139,37 +144,23 @@ public class AchievementsActivity extends NavigationBaseActivity {
params.width = (int) (width * BADGE_IMAGE_WIDTH_RATIO);
imageView.requestLayout();
- setSupportActionBar(toolbar);
progressBar.setVisibility(View.VISIBLE);
+ setHasOptionsMenu(true);
+
hideLayouts();
setWikidataEditCount();
setAchievements();
- initDrawer();
+ return rootView;
}
@Override
- public void onDestroy() {
- super.onDestroy();
- compositeDisposable.clear();
- }
-
- /**
- * To invoke the AlertDialog on clicking info button
- */
- @OnClick(R.id.achievement_info)
- public void showInfoDialog(){
- launchAlert(getResources().getString(R.string.Achievements)
- ,getResources().getString(R.string.achievements_info_message));
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
+ public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
// Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_about, menu);
- item=menu.getItem(0);
+ super.onCreateOptionsMenu(menu, menuInflater);
+ menuInflater.inflate(R.menu.menu_about, menu);
+ item = menu.getItem(0);
item.setVisible(false);
- return true;
}
/**
@@ -180,7 +171,7 @@ public class AchievementsActivity extends NavigationBaseActivity {
int id = item.getItemId();
// take screenshot in form of bitmap and show it in Alert Dialog
if (id == R.id.share_app_icon) {
- View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
+ View rootView = getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
Bitmap screenShot = Utils.getScreenShot(rootView);
showAlert(screenShot);
}
@@ -188,20 +179,39 @@ public class AchievementsActivity extends NavigationBaseActivity {
return super.onOptionsItemSelected(item);
}
+ /**
+ * It display the alertDialog with Image of screenshot
+ * @param screenshot
+ */
+ public void showAlert(Bitmap screenshot){
+ AlertDialog.Builder alertadd = new AlertDialog.Builder(getActivity());
+ LayoutInflater factory = LayoutInflater.from(getActivity());
+ final View view = factory.inflate(R.layout.image_alert_layout, null);
+ ImageView screenShotImage = view.findViewById(R.id.alert_image);
+ screenShotImage.setImageBitmap(screenshot);
+ TextView shareMessage = view.findViewById(R.id.alert_text);
+ shareMessage.setText(R.string.achievements_share_message);
+ alertadd.setView(view);
+ alertadd.setPositiveButton(R.string.about_translate_proceed, (dialog, which) -> shareScreen(screenshot));
+ alertadd.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel());
+ alertadd.show();
+ }
+
/**
* To take bitmap and store it temporary storage and share it
* @param bitmap
*/
void shareScreen(Bitmap bitmap) {
try {
- File file = new File(this.getExternalCacheDir(), "screen.png");
+ File file = new File(getActivity().getExternalCacheDir(), "screen.png");
FileOutputStream fOut = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
file.setReadable(true, false);
- Uri fileUri = FileProvider.getUriForFile(getApplicationContext(), getPackageName()+".provider", file);
- grantUriPermission(getPackageName(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ Uri fileUri = FileProvider
+ .getUriForFile(getActivity().getApplicationContext(), getActivity().getPackageName()+".provider", file);
+ getActivity().grantUriPermission(getActivity().getPackageName(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
@@ -212,6 +222,15 @@ public class AchievementsActivity extends NavigationBaseActivity {
}
}
+ /**
+ * To invoke the AlertDialog on clicking info button
+ */
+ @OnClick(R.id.achievement_info)
+ public void showInfoDialog(){
+ launchAlert(getResources().getString(R.string.Achievements)
+ ,getResources().getString(R.string.achievements_info_message));
+ }
+
/**
* To call the API to get results in form Single
* which then calls parseJson when results are fetched
@@ -234,7 +253,7 @@ public class AchievementsActivity extends NavigationBaseActivity {
layoutImageReverts.setVisibility(View.INVISIBLE);
imageView.setVisibility(View.INVISIBLE);
// If the number of edits made by the user are more than 150,000
- // in some cases such high number of wiki edit counts cause the
+ // in some cases such high number of wiki edit counts cause the
// achievements calculator to fail in some cases, for more details
// refer Issue: #3295
if (numberOfEdits <= 150000) {
@@ -264,7 +283,6 @@ public class AchievementsActivity extends NavigationBaseActivity {
* To call the API to fetch the count of wiki data edits
* in the form of JavaRx Single object
*/
- @SuppressLint("CheckResult")
private void setWikidataEditCount() {
String userName = sessionManager.getUserName();
if (StringUtils.isBlank(userName)) {
@@ -285,18 +303,18 @@ public class AchievementsActivity extends NavigationBaseActivity {
/**
* Shows a snack bar which has an action button which on click dismisses the snackbar and invokes the
* listener passed
- * @param tooManyAchievements if this value is true it means that the number of achievements of the
- * user are so high that it wrecks havoc with the Achievements calculator due to which request may time
+ * @param tooManyAchievements if this value is true it means that the number of achievements of the
+ * user are so high that it wrecks havoc with the Achievements calculator due to which request may time
* out. Well this is the Ultimate Achievement
*/
private void showSnackBarWithRetry(boolean tooManyAchievements) {
if (tooManyAchievements) {
progressBar.setVisibility(View.GONE);
- ViewUtil.showDismissibleSnackBar(findViewById(android.R.id.content),
+ ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content),
R.string.achievements_fetch_failed_ultimate_achievement, R.string.retry, view -> setAchievements());
} else {
progressBar.setVisibility(View.GONE);
- ViewUtil.showDismissibleSnackBar(findViewById(android.R.id.content),
+ ViewUtil.showDismissibleSnackBar(getActivity().findViewById(android.R.id.content),
R.string.achievements_fetch_failed, R.string.retry, view -> setAchievements());
}
}
@@ -305,7 +323,7 @@ public class AchievementsActivity extends NavigationBaseActivity {
* Shows a generic error toast when error occurs while loading achievements or uploads
*/
private void onError() {
- ViewUtil.showLongToast(this, getResources().getString(R.string.error_occurred));
+ ViewUtil.showLongToast(getActivity(), getResources().getString(R.string.error_occurred));
progressBar.setVisibility(View.GONE);
}
@@ -355,7 +373,7 @@ public class AchievementsActivity extends NavigationBaseActivity {
}
private void setZeroAchievements() {
- AlertDialog.Builder builder=new AlertDialog.Builder(this)
+ AlertDialog.Builder builder=new AlertDialog.Builder(getActivity())
.setMessage(getString(R.string.no_achievements_yet))
.setPositiveButton(getString(R.string.ok), (dialog, which) -> {
});
@@ -399,20 +417,10 @@ public class AchievementsActivity extends NavigationBaseActivity {
levelUpInfoString += " " + levelInfo.getLevelNumber();
levelNumber.setText(levelUpInfoString);
imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), R.drawable.badge,
- new ContextThemeWrapper(this, levelInfo.getLevelStyle()).getTheme()));
+ new ContextThemeWrapper(getActivity(), levelInfo.getLevelStyle()).getTheme()));
badgeText.setText(Integer.toString(levelInfo.getLevelNumber()));
}
- /**
- * Creates a way to change current activity to AchievementActivity
- * @param context
- */
- public static void startYourself(Context context) {
- Intent intent = new Intent(context, AchievementsActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- context.startActivity(intent);
- }
-
/**
* to hide progressbar
*/
@@ -447,24 +455,6 @@ public class AchievementsActivity extends NavigationBaseActivity {
levelNumber.setVisibility(View.INVISIBLE);
}
- /**
- * It display the alertDialog with Image of screenshot
- * @param screenshot
- */
- public void showAlert(Bitmap screenshot){
- AlertDialog.Builder alertadd = new AlertDialog.Builder(AchievementsActivity.this);
- LayoutInflater factory = LayoutInflater.from(AchievementsActivity.this);
- final View view = factory.inflate(R.layout.image_alert_layout, null);
- ImageView screenShotImage = view.findViewById(R.id.alert_image);
- screenShotImage.setImageBitmap(screenshot);
- TextView shareMessage = view.findViewById(R.id.alert_text);
- shareMessage.setText(R.string.achievements_share_message);
- alertadd.setView(view);
- alertadd.setPositiveButton(R.string.about_translate_proceed, (dialog, which) -> shareScreen(screenshot));
- alertadd.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel());
- alertadd.show();
- }
-
@OnClick(R.id.images_upload_info)
public void showUploadInfo(){
launchAlert(getResources().getString(R.string.images_uploaded)
@@ -507,7 +497,7 @@ public class AchievementsActivity extends NavigationBaseActivity {
* @param message
*/
private void launchAlert(String title, String message){
- new AlertDialog.Builder(AchievementsActivity.this)
+ new AlertDialog.Builder(getActivity())
.setTitle(title)
.setMessage(message)
.setCancelable(true)
@@ -524,11 +514,11 @@ public class AchievementsActivity extends NavigationBaseActivity {
Account currentAccount = sessionManager.getCurrentAccount();
if (currentAccount == null) {
Timber.d("Current account is null");
- ViewUtil.showLongToast(this, getResources().getString(R.string.user_not_logged_in));
- sessionManager.forceLogin(this);
+ ViewUtil.showLongToast(getActivity(), getResources().getString(R.string.user_not_logged_in));
+ sessionManager.forceLogin(getActivity());
return false;
}
return true;
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/fr/free/nrw/commons/achievements/FeaturedImages.kt b/app/src/main/java/fr/free/nrw/commons/profile/achievements/FeaturedImages.kt
similarity index 58%
rename from app/src/main/java/fr/free/nrw/commons/achievements/FeaturedImages.kt
rename to app/src/main/java/fr/free/nrw/commons/profile/achievements/FeaturedImages.kt
index 4f5351e3c..0a54a778f 100644
--- a/app/src/main/java/fr/free/nrw/commons/achievements/FeaturedImages.kt
+++ b/app/src/main/java/fr/free/nrw/commons/profile/achievements/FeaturedImages.kt
@@ -1,11 +1,11 @@
-package fr.free.nrw.commons.achievements
+package fr.free.nrw.commons.profile.achievements
import com.google.gson.annotations.SerializedName
/**
-* Represents Featured Images on WikiMedia Commons platform
-* Used by Achievements and FeedbackResponse (objects) of the user
-*/
+ * Represents Featured Images on WikiMedia Commons platform
+ * Used by Achievements and FeedbackResponse (objects) of the user
+ */
class FeaturedImages(
@field:SerializedName("Quality_images") val qualityImages: Int,
@field:SerializedName("Featured_pictures_on_Wikimedia_Commons") val featuredPicturesOnWikimediaCommons: Int
diff --git a/app/src/main/java/fr/free/nrw/commons/achievements/FeedbackResponse.kt b/app/src/main/java/fr/free/nrw/commons/profile/achievements/FeedbackResponse.kt
similarity index 66%
rename from app/src/main/java/fr/free/nrw/commons/achievements/FeedbackResponse.kt
rename to app/src/main/java/fr/free/nrw/commons/profile/achievements/FeedbackResponse.kt
index 8d5d8b7bd..f86ca3e9b 100644
--- a/app/src/main/java/fr/free/nrw/commons/achievements/FeedbackResponse.kt
+++ b/app/src/main/java/fr/free/nrw/commons/profile/achievements/FeedbackResponse.kt
@@ -1,8 +1,8 @@
-package fr.free.nrw.commons.achievements
+package fr.free.nrw.commons.profile.achievements
/**
-* Represent the Feedback Response of the user
-*/
+ * Represent the Feedback Response of the user
+ */
data class FeedbackResponse(val uniqueUsedImages: Int,
val articlesUsingImages: Int,
val deletedUploads: Int,
diff --git a/app/src/main/java/fr/free/nrw/commons/achievements/LevelController.kt b/app/src/main/java/fr/free/nrw/commons/profile/achievements/LevelController.kt
similarity index 97%
rename from app/src/main/java/fr/free/nrw/commons/achievements/LevelController.kt
rename to app/src/main/java/fr/free/nrw/commons/profile/achievements/LevelController.kt
index 772f716bd..414bf271d 100644
--- a/app/src/main/java/fr/free/nrw/commons/achievements/LevelController.kt
+++ b/app/src/main/java/fr/free/nrw/commons/profile/achievements/LevelController.kt
@@ -1,4 +1,4 @@
-package fr.free.nrw.commons.achievements
+package fr.free.nrw.commons.profile.achievements
import fr.free.nrw.commons.R
diff --git a/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardFragment.java b/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardFragment.java
new file mode 100644
index 000000000..76cbc51a3
--- /dev/null
+++ b/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardFragment.java
@@ -0,0 +1,18 @@
+package fr.free.nrw.commons.profile.leaderboard;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import fr.free.nrw.commons.R;
+import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
+
+public class LeaderboardFragment extends CommonsDaggerSupportFragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_leaderboard, container, false);
+ return rootView;
+ }
+
+}
diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
index 0019206dd..0dea4bf55 100644
--- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
@@ -26,6 +26,7 @@ import androidx.drawerlayout.widget.DrawerLayout;
import com.google.android.material.navigation.NavigationView;
+import fr.free.nrw.commons.profile.ProfileActivity;
import org.wikipedia.dataclient.Service;
import javax.inject.Inject;
@@ -37,7 +38,6 @@ import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.WelcomeActivity;
-import fr.free.nrw.commons.achievements.AchievementsActivity;
import fr.free.nrw.commons.auth.LoginActivity;
import fr.free.nrw.commons.auth.LogoutClient;
import fr.free.nrw.commons.bookmarks.BookmarksActivity;
@@ -140,7 +140,7 @@ public abstract class NavigationBaseActivity extends BaseActivity
LinearLayout userIcon = navHeaderView.findViewById(R.id.user_details);
userIcon.setOnClickListener(v -> {
drawerLayout.closeDrawer(navigationView);
- AchievementsActivity.startYourself(NavigationBaseActivity.this);
+ ProfileActivity.startYourself(NavigationBaseActivity.this);
});
}
diff --git a/app/src/main/res/layout/activity_achievements.xml b/app/src/main/res/layout/activity_achievements.xml
deleted file mode 100644
index 01bc98bbd..000000000
--- a/app/src/main/res/layout/activity_achievements.xml
+++ /dev/null
@@ -1,495 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml
new file mode 100644
index 000000000..3ce7386c4
--- /dev/null
+++ b/app/src/main/res/layout/activity_profile.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_achievements.xml b/app/src/main/res/layout/fragment_achievements.xml
new file mode 100644
index 000000000..506d34418
--- /dev/null
+++ b/app/src/main/res/layout/fragment_achievements.xml
@@ -0,0 +1,482 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_leaderboard.xml b/app/src/main/res/layout/fragment_leaderboard.xml
new file mode 100644
index 000000000..28f5b725c
--- /dev/null
+++ b/app/src/main/res/layout/fragment_leaderboard.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2631e5d44..6f2a3a0c6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -397,6 +397,7 @@
Nominate For Deletion
Delete
Achievements
+ Profile
Statistics
Thanks Received
Featured Images
@@ -633,7 +634,6 @@ Upload your first media by tapping on the add button.
Did you shoot these two pictures at the same place? Do you want to use the latitude/longitude of the picture on the right?
Load More
No places found, try changing your search criteria.
-
Add image to Wikipedia
Do you want to add this picture to the %1$s language Wikipedia article?
@@ -649,4 +649,6 @@ Upload your first media by tapping on the add button.
6. Edit the wikitext for appropriate positioning, if necessary. For more information, see <a href="https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image">here</a>.
7. Publish the article
Copy wikicode to clipboard
+ Achievements
+ Leaderboard
diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt
index e4bacb4d8..d725a4806 100644
--- a/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt
+++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt
@@ -3,9 +3,9 @@ package fr.free.nrw.commons.delete
import android.content.Context
import android.content.res.Resources
import fr.free.nrw.commons.Media
-import fr.free.nrw.commons.achievements.FeedbackResponse
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient
+import fr.free.nrw.commons.profile.achievements.FeedbackResponse
import fr.free.nrw.commons.utils.ViewUtilWrapper
import io.reactivex.Single
import media