Page MenuHomePhabricator

Proposal - Commons Android app - Make it easier for contributors to choose pictures for upload from custom picture selector
Open, Needs TriagePublic

Assigned To
Authored By
Mar 17 2022, 6:50 AM
Referenced Files
F35041892: 2022-04-07.png
Apr 7 2022, 4:36 AM
F35035201: gesture.png
Apr 2 2022, 4:03 PM
F35034935: Switch on.png
Apr 2 2022, 12:05 PM
F35034942: bubble scroll.jpg
Apr 2 2022, 12:05 PM
F35034937: Swtich off.png
Apr 2 2022, 12:05 PM
F35034693: Switch.png
Apr 2 2022, 7:08 AM
F35034606: Mark as not for upload.png
Apr 2 2022, 5:31 AM
F35034556: Graph Project.png
Apr 2 2022, 4:19 AM


Improvement on the custom picture selector - Make it easier for contributors to choose pictures for upload on the Commons Android app

Project Repository:

GSoC Idea Link:


Name: Ayan Sarkar


Linkedin Profile: ayan-sarkar-44728a1a7

GitHub Profile: Ayan-10

Other Communication Method: Google Hangouts, Zulip

Blogs on GeeksforGeeks: Articles

Location during GSoC: West Bengal, India (UTC +5:30)

Education: B.TECH In Information Technology at Haldia Institute of Technology

Typical working hours (include your timezone) during GSoC: Between IST 5 pm to IST 2 am (UTC +5:30)

Relevant Skills

  • Experience in Android Development in Kotlin / Java
  • GitHub Workflow and Git Version Control
  • Retrofit and OkHttp
  • Android UI design
  • Experience in working with MVVM, MVP, MVC architecture
  • Experience in working with Android Architecture Components
  • Basic Understanding of RxJava, Dagger2
  • Unit testing in Android (Robolectric and Mockito)
  • Understanding of REST APIs
  • Basic knowledge of Wikimedia APIs


The Wikimedia Commons Android app allows users to upload pictures from their Android phone/tablet to Wikimedia Commons. Commons is not only the image repository for Wikipedia but an independent project that seeks to document the world with photos, videos, and recordings.

GitHub link of the idea:

Commons Android App Repo:

The goal of this GSoC project is to make it easier for contributors to choose pictures for upload. The feature will include UI to mark some pictures as "not for upload" (for instance family pictures), hide/unhide marked pictures, minor changes to the selection indicator, gestures, and indicator when previewing a picture full-screen, efficient and fast scrolling.

Possible Mentor(s)

Mentor: @Nicolas_Raoul (Nicolas Raoul)

Mentor: @AdityaSrivastav2009 (Aditya Srivastav)


To be implemented
  • Mark images as not for upload Lots of images can be present on a device that is not for uploading in the Commons app like family pictures, personal images, images with copyrights. Users will try to avoid those images while uploading some images to Commons app. It will be beneficial to user if user can manually mark those as not for upload. For that purpose, two buttons will be implemented at the bottom of the custom image picker.
    1. Upload button: to start the Upload Wizard with the selected pictures (replacing the already implemented ✔️ button currently available at the top-right).
    2. Mark as not for upload button: After selecting some images user can tap this button to mark these pictures as not for upload. Not for upload images will show with a 🚫 overlay icon and greyed out. This state will be remembered even after restarting the app. Tapping "Mark as not for upload" when all selected pictures are already marked as "Mark as not for upload" has the opposite effect, which means those images will be shown as normal images.
  • Option for hide/unhide pictures Users may not want to see those images which are marked as "Not for upload" or have been uploaded already while uploading images to Commons. A switch will be implemented to hide/unhide pictures that are either marked as "Not for upload" or have been uploaded already. Hiding them allows the contributor to more easily spot pictures they might want to upload. After turning on/off the switch the images will adjust their position, and the transition will be in-place.
  • Marked images numbering Currently, when selecting 3 pictures, they are numbered "1", "2", "3". Instead, please make all numbers always show the number of selected pictures, for instance, if 3 pictures are selected, they will all have the number "3", and be uploaded in the same order as their thumbnails are shown. Limit on number of images uploaded at once Issue: 3101
  • Add a bubble scroll bar Bubble scrollbar will be added so that users can easily locate the picture they are scrolling for. The bubble will show the date on which the pictures were taken.
  • Enhanced full-screen mode For a good user experience full-screen mode will be enhanced such that the user can do all operations while staying in the full-screen mode. It will make the app more convenient for the user. A small overlay will be shown indicating whether the picture is selected or not, showing the number of selected pictures.
    • Gestures:
      • Left/right swipe to go from one picture to another.
      • Swipe up to select the picture (the equivalent of tapping it in non-fullscreen mode) and show the next picture (the picture that follows in the folder view, skipping pictures that have either already been uploaded or ignored).
      • Swipe down to immediately mark that picture as "Not for upload" (the equivalent of selecting it then tapping "Mark as not for upload" in non-fullscreen mode), and show the next picture.
How can it be implemented?
  • Mark images as not for upload Room Database will be used for handling database operations. A new entity class ex. NotForUploadStatus will be created for storing "not for upload" marked images which will create a table in the database to store all information about "not for upload" marked images. A new Dao ex. NotForUploadDao will be created to handle database operations.

    Two buttons will be implemented one is for marking images as not for upload another one is for uploading those images. After selecting some images if user clicks the Mark as not for upload button, CustomSelectorViewModel will be updated with the new selected images and the database table will be updated with selected images. While showing images on the ImageFragment by observing from viewmodel each image will be checked with the database if it's present in the not for upload database or not. If the image is present in the database the image will be shown with a 🚫 overlay icon and greyed out.

Adding a flowchart to describe the tentative workflow.

Graph Project.png (768×1 px, 101 KB)

  • Option for hide/unhide pictures A switch will be implemented to hide/unhide "not for upload" and "already uploaded" images. If user turns on the switch to hide all "not for upload" and "already uploaded" images, those images will be removed from the ImageAdapter and only uploadable images will be shown and removed images will be stored in a list with their previous indices. If user turns the switch off those removed images will be added with the adapter in their actual positions. Thus these hide/unhide images transformation will be in-place.

Adding a flowchart to describe the tentative workflow

Switch.png (768×1 px, 54 KB)

  • Marked images numbering Unlike the current state of the app where selected images are numbered as their marking index, the images will be numbered as the total number of images selected. Every time a new image will be marked, all previous marked images numbering will be changed with the total number of images selected. So all times will be updated every time after marking/unmarking an image. Adding a limitation on the number of images uploaded at once.
  • Enhanced full-screen mode To handle the swipe gestures(left, right, up, down) a gesture listener class will be implemented which will extend SimpleOnGestureListener, and inside the onFling() method all swipe gestures will be detected. To act on those detections a new event listener class will be implemented which will implement OnTouchListener inside that method onSwipeLeft(), onSwipeRight(), onSwipeUp(), and onSwipeDown() will be added which will act on those detections, also the event listener class will be initialized with the gesture detector class. At last the ZoomableDraweeView will be edited such that onSwipeLeft(), onSwipeRight(), onSwipeUp(), and onSwipeDown() will be overridden in the ZoomableActivity like this
    fun onSwipeTop() {}
    fun onSwipeRight() {}
    fun onSwipeLeft() {}
    fun onSwipeBottom() {}

On onSwipeLeft() and onSwipeRight() it will fetch the next and previous images respectively from ImageFragment and onSwipeUp() the image will be listed in selected images. After returning to ImageFragment the UI will be changed with full-screen mode edits. Also to indicate the full-screen image is selected the number of marked images will be shown in the top left corner. onSwipeDown() the single image will be inserted in the database as a "not for upload' image. After returning to ImageFragment the UI will be changed with full-screen mode edits


Mockup 1 - UI with two buttons and some not for upload images

Mark as not for upload.png (2×1 px, 1 MB)

Mockup 2(A) - UI for Switch is turned off, already uploaded, and not for upload images are visible

Swtich off.png (2×1 px, 1 MB)

Mockup 2(B) - UI for Switch is turned on, already uploaded, and not for upload images are removed. Only uploadable images are visible, also new UI for numbering of marked images

Switch on.png (2×1 px, 1 MB)

Mockup 3 - UI for bubble scrollbar with date

bubble scroll.jpg (2×1 px, 1 MB)

Mockup 4 - small overlay on the top left corner of full-screen mode to show the image is selected, it will be removed if the image is not selected

gesture.png (2×1 px, 1 MB)


TimeframeStart DateEnd DateTask
Community Bonding PeriodMay 20, 2022June 12, 2022Getting involved with organization and mentors, Getting a depth knowledge of Wikimedia APIs, and Brushing up on testing skills. Getting more Familiarized with the project structure, Read Documentation, and Code of Conduct once again.
Week 1June 13, 2022June 19, 2022Set up database
(SubTask)13-June-202216-June-2022Discuss and create Entity and Dao classes
(SubTask)17-June-202219-June-2022Write tests of the classes
Week 2June 20, 2022June 29, 2022Mark as not for upload UI
(SubTask)20-June-202224-June-2022Discuss and create UI for mark as not for upload
(SubTask)25-June-202229-June-2022Phase 1 Evaluation
Week 3June 30, 2022July 6, 2022Finish mark as not for upload
(SubTask)30-June-20223-July-2022Connect mark as not for upload UI with database
(SubTask)4-July-20226-July-2022Write tests for total implementation and Bug fix
Week 4July 7, 2022July 13, 2022Adding option for hide/unhide pictures
(SubTask)7-July-202210-July-2022Implement option for hide/unhide pictures
(SubTask)11-July-202213-July-2022Write unit tests for this feature and Bug fix
Week 5July 14, 2022July 20, 2022Marked images numbering
(SubTask)14-July-202217-July-2022Changing the whole structure of selecting images
(SubTask)18-July-202220-July-2022Changing the numbering for selected images
Week 6July 21, 2022July 27, 2022Rest of the work on numbering and Discussion of scroll bar
(SubTask)21-July-202222-July-2022Limit on number of images uploaded at once
(SubTask)23-July-202225-July-2022Write tests for marked images numbering
(SubTask)26-July-202227-July-2022Discussion of implementation of bubble srollbar
Week 7July 28, 2022August 3, 2022Implementation of Bubble scrollbar
(SubTask)28-July-20221-August-2022Implementation of bubble scrollbar
(SubTask)2-August-20223-August-2022Write tests for bubble scrollbar
Week 8August 4, 2022August 11, 2022Detection of gestures on screen
(SubTask)4-August-202211-August-2022Implementation of classes to detect swipe gestures
Week 9August 12, 2022August 19, 2022Implementation of events for each gesture
(SubTask)12-August-202215-August-2022Implementation of swipe gestures
(SubTask)16-August-202219-August-2022Connect gesture event with UI
Week 10August 20, 2022August 27, 2022Finish full-screen mode
(SubTask)20-August-202221-August-2022Addition of small overly icon
(SubTask)22-August-202227-August-2022Write tests for full-screen mode and bug fix
Week 11August 28, 2022September 4, 2022Finish all over tasks and bug fixes
(SubTask)28-August-202231-August-2022Overall left tests
(SubTask)1-September-20224-September-2022Remaining Bug fix and suggestions
Week 12 FinalSeptember 5, 2022August 12, 2022Final Evaluation

Contributions For Commons App

Bug fixes:

Here you can see all the PRs that I made.

  • Total: 38
  • Merged: 37
  • Open: 1
PR NumberAbout Bug FixIssue NumberStatus
4418Added a feature for editing coordinates (Implemented location picker).8Merged
4475Added option to show and modify location while uploading.8(comment)Merged
4771Nearby tab accessible without GPS.3732(comment)Merged
4725Option for editing depictions.4616Merged
4605Displaying Category image and Description.3604 and 4527Merged
4515Added option for bookmarking Wikidata items.3700Merged
4672Option for editing caption and description.4615Merged
4928Editing categories of an existing picture: Reuse categories selection UI from the Upload Wizard4620Merged
4605Update Nearby list according to chip state.4511Merged
4366Made locale non-dependent on phone OS settings, but choosable on app settings.1821Merged
4406Added an option to Remove a new language description while uploading.2810Merged
4755Option for adding location for those pictures which have no location.1848Merged
4746Add bookmarked items to suggested depictions .4745Open
4489Added option for sharing achievements and a back button in ProfileActivity.4312Merged
4880Show recently used languages in language selection.4544Merged
4799When Wikidata has no description showing instance_of's label as a description.4539Merged
4803Description and thumbnail is showing for the categories that are associated with Wikidata.4762Merged
4929Fixed crash when trying to edit description (in Media details)4922Merged
4754If users already selected their preference about a nearby place while uploading, don't ask again.4497Merged
4735Suggest User to turn on camera location.4728Merged
4727After uploading by sharing an image from gallery the app should returns to contributions tab.4718Merged
4719"Starting uploads" notification is cleaned up when "Finishing uploads" notification pops up.4631Merged
4551Wikidata Items media tab is showing media in beta version.4532 and 3135Merged
4481Made media details caption & description copyable.4480Merged
4479Tutorial removed from log out state.4477Merged
4356READ_EXTERNAL_STORAGE permission is not necessary while picking file from gallery.3744Merged
4933Fixes depiction is not found despite wikidata item with exact same name4913Merged
4412New review layout UI for landscape view.4343Merged
4705Next button is not clickable while background task is going on.4703Merged
4763Clicking the back button in Contribution Tab after uploading an image, exit the app.4760Merged
4830Unit Tests for LocationPickerActivity.Unit TestMerged
4846Unit Tests for LocationPickerViewModel.Unit TestMerged
4416TextView blank issue fixed.4415Merged
4382Removed next button in quiz.4309 (comment)Merged
4315In Achievements for each of the help popups, it would be great to have a link that a wiki page that explains things much more deeply. So I added a link to each info button that shows an alert dialogue and there I add a READ ME button from where the user can open the following custom webpage.3433Merged
4333Fixed this issue with androidx.appcompat.widget.SearchView and rxBinding3 to show the searchview in lower API devices.4327Merged
4341Toggling the info on the fields in the achievement tab is difficult because the icons are so small. So I make the whole label clickable. Now users can anywhere in the label to see the dialog. I don't remove the icon because It will help the user to understand that the label is clickable..4318Merged
4323The help icon was getting invisible for small screen devices. After fixing, now the icon is visible for every device cause it's adjusting its lines instead of overlapping.3434Merged

Code Reviews:

PR NumberAbout ReviewIssue Number
4518Recognised a bug in the PR which is not resolving the actual issue.4513
4306Added before and after merge differences, found some minor code style mistake and java modifier issues4299


Here you can see all the issues that I created.

Issue NumberAbout IssueStatus
4759SSLHandshakeException while logging in on devices with API level 19.Open
4716Tapping notification (Tap to view your upload) is not working at all.Open
4507App crashed while deleting recent searches.Open
4607Copied description, caption, and language structure is removed after canceling upload of one mediaOpen
4749Crash while clicking on the hamburger icon on the bottom sheetClosed
4415Statistics TextViews are not showing in Achievements FragmentClosed
4402Pause/Resume Button is not available in lower API devicesOpen
4532No images are showing in Items media tabClosed
4400{{Creator: Andy Mabbet}} in place of actual author nameOpen
4499Unit tests are breaking because of recent changes in some ActivitiesClosed
4733Categories should be fetched every time they are updatedOpen
4718After uploading by sharing an image from the gallery the app again returns to Upload ActivityClosed
4760Clicking the back button in Contribution Tab after uploading an image, return again to Contribution TabClosed
4611Make custom image selector available from NearbyOpen
4589Empty screen while no images found in custom picture selectorClosed
4590FAB of custom selector is still open after uploadingClosed
4320If GPS is not turned on and user click YES in the Turn on location dialog. It should turn on GPS directly instead of going to Settings like Google Maps.Open
4312ProfileActivity should have a back button and the title bar should have some contentClosed
4327On Nearby Fragment Place type SearchView is not visible properly in lower API devicesClosed
4335If the location is not available and user clicks to Exists and Needs Photo chip, it does not respond. In that state, if user clicks those chips it should show a Toast saying " Location not available ".Open
4343Elements of ReviewActivity is not visible to users in the landscape. We should make a landscape layout for it.Closed
4762Only name of the category is showing for the categories which are linked with depictsClosed

Helping Fellow Contributors

Issue NumberIssue
4824Need help in writing unit test
4794"No location found" popup location editor: Also remember zoom level
4931"Description edit dialog does not always work
4808Open the last opened screen of bottom navbar when launching the app

About Me

I am a second-year Information Technology undergraduate student at Haldia Institute of Technology.

I am passionate about Android development and I have been doing it for almost more than 2 years. I am an enthusiast of open source and love to learn and share. I have developed several apps. One of my apps is in Playstore also with 15k+ downloads. Playstore Link

Since I get to know about open source I have been contributing to various open-source projects regularly. Thanks to GSOC and Wikimedia that I found this project and I found it very interesting. I have been contributing to the Commons Android app since April 2020. I have been a very consistent contributor to Commons app since I get know about the Commons app. I think this project will be a great platform for me to learn a lot. Other than the Wikimedia Commons Android app I have also contributed to the other open-source organizations like FossAsia, Amahi, Study Partner, etc.

Past Experience

Personal Projects

  • Vaccine Slot Alert App: Covid vaccine notifier for India - This app solves a real problem of India. Getting an appointment for the Covid-19 vaccination is really difficult in India during the pandemic. So this app will notify users when the vaccine gets available. The app will show notification only if the vaccine increased with all information about the vaccination center.
    • 15k+ downloads in Playstore
    • The app fetches vaccine data from govt. APIs in a period of 15 min using Work Manager and I made an in-app algorithm which compares the new vaccine data with the previous one stored in the database and shows a notification if some vaccine increased.
    • Used Retrofit and Gson for API calls, Used Junit for tests.
  • Conduit App: Medium Website Clone - Make a clone of the renowned blog app Medium. To build this project used a backed API called In the app, you can log in/sign up and write a blog, and read others' blogs.
    • Used Retrofit and Gson for API calls
    • Used Junit for tests
    • Used LiveData and ViewModel
    • Used Navigation Architecture
  • Sun Shine: Weather App - This app helps you see the weather forecast of your favorite cities.
    • API calls using volley library.
    • Notification
    • Used content provider.
  • Emojify App - This app can detect your face and then classify it. According to your mood, the app can cover an emoji on your face.
    • used mobile vision library for face recognization

Work Experience

    • Got merged 4 Pull requests. Contributed to various projects mentioned in other contributions ( Merged )
    • Responsible for writing technical blogs on various technical topics.




  • Are you eligible for Google Summer of Code?

    Yes, I am eligible for Google Summer of Code.
  • Do you plan to submit any other proposal apart from this one?

    No, I am only submitting this proposal.
  • Do you have any other plans during the period of GSoC?

    No, I don’t have any other plans during the period of GSoC. Google Summer of Code is the topmost priority for me.
  • How many hours per week can you dedicate to this?

    I will dedicate as much as needed. Minimum 30-40 hours each week I will definitely give but I am willing to dedicate more if needed.
  • Have you been accepted to GSoC before?

    No, I applied to this project under the Wikimedia Foundation last year but was not selected.

Why should I be selected for the project

Since I get to know about the project I was very frequent with it throughout the year. From April 2020 I am contributing to Commons very frequently, solved a lot of bugs, and worked on a lot of issues, had a good amount of meaningful code addition to the codebase. I applied to last year's GSoC but was not selected however I completed 50% of my tasks from my previous year's proposal. I also reported many issues, helped maintainers in review and helped fellow contributors with bug fixes and contributions, involved in many discussions. As I have worked on various types of issues the codebase is very familiar to me now.

Moreover, I learned a lot from this organization and project while contributing. This project gave me the confidence to work on any issue no matter how difficult it is, it gave me the confidence to build an app from scratch which solves a real-world problem. I want to learn more from this organization and help others, want to get more involved with the organization. Even after GSoC, I will stay with the organization. This year GSoC will help me to get to know a bigger aspect of not only overall learning but also the beautiful work culture of the organization.

Also, I am very interested in this year's task idea. I already worked with MVVM and Room Database on many medium to small projects. I already did some research on the bubble scrollbar. I am familiar with Wikimedia APIs. I think things will help me while implementing the task ideas. Thus, I believe I have the perfect set of skills required for these tasks.


  • Why do you want to contribute to this project?

    After I found the organization I absolutely loved the way this community works. Community members are so helpful and generous to everyone. I am going to learn and gain experience so much from this project and can come up with new ideas. Other than that I found this project very interesting. So I want to mention that I have already gone through the codebase and project structure in which I want to contribute related to what I want to contribute to this project as you can see in the implementation section in the proposal.
  • What does open-source mean to you?

    Open Source is a platform for learning. People say "learning while doing" is the best way to learn and Open Source is the way to do so. It helps to challenge yourself and helps to get that potential out of you. It gives a lot of exposure to a student. It also helps to build a great community and helps to promote diversity. It's a way to learn and give it back to the community by contributing and helping others.
  • What does GSoC mean to you?

    For me, GSoC is a platform to learn and gain experience and also give something to the community, and also GSoC is not just about selection. It's more than that. It's about staying with the organization even after GSoC ends and giving my 100% to complete tasks that I committed to do and also I can get to learn new things so much here.

Event Timeline

Aklapper renamed this task from GSoC 2022 Proposal - Commons Android app - Make it easier for contributors to choose pictures for upload from custom picture selector to Proposal - Commons Android app - Make it easier for contributors to choose pictures for upload from custom picture selector.Mar 17 2022, 12:57 PM
Aklapper added a subscriber: Aklapper.

sir, I have a question

According to your GSoC Idea Link: , you are working on the issue GSoC 2022: Improve the custom picture selector . But while reading your proposal implementation I found out that you want to work on a different project which is

please clear my doubt

I will make a proposal on It's not fully updated yet. It will be updated soon.

but does not have to do anything with CROP/ROTATE/BLUR effects, it's completely different things to implement.

Pheonix10 updated the task description. (Show Details)

Great proposal, the work is well explained, there are even screenshots, the schedule makes sense.
Just a few very minor typos:
After marking some images -> After selecting some images
Not for uploaded images -> Not for upload images
Implementaion -> Implementation
Rest work -> Rest of work
Activies -> Activities

@Nicolas_Raoul Thanks a lot for the feedback. I have made the changes.

Just one query - What is the size of the project? option - (medium/large), This question is being asked while proposal submission and it strictly mentioned that the size must match the size that the target organization expects.

Thank you for asking! Would you mind sending a screenshot of the form so that we can be 100% sure to have the right choice?
At we wrote Expected size of project: 350 hours, Difficulty rating: mediumbut without seeing the form I am not 100% sure how that translates to.
Thanks in advance!

2022-04-07.png (863×1 px, 100 KB)

I think large is referring to 350 hours, not sure though.

Also, Can you please suggest what will be the best keywords to put under "Project Topics" for this project?

Thank you! Based on your screenshot, I added steps at the 7th bullet of

You are right, 350 hours is the largest per

Please do not hesitate to post more form screenshots if anything is unclear.


Thanks a lot for helping.

Looks good.
Nice work with flowcharts and mockups.

Hi! I am Srishti, one of the org admins - it's great to see your interest in applying to GSoC with Wikimedia! You can safely ignore this message if you have already followed our participants' guide. As you develop your proposal, we want to ensure that you follow the application process steps:, primarily communicate with project mentors, integrate their feedback in your proposal, adhere to the guidelines around proposal submission, contribute to microtasks, etc. Let us know if there are any questions!

As the GSoC deadline is soon approaching in less than 24 hours (April 19, 2022, 18:00 UTC), please ensure that the information in your proposal on Phabricator is complete and you have already submitted it on the Google's program website in the recommended format. When you have done so, please move your proposal here on the Phabricator workboard from "Proposals in Progress" to the "Proposals Submitted' column by simply dragging it. Let us know if you have any questions.