Google Summer of Code - 2015
============================

Introduction
------------
Kivy is a cross-platform, business friendly, GPU Accelerated open source 
Python library for rapid development of applications that make use of 
innovative user interfaces, such as multi-touch apps.

The Kivy Organization oversees several major projects:

* The `Kivy <https://github.com/kivy/kivy>`_ GUI Library
* The `Python-For-Android <https://github.com/kivy/python-for-android>`_ 
  compilation tool.
* The `Kivy-iOS <https://github.com/kivy/kivy-ios>`_ compilation tool.
* The `PyJNIus <https://github.com/kivy/pyjnius>`_ library for interfacing with 
  Java from Python.
* The `PyOBJus <https://github.com/kivy/pyobjus>`_ library for interfacing with 
  Objective-C from Python.
* The `Plyer <https://github.com/kivy/plyer>`_ platform-independent Python 
  wrapper for platform dependent APIs.
* `Buildozer <https://github.com/kivy/buildozer>`_ - A generic Python packager 
  for Android, iOS, and desktop.

Altogether, these projects allow the user to create applications for every 
major operating system that make use of any native APIs present. Our goal is to 
enable development of Python applications that run everywhere off the same 
codebase and make use of platform dependent APIs and features that users of 
specific operating systems have come to expect. 

Depending on which project you choose you may need to know Cython, OpenGL ES2, 
Java, Objective-C, or C in addition to python. We make heavy use of Cython and 
OpenGL for computational and graphics performance where it matters, and the 
other languages are typically involved in accesses OS or provider level APIs.

We are hoping to participate in Google Summer of Code 2015. This page showcases 
some ideas for GSoC projects and corresponding guidelines for students 
contributing to the Kivy Framework.

Requirements
------------

It is assumed that the incoming student meets some basic requirements as 
highlighted here:

* Intermediate level familiarity with Python.
* Comfortable with git and github (Kivy and its sister projects are all managed 
  on github) If you have never used github before you may be interested in this 
  `tutorial <https://guides.github.com/activities/hello-world/>`_.
* Comfortable with event driven programming.
* Has suitable tools/environment for kivy or the sister project you are going 
  to work on. For example to be able to work on PyOBJus you would need access 
  to an iOS device, mac with xcode and a developer license, to work on PyJNIus 
  you would need an Android device, and to work on plyer you would need access 
  to hardware for both platforms.

  
Additional desired skills may be listed with specific projects.

Familiarize yourself with the 
`contributing guide <http://kivy.org/docs/contribute.html>`_ 
We can help you get up to speed, however students demonstrating ability in 
advance will be given preference.

How to get setup
----------------

For Kivy, the easiest way is to follow the installation instructions for the 
development version for your specific platform:

http://kivy.org/docs/installation/installation.html#development-version

For the rest it's usually sufficient to install the relevant project from git 
and add it to your PYTHONPATH.

eg.. for PyJNIus::

    git clone http://github.com/kivy/pyjnius
    export PYTHONPATH=/path/to/pyjnius:$PYTHONPATH


Project Ideas
--------------
Here are some prospective ideas sourced from the Kivy development team, if 
none of these projects interest you come talk to us in #kivy-dev about a 
project idea of your own.

Beginner Projects
~~~~~~~~~~~~~~~~~
These projects should be suitable for anyone with a college level familiarity
with Python and require little knowledge of platform specifics.

**Kivy Designer**

  Description:
    Kivy Designer is a GUI tool for creating Kivy GUI layouts written in Kivy. 
    You can compose, customize, and test widgets using the tool. This project 
    has been the subject of 2 previous GSoC and is experimental, alpha level 
    software at the moment. However, it is a very popular request for more 
    updates among our users; if you are interested in GUI tool development 
    this could be a great fit for you!

  The Student will:
  
  - Integrate Buildozer, which is our build tool for deploying to different 
    target OS, within the kivy-designer.
  - Interface for using hanga.io (Remote Buildozer server) as a deployment 
    target.
  - Better File management for project files. Browser Pane.
  - Interface to test using different screen modules, for emulating interface 
    on different screen sizes.
  - Interface to Select different targets, simulator or actual device if 
    connected to deploy to.
  - Add mobile specific UI fixes(mostly making sure UI looks and feels the 
    same on tablets as on desktops)
  - Work on stability fixes.

  References:
    - https://github.com/kivy/kivy-designer
    - http://github.com/kivy/buildozer
    - http://hanga.io

  Expected outcome:
    It is expected that the student completes all the features mentioned above,  
    except stability fixes which is dependent on however much time is left 
    after completing the rest of the features. 

  - **Mentors**: Akshay Arora, Ryan Pessa
  - **Requirements:** Access to Linux, Windows, or OS X
  - **Task level**: Easy
  - **Desired Skills**: Experience with other GUI creation tools. Familiar 
    with Kivy approach to EventLoop and UIX Widgets.

**Matplotlib Integration**

  Description:
    More advanced graphing and plotting tools are a frequently requested 
    addition to Kivy, and it would be ideal to provide them via integration 
    with matplotlib's extensive feature set. The primary goal of the project 
    would be to write a Kivy backend to matplotlib that displays plots using 
    Kivy's own graphics API, but it would also potentially involve ensuring 
    that matplotlib is deployable on every platform Kivy supports.

  References:
    - http://matplotlib.org/
    - https://github.com/kivy/kivy

  Expected outcome:
    The matplotlib widgets will be included in the Kivy garden and ready to 
    use on all of Kivy's supported OS.

  - **Mentors**: Alexander Taylor, Matthew Einhorn, Jacob Kovac
  - **Requirements:** Access to Desktop OS and ideally at least one mobile 
    platform
  - **Task level**: Easy
  - **Desired Skills**: Familiarity with Kivy widget construction and 
    matplotlib. 

Intermediate Projects
~~~~~~~~~~~~~~~~~~~~~
These projects will involve more than just pure Python coding. You may find 
yourself either dealing with the details of cross platform compilation or 
working with communicating between Python and an API in a different language.

**Plyer:**

  Description:
    Plyer is a platform-independent Python API to use features 
    commonly found on the desktop and mobile platforms supported by 
    Kivy. The idea is to provide a stable API to the user for 
    accessing features of their desktop or mobile device.
    
    The student would replace some `.java` code currently in the Kivy 
    project to a more appropriate place in Plyer. In addition, the 
    student would work on improving access to platform specific 
    features through Plyer, including accessibility, Bluetooth, 
    Bluetooth Low Energy, recording and previewing the video camera, 
    accessing contacts, recording audio, and utilizing speech 
    recognition. 
    
    Under the hood you'll use PyJNIus on Android, PyOBJus on OS X and 
    iOS, ctypes on Windows, and native APIs on Linux. This probably 
    would also include improving PyObjus and PyJNIus to handle 
    interfaces that they can't right now.
    
  References:
    - https://github.com/kivy/plyer
    - https://github.com/kivy/pyjnius
    - https://github.com/kivy/pyobjus
    - https://github.com/kivy/python-for-android
    - https://github.com/kivy/kivy-ios
  Expected outcome:
    A successful outcome would include moving the Kivy Java code to 
    plyer and implementation of some or all of the new facades to be 
    decided with the student.
    
  - **Mentors**: Gabriel Pettier, Sebastian Popute
  - **Requirements**: Access to Linux, Windows, OS X, iOS device,  
    Android device.
  - **Task level**: Intermediate
  - **Desired Skills**: Familiarity with Pyjnius, PyOBJus.

**Font Reshaping and Font Fallback Support**

  Description:
    Currently Kivy does not support reshaping for alphabets such as Arabic, 
    Persian, Thai, or Devanagari. The solution is to integrate a text shaping
    engine- Harfbuzz. You would need to ensure that we can compile Harfbuzz
    on every platform and properly integrate it as a core text provider.
    
    The second part of the same project would involve font fallback support.
    If a particular character/glyph is missing; currently we show a [] box.
    The solution for this would involve either using an OS API if available
    or maintaining a hashtable for the default fonts on each OS which can be
    used for glyph fallback.

  References:
    - http://www.freedesktop.org/wiki/Software/HarfBuzz/
    - https://github.com/kivy/kivy/tree/master/kivy/core/text

  Expected outcome:
    Font fallback and text reshaping support Kivy and correct compilation 
    recipes for the libs used (harfbuzz) for platforms that need it, 
    such as Python-For-Android.

  - **Mentors**: Akshay Arora, Jacob Kovac
  - **Requirements:** Access to Desktop OS and ideally at least one mobile 
    platform
  - **Task level**: Intermediate
  - **Desired Skills**: Familiarity with text rendering, HarfBuzz, and Kivy's 
    provider abstraction.


Hard Projects
~~~~~~~~~~~~~
These projects may involve very in-depth knowledge of Kivy's existing 
internals, the hairy details of cross-platform compilation, or other fairly 
advanced topics. If you are comfortable with the internals of Python, working 
with C code, and using Cython to build your own C extensions these projects 
may appeal to you. 

**Python-For-Android Revamp:**
  
  Description:
    Currently Python-For-Android is not very flexible and have a very specific 
    bootstrap crafted for use with Kivy's old SDL1.2/1.3 backend used through 
    Pygame and functions only with Python2. Your job would be to make the 
    necessary changes to expose swappable bootstraps, python interpreters,
    and the appropriate compilation options for ARM and x86 Android. This
    project will involve a significant amount of refactoring the current tool,
    as much hardcoded functionality needs to be made optional. A student 
    looking to take on this task should be familiar with compiling Python,
    the compilation process for Cython modules, and the Android SDK and NDK.

  The Student will:

  - Introduce bootstrap argument for the distribute script
  - Introduce a new SDL2 bootstrap
  - Refactor old bootstrap to use new approach
  - Refactor pyjnius to find the appropriate Activity from the provided 
    bootstrap
  - Introduce option for compilation with Python3 instead of Python2, this will
    involve properly configuring the blacklist of omitted modules, the 
    collection of libs into one large one to avoid shared library limit on 
    older devices, and performing any Python3 code conversions necessary.
  - Ensure all recipes work with Python3 version of their modules
  - Introduce option for compiling for different architectures (ARM and x86)

  References:
    - https://github.com/kivy/python-for-android

  Expected outcome:
    Python-for-Android with more options for compilation including Python2 
    and Python3, legacy Pygame bootstrap, SDL2 bootstrap, and ARM and x86 
    compilation options.

  - **Mentors**: Mathieu Virbel, Jacob Kovac
  - **Requirements:** Access to Linux, Android.
  - **Task level**: Hard
  - **Desired Skills**: Understanding of cross-compilation for Android, 
    familiarity with PyJNIus


How to Contact devs
-------------------
Ask your questions on the Kivy users forums http://kivy.org/#forum

Or send a mail at kivy-users@googlegroups.com

Make sure to Join kivy-dev user group too @ 
https://groups.google.com/forum/#!forum/kivy-dev

You can also try to contact us on IRC (online chat), to get the irc handles of 
the devs mentioned above visit http://kivy.org/#aboutus

Make sure to read the `IRC rules <http://kivy.org/docs/contact.html>`_ before 
connecting. `Connect to webchat <http://webchat.freenode.net/?nick=kvuser_GSOC_.&channels=kivy&uio=d4>`_


Most of our developers are located in Europe, India, and North America so keep 
in mind typical waking hours for these areas.


How to be a good student
------------------------

If you want to participate as a student and want to maximize your chances of 
being accepted, start talking to us today and try fixing some smaller problems 
to get used to our workflow. If we know you can work well with us, you will 
have much better chances of being selected.

Here's a checklist:

* Make sure to read through the website and at least skim the documentation.
* Look at the source code.
* Read our contribution guidelines.
* Make a contribution! Kivy would like to see how you engage with the 
  development process. Take a look at the issue tracker for a Kivy project 
  that interest you and submit a Pull Request. It can be a simple bug or a 
  documentation change. We are looking to get a feel for how you work, not 
  evaluating your capabilities. Don't worry about trying to pick something 
  to impress us.
* Pick an idea that you think is interesting from the ideas list or come up 
  with your own idea.
* Do some research **yourself**. GSoC is about give and take, not just one 
  sided interaction. It is about you trying to achieve agreed upon goals with 
  our support. The main driving force in this should be, obviously, yourself. 
  Many students pop up and ask what they should do. You should base that 
  decision on your interests and your skills. Show us you're serious about it 
  and take the initiative.
* Write a draft 
  `proposal <https://wiki.python.org/moin/SummerOfCode/ApplicationTemplate2014>`_
  about what you want to do. Include what you understand the current state of
  the project to be, what you would like to improve, how, etc. 
* Discuss that proposal with us in a timely manner. Get feedback.
* Be patient! Especially on IRC. We will try to get to you if we're available. 
  If not, send an email and just wait. Most questions are already answered in 
  the docs or somewhere else and can be found with some research. Your 
  questions should reflect that you've actually thought through what you're 
  asking and done some rudimentary research.
* Most of all don't forget to have fun and interact with the community. The 
  community is as big a part of Open Source as the code itself.
  
What to expect if you are chosen
--------------------------------

* All students should join the #kivy and the #kivy-dev irc channels daily, 
  this is how the development team communicates both internally and with the 
  users. 
* You and your mentors will agree on two week milestones for the duration of 
  the summer. 
* Development will occur in your fork of the master branch of Kivy, we expect 
  you to submit at least one PR a week from your branch into a branch reserved 
  for you in the primary repo. This will be your forum for reporting progress 
  as well as documenting any struggles you may have encountered.
* Missing 2 weekly PR or 2 milestones will result in your failure unless there 
  have been extenuating circumstances. If something comes up, please inform 
  your mentors as soon as possible. If a milestone seems out of reach we will 
  work with you to reevaluate the goals.
* Your changes will be merged into master once the project has been completed 
  and we have thoroughly tested on every platform that is relevant!
