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

../../_images/01.png

Content Hub Share Page

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

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

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

  • ``ContentHandler.Source``(Выбранное приложение будет источником импортируемого файла)

  • ``ContentHandler.Destination``(Выбранное приложение будет местом назначения экспортируемого файла)

  • ``ContentHandler.Share``(Выбранное приложение будет местом назначения для экспортированного файла, который будет в общем доступе)

../../_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 - это``ContentType.All``, поэтому мы увидим только приложения, которые могут получать файлы с неуказанными типами. handler - это ContentHandler.Destination, поэтому выбранное приложение должно сохранять файл игры.

Нажатие вкладки «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"
    }
},

Приведённый выше код показывает, что в приложении есть hooks "openstore"``связанные с ``"content-hub", и они должны работать по правилам, заданным в файле 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? Об этом рассказывается в следующей части руководства.