diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml
index 7938695..ec15bfa 100644
--- a/.github/workflows/Release.yaml
+++ b/.github/workflows/Release.yaml
@@ -16,7 +16,7 @@ jobs:
# Константы, используемые далее по тексту
env:
PROJ: ${{ github.event.repository.name }}
- TAG: '7.3.6'
+ TAG: '7.4'
steps:
# Проверка состава репозитория (без анализа, как может показаться)
diff --git a/.release/Release.md b/.release/Release.md
index b131afa..d5b39c9 100644
--- a/.release/Release.md
+++ b/.release/Release.md
@@ -1,10 +1,10 @@
-_Changes for v 7.3.6_:
-- `Windows`: implemented the new App about interface';
-- Settings storage has been updated (may require some adjustments);
-- Updated the help and support links;
-- `Android`: probably fixed the bug with freezing touchscreen;
-- `Android`: adjusted the appearance of the main log;
+_Changes for v 7.4_:
+- `Android`: fixed some minor interface bugs;
+- `Windows`: fixed some minor interface bugs;
- `GMJ`: the skip list has been updated;
-- `Android`: added the extra tips for the first app start;
-- `Android`: added the reset button for the set of help tips;
-- `Windows`: application retargeted to `.NET Framework 4.8.1`
+- `Android`: app has been translated to `NET80 / MAUI` platform:
+ - App now has unified Android navigation shell;
+- `Android`: app has been adapted to `Android 14` (API 34);
+- `Windows`: implemented the new App about interface;
+- Settings storage has been updated (may require some adjustments);
+- Updated the help and support links
diff --git a/.release/TablepediaNotifier.apk b/.release/TablepediaNotifier.apk
index f53c8be..3e153da 100644
Binary files a/.release/TablepediaNotifier.apk and b/.release/TablepediaNotifier.apk differ
diff --git a/.release/UniNotifier.apk b/.release/UniNotifier.apk
index 38c0cdb..6c6cc9f 100644
Binary files a/.release/UniNotifier.apk and b/.release/UniNotifier.apk differ
diff --git a/.release/UniNotifier.exe b/.release/UniNotifier.exe
new file mode 100644
index 0000000..951d6e6
Binary files /dev/null and b/.release/UniNotifier.exe differ
diff --git a/.release/UniNotifier_en_us.html b/.release/UniNotifier_en_us.html
new file mode 100644
index 0000000..78ff8e5
--- /dev/null
+++ b/.release/UniNotifier_en_us.html
@@ -0,0 +1,27 @@
+
+
+uNot: the home page | UniNotifier
+
+
+
+
+uNot: the home page
+ƒ RD AAOW FDL; 30.01.2024; 2:48
+
+uNot (formerly know as UniNotifier) is the web resources supervisor service.
+This app provides the ability to be notified when the content of user-specified websites changes.
+In other words, about updates on them, which will be presented in the form of a text log. Only what the user
+has specified is loaded – all other objects (including ads) are ignored.
+What does it offer?
+
+The settings section allows you to manage and design notifications.
+The main log provides a view of changes, access to source webpages from which they were received, and the ability to share them.
+A static service notification will inform you about the presence of new changes received in the background.
+
+
+More info you can find in this video guide .
+The description for the data processing concept used in Grammar must joy project you can also find
+on its own page .
+
+
+
diff --git a/.release/UniNotifier_ru_ru.html b/.release/UniNotifier_ru_ru.html
new file mode 100644
index 0000000..799eeac
--- /dev/null
+++ b/.release/UniNotifier_ru_ru.html
@@ -0,0 +1,27 @@
+
+
+uNot: the home page | UniNotifier
+
+
+
+
+uNot: the home page
+ƒ RD AAOW FDL; 30.01.2024; 2:46
+
+uNot (ранее известный как UniNotifier) – служба наблюдения за состоянием веб-ресурсов.
+Это приложение предоставляет возможность получать уведомления об изменении состояния указанных пользователем
+веб-сайтов. Другими словами, об обновлениях, происходящих на них, которые представляются в виде текстового журнала.
+Загружается только то, что указал пользователь – все остальные объекты (включая рекламу) игнорируются.
+Что оно предлагает?
+
+Раздел настроек позволяет управлять уведомлениями и конструировать их.
+Главный журнал обеспечивает просмотр изменений, переход на исходные веб-страницы, с которых они были получены, и возможность ими поделиться.
+Закреплённое служебное оповещение будет сообщать о наличии непрочитанных изменений, полученных в фоновом режиме
+
+
+Больше информации Вы сможете найти в этом видеоруководстве .
+Информация о дополнении Grammar must joy теперь также доступна на отдельной странице .
+Информация о проекте Tablepedia notifier располагается на здесь
+
+
+
diff --git a/Changes.log b/Changes.log
index f11921b..5f96926 100644
--- a/Changes.log
+++ b/Changes.log
@@ -1,5 +1,13 @@
uNot: changes log
+Version 7.4:
+• Android: fixed some minor interface bugs;
+• Windows: fixed some minor interface bugs;
+• GMJ: the skip list has been updated;
+• Android: app has been translated to NET80 / MAUI platform:
+ - App now has unified Android navigation shell;
+• Android: app has been adapted to Android 14 (API 34)
+
Version 7.3.6:
• Windows: implemented the new App about interface
diff --git a/src/SettingsForm.cs b/src/SettingsForm.cs
index 49badd5..72347a0 100644
--- a/src/SettingsForm.cs
+++ b/src/SettingsForm.cs
@@ -117,7 +117,23 @@ private void SettingsForm_FormClosing (object sender, FormClosingEventArgs e)
// Закрытие окна
ProgramDescription.ShowTip (NSTipTypes.ServiceLaunchTip);
+
+ completeUpdate = RDGenerics.LocalizedMessageBox (RDMessageTypes.Question_Center, "RecallAllNews",
+ RDLDefaultTexts.Button_YesNoFocus, RDLDefaultTexts.Button_No) ==
+ RDMessageButtons.ButtonOne;
+ }
+
+ ///
+ /// Возвращает флаг полного опроса оповещений
+ ///
+ public bool CompleteUpdate
+ {
+ get
+ {
+ return completeUpdate;
+ }
}
+ private bool completeUpdate = false;
// Загрузка значений в поля
private void NotificationsList_Select (object sender, EventArgs e)
diff --git a/src/UniNotifierForm.cs b/src/UniNotifierForm.cs
index bce4f79..b818594 100644
--- a/src/UniNotifierForm.cs
+++ b/src/UniNotifierForm.cs
@@ -16,7 +16,7 @@ public partial class UniNotifierForm: Form
private NotifyIcon ni = new NotifyIcon ();
private bool callWindowOnUrgents = false;
private bool allowExit = false;
- private string[] regParameters = new string[] {
+ /*private string[] regParameters = new string[] {
"Left",
"Top",
"Width",
@@ -24,7 +24,7 @@ public partial class UniNotifierForm: Form
"Read",
"CallOnUrgents",
"FontSize",
- };
+ };*/
private NotificationsSet ns = new NotificationsSet (true);
private List texts = new List ();
@@ -59,13 +59,6 @@ public UniNotifierForm (bool HideWindow)
// Получение настроек
RDGenerics.LoadWindowDimensions (this);
- /*try
- {
- this.ReadMode.Checked = bool.Parse (RDGenerics.GetAppSettingsValue (regParameters[4]));
- callWindowOnUrgents = bool.Parse (RDGenerics.GetAppSettingsValue (regParameters[5]));
- this.FontSizeField.Value = decimal.Parse (RDGenerics.GetAppSettingsValue (regParameters[6]));
- }
- catch { }*/
ReadMode.Checked = RDGenerics.GetSettings (readPar, false);
callWindowOnUrgents = RDGenerics.GetSettings (callWindowOnUrgentsPar, false);
try
@@ -299,8 +292,9 @@ private void ShowSettings (object sender, EventArgs e)
// Запоминание настроек
callWindowOnUrgents = sf.CallWindowOnUrgents;
- /*RDGenerics.SetAppSettingsValue (regParameters[5], callWindowOnUrgents.ToString ());*/
RDGenerics.SetSettings (callWindowOnUrgentsPar, callWindowOnUrgents);
+
+ bool complete = sf.CompleteUpdate;
sf.Dispose ();
// Обработка случая закрытия основного окна из трея
@@ -320,10 +314,6 @@ private void ShowSettings (object sender, EventArgs e)
ni.ContextMenu.MenuItems[3].Text = RDLocale.GetText ("MainMenuOption05");
// Перезапуск
- bool complete = (RDGenerics.LocalizedMessageBox (RDMessageTypes.Question_Center, "RecallAllNews",
- RDLDefaultTexts.Button_YesNoFocus, RDLDefaultTexts.Button_No) ==
- RDMessageButtons.ButtonOne);
-
ns.ResetTimer (complete); // Раньше имел смысл обязательный полный сброс. Теперь это уже неактуально
MainTimer.Enabled = true;
}
@@ -362,7 +352,6 @@ private void ReadMode_CheckedChanged (object sender, EventArgs e)
}
// Запоминание
- /*RDGenerics.SetAppSettingsValue (regParameters[4], ReadMode.Checked.ToString ());*/
RDGenerics.SetSettings (readPar, ReadMode.Checked);
}
private const string readPar = "Read";
@@ -419,8 +408,7 @@ private void GetGMJ_Click (object sender, EventArgs e)
private void FontSizeField_ValueChanged (object sender, EventArgs e)
{
MainText.Font = new Font (MainText.Font.FontFamily, (float)FontSizeField.Value);
- /*RDGenerics.SetAppSettingsValue (regParameters[6], this.FontSizeField.Value.ToString ());**/
- RDGenerics.SetSettings (fontSizePar, (uint)(FontSizeField.Value*10.0m));
+ RDGenerics.SetSettings (fontSizePar, (uint)(FontSizeField.Value * 10.0m));
}
private const string fontSizePar = "FontSize";
}
diff --git a/src/android/AboutPage.xaml b/src/android/AboutPage.xaml
index a71044e..e01ca0c 100644
--- a/src/android/AboutPage.xaml
+++ b/src/android/AboutPage.xaml
@@ -1,53 +1,49 @@
-
-
+
+
+
-
+
-
-
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
+
-
-
-
-
+
-
+
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/android/AboutPage.xaml.cs b/src/android/AboutPage.xaml.cs
index 91c07f9..4dd32a6 100644
--- a/src/android/AboutPage.xaml.cs
+++ b/src/android/AboutPage.xaml.cs
@@ -1,13 +1,10 @@
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace RD_AAOW
+namespace RD_AAOW
{
///
/// Класс описывает страницу сведений о программе
///
[XamlCompilation (XamlCompilationOptions.Compile)]
- public partial class AboutPage:ContentPage
+ public partial class AboutPage: ContentPage
{
///
/// Конструктор. Запускает страницу
@@ -16,16 +13,5 @@ public AboutPage ()
{
InitializeComponent ();
}
-
- ///
- /// Переопределение для кнопки возврата
- ///
- protected override bool OnBackButtonPressed ()
- {
- App app = (App)App.Current;
- app.CallHeadersPage ();
-
- return true;
- }
}
}
diff --git a/src/android/AndroidManifest.G.xml b/src/android/AndroidManifest.xml
similarity index 97%
rename from src/android/AndroidManifest.G.xml
rename to src/android/AndroidManifest.xml
index ee92d9a..9605b9b 100644
--- a/src/android/AndroidManifest.G.xml
+++ b/src/android/AndroidManifest.xml
@@ -1,8 +1,8 @@
+ android:installLocation="internalOnly" android:versionCode="600714" android:versionName="7.4">
-
+
diff --git a/src/android/App.xaml b/src/android/App.xaml
index 7362abf..bf2970b 100644
--- a/src/android/App.xaml
+++ b/src/android/App.xaml
@@ -1,7 +1,15 @@
-
-
+
-
+
+
+
+
+
+
+
+
diff --git a/src/android/App.xaml.cs b/src/android/App.xaml.cs
index 14041c1..065988c 100644
--- a/src/android/App.xaml.cs
+++ b/src/android/App.xaml.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Xamarin.Essentials;
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
+using Microsoft.Maui.Controls;
[assembly: XamlCompilation (XamlCompilationOptions.Compile)]
namespace RD_AAOW
@@ -60,20 +54,20 @@ public partial class App: Application
// Цветовая схема
private readonly Color
- logMasterBackColor = Color.FromHex ("#F0F0F0"),
- logFieldBackColor = Color.FromHex ("#80808080"),
- logReadModeColor = Color.FromHex ("#202020"),
+ logMasterBackColor = Color.FromArgb ("#F0F0F0"),
+ logFieldBackColor = Color.FromArgb ("#80808080"),
+ logReadModeColor = Color.FromArgb ("#202020"),
- settingsMasterBackColor = Color.FromHex ("#FFF8F0"),
- settingsFieldBackColor = Color.FromHex ("#FFE8D0"),
+ settingsMasterBackColor = Color.FromArgb ("#FFF8F0"),
+ settingsFieldBackColor = Color.FromArgb ("#FFE8D0"),
- notSettingsMasterBackColor = Color.FromHex ("#F0F8FF"),
- notSettingsFieldBackColor = Color.FromHex ("#D0E8FF"),
+ notSettingsMasterBackColor = Color.FromArgb ("#F0F8FF"),
+ notSettingsFieldBackColor = Color.FromArgb ("#D0E8FF"),
- solutionLockedBackColor = Color.FromHex ("#F0F0F0"),
+ solutionLockedBackColor = Color.FromArgb ("#F0F0F0"),
- aboutMasterBackColor = Color.FromHex ("#F0FFF0"),
- aboutFieldBackColor = Color.FromHex ("#D0FFD0");
+ aboutMasterBackColor = Color.FromArgb ("#F0FFF0"),
+ aboutFieldBackColor = Color.FromArgb ("#D0FFD0");
#endregion
@@ -85,32 +79,35 @@ private readonly Color
allowSoundLabel, allowLightLabel, allowVibroLabel, comparatorLabel, ignoreMisfitsLabel,
aboutFontSizeField;
- private Xamarin.Forms.Switch allowStart, enabledSwitch, nightModeSwitch,
+ private Switch allowStart, enabledSwitch, nightModeSwitch,
allowSoundSwitch, allowLightSwitch, allowVibroSwitch,
comparatorSwitch, ignoreMisfitsSwitch, notifyIfUnavailableSwitch, newsAtTheEndSwitch,
keepScreenOnSwitch;
- private Xamarin.Forms.Button selectedNotification, applyButton, deleteButton,
+ private Button selectedNotification, applyButton, deleteButton,
notWizardButton, comparatorTypeButton, comparatorIncButton,
comparatorLongButton, comparatorDecButton, centerButtonFunction, linkFieldButton,
- centerButton, languageButton, scrollUpButton, scrollDownButton;
+ centerButton, languageButton, scrollUpButton, scrollDownButton, menuButton;
private Editor nameField, comparatorValueField;
- private Xamarin.Forms.ListView mainLog;
+ private ListView mainLog;
+
+ private List pageVariants = new List ();
#endregion
- #region Запуск и работа приложения
+ #region Запуск и настройка
///
/// Конструктор. Точка входа приложения
///
- public App (RDAppStartupFlags Flags)
+ public App ()
{
// Инициализация
InitializeComponent ();
- flags = Flags;
+ flags = AndroidSupport.GetAppStartupFlags (RDAppStartupFlags.Huawei | RDAppStartupFlags.CanReadFiles |
+ RDAppStartupFlags.CanWriteFiles | RDAppStartupFlags.CanShowNotifications);
if (ProgramDescription.NSet == null)
ProgramDescription.NSet = new NotificationsSet (false);
@@ -123,26 +120,22 @@ public App (RDAppStartupFlags Flags)
char[] ctSplitter = new char[] { '\n' };
comparatorTypes = new List (RDLocale.GetText ("ComparatorTypes").Split (ctSplitter));
- #region Общая конструкция страниц приложения
-
+ // Общая конструкция страниц приложения
MainPage = new MasterPage ();
- settingsPage = AndroidSupport.ApplyPageSettings (MainPage, "SettingsPage",
+ settingsPage = AndroidSupport.ApplyPageSettings (new SettingsPage (), "SettingsPage",
RDLocale.GetText ("SettingsPage"), settingsMasterBackColor);
- notSettingsPage = AndroidSupport.ApplyPageSettings (MainPage, "NotSettingsPage",
+ notSettingsPage = AndroidSupport.ApplyPageSettings (new NotSettingsPage (), "NotSettingsPage",
RDLocale.GetText ("NotSettingsPage"), notSettingsMasterBackColor);
- aboutPage = AndroidSupport.ApplyPageSettings (MainPage, "AboutPage",
+ aboutPage = AndroidSupport.ApplyPageSettings (new AboutPage (), "AboutPage",
RDLocale.GetDefaultText (RDLDefaultTexts.Control_AppAbout), aboutMasterBackColor);
- logPage = AndroidSupport.ApplyPageSettings (MainPage, "LogPage",
+ logPage = AndroidSupport.ApplyPageSettings (new LogPage (), "LogPage",
RDLocale.GetText ("LogPage"), logMasterBackColor);
- AndroidSupport.SetMainPage (MainPage);
- #endregion
+ AndroidSupport.SetMasterPage (MainPage, logPage, logMasterBackColor);
- int tab = 0;
if (!NotificationsSet.TipsState.HasFlag (NSTipTypes.PolicyTip))
- tab = notSettingsTab;
- ((CarouselPage)MainPage).CurrentPage = ((CarouselPage)MainPage).Children[tab];
+ AndroidSupport.SetCurrentPage (notSettingsPage, notSettingsMasterBackColor);
#region Настройки службы
@@ -158,7 +151,7 @@ public App (RDAppStartupFlags Flags)
Button allowServiceButton;
// Не работают оповещения
- if (!Flags.HasFlag (RDAppStartupFlags.CanShowNotifications))
+ if (!flags.HasFlag (RDAppStartupFlags.CanShowNotifications))
{
allowStart.IsEnabled = false;
allowServiceTip = AndroidSupport.ApplyLabelSettings (settingsPage, "AllowStartTip",
@@ -171,8 +164,8 @@ public App (RDAppStartupFlags Flags)
}
// Не работают файловые операции
- else if (!Flags.HasFlag (RDAppStartupFlags.CanReadFiles) ||
- !Flags.HasFlag (RDAppStartupFlags.CanWriteFiles))
+ else if (!flags.HasFlag (RDAppStartupFlags.CanReadFiles) ||
+ !flags.HasFlag (RDAppStartupFlags.CanWriteFiles))
{
allowServiceTip = AndroidSupport.ApplyLabelSettings (settingsPage, "AllowStartTip",
RDLocale.GetDefaultText (RDLDefaultTexts.Message_ReadWritePermission), RDLabelTypes.ErrorTip);
@@ -386,6 +379,9 @@ public App (RDAppStartupFlags Flags)
aboutFontSizeField = AndroidSupport.ApplyLabelSettings (aboutPage, "FontSizeField",
" ", RDLabelTypes.DefaultCenter);
+ AndroidSupport.ApplyLabelSettings (aboutPage, "HelpHeaderLabel",
+ RDLocale.GetDefaultText (RDLDefaultTexts.Control_AppAbout),
+ RDLabelTypes.HeaderLeft);
AndroidSupport.ApplyLabelSettings (aboutPage, "HelpTextLabel",
RDGenerics.GetEncoding (RDEncodings.UTF8).
GetString ((byte[])RD_AAOW.Properties.Resources.ResourceManager.
@@ -397,7 +393,7 @@ public App (RDAppStartupFlags Flags)
#region Страница журнала приложения
- mainLog = (Xamarin.Forms.ListView)logPage.FindByName ("MainLog");
+ mainLog = (ListView)logPage.FindByName ("MainLog");
mainLog.BackgroundColor = logFieldBackColor;
mainLog.HasUnevenRows = true;
mainLog.ItemTapped += MainLog_ItemTapped;
@@ -405,20 +401,16 @@ public App (RDAppStartupFlags Flags)
mainLog.SelectionMode = ListViewSelectionMode.None;
mainLog.SeparatorVisibility = SeparatorVisibility.None;
mainLog.ItemAppearing += MainLog_ItemAppearing;
- ((CarouselPage)MainPage).CurrentPageChanged += CurrentPageChanged; // Пробуем исправить сброс прокрутки
+ AndroidSupport.MasterPage.Popped += CurrentPageChanged;
centerButton = AndroidSupport.ApplyButtonSettings (logPage, "CenterButton", " ",
logFieldBackColor, CenterButton_Click, false);
- centerButton.Margin = centerButton.Padding = new Thickness (0);
centerButton.FontSize += 6;
scrollUpButton = AndroidSupport.ApplyButtonSettings (logPage, "ScrollUp",
RDDefaultButtons.Up, logFieldBackColor, ScrollUpButton_Click);
- scrollUpButton.Margin = scrollUpButton.Padding = new Thickness (0);
-
scrollDownButton = AndroidSupport.ApplyButtonSettings (logPage, "ScrollDown",
RDDefaultButtons.Down, logFieldBackColor, ScrollDownButton_Click);
- scrollDownButton.Margin = scrollDownButton.Padding = new Thickness (0);
// Режим чтения
AndroidSupport.ApplyLabelSettings (settingsPage, "ReadModeLabel",
@@ -432,6 +424,9 @@ public App (RDAppStartupFlags Flags)
newsAtTheEndSwitch = AndroidSupport.ApplySwitchSettings (settingsPage, "NewsAtTheEndSwitch",
false, settingsFieldBackColor, NewsAtTheEndSwitch_Toggled, NotificationsSupport.LogNewsItemsAtTheEnd);
+ menuButton = AndroidSupport.ApplyButtonSettings (logPage, "MenuButton",
+ RDDefaultButtons.Menu, logFieldBackColor, SelectPage);
+
#endregion
#region Прочие настройки
@@ -470,7 +465,8 @@ public App (RDAppStartupFlags Flags)
// Исправление для сброса текущей позиции журнала
private async void CurrentPageChanged (object sender, EventArgs e)
{
- if (((CarouselPage)MainPage).Children.IndexOf (((CarouselPage)MainPage).CurrentPage) != 0)
+ /*if (((CarouselPage)MainPage).Children.IndexOf (((CarouselPage)MainPage).CurrentPage) != 0)*/
+ if (AndroidSupport.MasterPage.CurrentPage != logPage)
return;
needsScroll = true;
@@ -562,14 +558,6 @@ private async Task ShowTips (NSTipTypes Type)
return true;
}
- ///
- /// Метод выполняет возврат на страницу содержания
- ///
- public void CallHeadersPage ()
- {
- ((CarouselPage)MainPage).CurrentPage = logPage;
- }
-
///
/// Сохранение настроек программы
///
@@ -725,11 +713,11 @@ private void UpdateLogButton (bool Requesting, bool FinishingBackgroundRequest)
(green ? semaphoreOn : semaphoreOff);
if (red)
- centerButton.TextColor = Color.FromHex (dark ? "#FF4040" : "#D00000");
+ centerButton.TextColor = Color.FromArgb (dark ? "#FF4040" : "#D00000");
else if (yellow)
- centerButton.TextColor = Color.FromHex (dark ? "#FFFF40" : "#D0D000");
+ centerButton.TextColor = Color.FromArgb (dark ? "#FFFF40" : "#D0D000");
else
- centerButton.TextColor = Color.FromHex (dark ? "#40FF40" : "#00D000");
+ centerButton.TextColor = Color.FromArgb (dark ? "#40FF40" : "#00D000");
}
else
{
@@ -925,7 +913,8 @@ private async void MainLog_ItemTapped (object sender, ItemTappedEventArgs e)
case 4:
currentNotification = notNumber;
SelectNotification (null, null);
- ((CarouselPage)MainPage).CurrentPage = ((CarouselPage)MainPage).Children[notSettingsTab];
+ /*((CarouselPage)MainPage).CurrentPage = ((CarouselPage)MainPage).Children[notSettingsTab];*/
+ AndroidSupport.SetCurrentPage (notSettingsPage, notSettingsMasterBackColor);
break;
// Удаление из журнала
@@ -1070,6 +1059,42 @@ private async void ScrollDownButton_Click (object sender, EventArgs e)
await ScrollMainLog (true, -1);
}
+ // Выбор текущей страницы
+ private async void SelectPage (object sender, EventArgs e)
+ {
+ // Запрос варианта
+ if (pageVariants.Count < 1)
+ {
+ pageVariants = new List ()
+ {
+ RDLocale.GetText ("SettingsPage"),
+ RDLocale.GetText ("NotSettingsPage"),
+ RDLocale.GetDefaultText (RDLDefaultTexts.Control_AppAbout),
+ };
+ }
+
+ int res = await AndroidSupport.ShowList (RDLocale.GetDefaultText (RDLDefaultTexts.Button_GoTo),
+ RDLocale.GetDefaultText (RDLDefaultTexts.Button_Cancel), pageVariants);
+ if (res < 0)
+ return;
+
+ // Вызов
+ switch (res)
+ {
+ case 0:
+ AndroidSupport.SetCurrentPage (settingsPage, settingsMasterBackColor);
+ break;
+
+ case 1:
+ AndroidSupport.SetCurrentPage (notSettingsPage, notSettingsMasterBackColor);
+ break;
+
+ case 2:
+ AndroidSupport.SetCurrentPage (aboutPage, aboutMasterBackColor);
+ break;
+ }
+ }
+
#endregion
#region Основные настройки
@@ -1296,7 +1321,8 @@ private async void StartNotificationsWizard (object sender, EventArgs e)
// Переход к дополнительным опциям
notWizardButton.IsEnabled = true;
- ((CarouselPage)MainPage).CurrentPage = ((CarouselPage)MainPage).Children[notSettingsTab];
+ /*((CarouselPage)MainPage).CurrentPage = ((CarouselPage)MainPage).Children[notSettingsTab];*/
+ AndroidSupport.SetCurrentPage (notSettingsPage, notSettingsMasterBackColor);
}
// Вызов помощника по созданию оповещений
@@ -1448,16 +1474,19 @@ private void NightModeSwitch_Toggled (object sender, ToggledEventArgs e)
if (nightModeSwitch.IsToggled)
{
logPage.BackgroundColor = mainLog.BackgroundColor = centerButton.BackgroundColor =
- scrollUpButton.BackgroundColor = scrollDownButton.BackgroundColor = logReadModeColor;
+ scrollUpButton.BackgroundColor = scrollDownButton.BackgroundColor =
+ menuButton.BackgroundColor = logReadModeColor;
NotificationsSupport.LogFontColor = logMasterBackColor;
}
else
{
logPage.BackgroundColor = mainLog.BackgroundColor = centerButton.BackgroundColor =
- scrollUpButton.BackgroundColor = scrollDownButton.BackgroundColor = logMasterBackColor;
+ scrollUpButton.BackgroundColor = scrollDownButton.BackgroundColor =
+ menuButton.BackgroundColor = logMasterBackColor;
NotificationsSupport.LogFontColor = logReadModeColor;
}
- scrollUpButton.TextColor = scrollDownButton.TextColor = NotificationView.CurrentAntiBackColor;
+ scrollUpButton.TextColor = scrollDownButton.TextColor = menuButton.TextColor =
+ NotificationView.CurrentAntiBackColor;
// Принудительное обновление (только не при старте)
if (e != null)
@@ -1477,7 +1506,7 @@ private void FontSizeChanged (object sender, EventArgs e)
if (e != null)
{
- Xamarin.Forms.Button b = (Xamarin.Forms.Button)sender;
+ Button b = (Button)sender;
if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Increase) &&
(fontSize < AndroidSupport.MaxFontSize))
fontSize++;
@@ -1573,7 +1602,7 @@ private void FontSizeButton_Clicked (object sender, EventArgs e)
{
if (sender != null)
{
- Xamarin.Forms.Button b = (Xamarin.Forms.Button)sender;
+ Button b = (Button)sender;
if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Increase))
AndroidSupport.MasterFontSize += 0.5;
else if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Decrease))
@@ -1669,7 +1698,7 @@ private async void OccurrenceChanged (object sender, EventArgs e)
if (!NotificationsSet.TipsState.HasFlag (NSTipTypes.OccurenceTip))
await ShowTips (NSTipTypes.OccurenceTip);
- Xamarin.Forms.Button b = (Xamarin.Forms.Button)sender;
+ Button b = (Button)sender;
if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Increase) &&
(currentOcc < Notification.MaxOccurrenceNumber))
currentOcc++;
@@ -1686,7 +1715,7 @@ private void RequestStepChanged (object sender, EventArgs e)
{
if (e != null)
{
- Xamarin.Forms.Button b = (Xamarin.Forms.Button)sender;
+ Button b = (Button)sender;
if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Increase) &&
(currentFreq < NotificationsSupport.MaxBackgroundRequestStep))
@@ -1958,7 +1987,7 @@ private void ComparatorValueChanged (object sender, EventArgs e)
if (e != null)
{
- Xamarin.Forms.Button b = (Xamarin.Forms.Button)sender;
+ Button b = (Button)sender;
if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Increase))
{
diff --git a/src/android/LogPage.xaml b/src/android/LogPage.xaml
index 1849bf2..eb179ce 100644
--- a/src/android/LogPage.xaml
+++ b/src/android/LogPage.xaml
@@ -1,12 +1,10 @@
-
-
-
@@ -15,14 +13,17 @@
+
+
-
-
+
+
+
diff --git a/src/android/LogPage.xaml.cs b/src/android/LogPage.xaml.cs
index c12805b..941161f 100644
--- a/src/android/LogPage.xaml.cs
+++ b/src/android/LogPage.xaml.cs
@@ -1,7 +1,4 @@
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace RD_AAOW
+namespace RD_AAOW
{
///
/// Класс описывает страницу журнала программы
@@ -9,29 +6,12 @@ namespace RD_AAOW
[XamlCompilation (XamlCompilationOptions.Compile)]
public partial class LogPage: ContentPage
{
- //private Button[] buttons = new Button[2];
- //private Grid mainGrid;
-
///
/// Конструктор. Запускает страницу
///
public LogPage ()
{
InitializeComponent ();
- //buttons[0] = (Button)this.FindByName ("AllNewsButton");
- //buttons[1] = (Button)this.FindByName ("GetGMJ");
- //mainGrid = (Grid)this.FindByName ("MainGrid");
- }
-
- ///
- /// Обработчик события изменения ориентации экрана
- ///
- protected override void OnSizeAllocated (double width, double height)
- {
- base.OnSizeAllocated (width, height);
- //buttons[0].HeightRequest = buttons[1].HeightRequest = (width > height) ? 40 : 85;
- //buttons[0].WidthRequest = buttons[1].WidthRequest = (width < height) ? 35 : 85;
- //mainGrid.ColumnDefinitions[0].Width = (width > height) ? 85 : 35;
}
}
}
diff --git a/src/android/MainActivity.cs b/src/android/MainActivity.cs
index 438d9bf..5fc2a8d 100644
--- a/src/android/MainActivity.cs
+++ b/src/android/MainActivity.cs
@@ -1,25 +1,12 @@
using Android.App;
using Android.Content;
using Android.Content.PM;
-using Android.Content.Res;
using Android.Graphics;
using Android.OS;
using Android.Views;
using AndroidX.Core.App;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Xamarin.Essentials;
-using Xamarin.Forms;
-
-#if DEBUG
-[assembly: Application (Debuggable = true)]
-#else
-[assembly: Application (Debuggable = false)]
-#endif
-
-namespace RD_AAOW.Droid
+
+namespace RD_AAOW
{
///
/// Класс описывает загрузчик приложения
@@ -28,9 +15,8 @@ namespace RD_AAOW.Droid
Icon = "@drawable/launcher_foreground",
Theme = "@style/SplashTheme",
MainLauncher = true,
- ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation
- )]
- public class MainActivity: global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity: MauiAppCompatActivity
{
///
/// Принудительная установка масштаба шрифта
@@ -44,7 +30,7 @@ protected override void AttachBaseContext (Context @base)
return;
}
- Configuration overrideConfiguration = new Configuration ();
+ Android.Content.Res.Configuration overrideConfiguration = new Android.Content.Res.Configuration ();
overrideConfiguration = @base.Resources.Configuration;
overrideConfiguration.FontScale = 0.9f;
@@ -60,28 +46,19 @@ protected override void AttachBaseContext (Context @base)
///
protected override void OnCreate (Bundle savedInstanceState)
{
- // Базовая настройка
- TabLayoutResource = Resource.Layout.Tabbar;
- ToolbarResource = Resource.Layout.Toolbar;
-
// Отмена темы для splash screen
- base.SetTheme (Resource.Style.MainTheme);
+ base.SetTheme (Microsoft.Maui.Controls.Resource.Style.MainTheme);
- // Инициализация и запуск
- base.OnCreate (savedInstanceState);
- Forms.Init (this, savedInstanceState);
+ // Настройка
Platform.Init (this, savedInstanceState);
- // Получение списка доступных прав
- RDAppStartupFlags flags = AndroidSupportX.GetAppStartupFlags (RDAppStartupFlags.CanShowNotifications |
- RDAppStartupFlags.CanReadFiles | RDAppStartupFlags.CanWriteFiles | RDAppStartupFlags.Huawei, this);
-
- // Запуск независимо от разрешения
+ // Инициализация службы
if (mainService == null)
mainService = new Intent (this, typeof (MainService));
AndroidSupport.StopRequested = false;
// Для Android 12 и выше запуск службы возможен только здесь
+ RDAppStartupFlags flags = AndroidSupport.GetAppStartupFlags (RDAppStartupFlags.CanShowNotifications);
if (flags.HasFlag (RDAppStartupFlags.CanShowNotifications))
{
if (AndroidSupport.IsForegroundAvailable)
@@ -94,7 +71,7 @@ protected override void OnCreate (Bundle savedInstanceState)
if (NotificationsSupport.KeepScreenOn)
this.Window.AddFlags (WindowManagerFlags.KeepScreenOn);
- LoadApplication (new App (flags));
+ base.OnCreate (savedInstanceState);
}
private Intent mainService;
@@ -146,7 +123,7 @@ protected override void OnResume ()
ForegroundServiceType = ForegroundService.TypeDataSync,
Label = "uNot",
Exported = true)]
- public class MainService: global::Android.App.Service
+ public class MainService: Service
{
// Идентификаторы процесса
private Handler handler;
@@ -187,13 +164,13 @@ public override void OnCreate ()
// Аналог таймера (создаёт задание, которое само себя ставит в очередь исполнения ОС)
runnable = new Action (() =>
- {
- if (isStarted)
- {
- TimerTick ();
- handler.PostDelayed (runnable, ProgramDescription.MasterFrameLength);
- }
- });
+ {
+ if (isStarted)
+ {
+ TimerTick ();
+ handler.PostDelayed (runnable, ProgramDescription.MasterFrameLength);
+ }
+ });
}
// Запрос всех новостей
@@ -268,7 +245,7 @@ private async void TimerTick ()
List masterLog = new List (NotificationsSupport.GetMasterLog (false));
// Извлечение новых записей
- AndroidSupport.StopRequested = false; // Разблокировка метода GetHTML
+ AndroidSupport.StopRequested = false; // Разблокировка метода GetHTML
string newText = "";
bool haveNews = false;
@@ -316,7 +293,7 @@ private async void TimerTick ()
notBuilder.SetColor (ProgramDescription.NSet.HasUrgentNotifications ? urgentColor : defaultColor);
// Формирование сообщения
- notMessage:
+ notMessage:
notBuilder.SetContentText (msg);
notTextStyle.BigText (msg);
Android.App.Notification notification = notBuilder.Build ();
@@ -372,11 +349,9 @@ public override StartCommandResult OnStartCommand (Intent intent, StartCommandFl
}
// Инициализация сообщений
- notBuilder.SetCategory ("msg"); // Категория "сообщение"
- notBuilder.SetColor (defaultColor); // Оттенок заголовков оповещений
-
- // По-видимому, вносит дефект в ОС, вешая тачскрин
- /*notBuilder.SetOngoing (true); // Android 13 и новее: не позволяет закрыть оповещение вручную*/
+ notBuilder.SetCategory ("msg"); // Категория "сообщение"
+ notBuilder.SetColor (defaultColor); // Оттенок заголовков оповещений
+ notBuilder.SetOngoing (true); // Android 13 и новее: не позволяет закрыть оповещение вручную
// Android 12 и новее: требует немедленного отображения оповещения
if (!AndroidSupport.IsForegroundStartableFromResumeEvent)
diff --git a/src/android/MainApplication.cs b/src/android/MainApplication.cs
new file mode 100644
index 0000000..c3537de
--- /dev/null
+++ b/src/android/MainApplication.cs
@@ -0,0 +1,20 @@
+using Android.App;
+using Android.Runtime;
+
+namespace RD_AAOW
+ {
+#if DEBUG
+ [Application (Debuggable = true)]
+#else
+ [Application (Debuggable = false)]
+#endif
+ public class MainApplication: MauiApplication
+ {
+ public MainApplication (IntPtr handle, JniHandleOwnership ownership)
+ : base (handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp () => MauiProgram.CreateMauiApp ();
+ }
+ }
diff --git a/src/android/MasterPage.xaml b/src/android/MasterPage.xaml
index 5947a40..e283dc0 100644
--- a/src/android/MasterPage.xaml
+++ b/src/android/MasterPage.xaml
@@ -1,11 +1,7 @@
-
-
-
-
-
-
+
diff --git a/src/android/MasterPage.xaml.cs b/src/android/MasterPage.xaml.cs
index a246f06..152afb0 100644
--- a/src/android/MasterPage.xaml.cs
+++ b/src/android/MasterPage.xaml.cs
@@ -1,13 +1,10 @@
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace RD_AAOW
+namespace RD_AAOW
{
///
/// Класс описывает главный макет приложения
///
[XamlCompilation (XamlCompilationOptions.Compile)]
- public partial class MasterPage:CarouselPage
+ public partial class MasterPage: NavigationPage
{
///
/// Конструктор. Создаёт макет приложения
diff --git a/src/android/NotSettingsPage.xaml b/src/android/NotSettingsPage.xaml
index 16cab5b..a9c2c72 100644
--- a/src/android/NotSettingsPage.xaml
+++ b/src/android/NotSettingsPage.xaml
@@ -1,97 +1,93 @@
-
-
-
+
+
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
-
+
-
-
+
-
-
+
+
-
+
+
diff --git a/src/android/NotSettingsPage.xaml.cs b/src/android/NotSettingsPage.xaml.cs
index babbcea..ac74eec 100644
--- a/src/android/NotSettingsPage.xaml.cs
+++ b/src/android/NotSettingsPage.xaml.cs
@@ -1,13 +1,10 @@
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace RD_AAOW
+namespace RD_AAOW
{
///
/// Класс описывает страницу решения
///
[XamlCompilation (XamlCompilationOptions.Compile)]
- public partial class NotSettingsPage:ContentPage
+ public partial class NotSettingsPage: ContentPage
{
///
/// Конструктор. Запускает страницу
@@ -16,16 +13,5 @@ public NotSettingsPage ()
{
InitializeComponent ();
}
-
- ///
- /// Переопределение для кнопки возврата
- ///
- protected override bool OnBackButtonPressed ()
- {
- App app = (App)App.Current;
- app.CallHeadersPage ();
-
- return true;
- }
}
}
diff --git a/src/android/SettingsPage.xaml b/src/android/SettingsPage.xaml
index 32d978e..60c8e6f 100644
--- a/src/android/SettingsPage.xaml
+++ b/src/android/SettingsPage.xaml
@@ -1,93 +1,88 @@
-
-
-
+
+
-
-
+
+
+
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
-
-
-
-
+
-
+
+
diff --git a/src/android/SettingsPage.xaml.cs b/src/android/SettingsPage.xaml.cs
index 812f874..529177d 100644
--- a/src/android/SettingsPage.xaml.cs
+++ b/src/android/SettingsPage.xaml.cs
@@ -1,13 +1,10 @@
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace RD_AAOW
+namespace RD_AAOW
{
///
/// Класс описывает страницу решения
///
[XamlCompilation (XamlCompilationOptions.Compile)]
- public partial class SettingsPage:ContentPage
+ public partial class SettingsPage: ContentPage
{
///
/// Конструктор. Запускает страницу
@@ -16,16 +13,5 @@ public SettingsPage ()
{
InitializeComponent ();
}
-
- ///
- /// Переопределение для кнопки возврата
- ///
- protected override bool OnBackButtonPressed ()
- {
- App app = (App)App.Current;
- app.CallHeadersPage ();
-
- return true;
- }
}
}
diff --git a/src/android/UniNotifier_en_us.resx b/src/android/UniNotifier_en_us.resx
index fa24ec0..a317848 100644
--- a/src/android/UniNotifier_en_us.resx
+++ b/src/android/UniNotifier_en_us.resx
@@ -160,7 +160,7 @@ In Android 12 and higher, there is no adequate implementation of going to the ap
Please wait for the remaining notifications to respond...
- Background request step: <b>{0:D}</b> minutes
+ Background request step:<br><b>{0:D}</b> minutes
Sign of beginning of notification text
@@ -224,11 +224,11 @@ For example: {CITY} to Reykjavik, {CURRENCY} to ZWL
The main log is empty.
-• Swipe this screen to the left to add new web resources to watch if it hasn’t been done yet.
+• Click the menu (≡) button and select “Application settings” to add new web resources to watch if it hasn’t been done yet.
• When finished enable the background service and close the app to start the supervision.
-• Detailed instructions for setting up the service are available on YouTube. Swipe this screen to the left (to the last page) and select “Reference materials” → “Project videoguide” for watching it
+• Detailed instructions for setting up the service are available on YouTube. Click the menu (≡) button in the main log and select “About the app” → “Reference materials” → “Project videoguide” for watching it
Font size of the main log: <b>{0:D}</b>
@@ -243,7 +243,8 @@ For example: {CITY} to Reykjavik, {CURRENCY} to ZWL
Indicate only urgent notifications
- Keep the screen on while app is opened
+ Keep the screen on
+while app is opened
Notification service is in supervision mode. Click on this message to go to the app’s log
@@ -428,19 +429,19 @@ markup:
Welcome to uNot, the web resources supervisor service!
-• On this page you can configure existing notifications.
+• On this page you can configure existing notifications. Each button has a one-time prompt.
-• Swipe this screen to the right to set up parameters of the service and add new web resources to watch
+• Use the system “Back” button to return to the main notifications log from any section
- • Detailed instructions for setting up the service are available on YouTube. Swipe this screen to the left (to the last page) and select “Reference materials” → “Project videoguide” for watching it.
+ • Detailed instructions for setting up the service are available on YouTube. Click the menu (≡) button in the main log and select “About the app” → “Reference materials” → “Project videoguide” for watching it.
-• The main notifications log is available on the first page of the app. It will be opened on every further start of the service
+• The main notifications log is available on the main page of the app. It will be opened on every further start of the service
Warning!
-• Some devices are requiring manual unlocking of internet access (f.e., in case of internet traffic saving mode) for the app. Check it if you will not get notifications.
+• Some devices are requiring manual unlocking of internet access (f.e., in case of internet traffic saving mode). Check it if you will not get notifications.
• Also, some operating systems contain individual settings for saving battery power, clearing memory, and “pinning” apps to the notification area. Add the application to exceptions and pin it so that the device doesn’t force close it in standby mode
diff --git a/src/android/UniNotifier_ru_ru.resx b/src/android/UniNotifier_ru_ru.resx
index 7d7e06b..6ff40ff 100644
--- a/src/android/UniNotifier_ru_ru.resx
+++ b/src/android/UniNotifier_ru_ru.resx
@@ -160,7 +160,7 @@
Пожалуйста, дождитесь ответа всех оповещений...
- Шаг фонового опроса, минут: <b>{0:D}</b>
+ Шаг фонового опроса,<br>минут: <b>{0:D}</b>
Признак начала текста оповещения
@@ -224,11 +224,11 @@
Главный журнал пуст.
-• Смахните этот экран влево, чтобы добавить новые веб-ресурсы для наблюдения, если это ещё не сделано.
+• Нажмите кнопку меню (≡) и выберите «Настройки приложения», чтобы добавить новые веб-ресурсы для наблюдения, если это ещё не было сделано.
• По завершении включите фоновую службу и закройте приложение, чтобы начать наблюдение.
-• Подробная инструкция по настройке службы доступна на YouTube. Смахните этот экран влево (до конца) и выберите «Справочные материалы» → «Видеоруководство проекта» для просмотра
+• Подробная инструкция по настройке службы доступна на YouTube. Нажмите кнопку меню (≡) в главном журнале и выберите «О приложении» → «Справочные материалы» → «Видеоруководство проекта» для её просмотра
Размер шрифта в журнале: <b>{0:D}</b>
@@ -246,7 +246,8 @@
Индикация только срочных уведомлений
- Запретить переход в спящий режим, пока приложение открыто
+ Запретить переход в спящий режим,
+пока приложение открыто
Служба оповещений находится в режиме наблюдения. Нажмите на это сообщение, чтобы перейти к журналу приложения
@@ -428,12 +429,12 @@
Добро пожаловать в uNot – службу наблюдения за веб-ресурсами!
-• На этой странице Вы можете настраивать созданные ранее уведомления.
+• На этой странице Вы можете настраивать созданные ранее уведомления. Каждая кнопка снабжена одноразовой подсказкой.
-• Смахните этот экран вправо, чтобы задать параметры службы и добавить новые ресурсы для наблюдения
+• Используйте системную кнопку «Назад», чтобы вернуться к главному журналу уведомлений из любого раздела
- • Подробная инструкция по настройке службы доступна на YouTube. Смахните этот экран влево (до конца) и выберите «Справочные материалы» → «Видеоруководство проекта» для её просмотра.
+ • Подробная инструкция по настройке службы доступна на YouTube. Нажмите кнопку меню (≡) в главном журнале и выберите «О приложении» → «Справочные материалы» → «Видеоруководство проекта» для её просмотра.
• Главный журнал уведомлений доступен на первой странице приложения. Он будет открываться при каждом следующем вызове службы
@@ -445,7 +446,9 @@
• Также некоторые операционные системы содержат индивидуальные настройки экономии заряда батареи, очистки памяти и «закрепления» приложений в области уведомлений. Добавьте приложение в исключения и закрепите его, чтобы устройство не закрывало его принудительно в режиме ожидания
- Также ваше устройство требует ручного разрешения звуков, подсветки и вибрации для уведомлений. При необходимости выберите их в настройках системы. Фоновая служба должна быть включена, иначе настройки будут недоступны.
+ Важно!
+
+Ваше устройство требует ручного разрешения звуков, подсветки и вибрации для уведомлений. При необходимости выберите их в настройках системы. Фоновая служба должна быть включена, иначе настройки будут недоступны.
Приложение создаёт два канала оповещений:
• для срочных уведомлений (которые требуют индикации);