У меня предложение ко всем разработчикам (разумеется, к посетителям этого форума). Впрочем, обо всём по порядку.
Как раньше многие заметили, есть проблема при вызове пользовательских приложений из циферблатов. А именно - перестают работать "тап-зоны" (до тех пор, пока не сделан свайп туда-обратно, или пока не нажата коронка дважды и т. п.).
Попытки "красивого" решения этой проблемы до сих пор безуспешны. Да к тому же, та же проблема присутствует если вызывать приложение не из "тап-зоны", а стандартно, из списка приложений.
Подход к решению проблемы был найден - при выходе делать гашение экрана (в AOD, если включен, или в пустой экран, если не включен AOD). При этом, средствами циферблата это сделать не получилось. И хотелось бы гасить экран только тогда, когда это действительно необходимо.
Хочу предложить следующий подход. (проверил на небольшом приложении-макете)
В приложении в каталоге page помимо файла index.js создавать файл indexw.js именно для вызова из циферблата. При этом в приложении будут следующие изменения:
1. в app.json добавляем точку входа indexw:
...
"gt": {
"module": {
"page": {
"pages": ["page/index",
"page/indexw"]
}
},
...
2. файл app.js приобретает следующий вид (добавляем описание новой переменной):
let isWF; // признак вызова из приложения или циферблата
App({
globalData: {
},
onCreate(options) {
isWF = false;
console.log('app on create invoke')
},
onDestroy(options) {
console.log('app on destroy invoke')
}
})
3. Создаем файл page/indexw.js со следующим содержимым:
import { replace } from '@zos/router'
Page({
state: {
},
onInit() {
},
build() {
isWF = true;
replace({
url: 'page/index'
});
},
onDestroy() {
},
});
Новой переменной присваиваем "истина" и передаем управление page/index.js
4. в файле index.js добавляем обработку выхода из приложения, для чего добавляем эту обработку в Page.onDestroy():
onDestroy() {
if (isWF) {
setScreenOff();
isWH = false;
home(); // выход в циферблат
} else {
exit(); // выход в список приложений
};
logger.debug("page onDestroy invoked");
},
Проверяем, что был вызов из циферблата (через indexw), гасим признак вызова из циферблата, гасим экран, выходим в циферблат.
5. (опционно) для обработки ситуации, когда приложение вызвано из списка приложений (я бы рекомендовал добавить):
onKey({
callback: (key, keyEvent) => {
let vMode = getSystemMode();
if (!vMode.button) {
if (key === KEY_HOME && keyEvent === KEY_EVENT_PRESS) {
isWH = false;
setScreenOff();
home(); // выход в циферблат
};
};
},
});
Здесь ловим нажатие на кнопку, проверяем, не включен ли кнопочный режим (поскольку в кнопочном режиме из приложения непосредственно в циферблат не выходим, то этой проблемы нет). Проверяем, что нажато именно кратко на коронку, гасим признак вызова из циферблата, гасим экран, выходим в циферблат.
При этом, если включен AOD, получается красивый эффект. При выходе из приложения, на краткое время появляется циферблат, потом переходим в AOD. Если режим AOD не включен, то все работает, но такого красивого эффекта нет.
6. Вызов приложения из циферблата может иметь подобный вид (здесь на примере вызова календарь плюс, который я применил в новой версии своего циферблата)
const [fs_stat, err] = hmFS.stat_asset("../../../js_apps/00102281/page/indexw.js");
if (err == 0) {
hmApp.startApp({appid: 1057409, url: 'page/indexw' });
} else {
hmApp.startApp({appid: 1057409, url: 'page/index' });
};
Здесь проверяю наличие файла page/indexw.js, при его наличии вызываю его, при отсутствии, стандартно вызываю page/index
Просьба к разработчикам приложений добавлять такой код. пп 6 не обязателен, и без него, если вызывать стандартно через page/index функциональность никак не меняется. Просто появляется дополнительная , если вызвать через page/indexw
Сугубая просьба к SashaCX75 добавить все это в Календарь Плюс.