Content hub - полезные советы

../../_images/01.png

Cтраница для публикации

В Ubuntu Touch возможности приложении сильно ограничены. Обмен файлами между ними осуществляется через Content Hub, это часть операционной системы, которая занимается импортом, экспортом и совместным использованием файлов.

Несколько способов поделиться контентом

Как можно узнать из документации к Content Hub, есть несколько способов совместного доступа к файлам:

  • ContentHandler.Source (The selected app will provide a file to be imported)

  • ContentHandler.Destination (The selected app will be the destination for the exported file)

  • ContentHandler.Share (The selected app will be the destination for the exported file, which will then be shared externally)

../../_images/12.svg

Импортирование

../../_images/02.png

Webapp Creator в OpenStore

Мы изучим исходный текст Webapp Creator и найдём участок кода, отвечающий за импорт изображения, которое используется в качестве иконки. Движение с нажатой клавишей мышки откроет Content Hub, где мы сможем выбрать откуда импортировать изображение (смотрите исходный код Webapp Creator)

ContentPeerPicker {
    anchors { fill: parent; topMargin: picker.header.height }
    visible: parent.visible
    showTitle: false
    contentType: picker.contentType //ContentType.Pictures
    handler: picker.handler //ContentHandler.Source

ContentPeerPicker - элемент, который показывает приложения.

var importPage = mainPageStack.push(Qt.resolvedUrl("ImportPage.qml"),{"contentType": ContentType.Pictures, "handler": ContentHandler.Source})

contentType передаётся в Main.qml как ContentType.Pictures. Таким образом, мы увидим только те приложения, из которых мы можем импортировать только изображения. handler передаётся в той же строчке, что и ContentHandler.Source потому, что мы хотим импортировать изображение из приложения, выбранного в Content Hub.

Экспорт

../../_images/04.png

Gelek в OpenStore

В Gelek мы будем работать с некоторыми сохраненными играми, которые нужно хранить в нашем устройстве или поделиться с пользователями (через Telegram, а затем перенести их на настольный ПК).

../../_images/05.png

Удерживая курсор на иконке «Download» , мы заставим Content Hub сохранить файл игры (и он же предназначен для экспорта).

Файл игры относится к типу glksave. Мы сообщим Content Hub, что собираемся отправить файл типа All (смотрите коды на странице инсталляции).

ContentPeerPicker {
    anchors { fill: parent; topMargin: picker.header.height }
    visible: parent.visible
    showTitle: false
    contentType: ContentType.All
    handler: ContentHandler.Destination

    onPeerSelected: {

contentType is ContentType.All, so we will only see apps which are able to receive unmarked file types. handler is ContentHandler.Destination, so the app selected should store the saved game.

Нажатие вкладки «File Manager» переместит сохраненную игру в папку, которую мы выберем.

Sharing (Общий доступ)

Точно так же нажатие на иконку «share» отправит сохранённую игру другим пользователям через мессенджер Telegram (подробнее смотрите страничку с исходным кодом Webapp Creator Import Page). Шаринг - то же самое, что и экспорт, за исключением того, что приложение может обмениваться контентом извне (например, через Telegram или текстовое сообщение).

ContentPeerPicker {
    anchors { fill: parent; topMargin: picker.header.height }
    visible: parent.visible
    showTitle: false
    contentType: picker.contentType //ContentType.Pictures
    handler: picker.handler //ContentHandler.Source

    onPeerSelected: {

Разница между этим и предыдущим участком кода только в том, что handler - это ContentHandler.Share.

Подождите, почему приложения разные?

../../_images/08.png

Content Hub: Экспорт или Общий доступ

Каждый разработчик может самостоятельно определитьправила, по которым каждое приложение взаимодействует с Content Hub. Почему OpenStore показывается как место для экспорта?

Давайте проверим manifest.json для этого приложения

"hooks": {
    "openstore": {
        "apparmor": "openstore/openstore.apparmor",
        "desktop": "openstore/openstore.desktop",
        "urls": "openstore/openstore.url-dispatcher",
        "content-hub": "openstore/openstore-contenthub.json"
    }
},

The above code defines that the hooks for the app named "openstore" in relation to the "content-hub" should follow the rules defined in openstore-contenthub.json

{
    "destination": [
        "all"
    ]
}

Это значит, что OpenStore будет местом назначения для всех ContentTypes.

А что с приложением uMatriks? Давайте посмотрим его файл content-hub.json

{
    "destination": [
        "pictures",
        "documents",
        "videos",
        "contacts",
        "music"
    ],
    "share": [
        "pictures",
        "documents",
        "videos",
        "contacts",
        "music"
    ],
    "source": [
        "pictures",
        "documents",
        "videos",
        "contacts",
        "music"
    ]
}

Так, в этом примере uMatriks может быть местом назначения, исходной точкой и приложением для общего доступа для всех типов ContentType. Что можно сказать о других hooks в файле manifest.json? Об этом рассказывается в следующей части руководства.