RAPPS Enchancements: GSoC 2017 Edition Final Report

by sanchaez | August 28, 2017

Introduction

ReactOS App Manager (RAPPS) is an app used in ReactOS to download apps, tested by ReactOS team and community. It also manages apps that are installed - you can view apps that are present on your system and uninstall them. The goal of this project was to improve RAPPS and add some very useful features.
Here is a video presenting it's features:

Video

Table of contents


Building

Building RAPPS is no different as building parts of ReactOS. You can build it via RosBE:

  1. Checkout the reactos/branches/GSoC_2017/rapps/reactos repo via your favourite svn client. Alternatively you can use ssvn from RosBE. Set the environment variable ROS_BRANCH to "GSOC_2017/rapps" and do ssvn create
  2. Make folder for output & move there
  3. Run configure script <source path>/configure
  4. run ninja rapps
  5. Go to the <output folder>/base/applications/rapps for the executable.

For more details please check out the official build instructions.

Testing

RAPPS is mostly straightforward to use. Just doubleclick the app you want to install or select multiple apps via checkboxes. You can also invoke a context menu on each entry for other commands.

Changes made during development

RAPPS Overview: ReactOS

Visually RAPPS remains mostly the same. It's base design isn't changed. However, I've added some enhancements for the UI. Some of them won't be listed here as they are not only visual.

Application List Improvements

New Application Info 2: ReactOS

One of the goals on the first week was editing the info for available applications. I've added several new information types for this panel.

The info panel displays status right after the name of the app. Statuses can be "Not installed", "Installed", "Update available". Installation check is done via checking the /Uninstall keys in the registry, and it's not very reliable - every app writes it's own string there. There already is a field which allows you to specify this string per app, but no apps database entries actually use that right now. While this string is a prefered method of doing such checks, I've decided to also do them with the existing plain names with or without version attached (this is a common thing), and that worked very well.

Version number is also retrieved from the same registry key. When the app is installed, and the available version is higher, then RAPPS would show "Update available" status. If the check can't happen or installed version is greater it falls back to "Installed". Suffers from the very same problem as the above, because version check uses the same method.

Image

Another added field is Languages field. This field can tell you if this app is translated to your language or English and how many more there is. This one requires adding additional Languages field to the DB entries where you add all the language codes app supports separated by |. Example: Languages=0C09|0813|0422 \\English|Dutch|Ukrainian Multiline parameters are also supported.

And the last field is LicenseInfo. It's a field in the DB which, when present, changes the way License field in the info is shown. Value 1 stands for "Open Source", 2 - "Freeware" and 3 - "Demo/Trial". Introducing this would highlight the open source apps among the rest.

New Icons Overview: ReactOS

I've used Faenza as well as some random icons from the Internet.

Old RAPPS used the same boring icon for every app in the list. I've added support for 'per app' icons, that can be loaded from AppData/rapps/rapps/icons folder (that's where the database entries are).

Bulk installing

New Download Dialog: ReactOS

Previously you could only download and install one app at time and you could not use RAPPS while doing it. This change introduces new download dialog that can download and install multiple apps sequentially and also it's now modeless. That means you can continue using RAPPS while it downloads something. Dialog also shows download progress status for each app.

Image

To issue this download you can check multiple checkboxes (use 'Select/Desellect All') and press 'Install' button. The download process begins immediately.

Image

This GIF is from earlier days of testing when RAPPS had 'Installed' disabled and there was a visual bug with decrementing. These are fixed now.

In the statusbar at the bottom now appears application selection count. Note that checkbox selection drops every change of category. Checkboxes also hide when user switches to 'Installed' category.

Scripted installation

Command Line Install: ReactOS

Long requested feature - unattended installs! Well, not very correct, since it will still run those installers in foreground, but you can specify exactly what app you want without firing up GUI. There are two keys now:

  • /INSTALL - accepts multiple apps as values and installs them if they are available.

    Example: rapps /INSTALL 7-Zip AkelPad

  • /SETUP - accepts a full path to the .inf file, where in [RAPPS] block you can specify which apps to install using one Install= key per single app.

Example:

[Version]
Signature = $Windows NT$
ClassGUID = {00000000-0000-0000-0000-000000000000}

[RAPPS]
Install=7-Zip
Install=AkelPad 

These two use the name of the app, that's specified in the database. However, I would like to change that to the names of DB files, since they are much shorter and easier to write manually.

Other improvements

And, of course, I've fixed some bugs and made other improvements to RAPPS:

  • Fixed applications list updating more than once because of the search bar timer
  • 'Update database' menu entry now working
  • 'Update every run' setting now working
  • Download folder now defaults to <user>\My Documents\RAPPS Downloads (since ReactOS doesn't have 'My Downloads') and some other.

Future work

While almost everything works, RAPPS still needs additional changes so it wasn't merged yet. But I expect it to be mergable pretty soon.

There still are some things I want to improve or left incomplete. I've mentioned some them in the previous chapters, but to name a few:

  • Making app selection persistent across the app
  • Improving Installed category - left untouched by this project
  • Adding comfirmation dialog for the downloads
  • Adding parallel downloads
  • Making RAPPS maintainable

Also, my proposal initially contained the 'Setup mode' function. ReactOS team decided to postpone that and focus on other features. Other thing that's left out is Screenshots view. That was also posponed since RAPPS has a very simple DB system. Maybe on the next GSoC... :)

Conclusions

ReactOS team is awesome! I really enjoyed working on the project and working with my mentors and devs. This project gave me valuable knowledge on what FOSS community is like. And also some experience on refactoring, debugging, and in general. 

I'll definetly stay with the project! Thanks Google for the GSoC that gave me an oportunity and incentive to work on something great.

P.S

I'm sorry for not keeping you updated on the last month with blogs. But expect another post or two about this project and Hackfest! Also, I gave updates on the live stream from the Hackfest, so you should watch that as well! And, of course, see the video at the beginning. Good day and happy hacking!