Page MenuHomePhabricator

Proposal: Allow users to browse Commons from the Android app
Closed, DeclinedPublic

Description

Profile Information

Name: Yash Shah
IRC nickname on Freenode: yashshah7197
Web Profiles -

Location: Pune, Maharashtra, India
Typical working hours: 5:00 PM to 5.00 AM (UTC +5:30)

Synopsis

The current release of the Wikimedia Commons app is a good one for people who want to upload their own images or share some images to Wikimedia Commons. However, the current state of the app leaves a lot to be desired in terms of the feature set and the overall experience from the stakeholders' and end-users' standpoints. Some of the features of that are currently missing in the app have been requested by quite an appreciable number of users as seen in the reviews on Google Play and has also popped up and been discussed in the GitHub Issues page of the Wikimedia Commons app repository. Here is a high-level breakdown of the requested features and the ideas discussed -

  • Add a way to enable the end-users and stakeholders to browse around and view existing images on Wikimedia Commons in the app itself.
  • Add a way which will enable the end-users and stakeholders to search for existing images, categories and even sub-categories along with the images that fall under each category and/or sub-category.
  • Add a way which will allow the users and stakeholders to browse Wikimedia Commons without logging in on the app.

The above two features have been highly requested and discussed which is a clear message that the end-users and stakeholders expect and want the Wikimedia Commons app to offer a seamless experience of browsing and searching Wikimedia Commons, just like the website does.

From a developer/volunteer perspective, here is a high-level breakdown of things that need to be done to implement the above mentioned features. A detailed breakdown of tasks is given later on in this proposal.

  • Create wireframes and mockups of the activity/fragment where the user can search for images and/or categories by specific keyword(s).
  • Add an activity or a fragment to display a list of images in a RecyclerView.
  • Implement the search functionality and initially limiting it to only search and display fetched images.
  • Expand the search functionality to search and display fetched categories and sub-categories along with the images.
  • Add an activity which will display the images in a particular category along with its sub-categories.
  • Add a button to change the sort order and possibly show the best rated images first.
  • Add an option in the Login activity which will allow the users to bypass logging in and enjoy the app without logging in.

Implementation of the above features in a systematic way would make this app even more robust than it already is and would result in a clean and seamless experience for browsing Wikimedia Commons through the app.

Mentors:
Mentor: @Nes
Co-mentor: @Nicolas_Raoul

Timeline

April 23 to May 14

  • Community Bonding.
  • Better familiarisation with the existing code base.
  • Getting comfortable with the Wikimedia APIs.
  • Designing wireframes for the image list.
  • Designing wireframes for the search functionality.

May 14 to May 21

  • Create an activity for the list of featured images.
  • Add a RecyclerView for the list of images.
  • Create a ViewHolder for the featured images.
  • Populate list with dummy data.

May 21 to May 28

  • Fetching the featured images information from the Wikimedia APIs using RxJava 2.
  • Displaying the fetched featured images in the RecyclerView.
  • Show image details view when particular image is clicked in the list.
  • Pagination in RecyclerView to avoid refreshing the RecyclerView every time. Can be done using DiffUtil too.

May 28 to June 4

  • Adding search button in the toolbar according to wireframes.
  • Create an activity for search and search results.
  • Make search button launch the search activity.
  • Add a fragment and RecyclerView in the search activity for the image results.
  • Add an EditText for the search keywords and a button to perform the search.
  • Hit the appropriate endpoints in the APIs to search for images.
  • Fetch results using RxJava 2 and possibly Retrofit instead of writing our own extractor.
  • Display fetched images in the RecyclerView.
  • Show image details view when particular image is clicked in the list.
  • Pagination in RecyclerView to avoid refreshing the RecyclerView every time. Can be done using DiffUtil too.

June 4 to June 11

  • Load image details from the API.
  • Populate image details in the image details view.
  • Add additional fields such as metadata, author, etc.
  • Add an option to save the image on the device.

June 11 to June 15

  • First evaluation.

June 11 to June 18

  • Write unit tests for the image search functionality.
  • Write instrumentation tests for the image search functionality.
  • If time allows, write integration tests for the image search functionality.

June 18 to June 25

  • Select image quality depending on network speed and strength.
  • Document all code written for the image search functionality.
  • Iron out any kinks in the image search functionality.

June 25 to July 2

  • Add a fragment and RecyclerView in the search activity for the category results.
  • Add a ViewPager to switch between image and category search.
  • Hit the appropriate endpoints in the APIs to search for categories.
  • Fetch results using RxJava 2 and possibly Retrofit instead of writing our own extractor.
  • Display fetched categories in the RecyclerView.
  • Pagination in RecyclerView to avoid refreshing the RecyclerView every time. Can be done using DiffUtil too.

July 2 to July 9

  • Create an activity for category information.
  • Display all information related to the category in the activity.
  • Display sub-categories in the category details view.
  • Display images of the category in the category details view.

June 9 to July 13

  • Second evaluation.

June 9 to July 16

  • Write unit tests for the category search functionality.
  • Write instrumentation tests for the category search functionality.
  • If time allows, write integration tests for the category search functionality.

July 16 to July 23

  • Write documentation for all code for category search.
  • Iron out any kinks in category search.
  • Add option on Login page to bypass login and browse Commons without logging in.

July 23 to July 30

  • Implement FastCCI functionality.
  • Implement sorting order for search in images and categories.
  • If time allows, start implementing search by description.
  • Store all searches in SQLite database or flat files. Could possibly use Room library for this.

July 30 to August 6

  • Write final documentation.
  • Write final tests.
  • Complete final testing
  • Iron out any remaining kinks.

August 6 to August 14

  • Final evalualtions.

Participation

The following is a break down of how I'm gonna attempt to participate in GSoC and also make participation for others seamless.

Communication
Most of my communication with the community and mentors, yet, has been through the GitHub Issues page of the Wikimedia Commons app repository. For instant messaging and group chats, Google Hangouts or IRC would be a good option though I would like to suggest that we use this an opportunity to set up a Slack team for Wikimedia Commons which would greatly improve productivity. Communication would also include sharing links to helpful resources and helping the other participants out to learn and get familiar with existing technologies used in the project like RxJava 2 and Dagger 2.

Contribution
All changes and commits to the app would be made on separate branches for each feature on my fork of the Wikimedia Commons app repository and pull requests would be made subsequently. All issues would be tracked using the GitHub Issues page of the Wikimedia Commons app repository.

Weekly Reports
I plan to write a short blog post explaining the progress and work done each week throughout the duration of GSoC which will help and give future aspirants a glimpse as to what to expect in the duration of the program. This would also serve as weekly reports for the work done during GSoC and as an added bonus, also help in adding content to my blog.

About Me

I'm just your average 21 year old Indian Joe currently pursuing my undergraduate degree in Computer Science from STES Smt. Kashibai Navale College of Engineering. Currently in the third year, I'm in the sixth semester of this eight semester program, which I'm on course to complete in June 2019. I'm a technical lead at the Entrepreneurship Cell (E-Cell) of my institute where we brainstormed and came up with two products which made the lives of students in our institute easier to an extent. I've had a love affair with computers or rather technology in general since I was a 3 year old kid and have been in the world of coding since I was in 5th grade in school. I'm a patient learner and love to team up and work in a collaborative environment which benefits everyone. The open source world has taught me a lot and moulded me into a better programmer and contributing to Wikimedia Commons is just my way of expressing gratitude to the huge help the Wikimedia projects like Wikipedia have benefited me with. Also, helping out and contributing to one of the largest organizations, Wikimedia, brings a sense of self-satisfaction and pride that few organizations and projects offer.

This is the first time I will be participating in Google Summer of Code and I'm hoping to learn a lot while also having a rollercoaster ride throughout! :)

Past Experience & Skillset

I'm familiar with and comfortable working with a wide range of languages such as C, C++, Java, Python, C#, Visual Basic and Kotlin with Java and Python being my strong points. I've also had a decent amount of experience with SQL based databases like MySQL, SQLite and Oracle and also with NoSQL and graph based databases like MongoDB and Neo4j. I'm a full-time macOS user for the last 2 years and have a couple of years of Linux experience prior to that.

For skills pertaining to Android specifically, I've had a lot of experience ranging from writing Content Providers, Broadcast Receivers to even running background services. I'm also very comfortable with working with libraries and tools like Dagger 2, RxJava 2, Retrofit, Glide, LeakCanary, Timber and more.

I've also had extensive experience working with Firebase as a Baackend as a Service (BaaS) and a bit of experience in continuous integration using Travis CI. Recently, I've also dived into the exciting world of Deep Learning & Artificial Intelligence.

I've had at least two years of experience working with Android so far and have loved every bit of it. Apart from Android, I've also had experience writing micro-services and REST APIs in Python using Flask and Django, setting up my own servers and deploying micro-services on those servers. Although I've always shied away from web technologies, I've had hands-on experience with Node.js while I was working on an app for the Google Assistant which requires JavaScript Cloud Functions as webhooks. Here is a detailed breakdown of my some of my major past projects and achievements so far.

Bunksheets Android Application

This was a project we took at E-Cell to try to solve one of the major gripes of attendance bunk sheets during work for events in our college. In this app the student requests a bunk sheet by specifying the reason and time for the bunk sheet. Once the bunksheet is requested the it goes through the chain of approval from student heads, then the teachers and then finally the Head of Department after which it is approved or denied. I've implemented different RecyclerView features such as swipe to accept or deny, delete, etc. The entire app was realtime and was done by using Firebase Realtime Database as the backend. Authentication options were also given in the form of email & password or Facebook/Google login to make things easier. I've also tried to give a nice material feel to the app.

College Portal Android Application
I made this app as an entry for the software development competition Credenz 2016 which is one of the biggest technical events for college students in my city, hosted by Pune Institute of Computer Technology which is one of the premier institutes in my state for Computer Science. In this app I made a central system where users teachers and students can have a seamless experience for passing information to one another. Attendance, marks, submissions and notices could all be marked and done through the app itself and push notifications were provided for notices as well. I ended up winning the first place in the competition and that is something I'm very proud of to date! :)

Sudoku Solver Windows Application
I published this app on the Windows Store as a Windows Universal App way back in 2014 and that was my first app that I've published. In the app I used XAML to create the user interface and C# to code the business logic. I used the backtracking algorithm to solve the Sudoku. This app also won me the second place in the junior category at Credenz 2015. The app was taken down in 2017 as I didn't have a Windows machine to work on to keep it updated! :(

Event Ticket Booking Web Application
This was another project that we did at E-Cell in 2017. The primary purpose of our app was to go paperless in receipts for event bookings and enable the members of our team to manage ticket bookings easily. We also created a QR Code associated with each receipt which was scanned and checked at the entrance for our flagship event, E-Conclave 2K17. We used the the Laravel PHP framework to build the application.

Blog using HUGO and Travis CI
In this self-taken project, I spun up my own server and used HUGO to start blogging. I maintained a repository of all my posts and used Travis CI for continuous integration. Basically, every time I pushed a new post to the master branch of my GitHub repo, it would trigger a Travis CI build which would build and push the static website to my server. I took the HUGO blog down in favor of using Ghost now.

Udacity Android Basics Nanodegree Graduate
I've graduated from Udacity's Android Basics Nanodegree in February 2017 which involved completing 7 projects and also 2 mini-projects in Android. Here is the GitHub link for all projects that I've completed -

Udacity Deep Learning Nanodegree Graduate
I graduated from Udacity's Deep Learning Nanodegree around 6 months ago. In this Nanodegree I made 5 projects which involved using Convolutional Neural Networks to classify images, using Recurrent Neural Networks to generate TV scripts for the Simpson's show and for language translation, using Generative Adversarial Networks to generate faces and using a simple neural network to predict bike sharing data.

Udacity Android Developer Scholarship Recipient
I've recently been granted scholarship for an advanced Android Developer course on Udacity which has been awarded to 5000 people from India.

Quotography Android Application (in progress)
This app is a simple app which displays images from Unsplash and quotes from multiple sources. It is still in development. The major purpose of this app is for me to learn to implement the MVP pattern in my app, learn use design patterns like Dependency Injection and properly implement a good design which follows the material design spec. I've also used libraries like RxJava 2, Retrofit, LeakCanary and Glide. I hope to get it out to the masses soon and also hope that it becomes a project which people can learn from.

Contributions to Wikimedia Commons

I've recently started contributing to the Commons app repository. Here is a list of contributions that I've made.

Apart from the above mentioned contributions, I'm actively working on a few open issues as well. :)