Эта статья посвящена вопросам использования инструментов, входящих в состав Palm® Mojo™ SDK.

При создании приложения для Palm WebOS, используется такая последовательность действий:

WebOS Application Development Workflow

На данный момент официальная документация содержит описание всех этапов, кроме этапа подписывания приложения. Соответственно в SDK доступны утилиты командной строки, обеспечивающие работу на каждом из перечисленных выше этапов.

  • palm-generate — Для генерирования сцен и приложений
  • palm-package — Для создания инсталляционного пакета, который можно установить на устройство или в эмулятор
  • palm-install —Для установки пакетов на устройство или в эмулятор
  • palm-launch — Для удаленного запуска приложений на устройстве или в эмуляторе
  • worm.jar — Для профилировки приложений

palm-generate

Этот скрипт используется для создания приложений и сцен

Синтаксис вызова утилиты:

palm-generate options

Доступны следующие параметры запуска:

Опция Описание
-f
–overwrite
Перезаписывать существующие файлы
-l
–list
Вывести список доступных шаблонов.
-p {property}
–property={property}
Определяет свойства генерируемого шаблона. Параметр {property} содержит JSON-объект или пары ключ-значение в формате “ключ=значение”. В обоих случаях необходимо заключение значения в кавычки. Кроме того, если в значениях есть пробелы, то эти значения должны быть заключены в одинарные кавычки.
-t {template}
–template={template}
Указывает на необходимость использования шаблона {template}. Если этот параметр не указан, то по умолчанию будет генерироваться новое приложение – шаблон new{{_app}}.
–help Вывод справочной информации.
Примеры использования

Сгенерировать проект с названием “Sample Application” в папке ~/projects/SampleApp

palm-generate -p "title=Sample Application" ~/projects/SampleApp

Создать новое приложение и указать название, уникальный идентификатор и версию

palm-generate -p "{title:'Super Application', id:com.mystuff.superapp, version:'1.1'}" ~/projects/SuperApp

Добавить новую сцену с названием First в приложение HelloWorld

palm-generate -t new_scene -p "name=First" ~/projects/HelloWorld

palm-package

Утилита-упаковщик, которая создает .ipkg файл, который, в свою очередь, может быть установлен в эмулятор или на устройство.

Синтаксис вызова:

palm-package [options ] application-directory

Доступные опции:

Опция Описание
-o {directory}
–outdir={directory}
Каталог, в котором должен быть создан .ipkg файл. Если эта опция не задана, то установочный пакет приложения будет создан в текущем каталоге.
–exclude={pattern} Исключает из обработки файлы, которые подпадают под описание {pattern}. Шаблон {pattern} может также содержать символы * и ?. Значение шаблона чувствительно к регистру если не указана опция –ignore-case.
-X {pattern_file}
–exclude-from={pattern_file}
Исключает из обработки файлы, названия которых совпадают с любым из шаблонов, указанных в параметре {pattern_file}. В файле {pattern_file} указываются шаблоны названий файлов, по одному в каждой строке. Шаблоны названий файлов могут содержать символы * и ?. Значение шаблона чувствительно к регистру если не указана опция –ignore-case.
–ignore-case Указыват что регистр символов в названиях файлов должен быть проигнорирован.
–no-exclude-eclipse По умолчанию, файлы проектов Eclipse исключаются из обработки. Если нужно их включить в инсталляционный пакет, используется эта опция.
–no-exclude-hidden По умолчанию, скрытые файлы исключаются из обработки. Если нужно их включить в инсталляционный пакет, используется эта опция.
–no-exclude-vcs По умолчанию, файлы и каталоги, необходимые для работы систем контроля версий, исключаются из обработки. Если нужно их включить в инсталляционный пакет, используется эта опция.
–help Выводит справочную информацию.
Примеры использования

Создать приложение HelloWorld

palm-package ~/projects/HelloWorld

Создать приложение Sample но исключить из дистрибутива текстовые файлы и папку docs.

palm-package --exclude="*.txt" --exclude="docs" ~/projects/Sample

palm-install

Эта утилита устанавливает приложения в эмулятор или на устройство. Нельзя установить приложение если устройство находится в режиме синхронизации (Media Sync mode). Если приложение устанавливается на устройство, то устройство должно находиться в режиме Developer Mode (см. ниже)

Синтаксис вызова:

palm-install [options] [package]

Доступные опции:

Опция Описание
-d {device}
–device={device}
Указывает устройство, на которое должна производиться установка приложения:

  • tcp – эмулятор.
  • usb – устроство.
    Если эта опция не указана, то программа будет установлена на первое найденное устройство.
-l
–list
Выдает список приложений, установленных на устройстве.
-r {application}–remove {application} Удаляет приложение, уникальный идентификатор которого соответствует параметру {application}.
–help Выводит справочную информацию.
Примеры использования

Установить приложение

palm-install ~/projects/packages/com.example.app_1.0_all.ipk

Удалить приложение

palm-install -r com.example.app

Вывести список приложение в эмуляторе

palm-install -d tcp -l

palm-launch

Запускает приложение в эмуляторе или на устройстве

Синтаксис вызова:

palm-launch [options] {application}

{application} – уникальный идентификатор приложения

Доступные опции:

Опция Описание
-c
–close
Закрывает приложение вместо запуска.
-d {device}
–device={device}
Устройство:

  • tcp – эмулятор.
  • usb – устроство.
    Если эта опция не указана, то программа будет установлена на первое найденное устройство.
-f
–relaunch
Перезапускает приложение.
-i Запускает приложение в Inspector.
-l
–list
Выводит список установленных приложений.
-p {parameters}–params={parameters} Указывает параметры запуска. Значение {parameters} содержит JSON-объект или пары ключ-значение в формате “ключ=значение”. В обоих случаях необходимо заключать все в двойные кавычки.
–help Выводит справочную информацию.
Примеры использования

Запустить приложение

palm-launch com.example.app

Запустить приложение в режиме отладки

palm-launch -p "{mojoConfig:true, debuggingEnabled:true}" com.example.app

Включение Developer Mode

  1. В Card view или в Launcher ввести текст:
    upupdowndownleftrightleftrightbastart
  2. Нажать на иконку Developer Mode Enabler.
  3. В приложении установить значение слайдера Developer Mode в позицию On.
  4. Нажать Reset the Device.

После перезагрузки режим Developer Mode будет включен.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

У.

Управление электропитанием (Power Management) в Palm WebOS

В WebOS пользователь может вручную указать интервал, по истечению которого, если устройство не используется, оно переходит в спящий режим. Этот интервал может варьироваться вдиапазоне от 30 секунд до 3х минут.

В некоторых приложениях может возникнуть необходимость держать устройство включенным по истечению интервала, заданного пользователем (это может быть актуально, например, для приложений, воспроизводящих видео или аудио). Для поддержания устройства в активном состоянии в WebOS существует специальный API. О нем и пойдет речь в этот раз.

Итак, нам понадобится тестовое приложение. Создаем проект и в нем сцену main.

app/views/main/main-scene.html

<div class="palm-hasheader">
  <div class="palm-header">Power Management Test</div>
</div>
<div class="palm-header-spacer"></div>
<div id="TimeoutPicker" x-mojo-element="IntegerPicker"></div>
<div id="StartActivityButton" x-mojo-element="Button"></div>
<div id="StopActivityButton" x-mojo-element="Button"></div>
<div id="ExitButton" x-mojo-element="Button"></div>
<div id="info" class="palm-body-text"></div>

Сцена содержит виджет для выбора таймаута, в течении которого устройство не должно засыпать, а также кнопки:

  • Переход в активносе состояние
  • Выход из активного состояния
  • Выход из приложения

app/assistants/main-assistant.js

function MainAssistant() {
}

MainAssistant.prototype.setup = function() {
    this.controller.setupWidget("TimeoutPicker",
        {
            modelProperty: 'value',
            label: 'Timeout (minutes)',
            min: 01,
            max: 15,
            padNumbers: true
        },
        this.timeoutModel =
        {
            value: 1
        });
    this.controller.setupWidget("StartActivityButton", {},
        this.startButtonModel = {label: "Start Activity"});
    this.controller.setupWidget("StopActivityButton", {},
        this.stopButtonModel = {label: "Stop Activity", disabled: true});
    this.controller.setupWidget("ExitButton", {}, {label: "Exit"});

    Mojo.Event.listen($(StartActivityButton), 
        Mojo.Event.tap, this.onStartActivity.bind(this));
    Mojo.Event.listen($(StopActivityButton), 
        Mojo.Event.tap, this.onStopActivity.bind(this));
    Mojo.Event.listen($(ExitButton), Mojo.Event.tap, this.onExit.bind(this));

    this.counter = 0;
}

MainAssistant.prototype.onStartActivity = function(event) {
}

MainAssistant.prototype.onStopActivity = function() {
}

MainAssistant.prototype.onExit = function(event) {
    this.controller.stageController.getAppController().closeAllStages();
    window.close();
}

MainAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening($(StartActivityButton), Mojo.Event.tap, this.onStartActivity);
    Mojo.Event.stopListening($(StopActivityButton), Mojo.Event.tap, this.onStopActivity);
    Mojo.Event.stopListening($(ExitButton), Mojo.Event.tap, this.onExit);
}

В результате получим такой внешний вид приложения:

WebOS Power Management Sample Application

Теперь можно писать логику для обработчиков событий.

Для запуска активного режима приложения необходимо вызвать метод activityStart сервиса palm://com.palm.power/com/palm/power.

MainAssistant.prototype.onStartActivity = function(event) {
    this.counter++;
    this.activity = /* "com.palm.app."  + */
        Mojo.appName + ".activity-" + this.counter;
    this.controller.serviceRequest("palm://com.palm.power/com/palm/power",
    {
         method: "activityStart",
         parameters:
         {
             id: this.activity,
             duration_ms: this.timeoutModel.value * 60 * 1000
         },
         onSuccess: this.activityStartSuccess.bind(this),
         onFailure: this.activityStartFailure.bind(this)
        });
    this.timer = setTimeout(this.onTimer.bind(this),
        this.timeoutModel.value * 60 * 1000 / 2.0);
}

MainAssistant.prototype.onTimer = function(event) {
    if(this.timer)
    {
        clearTimeout(this.timer);
        delete this.timer;
    }
    this.onStopActivity();
}

MainAssistant.prototype.activityStartSuccess = function(event) {
    this.startButtonModel.disabled = true;
    this.stopButtonModel.disabled = false;
    this.controller.modelChanged(this.startButtonModel);
    this.controller.modelChanged(this.stopButtonModel);
    $(info).update("Activity started: " + this.activity);
}

MainAssistant.prototype.activityStartFailure = function(event) {
    $(info).update("Error:<br>" + Object.toJSON(event));
}

Параметры метода activityStart:

  • id – уникальный идентификатор вызова активного режима (можно использовать формат ID-приложения + ID-операции + счетчик).
  • duration_ms – длительность активного режима в миллисекундах. Максимальное значение єтого параметра 900000, что соответствует 15ти минутам.

Возможные проблемы:

  • На эмуляторе вызов activityStart не дает видимого эффекта. Виртуальная машина остается активной всегда.
  • На официальном форуме разработчиков WebOS-приложений неоднократно появлялась информация о том, что активный режим работает только для системных приложений (с идентификатором, начинающимся на com.palm.app). Также была информация что эту проблему исправили и активный режим доступен для разработчиков сторонних приложений, но без устройства это подтвердить нет никакой возможности.
  • По окончанию активного режима приложение не получает никаких уведомлений, и в случае, когда активный режим завершился, а приложение все еще должно держать устройство включенным, надо перезапускать активный режим заново, указывая новый идентификатор вызова. В таком случае очень удобно пользоваться счетсиком. Для того, чтобы вовремя продлить активный режми, можно использовать таймер.

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

MainAssistant.prototype.onStopActivity = function() {
    if(this.activity)
    {
        this.controller.serviceRequest("palm://com.palm.power/com/palm/power", {
             method: "activityEnd",
             parameters:
             {
                 id: "com.palm.app.news.update-1"
             },
             onSuccess: this.activityStopSuccess.bind(this),
             onFailure: this.activityStopFailure.bind(this)
        });
    }
}

MainAssistant.prototype.activityStopSuccess = function(event) {
    this.startButtonModel.disabled = false;
    this.stopButtonModel.disabled = true;
    this.controller.modelChanged(this.startButtonModel);
    this.controller.modelChanged(this.stopButtonModel);
    $(info).update("Activity stopped: " + this.activity);
    delete this.activity;
}

MainAssistant.prototype.activityStopFailure = function(event) {
    $(info).update("Error:<br>" + Object.toJSON(event));
}

MainAssistant.prototype.onExit = function(event) {
    this.controller.stageController.getAppController().closeAllStages();
    window.close();
}

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

MainAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening($(StartActivityButton), Mojo.Event.tap, this.onStartActivity);
    Mojo.Event.stopListening($(StopActivityButton), Mojo.Event.tap, this.onStopActivity);
    Mojo.Event.stopListening($(ExitButton), Mojo.Event.tap, this.onExit);
    this.onStopActivity();
}

На этом все.

Скачать исходный код примера.

П.

Полноэкранный режим работы приложений в Palm WebOS

Работа в полноэкранном режиме на мобильном устройстве – полезная штука, особенно если вы пишете что-нибудь эдакое, например игру. Размер экрана и так небольшой, а панель состояния отбирает у приложения таоке драгоценное пространство.

WebOS позволяет приложениям работать в полноэкранном режиме. Вот об этой возможности мы и узнаем подробнее в этот раз.Итак, у нас задача – сделать приложение, работающее в полноэкранном режиме.

Создаем новый проект и в нем две сцены – main и fullscreen.

app/views/main/main-scene.html

<div class="palm-hasheader">
  <div class="palm-header">FullScreen Test</div>
</div>
<div class="palm-header-spacer"></div>
<div id="FullScreenSceneButton" x-mojo-element="Button"></div>
<div id="ExitButton" x-mojo-element="Button"></div>

app/assistants/main-assistant.js

function MainAssistant() {
}

MainAssistant.prototype.setup = function() {
    this.controller.setupWidget("FullScreenSceneButton", {}, {label: "FullScreen Scene"});
    this.controller.setupWidget("ExitButton", {}, {label: "Exit"});

    Mojo.Event.listen($(FullScreenSceneButton), Mojo.Event.tap, this.onFullScreen.bind(this));
    Mojo.Event.listen($(ExitButton), Mojo.Event.tap, this.onExit.bind(this));
}

MainAssistant.prototype.onFullScreen = function(event) {
    this.controller.stageController.pushScene("fullscreen");
}

MainAssistant.prototype.onExit = function(event) {
    this.controller.stageController.getAppController().closeAllStages();
    window.close();
}

MainAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening($(FullScreenSceneButton), Mojo.Event.tap, this.onFullScreen);
    Mojo.Event.stopListening($(ExitButton), Mojo.Event.tap, this.onExit);
}

На нашей сцене – заголовок и две кнопки. Первая – открывает сцену fullscreen, а вторая – закрывает приложение.

app/views/fullscreen/fullscreen-scene.html

<div class="palm-group">
  <div class="palm-group-title">Sample Fullscreen Scene</div>
</div>
<div id="PopButton" x-mojo-element="Button"></div>

Для перехода в полноэкранный режим у контроллера сцены есть метод enableFullScreenMode(), который принимает булевый параметр и благодаря которому тот же метод служит и для включения и для выключения полноэкранного режима.

app/assistants/fullscreen-assistant.js

function FullscreenAssistant() {
}

FullscreenAssistant.prototype.setup = function() {
    this.controller.setupWidget("PopButton", {}, {label: "Close"});
    Mojo.Event.listen($(PopButton), Mojo.Event.tap, this.onClose.bind(this));
}

FullscreenAssistant.prototype.activate = function(event) {
    this.controller.enableFullScreenMode(true);
}

FullscreenAssistant.prototype.onClose = function(event) {
    this.controller.stageController.popScene();
}

FullscreenAssistant.prototype.deactivate = function(event) {
    this.controller.enableFullScreenMode(false);
}

FullscreenAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening($(PopButton), Mojo.Event.tap, this.onClose);
}

Активацию полноэкранного режима нужно делать при активации сцены, а выход из полноэкранного режима – при деактивации сцены. Не надо переходить в полноэкранный режим внутри метода setup(). Из-за этого можно получить артефакты отрисовки. По этому поводу можно найти достаточно информации на официальном форуме WebOS-разработчиков. В общем, activate() и deactivate() – это как раз подходящие методы для этого.

После всего получаем такой вот результат (скрин из эмулятора):

WebOS Fullscreen

Скачать исходный код примера.