Content Handling on Ubuntu/Unity

Registered by Thomas Voß

Unity and the overall Ubuntu experience put heavy emphasis on the notion of content, with Unity’s dash offering streamlined access to arbitrary content, both local to the device or online. More to this, Unity’s dash is the primary way of surfacing content on mobile form factors without the need to access individual applications and their respective content silos. However, surfacing and searching content from Unity’s dash is only one part of a larger content handling story that includes app-to-app content exchange, content picking UX and cross-device content exchange.

Blueprint information

Thomas Voß
Thomas Voß
Ken VanDine
Series goal:
Accepted for trusty
Good progress
Milestone target:
milestone icon ubuntu-14.04-beta-1
Started by
Thomas Voß

Related branches



Design: There are two different approaches we are considering for content picking, and we would welcome feedback and thoughts on the pros and cons of each approach. It would be valuable if feedback was structured as use cases, stating the use case first, and then the advantages/problems you see for completing the use case with each approach.

Approach A - All content 100% isolated within each application

With this approach all content is attached to a specific application. For example if a user wishes to select a photo and they have multiple programs installed which handle photos, when the user first opens the content picker they have to select which application they would like to look inside to find their photo. Once the user has selected an application, that application displays its interface for selecting its content inside the content picker. Each application only displays it's content and does not have access to the content of any other application. Therefore if a user has a photo inside photo app 1, and they open photo app 2, they will not be able to view that photo in photo app 2 unless they choose to copy the photo into photo app 2 using the content picker.

Approach B - Global view of important content types

With this approach the content picker has a global view of all content for the most important content types (photos, contacts, videos, etc...). For example if a user wishes to select a photo they open the content picker, and the content picker displays a global view of all the photos stored on the device. The interface the user uses to pick the photo is a standard interface modelled on the interface of our gallery core application. Applications can choose if they would like to display all the content stored on the device for a specific 'important' content type, or if they would like to isolate themselves and only display their specific content.

At vUDS, we have decided to implement approach A for version 1.


Work Items

Work items:
[thomas-voss] Provide an API draft, taking care of potential lifetime issues: DONE
[thomas-voss] Provide architecture proposal: DONE
[bfiller] Provide breakdown of action items: DONE
[bfiller] Define iteration-0: DONE
[fboucault] implement content source picker component per design spec: TODO
[fboucault] implement external device browser component per design spec: TODO
[fboucault] identify/implement other shared components needed to facilitate designs (toolbars for per app content pickers): TODO
[thomas-voss] define QML api for access to hub service: DONE
[fboucault] implement support for apps to launching in content picking mode: TODO
[thomas-voss] define desktop/manifest file entry for application content-type definition: TODO
[ken-vandine] app-installer registration with content manager - click package hook: DONE
[thomas-voss] finalize api definition: DONE
[thomas-voss] provide pseudo-code example of application use of api: DONE
[ken-vandine] hub service - content-mgr registration implementation and persistence: DONE
[rachelliu] flush out Oren's spec: DONE
[rachelliu] main use cases for content picker: DONE
[rachelliu] figure out who is the visual designer responsible for the content picking: TODO

Work items for ubuntu-13.06:
[mdeslaur] review and bless architecture from a security perspective: DONE
[tyhicks] define (with mdeslaur, tvoss and other stakeholders) file locations for content exchange (ie, incoming directory, should use XDG): DONE

Work items for ubuntu-13.08:
[rachelliu] user flows/wireframes for main use cases (x5 for 13.10): DONE
[rachelliu] download edge cases user flows: DONE
[schwann] implement QML API: DONE
[schwann] implement gallery app support for launching in content picking mode: DONE
[schwann] implement content picker to select photos per design spec: INPROGRESS
[ken-vandine] hub service - implement Hub: DONE
[ken-vandine] hub service - implement Import: DONE
[ken-vandine] hub service - implement Store: DONE
[ken-vandine] hub service - implement Collection: TODO
[ken-vandine] hub service - implement helper classes: DONE
[tyhicks] define libapparmor API calls for ContentManager (generalized for other trusted helpers) with tvoss, mdeslaur and other stakeholders: DONE
[tyhicks] implement libapparmor API calls: DONE

Work items for ubuntu-13.09:
[jdstrand] document directory locations and any other useful security details in the wiki (for the SDK documentation team's benefit): DONE
[jdstrand] define initial abstractions/easyprof policy groups for content picking API: DONE
[jdstrand] define initial abstractions/easyprof policy groups for content providing API: DONE
[jdstrand] integrate/refine content picking/providing policy into data_exchange policy group: DONE
[jdstrand] evilapp access to content picker: POSTPONED

Work items for ubuntu-14.04:
[ken-vandine] export support in content-hub: DONE
[ken-vandine] support for dynamic content providers in content-hub: DONE
[ken-vandine] investigate and design how content hub and online accounts will integrate: DONE
[ken-vandine] implement resolution of online accounts integration: DONE
[ken-vandine] define manifest definition for click package registration of content providers: DONE
[ken-vandine] click hooks for content provider registration: DONE
[ken-vandine] enhancing known content types: DONE
[ken-vandine] support click package launching from content-hub: DONE
[ken-vandine] add share handler: DONE
[thomas-voss] application embedding: POSTPONED
[thomas-voss] trusted sessions: POSTPONED
[ken-vandine] content source and destination picker: DONE
[fboucault] template view selection picker used by apps: TODO
[ken-vandine] qml bindings for content-hub export operations and others: DONE
[fboucault] download/export progress indicator: TODO
[dbarth] bind import functions into html5/webapps container (javascript bindings): TODO
[uriboni] browser: import from supported apps for upload: INPROGRESS
[uriboni] browser: support sharing/export to supported apps (requires download service): TODO
[renatofilho] contacts: provide picker for vcards: DONE
[renatofilho] contacts: accept import of vcards: TODO
[renatofilho] contacts: content selection view (single and multiple support): DONE
[renatofilho] contacts: support sharing/export originated from contacts app: TODO
[tiagosh] messaging: import from supported apps: TODO
[tiagosh] messaging: export to supported apps: TODO
[tiagosh] messaging: as a sharing target for given content types: TODO
[schwann] gallery: content selection view (single and multiple support): DONE
[uriboni] gallery: accept import of pictures/videos: TODO
[uriboni] gallery: support sharing/export originated from gallery: TODO
[uriboni] notes-app: accept import from supported apps: TODO
[uriboni] notes-app: support sharing/export originated from notes-app: TODO

Dependency tree

* Blueprints in grey have been implemented.