openjdk.ruOpenJDK на русском

JEP 272: Platform-Specific Desktop Features

Возможности рабочего стола, специфичные для платформы

ОтветственныйAlexander Zvegintsev
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск9
Компонентclient-libs / java.awt
Обсуждениеawt dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьM
РецензентыPetr Pchelko, Sergey Bylokhov
ОдобренKevin Rushforth
Создан2014/06/30 15:52
Обновлён2017/06/28 15:03
Задача8048731

Аннотация

Определить новый публичный API для доступа к возможностям рабочего стола, специфичным для платформы, например для взаимодействия с панелью задач или Dock либо для прослушивания системных событий и событий приложения.

Цели

В предстоящем выпуске JDK 9 внутренние API, например API в пакете com.apple.eawt для Mac OS X, станут недоступны. Цель этого JEP — предоставить подходящую замену этим недоступным API, а также добавить связанные с ними возможности, специфичные для платформы. Мы планируем реализовать новые возможности на тех платформах, где есть необходимая поддержка. Где это осуществимо, API будет спроектирован кроссплатформенным, чтобы каждую возможность можно было реализовать на как можно большем числе платформ. Классы apple.applescript удаляются без какой-либо замены.

Что не является целью

Мы не намерены предоставлять прямую замену для всех внутренних API OS X, имеющихся в JDK 8. В частности, мы не будем предоставлять замену для пакета com.apple.concurrent. Также не является целью сохранить совместимость с теми внутренними API, для которых мы предоставляем замену.

Описание

Этот JEP включает две подзадачи:

Предоставить публичный API, заменяющий функциональность com.apple.{eawt,eio}

Цель этой подзадачи — не допустить потери функциональности для разработчиков под OS X. Мы предоставим замену для API во внутренних пакетах JDK com.apple.eawt и com.apple.eio.

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

Помимо возможностей, специфичных для OS X, есть аналогичные возможности, которые можно поддержать на других платформах, включая Windows и Linux:

  • Обработчики входа в систему и выхода из неё, а также блокировки экрана: предоставить слушатели событий входа в систему и выхода из неё (или блокировки и разблокировки экрана), чтобы приложение могло при необходимости запустить постоянную задачу или сохранить своё состояние.

  • Взаимодействие с панелью задач / Dock

    • Запрос внимания пользователя: позволить приложению привлечь внимание пользователя с помощью возможностей платформы, например мигания значка приложения на панели задач или подпрыгивания значка в Dock.

    • Отображение хода выполнения задачи: показывать индикатор выполнения или другой индикатор на панели задач / в Dock.

    • Ярлыки действий: предоставить ярлыки действий, доступные через всплывающее меню, например списки переходов (jump lists) в Windows.

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

API

Мы предлагаем добавить публичный API для этих двух подзадач в существующий класс java.awt.Desktop. Целевые поддерживаемые платформы — Mac OS X, Windows, Linux.

Предлагаемый набросок API:

package java.awt;

public class Desktop {

    /* ... */

    /**
     * Adds sub-types of {@link AppEventListener} to listen for notifications
     * from the native system.
     *
     * @param listener
     * @see AppForegroundListener
     * @see AppHiddenListener
     * @see AppReOpenedListener
     * @see AppScreenSleepListener
     * @see AppSystemSleepListener
     * @see AppUserSessionListener
     */

    public void addAppEventListener(final AppEventListener listener) {}

    /**
     * Requests user attention to this application (usually through bouncing the Dock icon).
     * Critical requests will continue to bounce the Dock icon until the app is activated.
     *
     */
    public void requestUserAttention(final boolean critical) {}

    /**
     * Attaches the contents of the provided PopupMenu to the application's Dock icon.
     */
    public void setDockMenu(final PopupMenu menu) {}

    /**
     * Changes this application's Dock icon to the provided image.
     */
    public void setDockIconImage(final Image image) {}


    /**
     * Affixes a small system provided badge to this application's Dock icon. Usually a number.
     */
    public void setDockIconBadge(final String badge) {}

    /**
     * Displays or hides a progress bar or other indicator in
     * the dock.
     *
     * @see DockProgressState.NORMAL
     * @see DockProgressState.PAUSED
     * @see DockProgressState.ERROR
     *
     * @see #setDockProgressValue
     */
    public void setDockProgressState(int state) {}

    /**
     * Sets the progress bar's current value to {@code n}.
     */
    public void setDockProgressValue(int n) {}

    /**
     * Tests whether a feature is supported on the current platform.
     */

    public boolean isSupportedFeature(Feature f) {}

    /* ... */
}

Тестирование

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