From bc0b5c05c7263c959e77ceae4b99bacdca347f5a Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Sun, 9 Aug 2020 16:06:32 +0530 Subject: [PATCH] [GSoC] Added option to set a new avatar (#3892) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes #3861 Use the APIs to fetch leaderboard’s based on uploads via mobile app (all time) and display it in the Leaderboard screen. * Added option to set a new avatar --- .../media/MediaDetailPagerFragment.java | 30 ++++++++ .../commons/mwapi/OkHttpJsonApiClient.java | 33 ++++++++ .../leaderboard/LeaderboardConstants.java | 2 - .../leaderboard/LeaderboardListAdapter.java | 6 +- .../leaderboard/UpdateAvatarResponse.java | 44 +++++++++++ .../leaderboard/UserDetailAdapter.java | 5 +- .../fr/free/nrw/commons/utils/ImageUtils.java | 76 ++++++++++++++++--- .../main/res/menu/fragment_image_detail.xml | 4 + app/src/main/res/values/strings.xml | 5 ++ 9 files changed, 182 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/profile/leaderboard/UpdateAvatarResponse.java diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index f98e66db3..f0d080bec 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -22,15 +22,19 @@ import butterknife.ButterKnife; import com.google.android.material.snackbar.Snackbar; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.bookmarks.Bookmark; import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesContentProvider; import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; +import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient; import fr.free.nrw.commons.utils.DownloadUtils; import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.utils.ViewUtil; +import io.reactivex.disposables.CompositeDisposable; +import java.util.Objects; import javax.inject.Inject; import timber.log.Timber; @@ -38,6 +42,14 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple @Inject BookmarkPicturesDao bookmarkDao; + @Inject + OkHttpJsonApiClient okHttpJsonApiClient; + + @Inject + SessionManager sessionManager; + + private static CompositeDisposable compositeDisposable = new CompositeDisposable(); + @BindView(R.id.mediaDetailsPager) ViewPager pager; private Boolean editable; private boolean isFeaturedImage; @@ -159,6 +171,10 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple // Set wallpaper setWallpaper(m); return true; + case R.id.menu_set_as_avatar: + // Set avatar + setAvatar(m); + return true; default: return super.onOptionsItemSelected(item); } @@ -177,6 +193,20 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple ImageUtils.setWallpaperFromImageUrl(getActivity(), Uri.parse(media.getImageUrl())); } + /** + * Set the media as user's leaderboard avatar + * @param media + */ + private void setAvatar(Media media) { + if (media.getImageUrl() == null || media.getImageUrl().isEmpty()) { + Timber.d("Media URL not present"); + return; + } + ImageUtils.setAvatarFromImageUrl(getActivity(), media.getImageUrl(), + Objects.requireNonNull(sessionManager.getCurrentAccount()).name, + okHttpJsonApiClient, compositeDisposable); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (!editable) { // Disable menu options for editable views diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java b/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java index e7e12ddef..e27d76614 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java @@ -12,6 +12,7 @@ import fr.free.nrw.commons.nearby.model.NearbyResultItem; import fr.free.nrw.commons.profile.achievements.FeaturedImages; import fr.free.nrw.commons.profile.achievements.FeedbackResponse; import fr.free.nrw.commons.profile.leaderboard.LeaderboardResponse; +import fr.free.nrw.commons.profile.leaderboard.UpdateAvatarResponse; import fr.free.nrw.commons.upload.FileUtils; import fr.free.nrw.commons.upload.structure.depictions.DepictedItem; import fr.free.nrw.commons.utils.ConfigUtils; @@ -103,6 +104,38 @@ public class OkHttpJsonApiClient { }); } + @NonNull + public Single setAvatar(String username, String avatar) { + final String urlTemplate = wikiMediaTestToolforgeUrl + + "/update_avatar.py"; + return Single.fromCallable(() -> { + String url = String.format(Locale.ENGLISH, + urlTemplate, + username, + avatar); + HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder(); + urlBuilder.addQueryParameter("user", username); + urlBuilder.addQueryParameter("avatar", avatar); + Timber.i("Url %s", urlBuilder.toString()); + Request request = new Request.Builder() + .url(urlBuilder.toString()) + .build(); + Response response = okHttpClient.newCall(request).execute(); + if (response != null && response.body() != null && response.isSuccessful()) { + String json = response.body().string(); + if (json == null) { + return null; + } + try { + return gson.fromJson(json, UpdateAvatarResponse.class); + } catch (Exception e) { + return new UpdateAvatarResponse(); + } + } + return null; + }); + } + @NonNull public Single getUploadCount(String userName) { HttpUrl.Builder urlBuilder = wikiMediaToolforgeUrl.newBuilder(); diff --git a/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardConstants.java b/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardConstants.java index 79b53ef98..e31062db6 100644 --- a/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardConstants.java +++ b/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardConstants.java @@ -6,8 +6,6 @@ public class LeaderboardConstants { public static final int START_OFFSET = 0; - public static final String AVATAR_SOURCE_URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/%s/1024px-%s.png"; - public final static String LOADING = "Loading"; public final static String LOADED = "Loaded"; diff --git a/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardListAdapter.java b/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardListAdapter.java index c6318f9b2..eb8f4c234 100644 --- a/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardListAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/profile/leaderboard/LeaderboardListAdapter.java @@ -1,7 +1,5 @@ package fr.free.nrw.commons.profile.leaderboard; -import static fr.free.nrw.commons.profile.leaderboard.LeaderboardConstants.AVATAR_SOURCE_URL; - import android.content.Context; import android.net.Uri; import android.view.LayoutInflater; @@ -72,9 +70,7 @@ public class LeaderboardListAdapter extends PagedListAdapter { + if (response != null && response.getStatus().equals("200")) { + ViewUtil.showLongToast(context, context.getString(R.string.avatar_set_successfully)); + if (progressDialogAvatar != null && progressDialogAvatar.isShowing()) { + progressDialogAvatar.dismiss(); + } + } + }, + t -> { + Timber.e(t, "Setting Avatar Failed"); + ViewUtil.showLongToast(context, context.getString(R.string.avatar_set_unsuccessfully)); + if (progressDialogAvatar != null) { + progressDialogAvatar.cancel(); + } + } + )); + } + catch (Exception e){ + Timber.d(e+"success"); + ViewUtil.showLongToast(context, context.getString(R.string.avatar_set_unsuccessfully)); + if (progressDialogAvatar != null) { + progressDialogAvatar.cancel(); + } + } + + } + private static void setWallpaper(Context context, Bitmap bitmap) { WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); try { wallpaperManager.setBitmap(bitmap); ViewUtil.showLongToast(context, context.getString(R.string.wallpaper_set_successfully)); - if (progressDialog != null && progressDialog.isShowing()) { - progressDialog.dismiss(); + if (progressDialogWallpaper != null && progressDialogWallpaper.isShowing()) { + progressDialogWallpaper.dismiss(); } } catch (IOException e) { Timber.e(e, "Error setting wallpaper"); ViewUtil.showLongToast(context, context.getString(R.string.wallpaper_set_unsuccessfully)); - if (progressDialog != null) { - progressDialog.cancel(); + if (progressDialogWallpaper != null) { + progressDialogWallpaper.cancel(); } } } private static void showSettingWallpaperProgressBar(Context context) { - progressDialog = ProgressDialog.show(context, context.getString(R.string.setting_wallpaper_dialog_title), + progressDialogWallpaper = ProgressDialog.show(context, context.getString(R.string.setting_wallpaper_dialog_title), context.getString(R.string.setting_wallpaper_dialog_message), true); } + private static void showSettingAvatarProgressBar(Context context) { + progressDialogAvatar = ProgressDialog.show(context, context.getString(R.string.setting_avatar_dialog_title), + context.getString(R.string.setting_avatar_dialog_message), true); + } + /** * Result variable is a result of an or operation of all possible problems. Ie. if result * is 0001 means IMAGE_DARK diff --git a/app/src/main/res/menu/fragment_image_detail.xml b/app/src/main/res/menu/fragment_image_detail.xml index 21f5f9be9..7339834a1 100644 --- a/app/src/main/res/menu/fragment_image_detail.xml +++ b/app/src/main/res/menu/fragment_image_detail.xml @@ -25,5 +25,9 @@ android:id="@+id/menu_set_as_wallpaper" android:title="@string/menu_set_wallpaper" app:showAsAction="never" /> + \ 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 64459cbf6..2cfeec072 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -656,4 +656,9 @@ Upload your first media by tapping on the add button. Rank User Count + Set as Leaderboard Avatar + Setting as Avatar, please wait + Avatar Set Successfully + Error setting new avatar, please try again + Set as avatar